From 62b55f71ca3ec9061776281a98ab47687a1d2405 Mon Sep 17 00:00:00 2001 From: "Eric A. Miller" Date: Mon, 4 Nov 2013 23:01:08 -0500 Subject: [PATCH] Add Nodes with multiple IP addresses report --- Netdisco/Changes | 1 + .../lib/App/Netdisco/DB/ResultSet/Node.pm | 64 +++++++++++++++++++ .../Web/Plugin/Report/NodeMultiIPs.pm | 35 ++++++++++ Netdisco/share/config.yml | 1 + .../share/views/ajax/report/nodemultiips.tt | 24 +++++++ .../views/ajax/report/nodemultiips_csv.tt | 13 ++++ 6 files changed, 138 insertions(+) create mode 100644 Netdisco/lib/App/Netdisco/Web/Plugin/Report/NodeMultiIPs.pm create mode 100644 Netdisco/share/views/ajax/report/nodemultiips.tt create mode 100644 Netdisco/share/views/ajax/report/nodemultiips_csv.tt diff --git a/Netdisco/Changes b/Netdisco/Changes index a68ec753..6c6af16f 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -2,6 +2,7 @@ [NEW FEATURES] * Add Device PoE status report + * Add Nodes with multiple IP addresses report [ENHANCEMENTS] diff --git a/Netdisco/lib/App/Netdisco/DB/ResultSet/Node.pm b/Netdisco/lib/App/Netdisco/DB/ResultSet/Node.pm index acdf8761..dc031e60 100644 --- a/Netdisco/lib/App/Netdisco/DB/ResultSet/Node.pm +++ b/Netdisco/lib/App/Netdisco/DB/ResultSet/Node.pm @@ -125,4 +125,68 @@ sub delete { } } +=head2 with_multi_ips_as_hashref + +This is a modifier for C which returns a list of hash references +for nodes within the search criteria with multiple IP addresses. Each hash +reference contains the keys: + +=over 4 + +=item mac + +Node MAC address. + +=item switch + +IP address of the device where the node is attached. + +=item port + +Port on the device where the node is attached. + +=item dns + +DNS name of the device where the node is attached. + +=item name + +C of the device where the node is attached. + +=item ip_count + +Count of IP addresses associated with the node. + +=item vendor + +Vendor string based upon the node OUI. + +=back + +=cut + +sub with_multi_ips_as_hashref { + my ( $rs, $cond, $attrs ) = @_; + + my @return = $rs->search( + {}, + { result_class => 'DBIx::Class::ResultClass::HashRefInflator', + select => [ 'mac', 'switch', 'port' ], + join => [qw/device ips oui/], + '+columns' => [ + { 'dns' => 'device.dns' }, + { 'name' => 'device.name' }, + { 'ip_count' => { count => 'ips.ip' } }, + { 'vendor' => 'oui.company' } + ], + group_by => + [qw/ me.mac me.switch me.port device.dns device.name oui.company/], + having => \[ 'count(ips.ip) > ?', [ count => 1 ] ], + order_by => { -desc => [qw/count/] }, + } + )->all; + + return \@return; +} + 1; diff --git a/Netdisco/lib/App/Netdisco/Web/Plugin/Report/NodeMultiIPs.pm b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/NodeMultiIPs.pm new file mode 100644 index 00000000..4a1dccab --- /dev/null +++ b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/NodeMultiIPs.pm @@ -0,0 +1,35 @@ +package App::Netdisco::Web::Plugin::Report::NodeMultiIPs; + +use Dancer ':syntax'; +use Dancer::Plugin::DBIC; +use Dancer::Plugin::Auth::Extensible; + +use App::Netdisco::Web::Plugin; + +register_report( + { category => 'Node', + tag => 'nodemultiips', + label => 'Nodes with multiple active IP addresses', + provides_csv => 1, + } +); + +get '/ajax/content/report/nodemultiips' => require_login sub { + my $results = schema('netdisco')->resultset('Node') + ->with_multi_ips_as_hashref; + + return unless scalar $results; + + if ( request->is_ajax ) { + template 'ajax/report/nodemultiips.tt', { results => $results, }, + { layout => undef }; + } + else { + header( 'Content-Type' => 'text/comma-separated-values' ); + template 'ajax/report/nodemultiips_csv.tt', + { results => $results, }, + { layout => undef }; + } +}; + +1; diff --git a/Netdisco/share/config.yml b/Netdisco/share/config.yml index 08ac901c..7fd73b16 100644 --- a/Netdisco/share/config.yml +++ b/Netdisco/share/config.yml @@ -40,6 +40,7 @@ web_plugins: - Report::DeviceByLocation - Report::DevicePoeStatus - Report::DuplexMismatch + - Report::NodeMultiIPs - Report::SsidInventory - Report::VlanInventory - AdminTask::JobQueue diff --git a/Netdisco/share/views/ajax/report/nodemultiips.tt b/Netdisco/share/views/ajax/report/nodemultiips.tt new file mode 100644 index 00000000..e810a8f1 --- /dev/null +++ b/Netdisco/share/views/ajax/report/nodemultiips.tt @@ -0,0 +1,24 @@ +[% USE Number.Format %] + + + + + + + + + + + [% FOREACH row IN results %] + + + + + + [% END %] + +
MACVendorLocationIPs
+ [% row.mac.upper | html_entity %] + [% row.vendor | html_entity %] + [% row.dns || row.name || row.switch | html_entity %] ([% row.port | html_entity %])[% row.ip_count | format_number %]
+ diff --git a/Netdisco/share/views/ajax/report/nodemultiips_csv.tt b/Netdisco/share/views/ajax/report/nodemultiips_csv.tt new file mode 100644 index 00000000..b0d70f41 --- /dev/null +++ b/Netdisco/share/views/ajax/report/nodemultiips_csv.tt @@ -0,0 +1,13 @@ +[% USE CSV -%] +[% CSV.dump([ 'MAC' 'Vendor' 'Switch' 'Port' 'IPs' ]) %] + +[% FOREACH row IN results %] + [% mylist = [] %] + [% mylist.push(row.mac.upper) %] + [% mylist.push(row.vendor) %] + [% mylist.push(row.dns || row.name || row.switch) %] + [% mylist.push(row.port) %] + [% mylist.push(row.ip_count) %] + [% CSV.dump(mylist) %] + +[% END %]