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; | ||||
|  | ||||
| use Dancer qw/:syntax :script/; | ||||
| use Dancer::Plugin::DBIC 'schema'; | ||||
|  | ||||
| use App::Netdisco::Util::SNMP 'get_communities'; | ||||
| use App::Netdisco::Util::Device 'get_device'; | ||||
| use App::Netdisco::Util::Permission ':all'; | ||||
| @@ -9,6 +11,7 @@ use SNMP::Info; | ||||
| use Try::Tiny; | ||||
| use Module::Load (); | ||||
| use Path::Class 'dir'; | ||||
| use NetAddr::IP::Lite ':lower'; | ||||
|  | ||||
| use base 'Dancer::Object::Singleton'; | ||||
|  | ||||
| @@ -61,6 +64,34 @@ sub reader_for { | ||||
|     = _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? ) | ||||
|  | ||||
| Same as C<reader_for> but uses the read-write community strings from the | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package App::Netdisco::Util::SNMP; | ||||
|  | ||||
| use Dancer qw/:syntax :script/; | ||||
| use App::Netdisco::Util::DNS 'hostname_from_ip'; | ||||
| use App::Netdisco::Util::Permission ':all'; | ||||
|  | ||||
| use base 'Exporter'; | ||||
| @@ -138,7 +139,8 @@ sub get_communities { | ||||
|  | ||||
|   # clean the community table of obsolete tags | ||||
|   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 ); | ||||
| } | ||||
| @@ -147,7 +149,7 @@ sub _get_external_community { | ||||
|   my ($device, $mode) = @_; | ||||
|   my $cmd = setting('get_community'); | ||||
|   my $ip = $device->ip; | ||||
|   my $host = $device->dns || $ip; | ||||
|   my $host = ($device->dns || hostname_from_ip($ip) || $ip); | ||||
|  | ||||
|   if (defined $cmd and length $cmd) { | ||||
|       # replace variables | ||||
|   | ||||
| @@ -22,7 +22,7 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub { | ||||
|   my $revofname = ipv4_from_hostname($snmp->name); | ||||
|  | ||||
|   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; | ||||
|     } | ||||
|     else { | ||||
| @@ -46,8 +46,7 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub { | ||||
|           if (check_acl_only($device, $key) | ||||
|                 and check_acl_only($alias, $map->{$key})) { | ||||
|  | ||||
|             # if ($snmp->snmp_connect_ip( $alias->alias )) { FIXME | ||||
|             if (App::Netdisco::Transport::SNMP->reader_for( $alias->alias )) { | ||||
|             if (App::Netdisco::Transport::SNMP->test_connection( $alias->alias )) { | ||||
|               $new_ip = $alias->alias; | ||||
|               last ALIAS; | ||||
|             } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user