aboutsummaryrefslogtreecommitdiffstats
path: root/include/nms/snmp.pm
diff options
context:
space:
mode:
Diffstat (limited to 'include/nms/snmp.pm')
-rw-r--r--include/nms/snmp.pm89
1 files changed, 89 insertions, 0 deletions
diff --git a/include/nms/snmp.pm b/include/nms/snmp.pm
new file mode 100644
index 0000000..b1354ae
--- /dev/null
+++ b/include/nms/snmp.pm
@@ -0,0 +1,89 @@
+#! /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("../mibs");
+ 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;
+}
+