diff options
| author | Kristian Lyngstol <kristian@bohemians.org> | 2016-04-12 18:01:32 +0200 | 
|---|---|---|
| committer | Kristian Lyngstol <kristian@bohemians.org> | 2016-04-12 18:01:32 +0200 | 
| commit | 09ea945c3908fd42e90eb64c194d9af11d174206 (patch) | |
| tree | 8bcf0f98113ea4a92effa1c39344730c7e6f50b0 /include/nms/snmp.pm | |
| parent | c3ebdbda43c23ade1e49dfd9f546fba1d15f9941 (diff) | |
Actual initial import
Fetched from tgmanage.
Diffstat (limited to 'include/nms/snmp.pm')
| -rw-r--r-- | include/nms/snmp.pm | 91 | 
1 files changed, 91 insertions, 0 deletions
diff --git a/include/nms/snmp.pm b/include/nms/snmp.pm new file mode 100644 index 0000000..26ada44 --- /dev/null +++ b/include/nms/snmp.pm @@ -0,0 +1,91 @@ +#! /usr/bin/perl +use strict; +use warnings; +use SNMP; +use nms; +package nms::snmp; + +use base 'Exporter'; +our @EXPORT = qw(); + +BEGIN { +	# $SNMP::debugging = 1; + +	# sudo mkdir /usr/share/mibs/site +	# cd /usr/share/mibs/site +	# wget -O- ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | sudo tar --strip-components=3 -zxvvf - +	SNMP::initMib(); +	SNMP::addMibDirs("/srv/tgmanage/mibs/StandardMibs"); +	SNMP::addMibDirs("/srv/tgmanage/mibs/JuniperMibs"); +	 +	SNMP::loadModules('SNMPv2-MIB'); +	SNMP::loadModules('ENTITY-MIB'); +	SNMP::loadModules('IF-MIB'); +	SNMP::loadModules('LLDP-MIB'); +	SNMP::loadModules('IP-MIB'); +	SNMP::loadModules('IP-FORWARD-MIB'); +} + +sub snmp_open_session { +	my ($ip, $community, $async) = @_; + +	$async //= 0; + +	my %options = (UseEnums => 1); +	if ($ip =~ /:/) { +		$options{'DestHost'} = "udp6:$ip"; +	} else { +		$options{'DestHost'} = "udp:$ip"; +	} + +	if ($community =~ /^snmpv3:(.*)$/) { +		my ($username, $authprotocol, $authpassword, $privprotocol, $privpassword) = split /\//, $1; + +		$options{'SecName'} = $username; +		$options{'SecLevel'} = 'authNoPriv'; +		$options{'AuthProto'} = $authprotocol; +		$options{'AuthPass'} = $authpassword; + +		if (defined($privprotocol) && defined($privpassword)) { +			$options{'SecLevel'} = 'authPriv'; +			$options{'PrivProto'} = $privprotocol; +			$options{'PrivPass'} = $privpassword; +		} + +		$options{'Version'} = 3; +	} else { +		$options{'Community'} = $community; +		$options{'Version'} = 2; +	} + +	my $session = SNMP::Session->new(%options); +	if (defined($session) && ($async || defined($session->getnext('sysDescr')))) { +		return $session; +	} else { +		die 'Could not open SNMP session to ' . $ip; +	} +} + +# Not currently in use; kept around for reference. +sub fetch_multi_snmp { +	my ($session, @oids) = @_; + +	my %results = (); + +	# Do bulk reads of 40 and 40; seems to be about the right size for 1500-byte packets. +	for (my $i = 0; $i < scalar @oids; $i += 40) { +		my $end = $i + 39; +		$end = $#oids if ($end > $#oids); +		my @oid_slice = @oids[$i..$end]; + +		my $localresults = $session->get_request(-varbindlist => \@oid_slice); +		return undef if (!defined($localresults)); + +		while (my ($key, $value) = each %$localresults) { +			$results{$key} = $value; +		} +	} + +	return \%results; +} +  | 
