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