diff --git a/Netdisco/Changes b/Netdisco/Changes index b019cc3c..d9d42136 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -4,6 +4,7 @@ * Add Device PoE status report * Add Nodes with multiple IP addresses report * Add Device addresses with DNS entries report + * Add Ports with multiple nodes attached report [ENHANCEMENTS] diff --git a/Netdisco/lib/App/Netdisco/Web/Plugin/Report/PortMultiNodes.pm b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/PortMultiNodes.pm new file mode 100644 index 00000000..e0d9af15 --- /dev/null +++ b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/PortMultiNodes.pm @@ -0,0 +1,48 @@ +package App::Netdisco::Web::Plugin::Report::PortMultiNodes; + +use Dancer ':syntax'; +use Dancer::Plugin::DBIC; +use Dancer::Plugin::Auth::Extensible; + +use App::Netdisco::Web::Plugin; + +register_report( + { category => 'Port', + tag => 'portmultinodes', + label => 'Ports with multiple nodes attached', + provides_csv => 1, + } +); + +get '/ajax/content/report/portmultinodes' => require_login sub { + my @results = schema('netdisco')->resultset('Device')->search( + { 'ports.remote_ip' => undef, 'nodes.active' => 1 }, + { result_class => 'DBIx::Class::ResultClass::HashRefInflator', + select => [ 'ip', 'dns', 'name' ], + join => { 'ports' => 'nodes' }, + '+columns' => [ + { 'port' => 'ports.port' }, + { 'description' => 'ports.name' }, + { 'mac_count' => { count => 'nodes.mac' } }, + ], + group_by => [qw/me.ip me.dns me.name ports.port ports.name/], + having => \[ 'count(nodes.mac) > ?', [ count => 1 ] ], + order_by => { -desc => [qw/count/] }, + } + )->all; + + return unless scalar @results; + + if ( request->is_ajax ) { + template 'ajax/report/portmultinodes.tt', { results => \@results, }, + { layout => undef }; + } + else { + header( 'Content-Type' => 'text/comma-separated-values' ); + template 'ajax/report/portmultinodes_csv.tt', + { results => \@results, }, + { layout => undef }; + } +}; + +1; diff --git a/Netdisco/share/config.yml b/Netdisco/share/config.yml index a6193b95..24fc8652 100644 --- a/Netdisco/share/config.yml +++ b/Netdisco/share/config.yml @@ -33,6 +33,7 @@ trust_x_remote_user: false path: '/' web_plugins: - Inventory + - Report::PortMultiNodes - Report::PortUtilization - Report::ApChannelDist - Report::ApRadioChannelPower diff --git a/Netdisco/share/views/ajax/report/portmultinodes.tt b/Netdisco/share/views/ajax/report/portmultinodes.tt new file mode 100644 index 00000000..a0c8cf9a --- /dev/null +++ b/Netdisco/share/views/ajax/report/portmultinodes.tt @@ -0,0 +1,23 @@ +[% USE Number.Format %] +
| Device | +Port | +Port Description | +Node Count | +
|---|---|---|---|
| [% row.dns || row.name || row.ip | html_entity %] | ++ [% row.port | html_entity %] | +[% row.description | html_entity %] | +[% row.mac_count | format_number %] | +