From 03c4d8ef0995989b5222ee5793ae07416f9873a5 Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Thu, 4 Apr 2013 20:42:11 +0100 Subject: [PATCH] add discoverall and discover_neighbors poller jobs --- Netdisco/lib/App/Netdisco/Daemon/Queue.pm | 2 +- .../lib/App/Netdisco/Daemon/Worker/Manager.pm | 2 +- .../Netdisco/Daemon/Worker/Poller/Discover.pm | 38 ++++++++++++++++++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/Netdisco/lib/App/Netdisco/Daemon/Queue.pm b/Netdisco/lib/App/Netdisco/Daemon/Queue.pm index d333ebcd..95cbb30d 100644 --- a/Netdisco/lib/App/Netdisco/Daemon/Queue.pm +++ b/Netdisco/lib/App/Netdisco/Daemon/Queue.pm @@ -33,7 +33,7 @@ sub capacity_for { debug "checking local capacity for action $action"; my $action_map = { - Poller => [qw/refresh discover/], + Poller => [qw/refresh discover discoverall discover_neighbors/], Interactive => [qw/location contact portcontrol portname vlan power/], }; diff --git a/Netdisco/lib/App/Netdisco/Daemon/Worker/Manager.pm b/Netdisco/lib/App/Netdisco/Daemon/Worker/Manager.pm index 823bccad..20b8fa58 100644 --- a/Netdisco/lib/App/Netdisco/Daemon/Worker/Manager.pm +++ b/Netdisco/lib/App/Netdisco/Daemon/Worker/Manager.pm @@ -14,7 +14,7 @@ my $fqdn = hostfqdn || 'localhost'; my $role_map = { (map {$_ => 'Poller'} - qw/refresh discover/), + qw/refresh discover discoverall discover_neighbors/), (map {$_ => 'Interactive'} qw/location contact portcontrol portname vlan power/) }; diff --git a/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Discover.pm b/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Discover.pm index 6c365357..abfeff9a 100644 --- a/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Discover.pm +++ b/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Discover.pm @@ -38,7 +38,7 @@ sub discover { my $snmp = snmp_connect($device); if (!defined $snmp) { - return job_error("Discover failed: could not SNMP connect to $host"); + return job_error("discover failed: could not SNMP connect to $host"); } store_device($device, $snmp); @@ -48,7 +48,41 @@ sub discover { store_power($device, $snmp); store_modules($device, $snmp); - return job_done("Ended Discover for $host"); + return job_done("Ended discover for $host"); +} + +# run find_neighbors on all known devices, and run discover on any +# newly found devices. +sub discoverall { + my ($self, $job) = @_; + + my $devices = schema('netdisco')->resultset('Device')->get_column('ip'); + + schema('netdisco')->resultset('Admin')->populate([ + map {{ + device => $_, + action => 'discover_neighbors', + status => 'queued', + }} ($devices->all) + ]); + + return job_done("Queued discover_neighbors job for all devices"); +} + +sub discover_neighbors { + my ($self, $job) = @_; + + my $host = NetAddr::IP::Lite->new($job->device); + my $device = get_device($host->addr); + my $snmp = snmp_connect($device); + + if (!defined $snmp) { + return job_error("discover_neighbors failed: could not SNMP connect to $host"); + } + + find_neighbors($device, $snmp); + + return job_done("Ended find_neighbors for $host"); } 1;