aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xtools/lldp/lldpdiscover.pl103
1 files changed, 33 insertions, 70 deletions
diff --git a/tools/lldp/lldpdiscover.pl b/tools/lldp/lldpdiscover.pl
index f3df093..7ecf969 100755
--- a/tools/lldp/lldpdiscover.pl
+++ b/tools/lldp/lldpdiscover.pl
@@ -29,8 +29,9 @@ use strict;
use warnings;
use Data::Dumper;
-use lib '../include';
+use lib '../../include';
use nms;
+use nms::snmp;
# Actual assets detected, indexed by chassis ID
my %assets;
@@ -47,11 +48,10 @@ if (defined($cmdline_ip) && defined($cmdline_community)) {
# Special-case for the first switch is to fetch chassis id
# directly. Everything else is fetched from a neighbour
# table.
- my $session = nms::snmp_open_session($cmdline_ip, $cmdline_community);
+ my $session = nms::snmp::snmp_open_session($cmdline_ip, $cmdline_community);
$chassis_id = get_lldp_chassis_id($session);
$assets{$chassis_id}{'community'} = $cmdline_community;
- @{$assets{$chassis_id}{'v4mgmt'}} = ($cmdline_ip);
- @{$assets{$chassis_id}{'v6mgmt'}} = ();
+ $assets{$chassis_id}{'ip'} = $cmdline_ip;
push @chassis_ids_to_check, $chassis_id;
};
if ($@) {
@@ -87,6 +87,9 @@ if (defined($cmdline_ip) && defined($cmdline_community)) {
# XXX: Several of these things are temporary to test (e.g.: AP).
sub filter {
my %sys = %{$_[0]};
+ if (!defined($sys{'lldpRemSysCapEnabled'})) {
+ return 0;
+ }
my %caps = %{$sys{'lldpRemSysCapEnabled'}};
my $sysdesc = $sys{'lldpRemSysDesc'};
my $sysname = $sys{'lldpRemSysName'};
@@ -117,12 +120,14 @@ sub filter {
# new devices as it finds them.
sub discover_lldp_neighbors {
my $local_id = $_[0];
+ #print "local id: $local_id\n";
my $ip = $assets{$local_id}{mgmt};
my $local_sysname = $assets{$local_id}{snmp}{sysName};
my $community = $assets{$local_id}{community};
my $addrtable;
- while (my ($key, $value) = each %{$assets{$local_id}{snmp_parsed}{lldpRemTable}}) {
+ while (my ($key, $value) = each %{$assets{$local_id}{snmp_parsed}}) {
my $chassis_id = $value->{'lldpRemChassisId'};
+ #print "chasis id: $chassis_id\n";
my $sysname = $value->{'lldpRemSysName'};
if (!defined($sysname)) {
$sysname = $chassis_id;
@@ -133,39 +138,12 @@ sub discover_lldp_neighbors {
mylog("Filtered out $sysname ($local_sysname -> $sysname)");
next;
}
-
- # Pull in the management address table lazily.
- $addrtable = $assets{$local_id}{snmp_parsed}{lldpRemManAddrTable}{$key};
-
- # Search for this key in the address table.
- my @v4addrs = ();
- my @v6addrs = ();
- while (my ($addrkey, $addrvalue) = each %$addrtable) {
- my $addr = $addrvalue->{'lldpRemManAddr'};
- my $addrtype = $addrvalue->{'lldpRemManAddrSubtype'};
- if ($addrtype == 1) {
- push @v4addrs, $addr;
- } elsif ($addrtype == 2) {
- my $v6addr = $addr;
- next if $v6addr =~ /^fe80:/; # Ignore link-local.
- push @v6addrs, $v6addr;
- } else {
- die "Unknown address type $addr";
- }
- }
- my $addr;
- if (scalar @v6addrs > 0) {
- $addr = $v6addrs[0];
- } elsif (scalar @v4addrs > 0) {
- $addr = $v4addrs[0];
+ $sysname =~ s/\..*$//;
+ if (defined($value->{lldpRemManAddr})) {
+ mylog("Found $sysname ($local_sysname -> $sysname )");
} else {
- mylog( "Could not find a management address for chassis ID $chassis_id (sysname=$sysname, lldpRemIndex=$key)");
- # We still want to add these weirdo-things, but
- # they wont do much good except fill the map.
+ next;
}
-
- mylog("Found $sysname ($local_sysname -> $sysname )");
- $sysname =~ s/\..*$//;
if (defined($assets{$chassis_id}{'sysName'})) {
mylog("Duplicate $sysname: \"$sysname\" vs \"$assets{$chassis_id}{'sysName'}\"");
if ($assets{$chassis_id}{'sysName'} eq "") {
@@ -185,12 +163,12 @@ sub discover_lldp_neighbors {
# We simply guess that the community is the same as ours.
$assets{$chassis_id}{'community'} = $community;
- @{$assets{$chassis_id}{'v4mgmt'}} = @v4addrs;
- @{$assets{$chassis_id}{'v6mgmt'}} = @v6addrs;
+ $assets{$chassis_id}{'ip'} = $value->{lldpRemManAddr};
$assets{$chassis_id}{'neighbors'}{$local_id} = 1;
$assets{$local_id}{'neighbors'}{$chassis_id} = 1;
check_neigh($chassis_id);
+ #print "checking $chassis_id\n";
}
}
@@ -209,14 +187,14 @@ sub get_snmp_data {
my ($ip, $community) = @_;
my %ret = ();
eval {
- my $session = nms::snmp_open_session($ip, $community);
+ my $session = nms::snmp::snmp_open_session($ip, $community);
$ret{'sysName'} = $session->get('sysName.0');
$ret{'sysDescr'} = $session->get('sysDescr.0');
$ret{'lldpRemManAddrTable'} = $session->gettable("lldpRemManAddrTable");
$ret{'lldpRemTable'} = $session->gettable("lldpRemTable");
- $ret{'ifTable'} = $session->gettable('ifTable', columns => [ 'ifType', 'ifDescr' ]);
- $ret{'ifXTable'} = $session->gettable('ifXTable', columns => [ 'ifHighSpeed', 'ifName' ]);
+ $ret{'lldpLocChassisIdParsed'} = nms::convert_mac($session->get('lldpLocChassisId.0'));
$ret{'lldpLocChassisId'} = $session->get('lldpLocChassisId.0');
+ #print Dumper(\%ret);
};
if ($@) {
mylog("Error during SNMP to $ip : $@");
@@ -232,40 +210,34 @@ sub parse_snmp
{
my $snmp = $_[0];
my %result = ();
+ my %lol = ();
while (my ($key, $value) = each %{$snmp}) {
$result{$key} = $value;
}
- $result{lldpLocChassisId} = nms::convert_mac($snmp->{'lldpLocChassisId'});
while (my ($key, $value) = each %{$snmp->{lldpRemTable}}) {
- my $id = $key;
my $chassis_id = nms::convert_mac($value->{'lldpRemChassisId'});
- my $sysname = $value->{'lldpRemSysName'};
foreach my $key2 (keys %$value) {
- $result{lldpRemTable}{$id}{$key2} = $value->{$key2};
+ $lol{$value->{lldpRemIndex}}{$key2} = $value->{$key2};
}
- $result{lldpRemTable}{$id}{'lldpRemChassisId'} = $chassis_id;
+ $lol{$value->{lldpRemIndex}}{'lldpRemChassisId'} = $chassis_id;
my %caps = ();
nms::convert_lldp_caps($value->{'lldpRemSysCapEnabled'}, \%caps);
- $result{lldpRemTable}{$id}{'lldpRemSysCapEnabled'} = \%caps;
+ $lol{$value->{lldpRemIndex}}{'lldpRemSysCapEnabled'} = \%caps;
}
- $result{lldpRemManAddrTable} = ();
while (my ($key, $value) = each %{$snmp->{lldpRemManAddrTable}}) {
- my %tmp = ();
foreach my $key2 (keys %$value) {
- $tmp{$key2} = $value->{$key2};
+ $lol{$value->{lldpRemIndex}}{$key2} = $value->{$key2};
}
my $addr = $value->{'lldpRemManAddr'};
my $addrtype = $value->{'lldpRemManAddrSubtype'};
if ($addrtype == 1) {
- $tmp{lldpRemManAddr} = nms::convert_ipv4($addr);
+ $lol{$value->{lldpRemIndex}}{lldpRemManAddr} = nms::convert_ipv4($addr);
} elsif ($addrtype == 2) {
- $tmp{lldpRemManAddr} = nms::convert_ipv6($addr);
+ $lol{$value->{lldpRemIndex}}{lldpRemManAddr} = nms::convert_ipv6($addr);
}
- my $id = $value->{lldpRemTimeMark} . "." . $value->{lldpRemLocalPortNum} . "." . $value->{lldpRemIndex};
- my $id2 = $tmp{lldpRemManAddr};
- $result{lldpRemManAddrTable}{$id}{$id2} = \%tmp;
}
- return \%result;
+ return \%lol;
+ print Dumper (\%lol);
}
# Add a chassis_id to the list to be checked, but only if it isn't there.
@@ -285,28 +257,19 @@ sub check_neigh {
# We've got a switch. Populate it with SNMP data (if we can).
sub add_switch {
my $chassis_id = shift;
- my @addrs;
- push @addrs, @{$assets{$chassis_id}{'v4mgmt'}};
- push @addrs, @{$assets{$chassis_id}{'v6mgmt'}};
my $addr;
my $snmp = undef;
- while (my $key = each @addrs ) {
- $addr = $addrs[$key];
- mylog("Probing $addr");
- $snmp = get_snmp_data($addr, $assets{$chassis_id}{'community'});
- if (defined($snmp)) {
- last;
- }
-
- }
+ $addr = $assets{$chassis_id}{'ip'};
+ mylog("Probing $addr");
+ $snmp = get_snmp_data($addr, $assets{$chassis_id}{'community'});
+
return if (!defined($snmp));
my $sysname = $snmp->{sysName};
$sysname =~ s/\..*$//;
$assets{$chassis_id}{'sysName'} = $sysname;
- $assets{$chassis_id}{'mgmt'} = $addr;
+ $assets{$chassis_id}{'ip'} = $addr;
$assets{$chassis_id}{'snmp'} = $snmp;
$assets{$chassis_id}{'snmp_parsed'} = parse_snmp($snmp);
- $assets{$chassis_id}{'chassis_id_x'} = nms::convert_mac($snmp->{'lldpLocChassisId'});
return;
}