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