diff options
| -rwxr-xr-x | clients/lldpdiscover.pl | 58 | 
1 files changed, 36 insertions, 22 deletions
| diff --git a/clients/lldpdiscover.pl b/clients/lldpdiscover.pl index 543c74f..bfd4f84 100755 --- a/clients/lldpdiscover.pl +++ b/clients/lldpdiscover.pl @@ -11,11 +11,14 @@ use nms;  my $dbh = nms::db_connect();  $dbh->{AutoCommit} = 0; -# If we are given one switch on the command line, poll that and then exit. +# If we are given one switch on the command line, add that and then exit.  my ($cmdline_ip, $cmdline_community) = @ARGV;  if (defined($cmdline_ip) && defined($cmdline_community)) {  	eval { -		discover_lldp_neighbors($dbh, $cmdline_ip, $cmdline_community); +		my $session = nms::snmp_open_session($cmdline_ip, $cmdline_community); +		my $sysname = $session->get('sysName.0'); +		my $chassis_id = get_lldp_chassis_id($session); +		add_switch($dbh, $cmdline_ip, $sysname, $chassis_id, $cmdline_community);  	};  	if ($@) {  		mylog("ERROR: $@ (during poll of $cmdline_ip)"); @@ -33,11 +36,7 @@ while (my $ref = $q->fetchrow_hashref) {  	my ($switch, $ip, $community) = ($ref->{'switch'}, $ref->{'ip'}, $ref->{'community'});  	eval {  		my $session = nms::snmp_open_session($ip, $community); - -		# Cisco returns completely bogus values if we use get() -		# on lldpLocChassisId.0, it seems. Work around it by using getnext(). -		my $response = $session->getnext('lldpLocChassisId'); -		my $chassis_id = nms::convert_mac($response); +		my $chassis_id = get_lldp_chassis_id($session);  		die "SNMP error: " . $session->error() if (!defined($chassis_id));  		$dbh->do('UPDATE switches SET lldp_chassis_id=? WHERE switch=?', undef,  			$chassis_id, $switch); @@ -114,22 +113,8 @@ sub discover_lldp_neighbors {  			next;  		} -		# Yay, a new switch! Make a new type for it.  		# We simply guess that the community is the same as ours. -		my $ports = get_ports($addr, $community); -		next if (!defined($ports)); -		my $portlist = compress_ports(get_ifindex_for_physical_ports($ports)); -		mylog("Inserting new switch $sysname ($addr, ports $portlist)."); -		my $switchtype = "auto-$sysname-$chassis_id"; -		$dbh->do('INSERT INTO switchtypes (switchtype, ports) VALUES (?, ?)', undef, -			$switchtype, $portlist); -		$dbh->do('INSERT INTO switches (ip, sysname, switchtype, community, lldp_chassis_id) VALUES (?, ?, ?, ?, ?)', undef, -			$addr, $sysname, $switchtype, $community, $chassis_id); -		for my $port (values %$ports) { -			$dbh->do('INSERT INTO portnames (switchtype, port, description) VALUES (?, ?, ?)', -				undef, $switchtype, $port->{'ifIndex'}, $port->{'ifDescr'}); -		} -		$dbh->commit; +		add_switch($dbh, $addr, $sysname, $chassis_id, $community);  	}  } @@ -196,3 +181,32 @@ sub range_from_to {  		return "$from-$to";  	}  } + +sub add_switch { +	my ($dbh, $addr, $sysname, $chassis_id, $community) = @_; + +	# Yay, a new switch! Make a new type for it. +	my $ports = get_ports($addr, $community); +	return if (!defined($ports)); +	my $portlist = compress_ports(get_ifindex_for_physical_ports($ports)); +	mylog("Inserting new switch $sysname ($addr, ports $portlist)."); +	my $switchtype = "auto-$sysname-$chassis_id"; +	$dbh->do('INSERT INTO switchtypes (switchtype, ports) VALUES (?, ?)', undef, +		$switchtype, $portlist); +	$dbh->do('INSERT INTO switches (ip, sysname, switchtype, community, lldp_chassis_id) VALUES (?, ?, ?, ?, ?)', undef, +		$addr, $sysname, $switchtype, $community, $chassis_id); +	for my $port (values %$ports) { +		$dbh->do('INSERT INTO portnames (switchtype, port, description) VALUES (?, ?, ?)', +			undef, $switchtype, $port->{'ifIndex'}, $port->{'ifDescr'}); +	} +	$dbh->commit; +} + +sub get_lldp_chassis_id { +	my ($session) = @_; + +	# Cisco returns completely bogus values if we use get() +	# on lldpLocChassisId.0, it seems. Work around it by using getnext(). +	my $response = $session->getnext('lldpLocChassisId'); +	return nms::convert_mac($response); +} | 
