Add Nodes with multiple IP addresses report
This commit is contained in:
		| @@ -125,4 +125,68 @@ sub delete { | ||||
|   } | ||||
| } | ||||
|  | ||||
| =head2 with_multi_ips_as_hashref | ||||
|  | ||||
| This is a modifier for C<search()> which returns a list of hash references | ||||
| for nodes within the search criteria with multiple IP addresses.  Each hash | ||||
| reference contains the keys: | ||||
|  | ||||
| =over 4 | ||||
|  | ||||
| =item mac | ||||
|  | ||||
| Node MAC address. | ||||
|  | ||||
| =item switch | ||||
|  | ||||
| IP address of the device where the node is attached. | ||||
|  | ||||
| =item port | ||||
|  | ||||
| Port on the device where the node is attached. | ||||
|  | ||||
| =item dns | ||||
|  | ||||
| DNS name of the device where the node is attached. | ||||
|  | ||||
| =item name | ||||
|  | ||||
| C<sysName> of the device where the node is attached. | ||||
|  | ||||
| =item ip_count | ||||
|  | ||||
| Count of IP addresses associated with the node. | ||||
|  | ||||
| =item vendor | ||||
|  | ||||
| Vendor string based upon the node OUI. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
|  | ||||
| sub with_multi_ips_as_hashref { | ||||
|   my ( $rs, $cond, $attrs ) = @_; | ||||
|  | ||||
|   my @return = $rs->search( | ||||
|     {}, | ||||
|     { result_class => 'DBIx::Class::ResultClass::HashRefInflator', | ||||
|       select       => [ 'mac', 'switch', 'port' ], | ||||
|       join         => [qw/device ips oui/], | ||||
|       '+columns'   => [ | ||||
|         { 'dns'      => 'device.dns' }, | ||||
|         { 'name'     => 'device.name' }, | ||||
|         { 'ip_count' => { count => 'ips.ip' } }, | ||||
|         { 'vendor'   => 'oui.company' } | ||||
|       ], | ||||
|       group_by => | ||||
|         [qw/ me.mac me.switch me.port device.dns device.name oui.company/], | ||||
|       having => \[ 'count(ips.ip) > ?', [ count => 1 ] ], | ||||
|       order_by => { -desc => [qw/count/] }, | ||||
|     } | ||||
|   )->all; | ||||
|  | ||||
|   return \@return; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|   | ||||
							
								
								
									
										35
									
								
								Netdisco/lib/App/Netdisco/Web/Plugin/Report/NodeMultiIPs.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								Netdisco/lib/App/Netdisco/Web/Plugin/Report/NodeMultiIPs.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| package App::Netdisco::Web::Plugin::Report::NodeMultiIPs; | ||||
|  | ||||
| use Dancer ':syntax'; | ||||
| use Dancer::Plugin::DBIC; | ||||
| use Dancer::Plugin::Auth::Extensible; | ||||
|  | ||||
| use App::Netdisco::Web::Plugin; | ||||
|  | ||||
| register_report( | ||||
|     {   category     => 'Node', | ||||
|         tag          => 'nodemultiips', | ||||
|         label        => 'Nodes with multiple active IP addresses', | ||||
|         provides_csv => 1, | ||||
|     } | ||||
| ); | ||||
|  | ||||
| get '/ajax/content/report/nodemultiips' => require_login sub { | ||||
|     my $results = schema('netdisco')->resultset('Node') | ||||
|         ->with_multi_ips_as_hashref; | ||||
|  | ||||
|     return unless scalar $results; | ||||
|  | ||||
|     if ( request->is_ajax ) { | ||||
|         template 'ajax/report/nodemultiips.tt', { results => $results, }, | ||||
|             { layout => undef }; | ||||
|     } | ||||
|     else { | ||||
|         header( 'Content-Type' => 'text/comma-separated-values' ); | ||||
|         template 'ajax/report/nodemultiips_csv.tt', | ||||
|             { results => $results, }, | ||||
|             { layout  => undef }; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| 1; | ||||
		Reference in New Issue
	
	Block a user