Merge branch 'og-treemap'
This commit is contained in:
		
							
								
								
									
										34
									
								
								Netdisco/lib/Netdisco/DB/Result/Virtual/DeviceLinks.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								Netdisco/lib/Netdisco/DB/Result/Virtual/DeviceLinks.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| package Netdisco::DB::Result::Virtual::DeviceLinks; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
|  | ||||
| use base 'DBIx::Class::Core'; | ||||
|  | ||||
| __PACKAGE__->table_class('DBIx::Class::ResultSource::View'); | ||||
|  | ||||
| __PACKAGE__->table('device_links'); | ||||
| __PACKAGE__->result_source_instance->is_virtual(1); | ||||
| __PACKAGE__->result_source_instance->view_definition(<<ENDSQL | ||||
|  SELECT dp.ip AS left_ip, di.ip AS right_ip | ||||
|    FROM ( SELECT device_port.ip, device_port.remote_ip | ||||
|            FROM device_port | ||||
|           WHERE device_port.remote_port IS NOT NULL | ||||
|           GROUP BY device_port.ip, device_port.remote_ip | ||||
|           ORDER BY device_port.ip) dp | ||||
|    LEFT JOIN device_ip di ON dp.remote_ip = di.alias | ||||
|   WHERE di.ip IS NOT NULL | ||||
|   ORDER BY dp.ip | ||||
| ENDSQL | ||||
| ); | ||||
|  | ||||
| __PACKAGE__->add_columns( | ||||
|   'left_ip' => { | ||||
|     data_type => 'inet', | ||||
|   }, | ||||
|   'right_ip' => { | ||||
|     data_type => 'inet', | ||||
|   }, | ||||
| ); | ||||
|  | ||||
| 1; | ||||
| @@ -82,6 +82,69 @@ ajax '/ajax/content/device/:thing' => sub { | ||||
|     return "<p>Hello, this is where the ". param('thing') ." content goes.</p>"; | ||||
| }; | ||||
|  | ||||
| ajax '/ajax/content/device/netmap' => sub { | ||||
|     content_type('text/html'); | ||||
|     template 'ajax/device/netmap.tt', {}, { layout => undef }; | ||||
| }; | ||||
|  | ||||
| sub _get_name { | ||||
|     my $ip = shift; | ||||
|     my $domain = quotemeta( setting('domain_suffix') || '' ); | ||||
|  | ||||
|     (my $dns = (var('devices')->{$ip} || '')) =~ s/$domain$//; | ||||
|     return ($dns || $ip); | ||||
| } | ||||
|  | ||||
| sub _add_children { | ||||
|     my ($ptr, $childs) = @_; | ||||
|     my @legit = (); | ||||
|  | ||||
|     foreach my $c (@$childs) { | ||||
|         next if exists var('seen')->{$c}; | ||||
|         var('seen')->{$c}++; | ||||
|         push @legit, $c; | ||||
|         push @{$ptr}, { name => _get_name($c) }; | ||||
|     } | ||||
|  | ||||
|     for (my $i = 0; $i < @legit; $i++) { | ||||
|         $ptr->[$i]->{children} = []; | ||||
|         _add_children($ptr->[$i]->{children}, var('links')->{$legit[$i]}); | ||||
|     } | ||||
| } | ||||
|  | ||||
| # d3 seems not to use proper json semantics, so get instead of ajax | ||||
| get '/ajax/data/device/netmap' => sub { | ||||
|     my $start = param('q'); | ||||
|     return unless $start; | ||||
|  | ||||
|     my @devices = schema->resultset('Device')->search({}, { | ||||
|       result_class => 'DBIx::Class::ResultClass::HashRefInflator', | ||||
|       columns => ['ip', 'dns'], | ||||
|     })->all; | ||||
|     var(devices => { map { $_->{ip} => $_->{dns} } @devices }); | ||||
|  | ||||
|     var(links => {}); | ||||
|     my $rs = schema->resultset('Virtual::DeviceLinks')->search({}, { | ||||
|       result_class => 'DBIx::Class::ResultClass::HashRefInflator', | ||||
|     }); | ||||
|  | ||||
|     while (my $l = $rs->next) { | ||||
|         var('links')->{ $l->{left_ip} } ||= []; | ||||
|         push @{ var('links')->{ $l->{left_ip} } }, $l->{right_ip}; | ||||
|     } | ||||
|  | ||||
|     my %tree = ( | ||||
|         name => _get_name($start), | ||||
|         children => [], | ||||
|     ); | ||||
|  | ||||
|     var(seen => {}); | ||||
|     _add_children($tree{children}, var('links')->{$start}); | ||||
|  | ||||
|     content_type('application/json'); | ||||
|     return to_json(\%tree); | ||||
| }; | ||||
|  | ||||
| # device interface addresses | ||||
| ajax '/ajax/content/device/addresses' => sub { | ||||
|     my $ip = param('q'); | ||||
| @@ -202,6 +265,7 @@ get '/device' => sub { | ||||
|         { id => 'details',   label => 'Details'   }, | ||||
|         { id => 'ports',     label => 'Ports'     }, | ||||
|         { id => 'modules',   label => 'Modules'   }, | ||||
|         { id => 'netmap',    label => 'Neighbors' }, | ||||
|         { id => 'addresses', label => 'Addresses' }, | ||||
|     ]); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user