From 79cc9622b2ee708448439f116833cab3eecf77e0 Mon Sep 17 00:00:00 2001 From: "Eric A. Miller" Date: Sat, 8 Feb 2014 20:46:07 -0500 Subject: [PATCH] NetBIOS Node Report --- Netdisco/Changes | 2 +- .../App/Netdisco/Web/Plugin/Report/Netbios.pm | 75 +++++++++++++++++++ Netdisco/lib/App/Netdisco/Web/Report.pm | 17 ++++- Netdisco/share/config.yml | 1 + Netdisco/share/views/ajax/report/netbios.tt | 48 ++++++++++++ .../share/views/sidebar/report/netbios.tt | 19 +++++ 6 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 Netdisco/lib/App/Netdisco/Web/Plugin/Report/Netbios.pm create mode 100644 Netdisco/share/views/ajax/report/netbios.tt create mode 100644 Netdisco/share/views/sidebar/report/netbios.tt diff --git a/Netdisco/Changes b/Netdisco/Changes index 1d3d0690..a55b3233 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -5,7 +5,7 @@ * [#86] Use Vendor abbrevs to enhance node display in device port view * [#74] Device Name / DNS mismatches report * [#71] Node search by date (but not time) - * [#73] NetBIOS Poller - nbtstat and nbtwalk + * [#73] NetBIOS Poller (nbtstat and nbtwalk), NetBIOS Node Report * [#56] Support API call to /login [ENHANCEMENTS] diff --git a/Netdisco/lib/App/Netdisco/Web/Plugin/Report/Netbios.pm b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/Netbios.pm new file mode 100644 index 00000000..d731bc25 --- /dev/null +++ b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/Netbios.pm @@ -0,0 +1,75 @@ +package App::Netdisco::Web::Plugin::Report::Netbios; + +use Dancer ':syntax'; +use Dancer::Plugin::DBIC; +use Dancer::Plugin::Auth::Extensible; + +use App::Netdisco::Web::Plugin; + +register_report( + { category => 'Node', + tag => 'netbios', + label => 'NetBIOS Inventory', + provides_csv => 1, + } +); + +hook 'before_template' => sub { + my $tokens = shift; + + return + unless ( request->path eq uri_for('/report/netbios')->path + or + index( request->path, uri_for('/ajax/content/report/netbios')->path ) + == 0 ); + + # used in the search sidebar template to set selected items + foreach my $opt (qw/domain/) { + my $p = ( + ref [] eq ref param($opt) + ? param($opt) + : ( param($opt) ? [ param($opt) ] : [] ) + ); + $tokens->{"${opt}_lkp"} = { map { $_ => 1 } @$p }; + } +}; + +get '/ajax/content/report/netbios' => require_login sub { + + my $domain = param('domain'); + + my $rs = schema('netdisco')->resultset('NodeNbt'); + + if ( defined $domain ) { + $domain = '' if $domain eq 'blank'; + $rs = $rs->search( { domain => $domain } )->order_by( + [ { -asc => 'domain' }, + { -desc => 'time_last' } + ] + )->hri; + } + else { + $rs = $rs->search( + {}, + { select => [ 'domain', { count => 'domain' } ], + as => [qw/ domain count /], + group_by => [qw/ domain /] + } + )->order_by( { -desc => 'count' } )->hri; + + } + + return unless $rs->has_rows; + + if ( request->is_ajax ) { + template 'ajax/report/netbios.tt', { results => $rs, }, + { layout => undef }; + } + else { + header( 'Content-Type' => 'text/comma-separated-values' ); + template 'ajax/report/netbios_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 29ab91c1..b94ddb9c 100644 --- a/Netdisco/lib/App/Netdisco/Web/Report.pm +++ b/Netdisco/lib/App/Netdisco/Web/Report.pm @@ -1,18 +1,27 @@ package App::Netdisco::Web::Report; use Dancer ':syntax'; +use Dancer::Plugin::DBIC; use Dancer::Plugin::Auth::Extensible; get '/report/*' => require_login sub { my ($tag) = splat; + # used in the report search sidebar to populate select inputs + my $domain_list + = [ + schema('netdisco')->resultset('NodeNbt')->get_distinct_col('domain') + ]; + # trick the ajax into working as if this were a tabbed page params->{tab} = $tag; - var(nav => 'reports'); - template 'report', { - report => setting('_reports')->{ $tag }, - }; + var( nav => 'reports' ); + template 'report', + { + report => setting('_reports')->{$tag}, + domain_list => $domain_list, + }; }; true; diff --git a/Netdisco/share/config.yml b/Netdisco/share/config.yml index ad0f1288..6ede1246 100644 --- a/Netdisco/share/config.yml +++ b/Netdisco/share/config.yml @@ -47,6 +47,7 @@ web_plugins: - Report::DevicePoeStatus - Report::DuplexMismatch - Report::IpInventory + - Report::Netbios - Report::NodeMultiIPs - Report::PhonesDiscovered - Report::SsidInventory diff --git a/Netdisco/share/views/ajax/report/netbios.tt b/Netdisco/share/views/ajax/report/netbios.tt new file mode 100644 index 00000000..372f930e --- /dev/null +++ b/Netdisco/share/views/ajax/report/netbios.tt @@ -0,0 +1,48 @@ +[% USE date(format = '%Y-%m-%d %H:%M') %] +[% USE Number.Format %] +[% first = results.first %] +[% IF results.first.mac %] + [% row = results.reset %] + + + + + + + + + + + + + [% WHILE (row = results.next) %] + + + + + + + + + [% END %] + +
DomainNodeNameUserFirst SeenLast Seen
[% row.domain | html_entity %][% row.mac.upper | html_entity %][% IF row.domain %]\\[% row.domain | html %]\[% END %][% row.nbname | html_entity %][% row.nbuser || '[No User]' | html %]@[% row.ip | html_entity %][% date.format(row.time_first) | html_entity %][% date.format(row.time_last) | html_entity %]
+[% ELSE %] + [% row = results.reset %] + + + + + + + + + [% WHILE (row = results.next) %] + + + + + [% END %] + +
DomainCount
[% row.domain || '(Blank Domain)' | html %][% row.count | format_number %]
+[% END %] \ No newline at end of file diff --git a/Netdisco/share/views/sidebar/report/netbios.tt b/Netdisco/share/views/sidebar/report/netbios.tt new file mode 100644 index 00000000..180e4895 --- /dev/null +++ b/Netdisco/share/views/sidebar/report/netbios.tt @@ -0,0 +1,19 @@ + +

NetBIOS Search Options

+
+ +
+ + +