From 3ec84161ae851325252cf39a764f46b32cdc95c2 Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Tue, 25 Apr 2017 12:26:09 +0100 Subject: [PATCH] New report for Port VLAN Mismatches (M. Bernstein) --- Changes | 6 +++ .../DB/Result/Virtual/PortVLANMismatch.pm | 46 ++++++++++++++++ .../Web/Plugin/Report/PortVLANMismatch.pm | 33 ++++++++++++ share/config.yml | 1 + share/views/ajax/report/portvlanmismatch.tt | 52 +++++++++++++++++++ 5 files changed, 138 insertions(+) create mode 100644 lib/App/Netdisco/DB/Result/Virtual/PortVLANMismatch.pm create mode 100644 lib/App/Netdisco/Web/Plugin/Report/PortVLANMismatch.pm create mode 100644 share/views/ajax/report/portvlanmismatch.tt diff --git a/Changes b/Changes index 75bccf20..632d17ab 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,9 @@ +2.035005 - + + [NEW FEATURES] + + * New report for Port VLAN Mismatches (M. Bernstein) + 2.035004 - 2017-04-25 [BUG FIXES] diff --git a/lib/App/Netdisco/DB/Result/Virtual/PortVLANMismatch.pm b/lib/App/Netdisco/DB/Result/Virtual/PortVLANMismatch.pm new file mode 100644 index 00000000..977406c3 --- /dev/null +++ b/lib/App/Netdisco/DB/Result/Virtual/PortVLANMismatch.pm @@ -0,0 +1,46 @@ +package App::Netdisco::DB::Result::Virtual::PortVLANMismatch; + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; +__PACKAGE__->table_class('DBIx::Class::ResultSource::View'); + +__PACKAGE__->table('port_vlan_mismatch'); +__PACKAGE__->result_source_instance->is_virtual(1); +__PACKAGE__->result_source_instance->view_definition(<<'ENDSQL'); + WITH all_vlans AS + (SELECT ip, port, + array_to_string(array_agg( CASE WHEN native THEN 'n:' || vlan::text + ELSE vlan::text END + ORDER BY vlan ASC ), ', ') AS vlist + FROM device_port_vlan GROUP BY ip, port) + + SELECT CASE WHEN length(ld.dns) > 0 THEN ld.dns ELSE host(ld.ip) END AS left_device, + lp.port AS left_port, + (SELECT vlist FROM all_vlans WHERE ip=lp.ip AND port=lp.port) AS left_vlans, + CASE WHEN length(rd.dns) > 0 THEN rd.dns ELSE host(rd.ip) END AS right_device, + rp.port AS right_port, + (SELECT vlist FROM all_vlans WHERE ip=rp.ip AND port=rp.port) AS right_vlans + FROM device ld + JOIN device_port lp USING (ip) + JOIN device_port rp ON lp.remote_ip=rp.ip AND lp.remote_port=rp.port + JOIN device rd ON rp.ip=rd.ip + WHERE ld.ip < rd.ip AND + (SELECT vlist FROM all_vlans WHERE ip=lp.ip AND port=lp.port) + != + (SELECT vlist FROM all_vlans WHERE ip=rp.ip AND port=rp.port) + ORDER BY left_device, left_port +ENDSQL + +__PACKAGE__->add_columns( + 'left_device' => { data_type => 'text' }, + 'left_port' => { data_type => 'text' }, + 'left_vlans' => { data_type => 'text' }, + + 'right_device' => { data_type => 'text' }, + 'right_port' => { data_type => 'text' }, + 'right_vlans' => { data_type => 'text' }, +); + +1; diff --git a/lib/App/Netdisco/Web/Plugin/Report/PortVLANMismatch.pm b/lib/App/Netdisco/Web/Plugin/Report/PortVLANMismatch.pm new file mode 100644 index 00000000..e2ffa45f --- /dev/null +++ b/lib/App/Netdisco/Web/Plugin/Report/PortVLANMismatch.pm @@ -0,0 +1,33 @@ +package App::Netdisco::Web::Plugin::Report::PortVLANMismatch; + +use Dancer ':syntax'; +use Dancer::Plugin::DBIC; +use Dancer::Plugin::Auth::Extensible; + +use App::Netdisco::Web::Plugin; + +register_report( + { category => 'Port', + tag => 'portvlanmismatch', + label => 'Port VLAN Mismatches', + provides_csv => 1, + } +); + +get '/ajax/content/report/portvlanmismatch' => require_login sub { + return unless schema('netdisco')->resultset('Device')->count; + my @results = schema('netdisco')->resultset('Virtual::PortVLANMismatch')->hri->all; + + if (request->is_ajax) { + my $json = to_json (\@results); + template 'ajax/report/portvlanmismatch.tt', { results => $json }, + { layout => undef }; + } + else { + header( 'Content-Type' => 'text/comma-separated-values' ); + template 'ajax/report/portvlanmismatch.tt', { results => \@results, }, + { layout => undef }; + } +}; + +1; diff --git a/share/config.yml b/share/config.yml index d3628239..9c47e011 100644 --- a/share/config.yml +++ b/share/config.yml @@ -36,6 +36,7 @@ trust_x_remote_user: false path: '/' web_plugins: - Inventory + - Report::PortVLANMismatch - Report::PortAdminDown - Report::PortBlocking - Report::PortMultiNodes diff --git a/share/views/ajax/report/portvlanmismatch.tt b/share/views/ajax/report/portvlanmismatch.tt new file mode 100644 index 00000000..6f276177 --- /dev/null +++ b/share/views/ajax/report/portvlanmismatch.tt @@ -0,0 +1,52 @@ + + + + + + + + + + + +
Left DeviceLeft PortLeft VLANsRight DeviceRight PortRight VLANs
+ +