1package App::Netdisco::Worker::Plugin::Nbtstat::Core; 2 3use Dancer ':syntax'; 4use App::Netdisco::Worker::Plugin; 5use aliased 'App::Netdisco::Worker::Status'; 6 7use App::Netdisco::Util::Nbtstat qw/nbtstat_resolve_async store_nbt/; 8use App::Netdisco::Util::Node 'is_nbtstatable'; 9use Dancer::Plugin::DBIC 'schema'; 10use Time::HiRes 'gettimeofday'; 11 12register_worker({ phase => 'main' }, sub { 13 my ($job, $workerconf) = @_; 14 my $host = $job->device->ip; 15 16 # get list of nodes on device 17 my $interval = (setting('nbtstat_max_age') || 7) . ' day'; 18 my $rs = schema('netdisco')->resultset('NodeIp')->search({ 19 -bool => 'me.active', 20 -bool => 'nodes.active', 21 'nodes.switch' => $host, 22 'me.time_last' => \[ '>= now() - ?::interval', $interval ], 23 },{ 24 join => 'nodes', 25 columns => 'ip', 26 distinct => 1, 27 })->ip_version(4); 28 29 my @ips = map {+{'ip' => $_}} 30 grep { is_nbtstatable( $_ ) } 31 $rs->get_column('ip')->all; 32 33 # Unless we have IPs don't bother 34 if (scalar @ips) { 35 my $now = 'to_timestamp('. (join '.', gettimeofday) .')'; 36 my $resolved_nodes = nbtstat_resolve_async(\@ips); 37 38 # update node_nbt with status entries 39 foreach my $result (@$resolved_nodes) { 40 if (defined $result->{'nbname'}) { 41 store_nbt($result, $now); 42 } 43 } 44 } 45 46 return Status->done("Ended nbtstat for $host"); 47}); 48 49true; 50