#72 Search on Vendor / OUI
This commit is contained in:
		
							
								
								
									
										104
									
								
								Netdisco/lib/App/Netdisco/Web/Plugin/Report/NodeVendor.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								Netdisco/lib/App/Netdisco/Web/Plugin/Report/NodeVendor.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | ||||
| package App::Netdisco::Web::Plugin::Report::NodeVendor; | ||||
|  | ||||
| use Dancer ':syntax'; | ||||
| use Dancer::Plugin::DBIC; | ||||
| use Dancer::Plugin::Auth::Extensible; | ||||
|  | ||||
| use App::Netdisco::Web::Plugin; | ||||
|  | ||||
| register_report( | ||||
|     {   category     => 'Node', | ||||
|         tag          => 'nodevendor', | ||||
|         label        => 'Node Vendor Inventory', | ||||
|         provides_csv => 1, | ||||
|     } | ||||
| ); | ||||
|  | ||||
| hook 'before' => sub { | ||||
|  | ||||
|     return | ||||
|         unless ( | ||||
|         request->path eq uri_for('/report/nodevendor')->path | ||||
|         or index( request->path, | ||||
|             uri_for('/ajax/content/report/nodevendor')->path ) == 0 | ||||
|         ); | ||||
|  | ||||
|     params->{'limit'} ||= 1024; | ||||
|     params->{'order'} ||= 'MAC'; | ||||
|  | ||||
| }; | ||||
|  | ||||
| hook 'before_template' => sub { | ||||
|     my $tokens = shift; | ||||
|  | ||||
|     return | ||||
|         unless ( | ||||
|         request->path eq uri_for('/report/nodevendor')->path | ||||
|         or index( request->path, | ||||
|             uri_for('/ajax/content/report/nodevendor')->path ) == 0 | ||||
|         ); | ||||
|  | ||||
|     # used in the search sidebar template to set selected items | ||||
|     foreach my $opt (qw/vendor/) { | ||||
|         my $p = ( | ||||
|             ref [] eq ref param($opt) | ||||
|             ? param($opt) | ||||
|             : ( param($opt) ? [ param($opt) ] : [] ) | ||||
|         ); | ||||
|         $tokens->{"${opt}_lkp"} = { map { $_ => 1 } @$p }; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| get '/ajax/content/report/nodevendor' => require_login sub { | ||||
|  | ||||
|     my $vendor = param('vendor'); | ||||
|  | ||||
|     my $rs = schema('netdisco')->resultset('Node'); | ||||
|  | ||||
|     if ( defined $vendor ) { | ||||
|  | ||||
|         my $match = $vendor eq 'blank' ? undef : $vendor; | ||||
|  | ||||
|         my $order = { | ||||
|             MAC    => 'me.mac', | ||||
|             Device => 'me.switch', | ||||
|             Vendor => 'oui.company' | ||||
|         }; | ||||
|  | ||||
|         $rs = $rs->search( { 'oui.abbrev' => $match } ) | ||||
|             ->prefetch( [qw/ oui device /] ); | ||||
|  | ||||
|         unless ( param('archived') ) { | ||||
|             $rs = $rs->search( { -bool => 'me.active' } ); | ||||
|         } | ||||
|  | ||||
|         $rs = $rs->order_by( $order->{ param('order') } ) | ||||
|             ->limit( param('limit') )->hri; | ||||
|     } | ||||
|     else { | ||||
|         $rs = $rs->search( | ||||
|             { -bool => 'me.active' }, | ||||
|             {   join     => 'oui', | ||||
|                 select   => [ 'oui.abbrev', { count => 'me.mac' } ], | ||||
|                 as       => [qw/ vendor count /], | ||||
|                 group_by => [qw/ oui.abbrev /] | ||||
|             } | ||||
|         )->order_by( { -desc => 'count' } )->hri; | ||||
|     } | ||||
|  | ||||
|     return unless $rs->has_rows; | ||||
|  | ||||
|     if ( request->is_ajax ) { | ||||
|         template 'ajax/report/nodevendor.tt', | ||||
|             { results => $rs, opt => $vendor }, | ||||
|             { layout => undef }; | ||||
|     } | ||||
|     else { | ||||
|         header( 'Content-Type' => 'text/comma-separated-values' ); | ||||
|         template 'ajax/report/nodevendor_csv.tt', | ||||
|             { results => $rs, opt => $vendor }, | ||||
|             { layout => undef }; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| 1; | ||||
| @@ -8,7 +8,7 @@ get '/report/*' => require_login sub { | ||||
|     my ($tag) = splat; | ||||
|  | ||||
|     # used in the report search sidebar to populate select inputs | ||||
|     my ( $domain_list, $class_list, $ssid_list ); | ||||
|     my ( $domain_list, $class_list, $ssid_list, $vendor_list ); | ||||
|  | ||||
|     if ( $tag eq 'netbios' ) { | ||||
|         $domain_list = [ schema('netdisco')->resultset('NodeNbt') | ||||
| @@ -22,6 +22,18 @@ get '/report/*' => require_login sub { | ||||
|         $ssid_list = [ schema('netdisco')->resultset('DevicePortSsid') | ||||
|                 ->get_distinct_col('ssid') ]; | ||||
|     } | ||||
|     elsif ( $tag eq 'nodevendor' ) { | ||||
|         $vendor_list = [ | ||||
|             schema('netdisco')->resultset('Node')->search( | ||||
|                 {}, | ||||
|                 {   join     => 'oui', | ||||
|                     columns  => ['oui.abbrev'], | ||||
|                     order_by => 'oui.abbrev', | ||||
|                     group_by => 'oui.abbrev', | ||||
|                 } | ||||
|                 )->get_column('abbrev')->all | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     # trick the ajax into working as if this were a tabbed page | ||||
|     params->{tab} = $tag; | ||||
| @@ -33,6 +45,7 @@ get '/report/*' => require_login sub { | ||||
|         domain_list => $domain_list, | ||||
|         class_list  => $class_list, | ||||
|         ssid_list   => $ssid_list, | ||||
|         vendor_list => $vendor_list, | ||||
|         }; | ||||
| }; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user