diff --git a/Netdisco/Changes b/Netdisco/Changes index 07025b6c..c49c5c1e 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -1,9 +1,24 @@ -2.029013 - +2.029013_002 - 2014-11-14 + + [ENHANCEMENTS] + + * [#161] Updated IOS-XR SSHCollector + * [#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 + * [#159] Macsuck archive behaviour same as ND1 (unseen nodes remain active) + * [#170] Show device SNMP::Info class in web interface + * Add "Run Expire Job" to the Admin Menu [BUG FIXES] * Fix for latest DBIx::Class (deploy) * Fix for latest Dancer (YAML::XS) + * [#160] Job Queue fatal error on num_slots + * [#157] Device Port Log being emptied by device discover + * [#156] Only delete node_ip and node_nbt when no active nodes reference + * [#169] Remove ref to force install of Dancer and DBIC 2.029012 - 2014-10-09 diff --git a/Netdisco/META.yml b/Netdisco/META.yml index d06d270b..6b30d622 100644 --- a/Netdisco/META.yml +++ b/Netdisco/META.yml @@ -59,8 +59,8 @@ requires: Net::DNS: 0.72 Net::Domain: 1.23 Net::LDAP: 0 - Net::MAC: 2.103622 NetAddr::IP: 4.068 + NetAddr::MAC: 0.87 Opcode: 1.07 Path::Class: 0.32 Plack: 1.0023 @@ -91,4 +91,4 @@ resources: homepage: http://netdisco.org/ license: http://opensource.org/licenses/bsd-license.php repository: git://git.code.sf.net/p/netdisco/netdisco-ng -version: 2.029012 +version: 2.029013_002 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.pm b/Netdisco/lib/App/Netdisco.pm index 38ae6be4..12d998ad 100644 --- a/Netdisco/lib/App/Netdisco.pm +++ b/Netdisco/lib/App/Netdisco.pm @@ -4,7 +4,7 @@ use strict; use warnings; use 5.010_000; -our $VERSION = '2.029012'; +our $VERSION = '2.029013_002'; use App::Netdisco::Configuration; use Module::Find (); @@ -75,7 +75,8 @@ On Fedora/Red-Hat: root:~# yum install perl-core perl-DBD-Pg net-snmp-perl make automake gcc -With those installed, we can proceed... +With those installed, next check that your system's clock is correct. Then, we +can proceed... Create a user on your system called C if one does not already exist. We'll install Netdisco and its dependencies into this user's home area, which @@ -123,7 +124,6 @@ install Netdisco and its dependencies into the C user's home area su - netdisco curl -L http://cpanmin.us/ | perl - --notest --local-lib ~/perl5 App::Netdisco - ~/bin/localenv cpanm --notest --force Dancer@1.3126 DBIx::Class@0.08270 Link some of the newly installed apps into a handy location: @@ -203,9 +203,6 @@ Notes|App::Netdisco::Manual::ReleaseNotes>. Then, the process is as follows: # upgrade Netdisco ~/bin/localenv cpanm --notest App::Netdisco - # workaround for current upstream bug - ~/bin/localenv cpanm --notest --force Dancer@1.3126 DBIx::Class@0.08270 - # apply database schema updates ~/bin/netdisco-deploy 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/Core/Macsuck.pm b/Netdisco/lib/App/Netdisco/Core/Macsuck.pm index 042f28e9..1cde1cc4 100644 --- a/Netdisco/lib/App/Netdisco/Core/Macsuck.pm +++ b/Netdisco/lib/App/Netdisco/Core/Macsuck.pm @@ -112,10 +112,15 @@ sub do_macsuck { $ip, $total_nodes; # a use for $now ... need to archive dissapeared nodes - my $archived = schema('netdisco')->resultset('Node')->search({ - switch => $ip, - time_last => { '<' => \$now }, - })->update({ active => \'false' }); + my $archived = 0; + + if (setting('node_freshness')) { + $archived = schema('netdisco')->resultset('Node')->search({ + switch => $ip, + time_last => \[ "< ($now - ?::interval)", + setting('node_freshness') .' minutes' ], + })->update({ active => \'false' }); + } debug sprintf ' [%s] macsuck - removed %d fwd table entries to archive', $ip, $archived; 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/DB/ResultSet/DevicePort.pm b/Netdisco/lib/App/Netdisco/DB/ResultSet/DevicePort.pm index 91ee2682..4b471617 100644 --- a/Netdisco/lib/App/Netdisco/DB/ResultSet/DevicePort.pm +++ b/Netdisco/lib/App/Netdisco/DB/ResultSet/DevicePort.pm @@ -157,7 +157,6 @@ sub delete { DevicePortVlan DevicePortWireless DevicePortSsid - DevicePortLog /) { $schema->resultset($set)->search( { ip => { '-in' => $ports->as_query }}, diff --git a/Netdisco/lib/App/Netdisco/DB/ResultSet/Node.pm b/Netdisco/lib/App/Netdisco/DB/ResultSet/Node.pm index 3a143243..4b9c4b5b 100644 --- a/Netdisco/lib/App/Netdisco/DB/ResultSet/Node.pm +++ b/Netdisco/lib/App/Netdisco/DB/ResultSet/Node.pm @@ -109,9 +109,30 @@ sub delete { return 0E0; } else { + # for node_ip and node_nbt *only* delete if there are no longer + # any active nodes referencing the IP or NBT (hence 2nd IN clause). foreach my $set (qw/ NodeIp NodeNbt + /) { + $schema->resultset($set)->search({ + '-and' => [ + 'me.mac' => { '-in' => $nodes->as_query }, + 'me.mac' => { '-in' => $schema->resultset($set)->search({ + -bool => 'nodes.active', + }, + { + columns => 'mac', + join => 'nodes', + group_by => 'me.mac', + having => \[ 'count(nodes.mac) = 0' ], + })->as_query, + }, + ], + })->delete; + } + + foreach my $set (qw/ NodeMonitor NodeWireless /) { diff --git a/Netdisco/lib/App/Netdisco/Daemon/Worker/Common.pm b/Netdisco/lib/App/Netdisco/Daemon/Worker/Common.pm index 437be666..4b217d2c 100644 --- a/Netdisco/lib/App/Netdisco/Daemon/Worker/Common.pm +++ b/Netdisco/lib/App/Netdisco/Daemon/Worker/Common.pm @@ -10,6 +10,8 @@ use namespace::clean; use App::Netdisco::JobQueue qw/jq_defer jq_complete/; +sub worker_begin { (shift)->{started} = time } + sub worker_body { my $self = shift; my $wid = $self->wid; @@ -38,6 +40,14 @@ sub worker_body { }; $self->close_job($job); + + # restart worker once a day. + # relies on the worker seeing a job at least every hour. + my $hour = [localtime()]->[2]; + if ($wid and (time >= ($self->{started} + 86400)) + and ($hour == ($wid % 24))) { + $self->exit(0, "recycling worker $wid"); + } } } diff --git a/Netdisco/lib/App/Netdisco/JobQueue/PostgreSQL.pm b/Netdisco/lib/App/Netdisco/JobQueue/PostgreSQL.pm index 02d77d3a..c4989792 100644 --- a/Netdisco/lib/App/Netdisco/JobQueue/PostgreSQL.pm +++ b/Netdisco/lib/App/Netdisco/JobQueue/PostgreSQL.pm @@ -25,26 +25,40 @@ our @EXPORT_OK = qw/ /; our %EXPORT_TAGS = ( all => \@EXPORT_OK ); -sub jq_getsome { - my ($num_slots, $prio) = @_; - return () if defined $num_slots and $num_slots eq '0'; - $num_slots ||= 1; - $prio ||= 'normal'; - my @returned = (); +sub _getsome { + my ($num_slots, $where) = @_; + return () if ((!defined $num_slots) or ($num_slots < 1)); + return () if ((!defined $where) or (ref {} ne ref $where)); my $rs = schema('netdisco')->resultset('Admin') ->search( - {status => 'queued', action => { -in => setting('job_prio')->{$prio} } }, - {order_by => 'random()', rows => ($num_slots || 1)}, + { status => 'queued', %$where }, + { order_by => 'random()', rows => $num_slots }, ); + my @returned = (); while (my $job = $rs->next) { push @returned, App::Netdisco::Daemon::Job->new({ $job->get_columns }); } return @returned; } -sub jq_getsomep { return jq_getsome(shift, 'high') } +sub jq_getsome { + return _getsome(shift, + { action => { -in => setting('job_prio')->{'normal'} } } + ); +} + +sub jq_getsomep { + return _getsome(shift, { + -or => [{ + username => { '!=' => undef }, + action => { -in => setting('job_prio')->{'normal'} }, + },{ + action => { -in => setting('job_prio')->{'high'} }, + }], + }); +} sub jq_locked { my $fqdn = hostfqdn || 'localhost'; diff --git a/Netdisco/lib/App/Netdisco/Manual/Configuration.pod b/Netdisco/lib/App/Netdisco/Manual/Configuration.pod index ebee0c90..8122008f 100644 --- a/Netdisco/lib/App/Netdisco/Manual/Configuration.pod +++ b/Netdisco/lib/App/Netdisco/Manual/Configuration.pod @@ -741,6 +741,21 @@ Value: Number. Default: 1. Seconds nbtstat will wait for a response before time out. Accepts fractional seconds as well as integers. +=head3 C + +Value: Number of Minutes. Default: 0 + +Controls the behaviour of Netdisco when a node (workstation, printer, etc) has +disappeared from the network (device MAC address tables). + +If set to 0, the default, nodes will remain on the last-seen switch port until +"C" days have passed (when they'll be deleted if you run the +Expire job). This is the same behaviour as Netdisco 1. + +Set to a number of minutes to enforce some kind of ageing on this data. For +example you could set to 60 to match the default macsuck schedule, meaning +nodes are archived if they're not in the device tables at the time of polling. + =head3 C Value: Number of Days. Default: 60 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/Manual/ReleaseNotes.pod b/Netdisco/lib/App/Netdisco/Manual/ReleaseNotes.pod index 28408b0d..69906ad9 100644 --- a/Netdisco/lib/App/Netdisco/Manual/ReleaseNotes.pod +++ b/Netdisco/lib/App/Netdisco/Manual/ReleaseNotes.pod @@ -36,6 +36,15 @@ but they are backwards compatible. =back +=head1 2.029013_002 + +=head2 General Notices + +The node archiving behaviour of Netdisco 2 has until now been accidentally +different to that in Netdisco 1. This has now been fixed. See the new +"C" configuration setting if you wish to revert or tune this +behaviour. + =head1 2.029010 =head2 General Notices diff --git a/Netdisco/lib/App/Netdisco/SSHCollector/Platform/IOSXR.pm b/Netdisco/lib/App/Netdisco/SSHCollector/Platform/IOSXR.pm index 9e893d93..e101c765 100644 --- a/Netdisco/lib/App/Netdisco/SSHCollector/Platform/IOSXR.pm +++ b/Netdisco/lib/App/Netdisco/SSHCollector/Platform/IOSXR.pm @@ -8,7 +8,7 @@ App::Netdisco::SSHCollector::Platform::IOSXR =head1 DESCRIPTION -Collect ARP entries from Cisco IOS XR devices. +Collect ARP entries from Cisco IOSXR devices. =cut @@ -16,7 +16,6 @@ use strict; use warnings; use Dancer ':script'; -use Expect; use Moo; =head1 PUBLIC METHODS @@ -36,28 +35,19 @@ sub arpnip { my ($self, $hostlabel, $ssh, @args) = @_; debug "$hostlabel $$ arpnip()"; + my @data = $ssh->capture("show arp vrf all"); - my ($pty, $pid) = $ssh->open2pty or die "unable to run remote command"; - my $expect = Expect->init($pty); - - my ($pos, $error, $match, $before, $after); - my $prompt = qr/#/; - - ($pos, $error, $match, $before, $after) = $expect->expect(10, -re, $prompt); - - $expect->send("terminal length 0\n"); - ($pos, $error, $match, $before, $after) = $expect->expect(5, -re, $prompt); - + chomp @data; my @arpentries; - $expect->send("show arp vrf all\n"); - ($pos, $error, $match, $before, $after) = $expect->expect(5, -re, $prompt); - # 0.0.0.0 00:00:00 0000.0000.0000 Dynamic ARPA GigabitEthernet0/0/0/0 - for (split(/\n/, $before)){ + foreach (@data) { + my ($ip, $age, $mac, $state, $t, $iface) = split(/\s+/); - if ($ip =~ m/(\d{1,3}\.){3}\d{1,3}/ && $mac =~ m/[0-9a-f.]+/i) { - push(@arpentries, { ip => $ip, mac => $mac }); + + if ($ip =~ m/(\d{1,3}\.){3}\d{1,3}/ + && $mac =~ m/([0-9a-f]{4}\.){2}[0-9a-f]{4}/i) { + push(@arpentries, { ip => $ip, mac => $mac }); } } 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/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/config.yml b/Netdisco/share/config.yml index 163beeec..8cd97367 100644 --- a/Netdisco/share/config.yml +++ b/Netdisco/share/config.yml @@ -198,6 +198,7 @@ nbtstat_only: [] nbtstat_max_age: 7 nbtstat_interval: 0.02 nbtstat_timeout: 1 +node_freshness: 0 expire_devices: 60 expire_nodes: 90 expire_nodes_archive: 60 diff --git a/Netdisco/share/views/ajax/device/details.tt b/Netdisco/share/views/ajax/device/details.tt index 6d27a2b6..7c4ca497 100644 --- a/Netdisco/share/views/ajax/device/details.tt +++ b/Netdisco/share/views/ajax/device/details.tt @@ -83,14 +83,18 @@ Administration - + SSH - + Telnet - + Web + + SNMP Class + [% d.snmp_class | html_entity %] + Uptime [% d.uptime_age | html_entity %] diff --git a/Netdisco/share/views/layouts/main.tt b/Netdisco/share/views/layouts/main.tt index b584dc70..e8e6e9be 100644 --- a/Netdisco/share/views/layouts/main.tt +++ b/Netdisco/share/views/layouts/main.tt @@ -122,6 +122,11 @@ +
  • +
    + +
    +
  • [% IF settings._admin_tasks.size %]
  • [% FOREACH ai IN settings._admin_order %] diff --git a/Netdisco/share/views/sidebar/device/ports.tt b/Netdisco/share/views/sidebar/device/ports.tt index 57e56740..b34deed0 100644 --- a/Netdisco/share/views/sidebar/device/ports.tt +++ b/Netdisco/share/views/sidebar/device/ports.tt @@ -128,9 +128,10 @@
  • MAC address format:
  • 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: