diff --git a/Netdisco/Changes b/Netdisco/Changes index 0455a6b4..012928be 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -3,6 +3,7 @@ [NEW FEATURES] * [#75] Device module inventory report / search + * [#70] SSID Search (port) [ENHANCEMENTS] diff --git a/Netdisco/lib/App/Netdisco/DB/ResultSet/DevicePortSsid.pm b/Netdisco/lib/App/Netdisco/DB/ResultSet/DevicePortSsid.pm new file mode 100644 index 00000000..bfbbfd37 --- /dev/null +++ b/Netdisco/lib/App/Netdisco/DB/ResultSet/DevicePortSsid.pm @@ -0,0 +1,48 @@ +package App::Netdisco::DB::ResultSet::DevicePortSsid; +use base 'App::Netdisco::DB::ResultSet'; + +use strict; +use warnings FATAL => 'all'; + +__PACKAGE__->load_components( + qw/ + +App::Netdisco::DB::ExplicitLocking + / +); + +=head1 ADDITIONAL METHODS + +=head2 get_ssids + +Returns a sorted list of SSIDs with the following columns only: + +=over 4 + +=item ssid + +=item broadcast + +=item count + +=back + +Where C is the number of instances of the SSID in the Netdisco +database. + +=cut + +sub get_ssids { + my $rs = shift; + + return $rs->search( + {}, + { select => [ 'ssid', 'broadcast', { count => 'ssid' } ], + as => [qw/ ssid broadcast count /], + group_by => [qw/ ssid broadcast /], + order_by => { -desc => [qw/count/] }, + } + ) + +} + +1; diff --git a/Netdisco/lib/App/Netdisco/Web/Plugin/Report/PortSsid.pm b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/PortSsid.pm new file mode 100644 index 00000000..3c1aed23 --- /dev/null +++ b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/PortSsid.pm @@ -0,0 +1,70 @@ +package App::Netdisco::Web::Plugin::Report::PortSsid; + +use Dancer ':syntax'; +use Dancer::Plugin::DBIC; +use Dancer::Plugin::Auth::Extensible; + +use App::Netdisco::Web::Plugin; + +register_report( + { category => 'Port', + tag => 'portssid', + label => 'Port SSID Inventory', + provides_csv => 1, + } +); + +hook 'before_template' => sub { + my $tokens = shift; + + return + unless ( + request->path eq uri_for('/report/portssid')->path + or index( + request->path, uri_for('/ajax/content/report/portssid')->path + ) == 0 + ); + + # used in the search sidebar template to set selected items + foreach my $opt (qw/ssid/) { + my $p = ( + ref [] eq ref param($opt) + ? param($opt) + : ( param($opt) ? [ param($opt) ] : [] ) + ); + $tokens->{"${opt}_lkp"} = { map { $_ => 1 } @$p }; + } +}; + +get '/ajax/content/report/portssid' => require_login sub { + + my $ssid = param('ssid'); + + my $rs = schema('netdisco')->resultset('DevicePortSsid'); + + if ( defined $ssid ) { + + $rs + = $rs->search( { ssid => $ssid } ) + ->prefetch( [qw/ device port /] ) + ->order_by( [qw/ port.ip port.port /] )->hri; + } + else { + $rs = $rs->get_ssids->hri; + + } + + return unless $rs->has_rows; + + if ( request->is_ajax ) { + template 'ajax/report/portssid.tt', { results => $rs, }, + { layout => undef }; + } + else { + header( 'Content-Type' => 'text/comma-separated-values' ); + template 'ajax/report/portssid_csv.tt', { results => $rs, }, + { layout => undef }; + } +}; + +1; diff --git a/Netdisco/lib/App/Netdisco/Web/Report.pm b/Netdisco/lib/App/Netdisco/Web/Report.pm index 800f9295..f5221b46 100644 --- a/Netdisco/lib/App/Netdisco/Web/Report.pm +++ b/Netdisco/lib/App/Netdisco/Web/Report.pm @@ -14,6 +14,8 @@ get '/report/*' => require_login sub { ]; my $class_list = [ schema('netdisco')->resultset('DeviceModule') ->get_distinct_col('class') ]; + my $ssid_list = [ schema('netdisco')->resultset('DevicePortSsid') + ->get_distinct_col('ssid') ]; # trick the ajax into working as if this were a tabbed page params->{tab} = $tag; @@ -24,6 +26,7 @@ get '/report/*' => require_login sub { report => setting('_reports')->{$tag}, domain_list => $domain_list, class_list => $class_list, + ssid_list => $ssid_list, }; }; diff --git a/Netdisco/share/config.yml b/Netdisco/share/config.yml index de401b7d..318f7140 100644 --- a/Netdisco/share/config.yml +++ b/Netdisco/share/config.yml @@ -36,6 +36,7 @@ web_plugins: - Report::PortAdminDown - Report::PortBlocking - Report::PortMultiNodes + - Report::PortSsid - Report::PortUtilization - Report::ApChannelDist - Report::ApClients diff --git a/Netdisco/share/views/ajax/report/portssid.tt b/Netdisco/share/views/ajax/report/portssid.tt new file mode 100644 index 00000000..7a07d3c9 --- /dev/null +++ b/Netdisco/share/views/ajax/report/portssid.tt @@ -0,0 +1,54 @@ +[% USE Number.Format %] +[% IF results.first.device.ip %] + [% row = results.reset %] + + + + + + + + + + + + [% WHILE (row = results.next) %] + + + + + + + + [% END %] + +
Device (Port)BroadcastModelSSIDVendor
+ + [% row.device.dns || row.device.name || row.device.ip | html_entity %] ( [% row.port.port | html_entity %] ) + [% row.broadcast ? 'Yes' : 'No' %][% row.device.model | html_entity %][% row.ssid | html_entity %][% row.device.vendor | html_entity %]
+[% ELSE %] + [% row = results.reset %] + + + + + + + + + + [% WHILE (row = results.next) %] + + + + + + [% END %] + +
SSIDBroadcastCount
+ + [% row.ssid | html %] + [% row.broadcast ? 'Yes' : 'No' %][% row.count | format_number %]
+[% END %] diff --git a/Netdisco/share/views/ajax/report/portssid_csv.tt b/Netdisco/share/views/ajax/report/portssid_csv.tt new file mode 100644 index 00000000..6e5796b0 --- /dev/null +++ b/Netdisco/share/views/ajax/report/portssid_csv.tt @@ -0,0 +1,28 @@ +[% USE CSV -%] +[% IF results.first.ip %] + [% row = results.reset %] + [% CSV.dump(['Device' 'Port' 'Name' 'Broadcast' 'Model' 'SSID' 'Vendor']) %] + + [% WHILE (row = results.next) %] + [% mylist = [] %] + [% device = row.device.dns || row.device.name || row.device.ip %] + [% broadcast = row.broadcast ? 'Yes' : 'No' %] + [% FOREACH col IN [ device row.port.port row.device.name broadcast row.device.model row.ssid row.device.vendor ] %] + [% mylist.push(col) %] + [% END %] + [% CSV.dump(mylist) %] + + [% END %] +[% ELSE %] + [% row = results.reset %] + [% CSV.dump(['SSID' 'Count']) %] + + [% WHILE (row = results.next) %] + [% mylist = [] %] + [% FOREACH col IN [ row.ssid row.count ] %] + [% mylist.push(col) %] + [% END %] + [% CSV.dump(mylist) %] + + [% END %] +[% END %] \ No newline at end of file diff --git a/Netdisco/share/views/sidebar/report/portssid.tt b/Netdisco/share/views/sidebar/report/portssid.tt new file mode 100644 index 00000000..717d761a --- /dev/null +++ b/Netdisco/share/views/sidebar/report/portssid.tt @@ -0,0 +1,15 @@ + +

SSID Search Options

+
+ +
+ + +