aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xextras/tools/lldp/draw-neighbors.pl69
-rwxr-xr-xextras/tools/lldp/lolwhat.pl107
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;
+ }
+ }
+}