From 2cb2809dd9e20bcc110dae95a7b52d494057e2cf Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Tue, 18 Oct 2022 12:49:24 +0100 Subject: [PATCH] #935 Macsuck forces ports up/up - but a forwarding table may be present on a port that is down --- lib/App/Netdisco/Worker/Plugin/Macsuck/Nodes.pm | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/App/Netdisco/Worker/Plugin/Macsuck/Nodes.pm b/lib/App/Netdisco/Worker/Plugin/Macsuck/Nodes.pm index 01d336aa..ed389ad3 100644 --- a/lib/App/Netdisco/Worker/Plugin/Macsuck/Nodes.pm +++ b/lib/App/Netdisco/Worker/Plugin/Macsuck/Nodes.pm @@ -32,6 +32,9 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub { $device->ports(undef, {prefetch => {neighbor_alias => 'device'}})->all}; my $interfaces = $snmp->interfaces; + my $reverse_interfaces = { reverse %{ $interfaces } }; # might squash but prob not + my $i_up = $snmp->i_up; + my $i_up_admin = $snmp->i_up_admin; # get forwarding table data via basic snmp connection my $fwtable = walk_fwtable($device, $interfaces, $device_ports); @@ -60,8 +63,15 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub { # make sure this port is UP in netdisco (unless it's a lag master, # because we can still see nodes without a functioning aggregate) - $device_ports->{$port}->update({up_admin => 'up', up => 'up'}) - if not $device_ports->{$port}->is_master; + my $iid = $reverse_interfaces->{$port}; + if ($iid and not $device_ports->{$port}->is_master) { + debug sprintf ' [%s] macsuck - updating port %s status : %s/%s', + $device->ip, $port, ($i_up_admin->{$iid} || '-'), ($i_up->{$iid} || '-'); + $device_ports->{$port}->update({ + up => $i_up->{$iid}, + up_admin => $i_up_admin->{$iid}, + }); + } foreach my $mac (keys %{ $fwtable->{$vlan}->{$port} }) {