From 50ed3d0b90989600045241b6e27d8c19bba4109d Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Sun, 6 Oct 2013 22:22:48 +0100 Subject: [PATCH] OK to include device ports when doing arpnip --- Netdisco/Changes | 1 + Netdisco/lib/App/Netdisco/Core/Arpnip.pm | 11 ++++------- Netdisco/lib/App/Netdisco/Util/SanityCheck.pm | 13 ++++++++----- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Netdisco/Changes b/Netdisco/Changes index cb571299..577b0311 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -11,6 +11,7 @@ * Fix SSL-proxy behaviour by using only path+query in links (W. Gould) * Avoid macsuck generated SQL bug when cleaning NULL VLAN (W. Gould) * During macsuck get VLAN from Q-BRIDGE if available (jeneric) + * OK to include device ports when doing arpnip (jeneric) 2.017000 - 2013-09-23 diff --git a/Netdisco/lib/App/Netdisco/Core/Arpnip.pm b/Netdisco/lib/App/Netdisco/Core/Arpnip.pm index f441f05e..22538ead 100644 --- a/Netdisco/lib/App/Netdisco/Core/Arpnip.pm +++ b/Netdisco/lib/App/Netdisco/Core/Arpnip.pm @@ -3,7 +3,6 @@ package App::Netdisco::Core::Arpnip; use Dancer qw/:syntax :script/; use Dancer::Plugin::DBIC 'schema'; -use App::Netdisco::Util::PortMAC 'get_port_macs'; use App::Netdisco::Util::SanityCheck 'check_mac'; use App::Netdisco::Util::DNS ':all'; use NetAddr::IP::Lite ':lower'; @@ -44,12 +43,10 @@ sub do_arpnip { return; } - my $port_macs = get_port_macs($device); - # get v4 arp table - my @v4 = _get_arps($device, $port_macs, $snmp->at_paddr, $snmp->at_netaddr); + my @v4 = _get_arps($device, $snmp->at_paddr, $snmp->at_netaddr); # get v6 neighbor cache - my @v6 = _get_arps($device, $port_macs, $snmp->ipv6_n2p_mac, $snmp->ipv6_n2p_addr); + my @v6 = _get_arps($device, $snmp->ipv6_n2p_mac, $snmp->ipv6_n2p_addr); # get directly connected networks my @subnets = _gather_subnets($device, $snmp); @@ -78,13 +75,13 @@ sub do_arpnip { # get an arp table (v4 or v6) sub _get_arps { - my ($device, $port_macs, $paddr, $netaddr) = @_; + my ($device, $paddr, $netaddr) = @_; my @arps = (); while (my ($arp, $node) = each %$paddr) { my $ip = $netaddr->{$arp}; next unless defined $ip; - next unless check_mac($device, $node, $port_macs); + next unless check_mac($device, $node); push @arps, [$node, $ip, hostname_from_ip($ip)]; } diff --git a/Netdisco/lib/App/Netdisco/Util/SanityCheck.pm b/Netdisco/lib/App/Netdisco/Util/SanityCheck.pm index 43a3fe5a..5319d840 100644 --- a/Netdisco/lib/App/Netdisco/Util/SanityCheck.pm +++ b/Netdisco/lib/App/Netdisco/Util/SanityCheck.pm @@ -44,22 +44,25 @@ MAC address is well-formed (according to common formats) MAC address is not all-zero, broadcast, CLIP, VRRP or HSRP +=back + +Optionally pass a cached set of Device port MAC addresses as the third +argument, in which case an additional check is added: + +=over 4 + =item * MAC address does not belong to an interface on any known Device =back -Optionally pass a cached set of Device port MAC addresses as the third -argument, or else C will retrieve this for itself from the -database. - =cut sub check_mac { my ($device, $node, $port_macs) = @_; - $port_macs ||= get_port_macs($device); my $mac = Net::MAC->new(mac => $node, 'die' => 0, verbose => 0); + $port_macs ||= {}; # incomplete MAC addresses (BayRS frame relay DLCI, etc) if ($mac->get_error) {