diff --git a/lib/App/Netdisco/Transport/SNMP.pm b/lib/App/Netdisco/Transport/SNMP.pm index 2ad14ec1..04f934c2 100644 --- a/lib/App/Netdisco/Transport/SNMP.pm +++ b/lib/App/Netdisco/Transport/SNMP.pm @@ -94,13 +94,17 @@ Returns C if the connection fails. sub test_connection { my ($class, $ip) = @_; my $addr = NetAddr::IP::Lite->new($ip) or return undef; + # avoid renumbering to localhost loopbacks return undef if $addr->addr eq '0.0.0.0' or check_acl_no($addr->addr, 'group:__LOOPBACK_ADDRESSES__'); + my $device = schema(vars->{'tenant'})->resultset('Device') ->new_result({ ip => $addr->addr }) or return undef; + my $readers = $class->instance->readers or return undef; return $readers->{$device->ip} if exists $readers->{$device->ip}; + debug sprintf 'snmp reader cache warm: [%s]', $device->ip; return ($readers->{$device->ip} = _snmp_connect_generic('read', $device)); } @@ -167,10 +171,12 @@ sub _snmp_connect_generic { } # support for offline cache - if ($device->is_pseudo) { - my $pseudo_cache = catfile( catdir(($ENV{NETDISCO_HOME} || $ENV{HOME}), 'logs', 'snapshots'), $device->ip ); + my $pseudo_cache = catfile( catdir(($ENV{NETDISCO_HOME} || $ENV{HOME}), 'logs', 'snapshots'), $device->ip ); + if (-f $pseudo_cache and ($device->is_pseudo or ! $device->in_storage)) { $snmp_args{Cache} = thaw( decode_base64( read_text($pseudo_cache) ) ); $snmp_args{Offline} = 1; + # support pseudo/offline device renumber and also pseudo device autovivification + $device->set_column(is_pseudo => \'true') if ! $device->is_pseudo; debug sprintf 'snmp transport running in offline mode for: [%s]', $device->ip; }