add reset after messing with snmp context or community index

This commit is contained in:
Oliver Gorwits
2017-09-13 20:42:41 +01:00
parent 09214dce92
commit dfaeb34d8c
2 changed files with 13 additions and 9 deletions

View File

@@ -172,6 +172,7 @@ sub snmp_comm_reindex {
if ($ver == 3) { if ($ver == 3) {
my $prefix = ''; my $prefix = '';
my @comms = _build_communities($device, 'read'); my @comms = _build_communities($device, 'read');
# find a context prefix configured by the user
foreach my $c (@comms) { foreach my $c (@comms) {
next unless $c->{tag} next unless $c->{tag}
and $c->{tag} eq (eval { $device->community->snmp_auth_tag_read } || ''); and $c->{tag} eq (eval { $device->community->snmp_auth_tag_read } || '');
@@ -182,14 +183,16 @@ sub snmp_comm_reindex {
debug debug
sprintf '[%s] reindexing to "%s%s" (ver: %s, class: %s)', sprintf '[%s] reindexing to "%s%s" (ver: %s, class: %s)',
$device->ip, $prefix, $vlan, $ver, $snmp->class; $device->ip, $prefix, $vlan, $ver, $snmp->class;
$snmp->update(Context => ($prefix . $vlan)); $vlan ? $snmp->update(Context => ($prefix . $vlan))
: $snmp->update(Context => '');
} }
else { else {
my $comm = $snmp->snmp_comm; my $comm = $snmp->snmp_comm;
debug sprintf '[%s] reindexing to vlan %s (ver: %s, class: %s)', debug sprintf '[%s] reindexing to vlan %s (ver: %s, class: %s)',
$device->ip, $vlan, $ver, $snmp->class; $device->ip, $vlan, $ver, $snmp->class;
$snmp->update(Community => $comm . '@' . $vlan); $vlan ? $snmp->update(Community => $comm . '@' . $vlan)
: $snmp->update(Community => $comm);
} }
} }

View File

@@ -27,9 +27,6 @@ register_worker({ stage => 'check', driver => 'snmp' }, sub {
my $now = 'to_timestamp('. (join '.', gettimeofday) .')'; my $now = 'to_timestamp('. (join '.', gettimeofday) .')';
my $total_nodes = 0; my $total_nodes = 0;
# do this before we start messing with the snmp community string
my $guard = guard { }; # FIXME TODO reset snmp community
# cache the device ports to save hitting the database for many single rows # cache the device ports to save hitting the database for many single rows
my $device_ports = {map {($_->port => $_)} my $device_ports = {map {($_->port => $_)}
$device->ports(undef, {prefetch => {neighbor_alias => 'device'}})->all}; $device->ports(undef, {prefetch => {neighbor_alias => 'device'}})->all};
@@ -41,10 +38,14 @@ register_worker({ stage => 'check', driver => 'snmp' }, sub {
# ...then per-vlan if supported # ...then per-vlan if supported
my @vlan_list = get_vlan_list($device); my @vlan_list = get_vlan_list($device);
foreach my $vlan (@vlan_list) { {
snmp_comm_reindex($snmp, $device, $vlan); my $guard = guard { snmp_comm_reindex($snmp, $device, 0) };
my $pv_fwtable = walk_fwtable($device, $interfaces, $port_macs, $device_ports, $vlan); foreach my $vlan (@vlan_list) {
$fwtable = {%$fwtable, %$pv_fwtable}; snmp_comm_reindex($snmp, $device, $vlan);
my $pv_fwtable =
walk_fwtable($device, $interfaces, $port_macs, $device_ports, $vlan);
$fwtable = {%$fwtable, %$pv_fwtable};
}
} }
# now it's time to call store_node for every node discovered # now it's time to call store_node for every node discovered