diff --git a/Netdisco/Changes b/Netdisco/Changes index 9d9b91af..5e9377da 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -6,6 +6,7 @@ * [#165] Mention system clock in docs * [#164] Workers should restart periodically * [#168] Jobs requested via web UI are treated as high priority + * [#162] Change from Net::MAC to NetAddr::MAC * Add "Run Expire Job" to the Admin Menu [BUG FIXES] diff --git a/Netdisco/META.yml b/Netdisco/META.yml index 37cac2d4..3ba0816c 100644 --- a/Netdisco/META.yml +++ b/Netdisco/META.yml @@ -59,7 +59,7 @@ requires: Net::DNS: 0.72 Net::Domain: 1.23 Net::LDAP: 0 - Net::MAC: 2.103622 + NetAddr::MAC: 0.87 NetAddr::IP: 4.068 Opcode: 1.07 Path::Class: 0.32 diff --git a/Netdisco/Makefile.PL b/Netdisco/Makefile.PL index b4a63df6..3c34f9c8 100644 --- a/Netdisco/Makefile.PL +++ b/Netdisco/Makefile.PL @@ -1,12 +1,12 @@ use inc::Module::Install; - + name 'App-Netdisco'; license 'bsd'; all_from 'lib/App/Netdisco.pm'; test_requires 'Test::More' => 0.88; test_requires 'Env::Path' => 0; - + requires 'Algorithm::Cron' => 0.07; requires 'AnyEvent' => 7.05; requires 'AnyEvent::DNS::EtcHosts' => 0; @@ -38,7 +38,7 @@ requires 'MCE' => 1.515; requires 'Net::Domain' => 1.23; requires 'Net::DNS' => 0.72; requires 'Net::LDAP' => 0; -requires 'Net::MAC' => 2.103622; +requires 'NetAddr::MAC' => 0.87; requires 'NetAddr::IP' => 4.068; requires 'Opcode' => 1.07; requires 'Path::Class' => 0.32; diff --git a/Netdisco/lib/App/Netdisco/Core/Discover.pm b/Netdisco/lib/App/Netdisco/Core/Discover.pm index 29acbac6..94257b15 100644 --- a/Netdisco/lib/App/Netdisco/Core/Discover.pm +++ b/Netdisco/lib/App/Netdisco/Core/Discover.pm @@ -10,7 +10,7 @@ use NetAddr::IP::Lite ':lower'; use List::MoreUtils (); use Encode; use Try::Tiny; -use Net::MAC; +use NetAddr::MAC; use base 'Exporter'; our @EXPORT = (); @@ -754,9 +754,9 @@ sub store_neighbors { $device->ip, $remote_ip, $port, $remote_id; if (!defined $neigh) { - my $mac = Net::MAC->new(mac => $remote_id, 'die' => 0, verbose => 0); - if (not $mac->get_error) { - $neigh = $devices->single({mac => $mac->as_IEEE()}); + my $mac = NetAddr::MAC->new(mac => $remote_id); + if ($mac and not $mac->errstr) { + $neigh = $devices->single({mac => $mac->as_microsoft()}); } } @@ -765,13 +765,13 @@ sub store_neighbors { # "myswitchname(012345-012345)" if (!defined $neigh) { (my $tmpid = $remote_id) =~ s/.([0-9a-f]{6})-([0-9a-f]{6})./$1$2/; - my $mac = Net::MAC->new(mac => $tmpid, 'die' => 0, verbose => 0); + my $mac = NetAddr::MAC->new(mac => $tmpid); - if (not $mac->get_error) { + if ($mac and not $mac->errstr) { info sprintf '[%s] neigh - found neighbor %s by MAC %s', - $device->ip, $remote_id, $mac->as_IEEE(); - $neigh = $devices->single({mac => $mac->as_IEEE()}); + $device->ip, $remote_id, $mac->as_microsoft(); + $neigh = $devices->single({mac => $mac->as_microsoft()}); } } diff --git a/Netdisco/lib/App/Netdisco/DB/Result/DevicePort.pm b/Netdisco/lib/App/Netdisco/DB/Result/DevicePort.pm index dcb40579..93b94367 100644 --- a/Netdisco/lib/App/Netdisco/DB/Result/DevicePort.pm +++ b/Netdisco/lib/App/Netdisco/DB/Result/DevicePort.pm @@ -7,7 +7,7 @@ package App::Netdisco::DB::Result::DevicePort; use strict; use warnings; -use Net::MAC; +use NetAddr::MAC; use MIME::Base64 'encode_base64url'; @@ -339,10 +339,10 @@ sub base64url_port { return encode_base64url((shift)->port) } =head2 net_mac -Returns the C column instantiated into a L object. +Returns the C column instantiated into a L object. =cut -sub net_mac { return Net::MAC->new(mac => (shift)->mac) } +sub net_mac { return NetAddr::MAC->new(mac => (shift)->mac) } 1; diff --git a/Netdisco/lib/App/Netdisco/DB/Result/Node.pm b/Netdisco/lib/App/Netdisco/DB/Result/Node.pm index d71bf24a..88de7544 100644 --- a/Netdisco/lib/App/Netdisco/DB/Result/Node.pm +++ b/Netdisco/lib/App/Netdisco/DB/Result/Node.pm @@ -7,7 +7,7 @@ package App::Netdisco::DB::Result::Node; use strict; use warnings; -use Net::MAC; +use NetAddr::MAC; use base 'DBIx::Class::Core'; __PACKAGE__->table("node"); @@ -175,10 +175,10 @@ sub time_last_stamp { return (shift)->get_column('time_last_stamp') } =head2 net_mac -Returns the C column instantiated into a L object. +Returns the C column instantiated into a L object. =cut -sub net_mac { return Net::MAC->new(mac => (shift)->mac) } +sub net_mac { return NetAddr::MAC->new(mac => (shift)->mac) } 1; diff --git a/Netdisco/lib/App/Netdisco/DB/Result/NodeIp.pm b/Netdisco/lib/App/Netdisco/DB/Result/NodeIp.pm index 504c2f7f..0a3f6a77 100644 --- a/Netdisco/lib/App/Netdisco/DB/Result/NodeIp.pm +++ b/Netdisco/lib/App/Netdisco/DB/Result/NodeIp.pm @@ -7,7 +7,7 @@ package App::Netdisco::DB::Result::NodeIp; use strict; use warnings; -use Net::MAC; +use NetAddr::MAC; use base 'DBIx::Class::Core'; __PACKAGE__->table("node_ip"); @@ -221,10 +221,10 @@ sub time_last_stamp { return (shift)->get_column('time_last_stamp') } =head2 net_mac -Returns the C column instantiated into a L object. +Returns the C column instantiated into a L object. =cut -sub net_mac { return Net::MAC->new(mac => (shift)->mac) } +sub net_mac { return NetAddr::MAC->new(mac => (shift)->mac) } 1; diff --git a/Netdisco/lib/App/Netdisco/DB/Result/NodeNbt.pm b/Netdisco/lib/App/Netdisco/DB/Result/NodeNbt.pm index 7790b9ae..e8203dc9 100644 --- a/Netdisco/lib/App/Netdisco/DB/Result/NodeNbt.pm +++ b/Netdisco/lib/App/Netdisco/DB/Result/NodeNbt.pm @@ -7,7 +7,7 @@ package App::Netdisco::DB::Result::NodeNbt; use strict; use warnings; -use Net::MAC; +use NetAddr::MAC; use base 'DBIx::Class::Core'; __PACKAGE__->table("node_nbt"); @@ -178,10 +178,10 @@ sub time_last_stamp { return (shift)->get_column('time_last_stamp') } =head2 net_mac -Returns the C column instantiated into a L object. +Returns the C column instantiated into a L object. =cut -sub net_mac { return Net::MAC->new(mac => (shift)->mac) } +sub net_mac { return NetAddr::MAC->new(mac => (shift)->mac) } 1; diff --git a/Netdisco/lib/App/Netdisco/DB/Result/NodeWireless.pm b/Netdisco/lib/App/Netdisco/DB/Result/NodeWireless.pm index e43244b3..c2e8aad0 100644 --- a/Netdisco/lib/App/Netdisco/DB/Result/NodeWireless.pm +++ b/Netdisco/lib/App/Netdisco/DB/Result/NodeWireless.pm @@ -7,7 +7,7 @@ package App::Netdisco::DB::Result::NodeWireless; use strict; use warnings; -use Net::MAC; +use NetAddr::MAC; use base 'DBIx::Class::Core'; __PACKAGE__->table("node_wireless"); @@ -87,10 +87,10 @@ __PACKAGE__->belongs_to( node => 'App::Netdisco::DB::Result::Node', =head2 net_mac -Returns the C column instantiated into a L object. +Returns the C column instantiated into a L object. =cut -sub net_mac { return Net::MAC->new(mac => (shift)->mac) } +sub net_mac { return NetAddr::MAC->new(mac => (shift)->mac) } 1; diff --git a/Netdisco/lib/App/Netdisco/Manual/Developing.pod b/Netdisco/lib/App/Netdisco/Manual/Developing.pod index 61c63a13..37a09a23 100644 --- a/Netdisco/lib/App/Netdisco/Manual/Developing.pod +++ b/Netdisco/lib/App/Netdisco/Manual/Developing.pod @@ -14,10 +14,10 @@ the L. Then: su - netdisco && cd $HOME mkdir git && cd git - + git clone git://git.code.sf.net/p/netdisco/netdisco-ng netdisco-ng cd netdisco-ng/Netdisco - + DBIC_TRACE=1 ~/bin/localenv plackup -R share,lib -p 5001 bin/netdisco-web-fg The above creates you a git clone (change the URL if you're a Netdisco @@ -259,7 +259,7 @@ Compared to the current Netdisco, the handler routines are very small. This is because (a) they don't include any HTML - this is delegated to a template, and (b) they don't include an SQL - this is delegated to DBIx::Class. Small routines are more manageable, and easier to maintain. You'll also notice use -of modules such as L and L to simplify and make +of modules such as L and L to simplify and make more robust the handling of data. In fact, many sections of the web application have been factored out into diff --git a/Netdisco/lib/App/Netdisco/Util/Node.pm b/Netdisco/lib/App/Netdisco/Util/Node.pm index ac87ebe1..44c43bcc 100644 --- a/Netdisco/lib/App/Netdisco/Util/Node.pm +++ b/Netdisco/lib/App/Netdisco/Util/Node.pm @@ -3,7 +3,7 @@ package App::Netdisco::Util::Node; use Dancer qw/:syntax :script/; use Dancer::Plugin::DBIC 'schema'; -use Net::MAC; +use NetAddr::MAC; use App::Netdisco::Util::Permission 'check_acl'; use base 'Exporter'; @@ -66,23 +66,23 @@ MAC address does not belong to an interface on any known Device sub check_mac { my ($device, $node, $port_macs) = @_; - my $mac = Net::MAC->new(mac => $node, 'die' => 0, verbose => 0); + my $mac = NetAddr::MAC->new(mac => $node); my $devip = (ref $device ? $device->ip : ''); $port_macs ||= {}; # incomplete MAC addresses (BayRS frame relay DLCI, etc) - if ($mac->get_error) { + if (!defined $mac or $mac->errstr) { debug sprintf ' [%s] check_mac - mac [%s] malformed - skipping', $devip, $node; return 0; } else { # lower case, hex, colon delimited, 8-bit groups - $node = lc $mac->as_IEEE; + $node = lc $mac->as_microsoft; } # broadcast MAC addresses - return 0 if $node eq 'ff:ff:ff:ff:ff:ff'; + return 0 if $mac->is_broadcast; # all-zero MAC addresses return 0 if $node eq '00:00:00:00:00:00'; @@ -91,21 +91,21 @@ sub check_mac { return 0 if $node eq '00:00:00:00:00:01'; # multicast - if ($node =~ m/^[0-9a-f](?:1|3|5|7|9|b|d|f):/) { + if ($mac->is_multicast and not $mac->is_msnlb) { debug sprintf ' [%s] check_mac - multicast mac [%s] - skipping', $devip, $node; return 0; } # VRRP - if (index($node, '00:00:5e:00:01:') == 0) { + if ($mac->is_vrrp) { debug sprintf ' [%s] check_mac - VRRP mac [%s] - skipping', $devip, $node; return 0; } # HSRP - if (index($node, '00:00:0c:07:ac:') == 0) { + if ($mac->is_hsrp or $mac->is_hsrp2) { debug sprintf ' [%s] check_mac - HSRP mac [%s] - skipping', $devip, $node; return 0; diff --git a/Netdisco/lib/App/Netdisco/Web/Device.pm b/Netdisco/lib/App/Netdisco/Web/Device.pm index 89e97cfe..23ea7caa 100644 --- a/Netdisco/lib/App/Netdisco/Web/Device.pm +++ b/Netdisco/lib/App/Netdisco/Web/Device.pm @@ -129,8 +129,7 @@ hook 'before_template' => sub { $tokens->{device_ports}->query_param($key, params->{$key}); } - # for Net::MAC method - $tokens->{mac_format_call} = 'as_'. params->{'mac_format'} + $tokens->{mac_format_call} = 'as_'. lc(params->{'mac_format'}) if params->{'mac_format'}; foreach my $col (@{ var('port_columns') }) { diff --git a/Netdisco/lib/App/Netdisco/Web/Plugin/Search/Node.pm b/Netdisco/lib/App/Netdisco/Web/Plugin/Search/Node.pm index 7c312355..a4ef1280 100644 --- a/Netdisco/lib/App/Netdisco/Web/Plugin/Search/Node.pm +++ b/Netdisco/lib/App/Netdisco/Web/Plugin/Search/Node.pm @@ -6,7 +6,7 @@ use Dancer::Plugin::DBIC; use Dancer::Plugin::Auth::Extensible; use NetAddr::IP::Lite ':lower'; -use Net::MAC (); +use NetAddr::MAC (); use App::Netdisco::Web::Plugin; use App::Netdisco::Util::Web 'sql_match'; @@ -20,9 +20,9 @@ ajax '/ajax/content/search/node' => require_login sub { content_type('text/html'); my $agenot = param('age_invert') || '0'; - my ( $start, $end ) = param('daterange') =~ /(\d+-\d+-\d+)/gmx; + my ( $start, $end ) = param('daterange') =~ m/(\d+-\d+-\d+)/gmx; - my $mac = Net::MAC->new(mac => $node, 'die' => 0, verbose => 0); + my $mac = NetAddr::MAC->new(mac => $node); my @active = (param('archived') ? () : (-bool => 'active')); my @times = (); @@ -48,7 +48,7 @@ ajax '/ajax/content/search/node' => require_login sub { my @where_mac = ($using_wildcards ? \['me.mac::text ILIKE ?', $likeval] - : ($mac->get_error ? \'0=1' : ('me.mac' => $mac->as_IEEE)) ); + : ((!defined $mac or $mac->errstr) ? \'0=1' : ('me.mac' => $mac->as_microsoft)) ); my $sightings = schema('netdisco')->resultset('Node') ->search({-and => [@where_mac, @active, @times]}, { diff --git a/Netdisco/share/views/sidebar/device/ports.tt b/Netdisco/share/views/sidebar/device/ports.tt index 5618b3ee..88213dc3 100644 --- a/Netdisco/share/views/sidebar/device/ports.tt +++ b/Netdisco/share/views/sidebar/device/ports.tt @@ -125,9 +125,10 @@
  • MAC address format:
  • [% FOREACH item IN vars.connected_properties %] diff --git a/Netdisco/share/views/sidebar/search/node.tt b/Netdisco/share/views/sidebar/search/node.tt index a73eb989..19368224 100644 --- a/Netdisco/share/views/sidebar/search/node.tt +++ b/Netdisco/share/views/sidebar/search/node.tt @@ -55,9 +55,10 @@
    MAC address format: