diff options
-rwxr-xr-x | extras/tools/lldp/draw-neighbors.pl | 69 | ||||
-rwxr-xr-x | extras/tools/lldp/lolwhat.pl | 107 |
2 files changed, 116 insertions, 60 deletions
diff --git a/extras/tools/lldp/draw-neighbors.pl b/extras/tools/lldp/draw-neighbors.pl index 562e34e..a6540ed 100755 --- a/extras/tools/lldp/draw-neighbors.pl +++ b/extras/tools/lldp/draw-neighbors.pl @@ -10,43 +10,35 @@ while (<STDIN>) { } my %assets = %{JSON::XS::decode_json($in)}; -my %map = %{$assets{hood}}; -my %map2 = %{$assets{extended}}; -my %map3 = %{$assets{lldpmap}}; +my %peermap = %{$assets{peermap}}; +my %map2 = %{$assets{lldpmap}}; +my %ipmap = %{$assets{ipmap}}; print "strict graph network {\n"; if ($full ne "lldp") { - while (my ($key, $value) = each %map) { + while (my ($key, $value) = each %peermap) { print_tree ($key,0,undef); } - if ($full eq "full") { - while (my ($key, $value) = each %map2) { - print_tree2 ($key,0,undef); - } - } } else { - while (my ($key, $value) = each %map3) { - print_tree3 ($key, 0, undef); + while (my ($key, $value) = each %map2) { + print_lldp ($key, 0, undef); } } print "}\n"; -sub print_tree3 +sub print_lldp { my ($id,$indent,$parent,$max) = @_; my $name = $id; - if (defined($map3{$id}{sysName}) and $map3{$id}{sysName} ne "") { - $name = $map3{$id}{sysName}; - } - if ($indent > 50) { - die "Possible loop detected."; + if (defined($assets{lldppeers}{$id}{name}) and $assets{lldppeers}{$id}{name} ne "") { + $name = $assets{lldppeers}{$id}{name}; } print " \"$name\" -- {"; my @n; - while (my ($key, $value) = each %{$map3{$id}{peers}}) { + while (my ($key, $value) = each %{$map2{$id}}) { my $peer = $key; - if (defined($map3{$key}{sysName}) and $map3{$key}{sysName} ne "") { - $peer = $map3{$key}{sysName}; + if (defined($assets{lldppeers}{$key}{name}) and $assets{lldppeers}{$key}{name} ne "") { + $peer = $assets{lldppeers}{$key}{name}; } push @n, "\"$peer\""; } @@ -54,34 +46,29 @@ sub print_tree3 } sub print_tree { - my ($name,$indent,$parent,$max) = @_; - if (!defined($parent)) { - $parent = ""; - } - if ($indent > 50) { - die "Possible loop detected."; + my ($ip) = @_; + my $name = $ip; + if ($assets{snmpresults}{$ip}{sysName}) { + $name = $assets{snmpresults}{$ip}{sysName}; } print " \"$name\" -- {"; my @n; - while (my ($key, $value) = each %{$map{$name}}) { - push @n, "\"$key\""; + while(my ($peer, $garbage) = each %{$peermap{$ip}}) { + $peer = get_name($peer); + push @n, "\"$peer\""; } print join(",",@n) . "};\n"; } -sub print_tree2 -{ - my ($name,$indent,$parent,$max) = @_; - if (!defined($parent)) { - $parent = ""; +sub get_name { + my ($ip) = @_; + if (defined($ipmap{$ip})) { + $ip = $ipmap{$ip}; } - if ($indent > 50) { - die "Possible loop detected."; + my $name = $ip; + if (defined($assets{snmpresults}{$ip}{sysName})) { + $name = $assets{snmpresults}{$ip}{sysName}; + return $name; } - print " \"$name\" -- {"; - my @n; - while (my ($key, $value) = each %{$map2{$name}}) { - push @n, "\"$key\""; - } - print join(",",@n) . "};\n"; + return $name; } diff --git a/extras/tools/lldp/lolwhat.pl b/extras/tools/lldp/lolwhat.pl index c6d3da7..455b4ff 100755 --- a/extras/tools/lldp/lolwhat.pl +++ b/extras/tools/lldp/lolwhat.pl @@ -33,11 +33,11 @@ my %snmpresults = (); my %lldppeers = (); my %lldpmap = (); +my %lldpnamemap = (); + my %lldpresolver = (); my %ipmap = (); my %peermap = (); -my %hood = (); -my %extended = (); # tracking for log indentation my $mylogindent = ""; @@ -78,21 +78,11 @@ mylog("Probing complete. Trying to make road in the velling"); deduplicate(); -mylog("Building peermaps"); -while (my ($ip, $value) = each %peermap) { - my $sys = $ipmap{$ip} || $ip; - my $real = defined($ipmap{$ip}); - foreach my $sys2 (@{$value}) { - if ($real) { - $hood{$sys}{$sys2} = 1; - $hood{$sys2}{$sys} = 1; - } else { - $extended{$sys2}{$sys} = 1; - } - } -} +populate_lldpmap(); +populate_ipmap(); +populate_peermap(); -my %result = ( snmpresults => \%snmpresults, hood => \%hood, extended => \%extended, ipmap => \%ipmap, peermap => \%peermap, lldpmap => \%lldpmap); +my %result = ( snmpresults => \%snmpresults, ipmap => \%ipmap, peermap => \%peermap, lldpmap => \%lldpmap, lldppeers => \%lldppeers); mylog("Done. Outputting JSON."); print JSON::XS::encode_json(\%result); @@ -243,22 +233,49 @@ sub deduplicate mylog("Checking for chassis id's with duplicate systems"); logindent(1); my %fixlist = (); + my %tested = (); while (my ($id, $value) = each %locmap) { if (@$value > 1) { mylog("Duplicate or collision: chassis id ($id) : " . join(", ", @$value)); - my @checked = (); + logindent(1); + my @removed = (); foreach my $test (@$value) { + foreach my $isremoved1 (@removed) { + if ($isremoved1 eq $test) { + next; + } + } foreach my $test2 (@$value) { if ($test2 eq $test) { next; } - if (compare_targets($test, $test2) != 2) { + foreach my $isremoved2 (@removed) { + if ($isremoved2 eq $test2) { + next; + } + } + if (defined($tested{$test}{$test2}) or defined($tested{$test2}{$test})) { + next; + } elsif (compare_targets($test, $test2) != 2) { mylog("Collision between $test and $test2. Adding to fixlist."); + $tested{$test}{$test2} = 1; + $tested{$test2}{$test} = 1; $fixlist{$test} = 1; $fixlist{$test2} = 1; + } else { + $tested{$test}{$test2} = 1; + $tested{$test2}{$test} = 1; + push @removed, $test2; } } } + foreach my $old (@removed) { + delete $snmpresults{$old}; + } + if (@removed > 0) { + mylog("Removed duplicates: " . join(", ", @removed)); + } + logindent(-1); } } logindent(-1); @@ -312,7 +329,6 @@ sub parse_snmp } @{$result{ips}} = (); @{$result{peers}} = (); - @{$result{lldppeers}} = (); mylog("Parsing lldp neighbors"); logindent(1); while (my ($key, $value) = each %{$snmp->{lldpRemTable}}) { @@ -457,3 +473,56 @@ sub probe_sys my $parsed = parse_snmp($snmp); $snmpresults{$target} = $parsed; } +sub populate_lldpmap +{ + mylog("Populate LLDP map"); + while (my ($ip, $value) = each %snmpresults) { + my $sysname = $value->{sysName}; + my $id = $value->{lldpLocChassisId}; + while (my ($if, $data) = each %{$value->{interfaces}}) { + if (!defined($data->{lldpRemSysName})) { + next; + } else { + $lldpmap{$id}{$data->{lldpRemChassisId}} = 1; + $lldpnamemap{$sysname}{$data->{lldpRemSysName}} = 1; + } + } + } +} + +sub populate_ipmap +{ + mylog("Populate ipmap"); + my @conflicts = (); + while (my ($ip, $value) = each %snmpresults) { + my $sysname = $value->{sysName}; + if (defined($ipmap{$ip})) { + mylog("Conflict for ip $ip"); + } + $ipmap{$ip} = $ip; + foreach my $localip (@{$value->{ips}}) { + if (!defined($localip)) { + next; + } elsif (defined($ipmap{$localip}) and $ipmap{$localip} ne $ip) { + mylog("IP conflict: $localip ($ipmap{$localip} vs $ip)"); + push @conflicts, $localip; + } + $ipmap{$localip} = $ip; + } + } + mylog("Removing conflicting IPs"); + foreach my $contested (@conflicts) { + delete $ipmap{$contested}; + } +} + +sub populate_peermap +{ + mylog("Populate layer3 peermap"); + while (my ($ip, $value) = each %snmpresults) { + my $sysname = $value->{sysName}; + foreach my $peer (@{$value->{peers}}) { + $peermap{$ip}{$peer} = 1; + } + } +} |