fix use of snmp_connect_ip which does not work for SNMPv3
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
package App::Netdisco::Transport::SNMP;
|
package App::Netdisco::Transport::SNMP;
|
||||||
|
|
||||||
use Dancer qw/:syntax :script/;
|
use Dancer qw/:syntax :script/;
|
||||||
|
use Dancer::Plugin::DBIC 'schema';
|
||||||
|
|
||||||
use App::Netdisco::Util::SNMP 'get_communities';
|
use App::Netdisco::Util::SNMP 'get_communities';
|
||||||
use App::Netdisco::Util::Device 'get_device';
|
use App::Netdisco::Util::Device 'get_device';
|
||||||
use App::Netdisco::Util::Permission ':all';
|
use App::Netdisco::Util::Permission ':all';
|
||||||
@@ -9,6 +11,7 @@ use SNMP::Info;
|
|||||||
use Try::Tiny;
|
use Try::Tiny;
|
||||||
use Module::Load ();
|
use Module::Load ();
|
||||||
use Path::Class 'dir';
|
use Path::Class 'dir';
|
||||||
|
use NetAddr::IP::Lite ':lower';
|
||||||
|
|
||||||
use base 'Dancer::Object::Singleton';
|
use base 'Dancer::Object::Singleton';
|
||||||
|
|
||||||
@@ -61,6 +64,34 @@ sub reader_for {
|
|||||||
= _snmp_connect_generic('read', $device, $useclass));
|
= _snmp_connect_generic('read', $device, $useclass));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
=head1 test_connection( $ip )
|
||||||
|
|
||||||
|
Similar to C<reader_for> but will use the literal IP address passed, and does
|
||||||
|
not support specifying the device class. The purpose is to test the SNMP
|
||||||
|
connectivity to the device before a renumber.
|
||||||
|
|
||||||
|
Attempts to have no side effect, however there will be a stored SNMP
|
||||||
|
authentication hint (tag) in the database if the connection is successful.
|
||||||
|
|
||||||
|
Returns C<undef> if the connection fails.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
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:__LOCAL_ADDRESSES__');
|
||||||
|
my $device = schema('netdisco')->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, $useclass));
|
||||||
|
}
|
||||||
|
|
||||||
=head1 writer_for( $ip, $useclass? )
|
=head1 writer_for( $ip, $useclass? )
|
||||||
|
|
||||||
Same as C<reader_for> but uses the read-write community strings from the
|
Same as C<reader_for> but uses the read-write community strings from the
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package App::Netdisco::Util::SNMP;
|
package App::Netdisco::Util::SNMP;
|
||||||
|
|
||||||
use Dancer qw/:syntax :script/;
|
use Dancer qw/:syntax :script/;
|
||||||
|
use App::Netdisco::Util::DNS 'hostname_from_ip';
|
||||||
use App::Netdisco::Util::Permission ':all';
|
use App::Netdisco::Util::Permission ':all';
|
||||||
|
|
||||||
use base 'Exporter';
|
use base 'Exporter';
|
||||||
@@ -138,7 +139,8 @@ sub get_communities {
|
|||||||
|
|
||||||
# clean the community table of obsolete tags
|
# clean the community table of obsolete tags
|
||||||
eval { $device->community->update({$tag_name => undef}) }
|
eval { $device->community->update({$tag_name => undef}) }
|
||||||
if not $stored_tag or !exists $seen_tags->{ $stored_tag };
|
if $device->in_storage
|
||||||
|
and (not $stored_tag or !exists $seen_tags->{ $stored_tag });
|
||||||
|
|
||||||
return ( @communities, @$config );
|
return ( @communities, @$config );
|
||||||
}
|
}
|
||||||
@@ -147,7 +149,7 @@ sub _get_external_community {
|
|||||||
my ($device, $mode) = @_;
|
my ($device, $mode) = @_;
|
||||||
my $cmd = setting('get_community');
|
my $cmd = setting('get_community');
|
||||||
my $ip = $device->ip;
|
my $ip = $device->ip;
|
||||||
my $host = $device->dns || $ip;
|
my $host = ($device->dns || hostname_from_ip($ip) || $ip);
|
||||||
|
|
||||||
if (defined $cmd and length $cmd) {
|
if (defined $cmd and length $cmd) {
|
||||||
# replace variables
|
# replace variables
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub {
|
|||||||
my $revofname = ipv4_from_hostname($snmp->name);
|
my $revofname = ipv4_from_hostname($snmp->name);
|
||||||
|
|
||||||
if (setting('reverse_sysname') and $revofname) {
|
if (setting('reverse_sysname') and $revofname) {
|
||||||
if ($snmp->snmp_connect_ip( $new_ip )) {
|
if (App::Netdisco::Transport::SNMP->test_connection( $new_ip )) {
|
||||||
$new_ip = $revofname;
|
$new_ip = $revofname;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -46,8 +46,7 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub {
|
|||||||
if (check_acl_only($device, $key)
|
if (check_acl_only($device, $key)
|
||||||
and check_acl_only($alias, $map->{$key})) {
|
and check_acl_only($alias, $map->{$key})) {
|
||||||
|
|
||||||
# if ($snmp->snmp_connect_ip( $alias->alias )) { FIXME
|
if (App::Netdisco::Transport::SNMP->test_connection( $alias->alias )) {
|
||||||
if (App::Netdisco::Transport::SNMP->reader_for( $alias->alias )) {
|
|
||||||
$new_ip = $alias->alias;
|
$new_ip = $alias->alias;
|
||||||
last ALIAS;
|
last ALIAS;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user