1package App::Netdisco::Worker::Plugin::Discover::Neighbors::Routed;
2use Dancer ':syntax';
3
4use App::Netdisco::Worker::Plugin;
5use App::Netdisco::Transport::SNMP;
6use aliased 'App::Netdisco::Worker::Status';
7
8use App::Netdisco::Util::Device qw/get_device is_discoverable/;
9use App::Netdisco::JobQueue 'jq_insert';
10
11register_worker({ phase => 'main', driver => 'snmp' }, sub {
12  my ($job, $workerconf) = @_;
13
14  my $device = $job->device;
15  return unless $device->in_storage and $device->has_layer(3);
16  my $snmp = App::Netdisco::Transport::SNMP->reader_for($device)
17    or return Status->defer("discover failed: could not SNMP connect to $device");
18
19  my $ospf_peers   = $snmp->ospf_peers || {};
20  my $ospf_routers = $snmp->ospf_peer_id || {};
21  my $isis_peers   = $snmp->isis_peers || {};
22  my $bgp_peers    = $snmp->bgp_peer_addr || {};
23  my $eigrp_peers  = $snmp->eigrp_peers || {};
24
25  return Status->info(" [$device] neigh - no BGP, OSPF, IS-IS, or EIGRP peers")
26    unless ((scalar values %$ospf_peers) or (scalar values %$ospf_routers)
27            or (scalar values %$bgp_peers) or (scalar values %$eigrp_peers)
28            or (scalar values %$isis_peers));
29
30  my $count = 0;
31  foreach my $ip ((values %$ospf_peers), (values %$ospf_routers),
32                  (values %$bgp_peers), (values %$eigrp_peers),
33                  (values %$isis_peers)) {
34    my $peer = get_device($ip);
35    next if $peer->in_storage or not is_discoverable($peer);
36    next if vars->{'queued'}->{$ip};
37
38    jq_insert({
39      device => $ip,
40      action => 'discover',
41      subaction => 'with-nodes',
42    });
43
44    $count++;
45    vars->{'queued'}->{$ip} += 1;
46    debug sprintf ' [%s] queue - queued %s for discovery (peer)', $device, $ip;
47  }
48
49  return Status->info(" [$device] neigh - $count peers added to queue.");
50});
51
52true;
53