Blame lib/mrtg2/Net_SNMP_util.pm

Packit 667938
### - *- mode: Perl -*-
Packit 667938
######################################################################
Packit 667938
### Net_SNMP_util -- SNMP utilities using Net::SNMP
Packit 667938
######################################################################
Packit 667938
### Copyright (c) 2005-2011 Mike Mitchell.
Packit 667938
###
Packit 667938
### This program is free software; you can redistribute it under the
Packit 667938
### "Artistic License" included in this distribution (file "Artistic").
Packit 667938
######################################################################
Packit 667938
### Created by:  Mike Mitchell   <Mike.Mitchell@sas.com>
Packit 667938
###
Packit 667938
### Contributions and fixes by:
Packit 667938
###
Packit 667938
### Laszlo Herczeg <laszlo.herczeg@austinenergy.com>
Packit 667938
###	ignore unimplemented SNMP_Session.pm options
Packit 667938
###
Packit 667938
### Daniel McDonald <dmcdonald@digicontech.com>
Packit 667938
### 	make sure snmpwalk_flg stops when last instance in table is fetched
Packit 667938
###
Packit 667938
### Alexander Kozlov <avk@post.eao.ru>
Packit 667938
###	Leave snmpwalk_flg early if no OIDs are returned
Packit 667938
###
Packit 667938
### <jaccobs@online.nl>
Packit 667938
###	parse NOTIFICATION-TYPE in MIB
Packit 667938
###
Packit 667938
### Dan Thorson <Dan.Thorson@seagate.com>
Packit 667938
###	Handle quotes in MIB comments better
Packit 667938
###
Packit 667938
### Daniel J McDonald <dan.mcdonald@austinenergy.com>
Packit 667938
###	fix getbulk_request -> get_bulk_request typo
Packit 667938
###
Packit 667938
### Tobias Oetiker <tobi@oetiker.ch>
Packit 667938
###	fix '-privpassword' error against snmpv2 hosts
Packit 667938
###
Packit 667938
######################################################################
Packit 667938
Packit 667938
package Net_SNMP_util;
Packit 667938
Packit 667938
=head1 NAME
Packit 667938
Packit 667938
Net_SNMP_util - SNMP utilities based on Net::SNMP
Packit 667938
Packit 667938
=head1 SYNOPSIS
Packit 667938
Packit 667938
The Net_SNMP_util module implements SNMP utilities using the Net::SNMP module.
Packit 667938
It implements snmpget, snmpgetnext, snmpwalk, snmpset, snmptrap, and
Packit 667938
snmpgetbulk.  The Net_SNMP_util module assumes that the user has a basic
Packit 667938
understanding of the Simple Network Management Protocol and related network
Packit 667938
management concepts.
Packit 667938
Packit 667938
=head1 DESCRIPTION
Packit 667938
Packit 667938
The Net_SNMP_util module simplifies SNMP queries even more than Net::SNMP  
Packit 667938
alone.  Easy-to-use "get", "getnext", "walk", "set", "trap", and "getbulk"
Packit 667938
routines are provided, hiding all the details of a SNMP query.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
# ==========================================================================
Packit 667938
Packit 667938
use strict;
Packit 667938
Packit 667938
## Validate the version of Perl
Packit 667938
Packit 667938
BEGIN
Packit 667938
{
Packit 667938
    die('Perl version 5.6.0 or greater is required') if ($] < 5.006);
Packit 667938
}
Packit 667938
Packit 667938
## Handle importing/exporting of symbols
Packit 667938
Packit 667938
use vars qw( @ISA @EXPORT $VERSION $ErrorMessage);
Packit 667938
use Exporter;
Packit 667938
Packit 667938
our @ISA = qw( Exporter );
Packit 667938
Packit 667938
our @EXPORT = qw(
Packit 667938
    snmpget snmpgetnext snmpwalk snmpset snmptrap snmpgetbulk snmpmaptable
Packit 667938
    snmpmaptable4 snmpwalkhash snmpmapOID snmpMIB_to_OID snmpLoad_OID_Cache
Packit 667938
    snmpQueue_MIB_File ErrorMessage
Packit 667938
);
Packit 667938
Packit 667938
## Version of the Net_SNMP_util module
Packit 667938
Packit 667938
our $VERSION = v1.0.20;
Packit 667938
Packit 667938
use Carp;
Packit 667938
Packit 667938
use Net::SNMP v5.0;
Packit 667938
Packit 667938
# The OID numbers from RFC1213 (MIB-II) and RFC1315 (Frame Relay)
Packit 667938
# are pre-loaded below.
Packit 667938
%Net_SNMP_util::OIDS = 
Packit 667938
  (
Packit 667938
    'iso' => '1',
Packit 667938
    'org' => '1.3',
Packit 667938
    'dod' => '1.3.6',
Packit 667938
    'internet' => '1.3.6.1',
Packit 667938
    'directory' => '1.3.6.1.1',
Packit 667938
    'mgmt' => '1.3.6.1.2',
Packit 667938
    'mib-2' => '1.3.6.1.2.1',
Packit 667938
    'system' => '1.3.6.1.2.1.1',
Packit 667938
    'sysDescr' => '1.3.6.1.2.1.1.1.0',
Packit 667938
    'sysObjectID' => '1.3.6.1.2.1.1.2.0',
Packit 667938
    'sysUpTime' => '1.3.6.1.2.1.1.3.0',
Packit 667938
    'sysUptime' => '1.3.6.1.2.1.1.3.0',
Packit 667938
    'sysContact' => '1.3.6.1.2.1.1.4.0',
Packit 667938
    'sysName' => '1.3.6.1.2.1.1.5.0',
Packit 667938
    'sysLocation' => '1.3.6.1.2.1.1.6.0',
Packit 667938
    'sysServices' => '1.3.6.1.2.1.1.7.0',
Packit 667938
    'interfaces' => '1.3.6.1.2.1.2',
Packit 667938
    'ifNumber' => '1.3.6.1.2.1.2.1.0',
Packit 667938
    'ifTable' => '1.3.6.1.2.1.2.2',
Packit 667938
    'ifEntry' => '1.3.6.1.2.1.2.2.1',
Packit 667938
    'ifIndex' => '1.3.6.1.2.1.2.2.1.1',
Packit 667938
    'ifInOctets' => '1.3.6.1.2.1.2.2.1.10',
Packit 667938
    'ifInUcastPkts' => '1.3.6.1.2.1.2.2.1.11',
Packit 667938
    'ifInNUcastPkts' => '1.3.6.1.2.1.2.2.1.12',
Packit 667938
    'ifInDiscards' => '1.3.6.1.2.1.2.2.1.13',
Packit 667938
    'ifInErrors' => '1.3.6.1.2.1.2.2.1.14',
Packit 667938
    'ifInUnknownProtos' => '1.3.6.1.2.1.2.2.1.15',
Packit 667938
    'ifOutOctets' => '1.3.6.1.2.1.2.2.1.16',
Packit 667938
    'ifOutUcastPkts' => '1.3.6.1.2.1.2.2.1.17',
Packit 667938
    'ifOutNUcastPkts' => '1.3.6.1.2.1.2.2.1.18',
Packit 667938
    'ifOutDiscards' => '1.3.6.1.2.1.2.2.1.19',
Packit 667938
    'ifDescr' => '1.3.6.1.2.1.2.2.1.2',
Packit 667938
    'ifOutErrors' => '1.3.6.1.2.1.2.2.1.20',
Packit 667938
    'ifOutQLen' => '1.3.6.1.2.1.2.2.1.21',
Packit 667938
    'ifSpecific' => '1.3.6.1.2.1.2.2.1.22',
Packit 667938
    'ifType' => '1.3.6.1.2.1.2.2.1.3',
Packit 667938
    'ifMtu' => '1.3.6.1.2.1.2.2.1.4',
Packit 667938
    'ifSpeed' => '1.3.6.1.2.1.2.2.1.5',
Packit 667938
    'ifPhysAddress' => '1.3.6.1.2.1.2.2.1.6',
Packit 667938
    'ifAdminHack' => '1.3.6.1.2.1.2.2.1.7',  
Packit 667938
    'ifAdminStatus' => '1.3.6.1.2.1.2.2.1.7',
Packit 667938
    'ifOperHack' => '1.3.6.1.2.1.2.2.1.8',             
Packit 667938
    'ifOperStatus' => '1.3.6.1.2.1.2.2.1.8',
Packit 667938
    'ifLastChange' => '1.3.6.1.2.1.2.2.1.9',
Packit 667938
    'at' => '1.3.6.1.2.1.3',
Packit 667938
    'atTable' => '1.3.6.1.2.1.3.1',
Packit 667938
    'atEntry' => '1.3.6.1.2.1.3.1.1',
Packit 667938
    'atIfIndex' => '1.3.6.1.2.1.3.1.1.1',
Packit 667938
    'atPhysAddress' => '1.3.6.1.2.1.3.1.1.2',
Packit 667938
    'atNetAddress' => '1.3.6.1.2.1.3.1.1.3',
Packit 667938
    'ip' => '1.3.6.1.2.1.4',
Packit 667938
    'ipForwarding' => '1.3.6.1.2.1.4.1',
Packit 667938
    'ipOutRequests' => '1.3.6.1.2.1.4.10',
Packit 667938
    'ipOutDiscards' => '1.3.6.1.2.1.4.11',
Packit 667938
    'ipOutNoRoutes' => '1.3.6.1.2.1.4.12',
Packit 667938
    'ipReasmTimeout' => '1.3.6.1.2.1.4.13',
Packit 667938
    'ipReasmReqds' => '1.3.6.1.2.1.4.14',
Packit 667938
    'ipReasmOKs' => '1.3.6.1.2.1.4.15',
Packit 667938
    'ipReasmFails' => '1.3.6.1.2.1.4.16',
Packit 667938
    'ipFragOKs' => '1.3.6.1.2.1.4.17',
Packit 667938
    'ipFragFails' => '1.3.6.1.2.1.4.18',
Packit 667938
    'ipFragCreates' => '1.3.6.1.2.1.4.19',
Packit 667938
    'ipDefaultTTL' => '1.3.6.1.2.1.4.2',
Packit 667938
    'ipAddrTable' => '1.3.6.1.2.1.4.20',
Packit 667938
    'ipAddrEntry' => '1.3.6.1.2.1.4.20.1',
Packit 667938
    'ipAdEntAddr' => '1.3.6.1.2.1.4.20.1.1',
Packit 667938
    'ipAdEntIfIndex' => '1.3.6.1.2.1.4.20.1.2',
Packit 667938
    'ipAdEntNetMask' => '1.3.6.1.2.1.4.20.1.3',
Packit 667938
    'ipAdEntBcastAddr' => '1.3.6.1.2.1.4.20.1.4',
Packit 667938
    'ipAdEntReasmMaxSize' => '1.3.6.1.2.1.4.20.1.5',
Packit 667938
    'ipRouteTable' => '1.3.6.1.2.1.4.21',
Packit 667938
    'ipRouteEntry' => '1.3.6.1.2.1.4.21.1',
Packit 667938
    'ipRouteDest' => '1.3.6.1.2.1.4.21.1.1',
Packit 667938
    'ipRouteAge' => '1.3.6.1.2.1.4.21.1.10',
Packit 667938
    'ipRouteMask' => '1.3.6.1.2.1.4.21.1.11',
Packit 667938
    'ipRouteMetric5' => '1.3.6.1.2.1.4.21.1.12',
Packit 667938
    'ipRouteInfo' => '1.3.6.1.2.1.4.21.1.13',
Packit 667938
    'ipRouteIfIndex' => '1.3.6.1.2.1.4.21.1.2',
Packit 667938
    'ipRouteMetric1' => '1.3.6.1.2.1.4.21.1.3',
Packit 667938
    'ipRouteMetric2' => '1.3.6.1.2.1.4.21.1.4',
Packit 667938
    'ipRouteMetric3' => '1.3.6.1.2.1.4.21.1.5',
Packit 667938
    'ipRouteMetric4' => '1.3.6.1.2.1.4.21.1.6',
Packit 667938
    'ipRouteNextHop' => '1.3.6.1.2.1.4.21.1.7',
Packit 667938
    'ipRouteType' => '1.3.6.1.2.1.4.21.1.8',
Packit 667938
    'ipRouteProto' => '1.3.6.1.2.1.4.21.1.9',
Packit 667938
    'ipNetToMediaTable' => '1.3.6.1.2.1.4.22',
Packit 667938
    'ipNetToMediaEntry' => '1.3.6.1.2.1.4.22.1',
Packit 667938
    'ipNetToMediaIfIndex' => '1.3.6.1.2.1.4.22.1.1',
Packit 667938
    'ipNetToMediaPhysAddress' => '1.3.6.1.2.1.4.22.1.2',
Packit 667938
    'ipNetToMediaNetAddress' => '1.3.6.1.2.1.4.22.1.3',
Packit 667938
    'ipNetToMediaType' => '1.3.6.1.2.1.4.22.1.4',
Packit 667938
    'ipRoutingDiscards' => '1.3.6.1.2.1.4.23',
Packit 667938
    'ipInReceives' => '1.3.6.1.2.1.4.3',
Packit 667938
    'ipInHdrErrors' => '1.3.6.1.2.1.4.4',
Packit 667938
    'ipInAddrErrors' => '1.3.6.1.2.1.4.5',
Packit 667938
    'ipForwDatagrams' => '1.3.6.1.2.1.4.6',
Packit 667938
    'ipInUnknownProtos' => '1.3.6.1.2.1.4.7',
Packit 667938
    'ipInDiscards' => '1.3.6.1.2.1.4.8',
Packit 667938
    'ipInDelivers' => '1.3.6.1.2.1.4.9',
Packit 667938
    'icmp' => '1.3.6.1.2.1.5',
Packit 667938
    'icmpInMsgs' => '1.3.6.1.2.1.5.1',
Packit 667938
    'icmpInTimestamps' => '1.3.6.1.2.1.5.10',
Packit 667938
    'icmpInTimestampReps' => '1.3.6.1.2.1.5.11',
Packit 667938
    'icmpInAddrMasks' => '1.3.6.1.2.1.5.12',
Packit 667938
    'icmpInAddrMaskReps' => '1.3.6.1.2.1.5.13',
Packit 667938
    'icmpOutMsgs' => '1.3.6.1.2.1.5.14',
Packit 667938
    'icmpOutErrors' => '1.3.6.1.2.1.5.15',
Packit 667938
    'icmpOutDestUnreachs' => '1.3.6.1.2.1.5.16',
Packit 667938
    'icmpOutTimeExcds' => '1.3.6.1.2.1.5.17',
Packit 667938
    'icmpOutParmProbs' => '1.3.6.1.2.1.5.18',
Packit 667938
    'icmpOutSrcQuenchs' => '1.3.6.1.2.1.5.19',
Packit 667938
    'icmpInErrors' => '1.3.6.1.2.1.5.2',
Packit 667938
    'icmpOutRedirects' => '1.3.6.1.2.1.5.20',
Packit 667938
    'icmpOutEchos' => '1.3.6.1.2.1.5.21',
Packit 667938
    'icmpOutEchoReps' => '1.3.6.1.2.1.5.22',
Packit 667938
    'icmpOutTimestamps' => '1.3.6.1.2.1.5.23',
Packit 667938
    'icmpOutTimestampReps' => '1.3.6.1.2.1.5.24',
Packit 667938
    'icmpOutAddrMasks' => '1.3.6.1.2.1.5.25',
Packit 667938
    'icmpOutAddrMaskReps' => '1.3.6.1.2.1.5.26',
Packit 667938
    'icmpInDestUnreachs' => '1.3.6.1.2.1.5.3',
Packit 667938
    'icmpInTimeExcds' => '1.3.6.1.2.1.5.4',
Packit 667938
    'icmpInParmProbs' => '1.3.6.1.2.1.5.5',
Packit 667938
    'icmpInSrcQuenchs' => '1.3.6.1.2.1.5.6',
Packit 667938
    'icmpInRedirects' => '1.3.6.1.2.1.5.7',
Packit 667938
    'icmpInEchos' => '1.3.6.1.2.1.5.8',
Packit 667938
    'icmpInEchoReps' => '1.3.6.1.2.1.5.9',
Packit 667938
    'tcp' => '1.3.6.1.2.1.6',
Packit 667938
    'tcpRtoAlgorithm' => '1.3.6.1.2.1.6.1',
Packit 667938
    'tcpInSegs' => '1.3.6.1.2.1.6.10',
Packit 667938
    'tcpOutSegs' => '1.3.6.1.2.1.6.11',
Packit 667938
    'tcpRetransSegs' => '1.3.6.1.2.1.6.12',
Packit 667938
    'tcpConnTable' => '1.3.6.1.2.1.6.13',
Packit 667938
    'tcpConnEntry' => '1.3.6.1.2.1.6.13.1',
Packit 667938
    'tcpConnState' => '1.3.6.1.2.1.6.13.1.1',
Packit 667938
    'tcpConnLocalAddress' => '1.3.6.1.2.1.6.13.1.2',
Packit 667938
    'tcpConnLocalPort' => '1.3.6.1.2.1.6.13.1.3',
Packit 667938
    'tcpConnRemAddress' => '1.3.6.1.2.1.6.13.1.4',
Packit 667938
    'tcpConnRemPort' => '1.3.6.1.2.1.6.13.1.5',
Packit 667938
    'tcpInErrs' => '1.3.6.1.2.1.6.14',
Packit 667938
    'tcpOutRsts' => '1.3.6.1.2.1.6.15',
Packit 667938
    'tcpRtoMin' => '1.3.6.1.2.1.6.2',
Packit 667938
    'tcpRtoMax' => '1.3.6.1.2.1.6.3',
Packit 667938
    'tcpMaxConn' => '1.3.6.1.2.1.6.4',
Packit 667938
    'tcpActiveOpens' => '1.3.6.1.2.1.6.5',
Packit 667938
    'tcpPassiveOpens' => '1.3.6.1.2.1.6.6',
Packit 667938
    'tcpAttemptFails' => '1.3.6.1.2.1.6.7',
Packit 667938
    'tcpEstabResets' => '1.3.6.1.2.1.6.8',
Packit 667938
    'tcpCurrEstab' => '1.3.6.1.2.1.6.9',
Packit 667938
    'udp' => '1.3.6.1.2.1.7',
Packit 667938
    'udpInDatagrams' => '1.3.6.1.2.1.7.1',
Packit 667938
    'udpNoPorts' => '1.3.6.1.2.1.7.2',
Packit 667938
    'udpInErrors' => '1.3.6.1.2.1.7.3',
Packit 667938
    'udpOutDatagrams' => '1.3.6.1.2.1.7.4',
Packit 667938
    'udpTable' => '1.3.6.1.2.1.7.5',
Packit 667938
    'udpEntry' => '1.3.6.1.2.1.7.5.1',
Packit 667938
    'udpLocalAddress' => '1.3.6.1.2.1.7.5.1.1',
Packit 667938
    'udpLocalPort' => '1.3.6.1.2.1.7.5.1.2',
Packit 667938
    'egp' => '1.3.6.1.2.1.8',
Packit 667938
    'egpInMsgs' => '1.3.6.1.2.1.8.1',
Packit 667938
    'egpInErrors' => '1.3.6.1.2.1.8.2',
Packit 667938
    'egpOutMsgs' => '1.3.6.1.2.1.8.3',
Packit 667938
    'egpOutErrors' => '1.3.6.1.2.1.8.4',
Packit 667938
    'egpNeighTable' => '1.3.6.1.2.1.8.5',
Packit 667938
    'egpNeighEntry' => '1.3.6.1.2.1.8.5.1',
Packit 667938
    'egpNeighState' => '1.3.6.1.2.1.8.5.1.1',
Packit 667938
    'egpNeighStateUps' => '1.3.6.1.2.1.8.5.1.10',
Packit 667938
    'egpNeighStateDowns' => '1.3.6.1.2.1.8.5.1.11',
Packit 667938
    'egpNeighIntervalHello' => '1.3.6.1.2.1.8.5.1.12',
Packit 667938
    'egpNeighIntervalPoll' => '1.3.6.1.2.1.8.5.1.13',
Packit 667938
    'egpNeighMode' => '1.3.6.1.2.1.8.5.1.14',
Packit 667938
    'egpNeighEventTrigger' => '1.3.6.1.2.1.8.5.1.15',
Packit 667938
    'egpNeighAddr' => '1.3.6.1.2.1.8.5.1.2',
Packit 667938
    'egpNeighAs' => '1.3.6.1.2.1.8.5.1.3',
Packit 667938
    'egpNeighInMsgs' => '1.3.6.1.2.1.8.5.1.4',
Packit 667938
    'egpNeighInErrs' => '1.3.6.1.2.1.8.5.1.5',
Packit 667938
    'egpNeighOutMsgs' => '1.3.6.1.2.1.8.5.1.6',
Packit 667938
    'egpNeighOutErrs' => '1.3.6.1.2.1.8.5.1.7',
Packit 667938
    'egpNeighInErrMsgs' => '1.3.6.1.2.1.8.5.1.8',
Packit 667938
    'egpNeighOutErrMsgs' => '1.3.6.1.2.1.8.5.1.9',
Packit 667938
    'egpAs' => '1.3.6.1.2.1.8.6',
Packit 667938
    'transmission' => '1.3.6.1.2.1.10',
Packit 667938
    'frame-relay' => '1.3.6.1.2.1.10.32',
Packit 667938
    'frDlcmiTable' => '1.3.6.1.2.1.10.32.1',
Packit 667938
    'frDlcmiEntry' => '1.3.6.1.2.1.10.32.1.1',
Packit 667938
    'frDlcmiIfIndex' => '1.3.6.1.2.1.10.32.1.1.1',
Packit 667938
    'frDlcmiState' => '1.3.6.1.2.1.10.32.1.1.2',
Packit 667938
    'frDlcmiAddress' => '1.3.6.1.2.1.10.32.1.1.3',
Packit 667938
    'frDlcmiAddressLen' => '1.3.6.1.2.1.10.32.1.1.4',
Packit 667938
    'frDlcmiPollingInterval' => '1.3.6.1.2.1.10.32.1.1.5',
Packit 667938
    'frDlcmiFullEnquiryInterval' => '1.3.6.1.2.1.10.32.1.1.6',
Packit 667938
    'frDlcmiErrorThreshold' => '1.3.6.1.2.1.10.32.1.1.7',
Packit 667938
    'frDlcmiMonitoredEvents' => '1.3.6.1.2.1.10.32.1.1.8',
Packit 667938
    'frDlcmiMaxSupportedVCs' => '1.3.6.1.2.1.10.32.1.1.9',
Packit 667938
    'frDlcmiMulticast' => '1.3.6.1.2.1.10.32.1.1.10',
Packit 667938
    'frCircuitTable' => '1.3.6.1.2.1.10.32.2',
Packit 667938
    'frCircuitEntry' => '1.3.6.1.2.1.10.32.2.1',
Packit 667938
    'frCircuitIfIndex' => '1.3.6.1.2.1.10.32.2.1.1',
Packit 667938
    'frCircuitDlci' => '1.3.6.1.2.1.10.32.2.1.2',
Packit 667938
    'frCircuitState' => '1.3.6.1.2.1.10.32.2.1.3',
Packit 667938
    'frCircuitReceivedFECNs' => '1.3.6.1.2.1.10.32.2.1.4',
Packit 667938
    'frCircuitReceivedBECNs' => '1.3.6.1.2.1.10.32.2.1.5',
Packit 667938
    'frCircuitSentFrames' => '1.3.6.1.2.1.10.32.2.1.6',
Packit 667938
    'frCircuitSentOctets' => '1.3.6.1.2.1.10.32.2.1.7',
Packit 667938
    'frOutOctets' => '1.3.6.1.2.1.10.32.2.1.7',
Packit 667938
    'frCircuitReceivedFrames' => '1.3.6.1.2.1.10.32.2.1.8',
Packit 667938
    'frCircuitReceivedOctets' => '1.3.6.1.2.1.10.32.2.1.9',
Packit 667938
    'frInOctets' => '1.3.6.1.2.1.10.32.2.1.9',
Packit 667938
    'frCircuitCreationTime' => '1.3.6.1.2.1.10.32.2.1.10',
Packit 667938
    'frCircuitLastTimeChange' => '1.3.6.1.2.1.10.32.2.1.11',
Packit 667938
    'frCircuitCommittedBurst' => '1.3.6.1.2.1.10.32.2.1.12',
Packit 667938
    'frCircuitExcessBurst' => '1.3.6.1.2.1.10.32.2.1.13',
Packit 667938
    'frCircuitThroughput' => '1.3.6.1.2.1.10.32.2.1.14',
Packit 667938
    'frErrTable' => '1.3.6.1.2.1.10.32.3',
Packit 667938
    'frErrEntry' => '1.3.6.1.2.1.10.32.3.1',
Packit 667938
    'frErrIfIndex' => '1.3.6.1.2.1.10.32.3.1.1',
Packit 667938
    'frErrType' => '1.3.6.1.2.1.10.32.3.1.2',
Packit 667938
    'frErrData' => '1.3.6.1.2.1.10.32.3.1.3',
Packit 667938
    'frErrTime' => '1.3.6.1.2.1.10.32.3.1.4',
Packit 667938
    'frame-relay-globals' => '1.3.6.1.2.1.10.32.4',
Packit 667938
    'frTrapState' => '1.3.6.1.2.1.10.32.4.1',
Packit 667938
    'snmp' => '1.3.6.1.2.1.11',
Packit 667938
    'snmpInPkts' => '1.3.6.1.2.1.11.1',
Packit 667938
    'snmpInBadValues' => '1.3.6.1.2.1.11.10',
Packit 667938
    'snmpInReadOnlys' => '1.3.6.1.2.1.11.11',
Packit 667938
    'snmpInGenErrs' => '1.3.6.1.2.1.11.12',
Packit 667938
    'snmpInTotalReqVars' => '1.3.6.1.2.1.11.13',
Packit 667938
    'snmpInTotalSetVars' => '1.3.6.1.2.1.11.14',
Packit 667938
    'snmpInGetRequests' => '1.3.6.1.2.1.11.15',
Packit 667938
    'snmpInGetNexts' => '1.3.6.1.2.1.11.16',
Packit 667938
    'snmpInSetRequests' => '1.3.6.1.2.1.11.17',
Packit 667938
    'snmpInGetResponses' => '1.3.6.1.2.1.11.18',
Packit 667938
    'snmpInTraps' => '1.3.6.1.2.1.11.19',
Packit 667938
    'snmpOutPkts' => '1.3.6.1.2.1.11.2',
Packit 667938
    'snmpOutTooBigs' => '1.3.6.1.2.1.11.20',
Packit 667938
    'snmpOutNoSuchNames' => '1.3.6.1.2.1.11.21',
Packit 667938
    'snmpOutBadValues' => '1.3.6.1.2.1.11.22',
Packit 667938
    'snmpOutGenErrs' => '1.3.6.1.2.1.11.24',
Packit 667938
    'snmpOutGetRequests' => '1.3.6.1.2.1.11.25',
Packit 667938
    'snmpOutGetNexts' => '1.3.6.1.2.1.11.26',
Packit 667938
    'snmpOutSetRequests' => '1.3.6.1.2.1.11.27',
Packit 667938
    'snmpOutGetResponses' => '1.3.6.1.2.1.11.28',
Packit 667938
    'snmpOutTraps' => '1.3.6.1.2.1.11.29',
Packit 667938
    'snmpInBadVersions' => '1.3.6.1.2.1.11.3',
Packit 667938
    'snmpEnableAuthenTraps' => '1.3.6.1.2.1.11.30',
Packit 667938
    'snmpInBadCommunityNames' => '1.3.6.1.2.1.11.4',
Packit 667938
    'snmpInBadCommunityUses' => '1.3.6.1.2.1.11.5',
Packit 667938
    'snmpInASNParseErrs' => '1.3.6.1.2.1.11.6',
Packit 667938
    'snmpInTooBigs' => '1.3.6.1.2.1.11.8',
Packit 667938
    'snmpInNoSuchNames' => '1.3.6.1.2.1.11.9',
Packit 667938
    'ifName' => '1.3.6.1.2.1.31.1.1.1.1',
Packit 667938
    'ifInMulticastPkts' => '1.3.6.1.2.1.31.1.1.1.2',
Packit 667938
    'ifInBroadcastPkts' => '1.3.6.1.2.1.31.1.1.1.3',
Packit 667938
    'ifOutMulticastPkts' => '1.3.6.1.2.1.31.1.1.1.4',
Packit 667938
    'ifOutBroadcastPkts' => '1.3.6.1.2.1.31.1.1.1.5',
Packit 667938
    'ifHCInOctets' => '1.3.6.1.2.1.31.1.1.1.6',
Packit 667938
    'ifHCInUcastPkts' => '1.3.6.1.2.1.31.1.1.1.7',
Packit 667938
    'ifHCInMulticastPkts' => '1.3.6.1.2.1.31.1.1.1.8',
Packit 667938
    'ifHCInBroadcastPkts' => '1.3.6.1.2.1.31.1.1.1.9',
Packit 667938
    'ifHCOutOctets' => '1.3.6.1.2.1.31.1.1.1.10',
Packit 667938
    'ifHCOutUcastPkts' => '1.3.6.1.2.1.31.1.1.1.11',
Packit 667938
    'ifHCOutMulticastPkts' => '1.3.6.1.2.1.31.1.1.1.12',
Packit 667938
    'ifHCOutBroadcastPkts' => '1.3.6.1.2.1.31.1.1.1.13',
Packit 667938
    'ifLinkUpDownTrapEnable' => '1.3.6.1.2.1.31.1.1.1.14',
Packit 667938
    'ifHighSpeed' => '1.3.6.1.2.1.31.1.1.1.15',
Packit 667938
    'ifPromiscuousMode' => '1.3.6.1.2.1.31.1.1.1.16',
Packit 667938
    'ifConnectorPresent' => '1.3.6.1.2.1.31.1.1.1.17',
Packit 667938
    'ifAlias' => '1.3.6.1.2.1.31.1.1.1.18',
Packit 667938
    'ifCounterDiscontinuityTime' => '1.3.6.1.2.1.31.1.1.1.19',
Packit 667938
    'experimental' => '1.3.6.1.3',
Packit 667938
    'private' => '1.3.6.1.4',
Packit 667938
    'enterprises' => '1.3.6.1.4.1',
Packit 667938
  );
Packit 667938
Packit 667938
# GIL
Packit 667938
my %revOIDS = ();	# Reversed %Net_SNMP_util::OIDS hash
Packit 667938
my $RevNeeded = 1;
Packit 667938
Packit 667938
undef $Net_SNMP_util::Host;
Packit 667938
undef $Net_SNMP_util::Session;
Packit 667938
undef $Net_SNMP_util::Version;
Packit 667938
undef $Net_SNMP_util::LHost;
Packit 667938
undef $Net_SNMP_util::IPv4only;
Packit 667938
undef $Net_SNMP_util::ContextEngineID;
Packit 667938
undef $Net_SNMP_util::ContextName;
Packit 667938
$Net_SNMP_util::Debug = 0;
Packit 667938
$Net_SNMP_util::SuppressWarnings = 0;
Packit 667938
$Net_SNMP_util::CacheFile = "OID_cache.txt";
Packit 667938
$Net_SNMP_util::CacheLoaded = 0;
Packit 667938
$Net_SNMP_util::ReturnArrayRefs = 0;
Packit 667938
$Net_SNMP_util::ReturnHashRefs = 0;
Packit 667938
$Net_SNMP_util::MaxRepetitions = 12;
Packit 667938
Packit 667938
### Prototypes
Packit 667938
sub snmpget ($@);
Packit 667938
sub snmpgetnext ($@);
Packit 667938
sub snmpopen ($$$);
Packit 667938
sub snmpwalk ($@);
Packit 667938
sub snmpwalk_flg ($$@);
Packit 667938
sub snmpset ($@);
Packit 667938
sub snmptrap ($$$$$@);
Packit 667938
sub snmpgetbulk ($$$@);
Packit 667938
sub snmpwalkhash ($$@);
Packit 667938
sub toOID (@);
Packit 667938
sub snmpmapOID (@);
Packit 667938
sub snmpMIB_to_OID ($);
Packit 667938
sub Check_OID ($);
Packit 667938
sub snmpLoad_OID_Cache ($);
Packit 667938
sub snmpQueue_MIB_File (@);
Packit 667938
sub ASNtype ($);
Packit 667938
sub error_msg ($);
Packit 667938
sub MIB_fill_OID ($);
Packit 667938
Packit 667938
sub version () { $VERSION; }
Packit 667938
Packit 667938
=head1 Option Notes
Packit 667938
Packit 667938
=over
Packit 667938
Packit 667938
=item host Parameter
Packit 667938
Packit 667938
SNMP parameters can be specified as part of the hostname/ip address passed
Packit 667938
as the first argument.  The syntax is
Packit 667938
Packit 667938
    community@host:port:timeout:retries:backoff:version
Packit 667938
Packit 667938
If the community is left off, it defaults to "public".
Packit 667938
If the port is left off, it defaults to 161 for everything but snmptrap().
Packit 667938
The snmptrap() routine uses a default port of 162.
Packit 667938
Timeout and retries defaults to whatever Net::SNMP uses, currently 5.0 seconds
Packit 667938
and 1 retry (2 tries total).
Packit 667938
The backoff parameter is currently unimplemented.
Packit 667938
The version parameter defaults to SNMP version 1.  Some SNMP values such as
Packit 667938
64-bit counters have to be queried using SNMP version 2.  Specifying "2" or
Packit 667938
"2c" as the version parameter will accomplish this.  The snmpgetbulk routine
Packit 667938
is only supported in SNMP version 2 and higher.  Additional security features
Packit 667938
are available under SNMP version 3.
Packit 667938
Packit 667938
Some machines have additional security features that only allow SNMP
Packit 667938
queries to come from certain IP addresses.  If the host doing the query
Packit 667938
has multiple interfaces, it may be necessary to specify the interface
Packit 667938
the query should come from.  The port parameter is further broken down into
Packit 667938
Packit 667938
    remote_port!local_address!local_port
Packit 667938
Packit 667938
Here are some examples:
Packit 667938
Packit 667938
    somehost
Packit 667938
    somehost:161
Packit 667938
    somehost:161!192.168.2.4!4000  use 192.168.2.4 and port 4000 as source
Packit 667938
    somehost:!192.168.2.4          use 192.168.2.4 as source
Packit 667938
    somehost:!!4000                use port 4000 as source
Packit 667938
Packit 667938
Most people will only need to use the first form ("somehost").
Packit 667938
Packit 667938
=item OBJECT IDENTIFIERs
Packit 667938
Packit 667938
To further simplify SNMP queries, the query routines use a small table that
Packit 667938
maps the textual representation of OBJECT IDENTIFIERs to their dotted notation.
Packit 667938
The OBJECT IDENTIFIERs from RFC1213 (MIB-II) and RFC1315 (Frame Relay) are
Packit 667938
preloaded.  This allows OBJECT IDENTIFIERs like "ifInOctets.4" to be used
Packit 667938
instead of the more cumbersome "1.3.6.1.2.1.2.2.1.10.4".
Packit 667938
Packit 667938
Several functions are provided to manage the mapping table.  Mapping entries
Packit 667938
can be added directly, SNMP MIB files can be read, and a cache file with the
Packit 667938
text-to-OBJECT-IDENTIFIER mappings are maintained.  By default, the file
Packit 667938
"OID_cache.txt" is loaded, but it can by changed by setting the variable
Packit 667938
$Net_SNMP_util::CacheFile to the desired file name.  The functions to
Packit 667938
manipulate the mappings are:
Packit 667938
Packit 667938
    snmpmapOID			Add a textual OID mapping directly
Packit 667938
    snmpMIB_to_OID		Read a SNMP MIB file
Packit 667938
    snmpLoad_OID_Cache		Load an OID-mapping cache file
Packit 667938
    snmpQueue_MIB_File		Queue a SNMP MIB file for loading on demand
Packit 667938
Packit 667938
=item Net::SNMP extensions
Packit 667938
Packit 667938
This module is built on top of Net::SNMP.  Net::SNMP has a different method
Packit 667938
of specifying SNMP parameters.  To support this different method, this module
Packit 667938
will accept an optional hash reference containing the SNMP parameters. The
Packit 667938
hash may contain the following:
Packit 667938
Packit 667938
	[-port		=> $port,]
Packit 667938
	[-localaddr	=> $localaddr,]
Packit 667938
	[-localport     => $localport,]
Packit 667938
	[-version       => $version,]
Packit 667938
	[-domain        => $domain,]
Packit 667938
	[-timeout       => $seconds,]
Packit 667938
	[-retries       => $count,]
Packit 667938
	[-maxmsgsize    => $octets,]
Packit 667938
	[-debug         => $bitmask,]
Packit 667938
	[-community     => $community,]   # v1/v2c  
Packit 667938
	[-username      => $username,]    # v3
Packit 667938
	[-authkey	=> $authkey,]     # v3  
Packit 667938
	[-authpassword  => $authpasswd,]  # v3  
Packit 667938
	[-authprotocol  => $authproto,]   # v3  
Packit 667938
	[-privkey       => $privkey,]     # v3  
Packit 667938
	[-privpassword  => $privpasswd,]  # v3  
Packit 667938
	[-privprotocol  => $privproto,]   # v3
Packit 667938
	[-contextengineid => $engine_id,] # v3 
Packit 667938
	[-contextname     => $name,]      # v3
Packit 667938
Packit 667938
Please see the documentation for Net::SNMP for a description of these
Packit 667938
parameters.
Packit 667938
Packit 667938
=item SNMPv3 Arguments
Packit 667938
Packit 667938
A SNMP context is a collection of management information accessible by a SNMP 
Packit 667938
entity.  An item of management information may exist in more than one context 
Packit 667938
and a SNMP entity potentially has access to many contexts.  The combination of 
Packit 667938
a contextEngineID and a contextName unambiguously identifies a context within 
Packit 667938
an administrative domain.  In a SNMPv3 message, the contextEngineID and 
Packit 667938
contextName are included as part of the scopedPDU.  All methods that generate 
Packit 667938
a SNMP message optionally take a B<-contextengineid> and B<-contextname> 
Packit 667938
argument to configure these fields.
Packit 667938
Packit 667938
=over
Packit 667938
Packit 667938
=item Context Engine ID
Packit 667938
Packit 667938
The B<-contextengineid> argument expects a hexadecimal string representing
Packit 667938
the desired contextEngineID.  The string must be 10 to 64 characters (5 to 
Packit 667938
32 octets) long and can be prefixed with an optional "0x".  Once the 
Packit 667938
B<-contextengineid> is specified it stays with the object until it is changed 
Packit 667938
again or reset to default by passing in the undefined value.  By default, the 
Packit 667938
contextEngineID is set to match the authoritativeEngineID of the authoritative
Packit 667938
SNMP engine.
Packit 667938
Packit 667938
=item Context Name
Packit 667938
Packit 667938
The contextName is passed as a string which must be 0 to 32 octets in length 
Packit 667938
using the B<-contextname> argument.  The contextName stays with the object 
Packit 667938
until it is changed.  The contextName defaults to an empty string which 
Packit 667938
represents the "default" context.
Packit 667938
Packit 667938
=back
Packit 667938
Packit 667938
=back
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
# [public methods] ---------------------------------------------------
Packit 667938
Packit 667938
=head1 Functions
Packit 667938
Packit 667938
=head2 snmpget() - send a SNMP get-request to the remote agent
Packit 667938
Packit 667938
    @result = snmpget(
Packit 667938
		[community@]host[:port[:timeout[:retries[:backoff[:version]]]]],
Packit 667938
		[\%param_hash],
Packit 667938
		@oids
Packit 667938
	    );
Packit 667938
Packit 667938
This function performs a SNMP get-request query to gather data from the remote
Packit 667938
agent on the host specified.  The message is built using the list of OBJECT
Packit 667938
IDENTIFIERs passed as an array.  Each OBJECT IDENTIFIER is placed into a single
Packit 667938
SNMP GetRequest-PDU in the same order that it held in the original list.
Packit 667938
Packit 667938
The requested values are returned in an array in the same order as they were
Packit 667938
requested.  In scalar context the first requested value is returned.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# snmpget.
Packit 667938
#
Packit 667938
sub snmpget ($@) {
Packit 667938
  my($host, @vars) = @_;
Packit 667938
  my($session, @enoid, %args, $ret, $oid, @retvals);
Packit 667938
Packit 667938
  @retvals = ();
Packit 667938
  $session = &snmpopen($host, 0, \@vars);
Packit 667938
  if (!defined($session)) {
Packit 667938
    carp "SNMPGET Problem for $host"
Packit 667938
      unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
    return wantarray ? @retvals : undef;
Packit 667938
  }
Packit 667938
Packit 667938
  @enoid = &toOID(@vars);
Packit 667938
  if ($#enoid < 0) {
Packit 667938
    return wantarray ? @retvals : undef;
Packit 667938
  }
Packit 667938
Packit 667938
  $args{'-varbindlist'} = \@enoid;
Packit 667938
  if ($Net_SNMP_util::Version > 2) {
Packit 667938
    $args{'-contextengineid'} = $Net_SNMP_util::ContextEngineID
Packit 667938
      if (defined($Net_SNMP_util::ContextEngineID));
Packit 667938
    $args{'-contextname'} = $Net_SNMP_util::ContextName
Packit 667938
      if (defined($Net_SNMP_util::ContextName));
Packit 667938
  }
Packit 667938
Packit 667938
  $ret = $session->get_request(%args);
Packit 667938
Packit 667938
  if ($ret) {
Packit 667938
      foreach $oid (@enoid) {
Packit 667938
      push @retvals, $ret->{$oid} if (exists($ret->{$oid}));
Packit 667938
    }
Packit 667938
    return wantarray ? @retvals : $retvals[0];
Packit 667938
  }
Packit 667938
  $ret = join(' ', @vars);
Packit 667938
  error_msg("SNMPGET Problem for $ret on ${host}: " . $session->error());
Packit 667938
  return wantarray ? @retvals : undef;
Packit 667938
}
Packit 667938
Packit 667938
=head2 snmpgetnext() - send a SNMP get-next-request to the remote agent
Packit 667938
Packit 667938
    @result = snmpgetnext(
Packit 667938
		[community@]host[:port[:timeout[:retries[:backoff[:version]]]]],
Packit 667938
		[\%param_hash],
Packit 667938
		@oids
Packit 667938
	    );
Packit 667938
Packit 667938
This function performs a SNMP get-next-request query to gather data from the
Packit 667938
remote agent on the host specified.  The message is built using the list of
Packit 667938
OBJECT IDENTIFIERs passed as an array.  Each OBJECT IDENTIFIER is placed into a
Packit 667938
single SNMP GetNextRequest-PDU in the same order that it held in the original
Packit 667938
list.
Packit 667938
Packit 667938
The requested values are returned in an array in the same order as they were
Packit 667938
requested.  The OBJECT IDENTIFIER number is added as a prefix to each value
Packit 667938
using a colon as a separator, like '1.3.6.1.2.1.2.2.1.2.1:ethernet'.
Packit 667938
In scalar context the first requested value is returned.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# snmpgetnext.
Packit 667938
#
Packit 667938
sub snmpgetnext ($@) {
Packit 667938
  my($host, @vars) = @_;
Packit 667938
  my($session, @enoid, %args, $ret, $oid, @retvals);
Packit 667938
Packit 667938
  @retvals = ();
Packit 667938
  $session = &snmpopen($host, 0, \@vars);
Packit 667938
  if (!defined($session)) {
Packit 667938
    carp "SNMPGETNEXT Problem for $host"
Packit 667938
      unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
    return wantarray ? @retvals : undef;
Packit 667938
  }
Packit 667938
Packit 667938
  @enoid = &toOID(@vars);
Packit 667938
  if ($#enoid < 0) {
Packit 667938
    return wantarray ? @retvals : undef;
Packit 667938
  }
Packit 667938
Packit 667938
  $args{'-varbindlist'} = \@enoid;
Packit 667938
  if ($Net_SNMP_util::Version > 2) {
Packit 667938
    $args{'-contextengineid'} = $Net_SNMP_util::ContextEngineID
Packit 667938
      if (defined($Net_SNMP_util::ContextEngineID));
Packit 667938
    $args{'-contextname'} = $Net_SNMP_util::ContextName
Packit 667938
      if (defined($Net_SNMP_util::ContextName));
Packit 667938
  }
Packit 667938
Packit 667938
  $ret = $session->get_next_request(%args);
Packit 667938
Packit 667938
  if ($ret) {
Packit 667938
    foreach $oid (@enoid) {
Packit 667938
      push @retvals, $oid . ':' . $ret->{$oid} if (exists($ret->{$oid}));
Packit 667938
    }
Packit 667938
    return wantarray ? @retvals : $retvals[0];
Packit 667938
  }
Packit 667938
  $ret = join(' ', @vars);
Packit 667938
  error_msg("SNMPGETNEXT Problem for $ret on ${host}: " . $session->error());
Packit 667938
  return wantarray ? @retvals : undef;
Packit 667938
}
Packit 667938
Packit 667938
=head2 snmpgetbulk() - send a SNMP get-bulk-request to the remote agent
Packit 667938
Packit 667938
    @result = snmpgetbulk(
Packit 667938
		[community@]host[:port[:timeout[:retries[:backoff[:version]]]]],
Packit 667938
		$nonrepeaters,
Packit 667938
		$maxrepetitions,
Packit 667938
		[\%param_hash],
Packit 667938
		@oids
Packit 667938
	    );
Packit 667938
Packit 667938
This function performs a SNMP get-bulk-request query to gather data from the
Packit 667938
remote agent on the host specified.
Packit 667938
Packit 667938
=over
Packit 667938
Packit 667938
=item *
Packit 667938
Packit 667938
The B<$nonrepeaters> value specifies the number of variables in the @oids list
Packit 667938
for which a single successor is to be returned.  If it is null or undefined,
Packit 667938
a value of 0 is used.
Packit 667938
Packit 667938
=item *
Packit 667938
Packit 667938
The B<$maxrepetitions> value specifies the number of successors to be returned
Packit 667938
for the remaining variables in the @oids list.  If it is null or undefined,
Packit 667938
the default value of 12 is used.
Packit 667938
Packit 667938
=item *
Packit 667938
Packit 667938
The message is built using the list of
Packit 667938
OBJECT IDENTIFIERs passed as an array.  Each OBJECT IDENTIFIER is placed into a
Packit 667938
single SNMP GetNextRequest-PDU in the same order that it held in the original
Packit 667938
list.
Packit 667938
Packit 667938
=back
Packit 667938
Packit 667938
The requested values are returned in an array in the same order as they were
Packit 667938
requested.
Packit 667938
Packit 667938
B<NOTE:> This function can only be used when the SNMP version is set to
Packit 667938
SNMPv2c or SNMPv3.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# snmpgetbulk.
Packit 667938
#
Packit 667938
sub snmpgetbulk ($$$@) {
Packit 667938
  my($host, $nr, $mr, @vars) = @_;
Packit 667938
  my($session, %args, @enoid, $ret);
Packit 667938
  my($oid, @retvals);
Packit 667938
Packit 667938
  @retvals = ();
Packit 667938
  $session = &snmpopen($host, 0, \@vars);
Packit 667938
  if (!defined($session)) {
Packit 667938
    carp "SNMPGETBULK Problem for $host"
Packit 667938
      unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
    return @retvals;
Packit 667938
  }
Packit 667938
Packit 667938
  if ($Net_SNMP_util::Version < 2) {
Packit 667938
    carp "SNMPGETBULK Problem for $host : must use SNMP version > 1"
Packit 667938
      unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
    return @retvals;
Packit 667938
  }
Packit 667938
Packit 667938
  $args{'-nonrepeaters'} = $nr if ($nr > 0);
Packit 667938
  $mr = $Net_SNMP_util::MaxRepetitions if ($mr <= 0);
Packit 667938
  $args{'-maxrepetitions'} = $mr;
Packit 667938
Packit 667938
  if ($Net_SNMP_util::Version > 2) {
Packit 667938
    $args{'-contextengineid'} = $Net_SNMP_util::ContextEngineID
Packit 667938
      if (defined($Net_SNMP_util::ContextEngineID));
Packit 667938
    $args{'-contextname'} = $Net_SNMP_util::ContextName
Packit 667938
      if (defined($Net_SNMP_util::ContextName));
Packit 667938
  }
Packit 667938
Packit 667938
  @enoid = &toOID(@vars);
Packit 667938
  return @retvals if ($#enoid < 0);
Packit 667938
Packit 667938
  $args{'-varbindlist'} = \@enoid;
Packit 667938
  $ret = $session->get_bulk_request(%args);
Packit 667938
Packit 667938
  if ($ret) {
Packit 667938
    @enoid = &Net::SNMP::oid_lex_sort(keys %$ret);
Packit 667938
    foreach $oid (@enoid) {
Packit 667938
      push @retvals, $oid . ":" . $ret->{$oid};
Packit 667938
    }
Packit 667938
    return @retvals;
Packit 667938
  } else {
Packit 667938
    $ret = join(' ', @vars);
Packit 667938
    error_msg("SNMPGETBULK Problem for $ret on ${host}: " . $session->error());
Packit 667938
    return @retvals;
Packit 667938
  }
Packit 667938
}
Packit 667938
Packit 667938
Packit 667938
=head2 snmpwalk() - walk OBJECT IDENTIFIER tree(s) on the remote agent
Packit 667938
Packit 667938
    @result = snmpwalk(
Packit 667938
		[community@]host[:port[:timeout[:retries[:backoff[:version]]]]],
Packit 667938
		[\%param_hash],
Packit 667938
		@oids
Packit 667938
	    );
Packit 667938
Packit 667938
This function performs a sequence of SNMP get-next-request or get-bulk-request
Packit 667938
(if the SNMP version is 2 or higher) queries to gather data from the remote
Packit 667938
agent on the host specified.  The initial message is built using the list of
Packit 667938
OBJECT IDENTIFIERs passed as an array.  Each OBJECT IDENTIFIER is placed into a
Packit 667938
single SNMP GetNextRequest-PDU in the same order that it held in the original
Packit 667938
list.  Queries continue until all the returned OBJECT IDENTIFIERs are no longer
Packit 667938
a child of the base OBJECT IDENTIFIERs.
Packit 667938
Packit 667938
The requested values are returned in an array in the same order as they were
Packit 667938
requested.  The OBJECT IDENTIFIER number is added as a prefix to each value
Packit 667938
using a colon as a separator, like '1.3.6.1.2.1.2.2.1.2.1:ethernet'.  If only
Packit 667938
one OBJECT IDENTIFIER is requested, just the "instance" part of the OBJECT
Packit 667938
IDENTIFIER is added as a prefix, like '1:ethernet', '2:ethernet', '3:fddi'.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# snmpwalk.
Packit 667938
#
Packit 667938
sub snmpwalk ($@) {
Packit 667938
  my($host, @vars) = @_;
Packit 667938
  return(&snmpwalk_flg($host, undef, @vars));
Packit 667938
}
Packit 667938
Packit 667938
=head2 snmpset() - send a SNMP set-request to the remote agent
Packit 667938
Packit 667938
    @result = snmpset(
Packit 667938
		[community@]host[:port[:timeout[:retries[:backoff[:version]]]]],
Packit 667938
		[\%param_hash],
Packit 667938
		$oid1, $type1, $value1,
Packit 667938
		[$oid2, $type2, $value2 ...]
Packit 667938
	    );
Packit 667938
Packit 667938
This function is used to modify data on the remote agent using a SNMP
Packit 667938
set-request.  The message is built using the list of values consisting of groups
Packit 667938
of an OBJECT IDENTIFIER, an object type, and the actual value to be set.
Packit 667938
The object type can be one of the following strings:
Packit 667938
Packit 667938
    integer | int
Packit 667938
    string | octetstring | octet string
Packit 667938
    oid | object id | object identifier
Packit 667938
    ipaddr | ip addr4ess
Packit 667938
    timeticks
Packit 667938
    uint | uinteger | uinteger32 | unsigned int | unsigned integer | unsigned integer32
Packit 667938
    counter | counter 32
Packit 667938
    counter64
Packit 667938
    gauge | gauge32
Packit 667938
Packit 667938
The object type may also be an octet corresponding to the ASN.1 type.  See
Packit 667938
the Net::SNMP documentation for more information.
Packit 667938
Packit 667938
The requested values are returned in an array in the same order as they were
Packit 667938
requested.  In scalar context the first requested value is returned.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# snmpset.
Packit 667938
#
Packit 667938
sub snmpset($@) {
Packit 667938
  my($host, @vars) = @_;
Packit 667938
  my($session, @vals, %args, $ret);
Packit 667938
  my($oid, $type, $value, @enoid, @retvals);
Packit 667938
Packit 667938
  @retvals = ();
Packit 667938
  $session = &snmpopen($host, 0, \@vars);
Packit 667938
  if (!defined($session)) {
Packit 667938
    carp "SNMPSET Problem for $host"
Packit 667938
      unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
    return wantarray ? @retvals : undef;
Packit 667938
  }
Packit 667938
Packit 667938
  if ($Net_SNMP_util::Version > 2) {
Packit 667938
    $args{'-contextengineid'} = $Net_SNMP_util::ContextEngineID
Packit 667938
      if (defined($Net_SNMP_util::ContextEngineID));
Packit 667938
    $args{'-contextname'} = $Net_SNMP_util::ContextName
Packit 667938
      if (defined($Net_SNMP_util::ContextName));
Packit 667938
  }
Packit 667938
Packit 667938
  while(@vars) {
Packit 667938
    ($oid) = toOID((shift @vars));
Packit 667938
    $ret   = shift @vars;
Packit 667938
    $value = shift @vars;
Packit 667938
    $type  = ASNtype($ret);
Packit 667938
    if (!defined($type)) {
Packit 667938
      carp "Unknown SNMP type: $type\n"
Packit 667938
	unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
    }
Packit 667938
    push @vals, $oid, $type, $value;
Packit 667938
    push @enoid, $oid;
Packit 667938
  }
Packit 667938
  if ($#vals < 0) {
Packit 667938
    return wantarray ? @retvals : undef;
Packit 667938
  }
Packit 667938
Packit 667938
  $args{'-varbindlist'} = \@vals;
Packit 667938
Packit 667938
  $ret = $session->set_request(%args);
Packit 667938
  if ($ret) {
Packit 667938
      foreach $oid (@enoid) {
Packit 667938
	push @retvals, $ret->{$oid} if (exists($ret->{$oid}));
Packit 667938
    }
Packit 667938
    return wantarray ? @retvals : $retvals[0];
Packit 667938
  }
Packit 667938
  $ret = join(' ', @enoid);
Packit 667938
  error_msg("SNMPSET Problem for $ret on ${host}: " . $session->error());
Packit 667938
  return wantarray ? @retvals : undef;
Packit 667938
}
Packit 667938
Packit 667938
=head2 snmptrap() - send a SNMP trap to the remote manager
Packit 667938
Packit 667938
    @result = snmptrap(
Packit 667938
		[community@]host[:port[:timeout[:retries[:backoff[:version]]]]],
Packit 667938
		$enterprise,
Packit 667938
		$agentaddr,
Packit 667938
		$generictrap,
Packit 667938
		$specifictrap,
Packit 667938
		[\%param_hash],
Packit 667938
		$oid1, $type1, $value1, 
Packit 667938
		[$oid2, $type2, $value2 ...]
Packit 667938
	    );
Packit 667938
Packit 667938
This function sends a SNMP trap to the remote manager on the host specified.
Packit 667938
The message is built using the list of values consisting of groups of an
Packit 667938
OBJECT IDENTIFIER, an object type, and the actual value to be set.
Packit 667938
The object type can be one of the following strings:
Packit 667938
Packit 667938
    integer | int
Packit 667938
    string | octetstring | octet string
Packit 667938
    oid | object id | object identifier
Packit 667938
    ipaddr | ip addr4ess
Packit 667938
    timeticks
Packit 667938
    uint | uinteger | uinteger32 | unsigned int | unsigned integer | unsigned integer32
Packit 667938
    counter | counter 32
Packit 667938
    counter64
Packit 667938
    gauge | gauge32
Packit 667938
Packit 667938
The object type may also be an octet corresponding to the ASN.1 type.  See
Packit 667938
the Net::SNMP documentation for more information.
Packit 667938
Packit 667938
A true value is returned if sending the trap is successful.  The undefined value
Packit 667938
is returned when a failure has occurred.
Packit 667938
Packit 667938
When the trap is sent as SNMPv2c, the B<$enterprise>, B<$agentaddr>,
Packit 667938
B<$generictrap>, and B<$specifictrap> arguments are ignored.  Furthermore,
Packit 667938
the first two (oid, type, value) tuples should be:
Packit 667938
Packit 667938
=over
Packit 667938
Packit 667938
=item *
Packit 667938
Packit 667938
sysUpTime.0 - ('1.3.6.1.2.1.1.3.0', 'timeticks', $timeticks)
Packit 667938
Packit 667938
=item *
Packit 667938
Packit 667938
snmpTrapOID.0 - ('1.3.6.1.6.3.1.1.4.1.0', 'oid', $oid)
Packit 667938
Packit 667938
=back
Packit 667938
Packit 667938
B<NOTE:> This function can only be used when the SNMP version is set to
Packit 667938
SNMPv1 or SNMPv2c.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# Send an SNMP trap
Packit 667938
#
Packit 667938
sub snmptrap($$$$$@) {
Packit 667938
  my($host, $ent, $agent, $gen, $spec, @vars) = @_;
Packit 667938
  my($oid, $type, $value, $ret, @enoid, @vals);
Packit 667938
  my($session, %args);
Packit 667938
Packit 667938
  $session = &snmpopen($host, 1, \@vars);
Packit 667938
  if (!defined($session)) {
Packit 667938
    carp "SNMPTRAP Problem for $host"
Packit 667938
      unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
    return undef;
Packit 667938
  }
Packit 667938
Packit 667938
  if ($Net_SNMP_util::Version == 1) {
Packit 667938
    $args{'-enterprise'} = $ent if (defined($ent) and (length($ent) > 0));
Packit 667938
    $args{'-agentaddr'} = $agent if (defined($agent) and (length($agent) > 0));
Packit 667938
    $args{'-generictrap'} = $gen if (defined($gen) and (length($gen) > 0));
Packit 667938
    $args{'-specifictrap'} = $spec if (defined($spec) and (length($spec) > 0));
Packit 667938
  } elsif ($Net_SNMP_util::Version > 2) {
Packit 667938
    carp "SNMPTRAP Problem for $host : must use SNMP version 1 or 2"
Packit 667938
      unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
  }
Packit 667938
Packit 667938
  while(@vars) {
Packit 667938
    ($oid) = toOID((shift @vars));
Packit 667938
    $ret   = shift @vars;
Packit 667938
    $value = shift @vars;
Packit 667938
    $type  = ASNtype($ret);
Packit 667938
    if (!defined($type)) {
Packit 667938
      carp "unknown SNMP type: $type"
Packit 667938
	unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
    }
Packit 667938
    push @vals, $oid, $type, $value;
Packit 667938
    push @enoid, $oid;
Packit 667938
  }
Packit 667938
  return undef unless defined $vals[0];
Packit 667938
Packit 667938
  $args{'-varbindlist'} = \@vals;
Packit 667938
Packit 667938
  if ($Net_SNMP_util::Version == 1) {
Packit 667938
    $ret = $session->trap_request(%args);
Packit 667938
  } else {
Packit 667938
    $ret = $session->snmpv2_trap(%args);
Packit 667938
  }
Packit 667938
Packit 667938
  if (!$ret) {
Packit 667938
    $ret = join(' ', @enoid);
Packit 667938
    error_msg("SNMPTRAP Problem for $ret on ${host}: " . $session->error());
Packit 667938
  }
Packit 667938
  return $ret;
Packit 667938
}
Packit 667938
Packit 667938
=head2 snmpmaptable() - walk OBJECT IDENTIFIER tree(s) on the remote agent
Packit 667938
Packit 667938
    $result = snmpmaptable(
Packit 667938
		[community@]host[:port[:timeout[:retries[:backoff[:version]]]]],
Packit 667938
		\&function,
Packit 667938
		[\%param_hash],
Packit 667938
		@oids
Packit 667938
	    );
Packit 667938
Packit 667938
This function performs a sequence of SNMP get-next-request or get-bulk-request
Packit 667938
(if the SNMP version is 2 or higher) queries to gather data from the remote
Packit 667938
agent on the host specified.  The initial message is built using the list of
Packit 667938
OBJECT IDENTIFIERs passed as an array.  Each OBJECT IDENTIFIER is placed into a
Packit 667938
single SNMP GetNextRequest-PDU in the same order that it held in the original
Packit 667938
list.  Queries continue until all the returned OBJECT IDENTIFIERs are no longer
Packit 667938
a child of the base OBJECT IDENTIFIERs.  The OBJECT IDENTIFIERs must correspond
Packit 667938
to column entries for a conceptual row in a table.  They may however be columns
Packit 667938
in different tables as long as each table is indexed the same way.
Packit 667938
Packit 667938
=over
Packit 667938
Packit 667938
=item *
Packit 667938
Packit 667938
The B<\&function> argument will be called once per row of the table.  It
Packit 667938
will be passed the row index as a partial OBJECT IDENTIFIER in dotted notation,
Packit 667938
e.g. "1.3" or "10.0.1.34", and the values of the requested table columns in
Packit 667938
that row.
Packit 667938
Packit 667938
=back
Packit 667938
Packit 667938
The number of rows in the table is returned on success.  The undefined value
Packit 667938
is returned when a failure has occurred.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# walk a table, calling a user-supplied function for each
Packit 667938
# column of a table.
Packit 667938
#
Packit 667938
sub snmpmaptable($$@) {
Packit 667938
  my($host, $fun, @vars) = @_;
Packit 667938
  return snmpmaptable4($host, $fun, 0, @vars);
Packit 667938
}
Packit 667938
Packit 667938
=head2 snmpmaptable4() - walk OBJECT IDENTIFIER tree(s) on the remote agent
Packit 667938
Packit 667938
    $result = snmpmaptable4(
Packit 667938
		[community@]host[:port[:timeout[:retries[:backoff[:version]]]]],
Packit 667938
		\&function,
Packit 667938
		$maxrepetitions,
Packit 667938
		[\%param_hash],
Packit 667938
		@oids
Packit 667938
	    );
Packit 667938
Packit 667938
This function performs a sequence of SNMP get-next-request or get-bulk-request
Packit 667938
(if the SNMP version is 2 or higher) queries to gather data from the remote
Packit 667938
agent on the host specified.  The initial message is built using the list of
Packit 667938
OBJECT IDENTIFIERs passed as an array.  Each OBJECT IDENTIFIER is placed into a
Packit 667938
single SNMP GetNextRequest-PDU in the same order that it held in the original
Packit 667938
list.  Queries continue until all the returned OBJECT IDENTIFIERs are no longer
Packit 667938
a child of the base OBJECT IDENTIFIERs.  The OBJECT IDENTIFIERs must correspond
Packit 667938
to column entries for a conceptual row in a table.  They may however be columns
Packit 667938
in different tables as long as each table is indexed the same way.
Packit 667938
Packit 667938
=over
Packit 667938
Packit 667938
=item *
Packit 667938
Packit 667938
The B<\&function> argument will be called once per row of the table.  It
Packit 667938
will be passed the row index as a partial OBJECT IDENTIFIER in dotted notation,
Packit 667938
e.g. "1.3" or "10.0.1.34", and the values of the requested table columns in
Packit 667938
that row.
Packit 667938
Packit 667938
=item *
Packit 667938
Packit 667938
The B<$maxrepetitions> argument specifies the number of rows to be returned
Packit 667938
by a single get-bulk-request.  If it is null or undefined, the default value
Packit 667938
of 12 is used.
Packit 667938
Packit 667938
=back
Packit 667938
Packit 667938
The number of rows in the table is returned on success.  The undefined value
Packit 667938
is returned when a failure has occurred.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
sub snmpmaptable4($$$@) {
Packit 667938
  my($host, $fun, $max_reps, @vars) = @_;
Packit 667938
  my($session, @enoid, %args, $ret);
Packit 667938
  my($oid, $soid, $toid, $inst, @row, $nr);
Packit 667938
Packit 667938
  $session = &snmpopen($host, 0, \@vars);
Packit 667938
  if (!defined($session)) {
Packit 667938
    carp "SNMPMAPTABLE Problem for $host"
Packit 667938
      unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
    return undef;
Packit 667938
  }
Packit 667938
Packit 667938
  @enoid = toOID(@vars);
Packit 667938
  return undef unless defined $enoid[0];
Packit 667938
Packit 667938
  if ($Net_SNMP_util::Version > 1) {
Packit 667938
    $max_reps = $Net_SNMP_util::MaxRepetitions if ($max_reps <= 0);
Packit 667938
    $args{'-maxrepetitions'} = $max_reps;
Packit 667938
  }
Packit 667938
  if ($Net_SNMP_util::Version > 2) {
Packit 667938
    $args{'-contextengineid'} = $Net_SNMP_util::ContextEngineID
Packit 667938
      if (defined($Net_SNMP_util::ContextEngineID));
Packit 667938
    $args{'-contextname'} = $Net_SNMP_util::ContextName
Packit 667938
      if (defined($Net_SNMP_util::ContextName));
Packit 667938
  }
Packit 667938
Packit 667938
  $args{'-columns'} = \@enoid;
Packit 667938
Packit 667938
  $ret = $session->get_entries(%args);
Packit 667938
Packit 667938
  if ($ret) {
Packit 667938
    $soid = $enoid[0];
Packit 667938
    $nr = 0;
Packit 667938
    foreach $oid (&Net::SNMP::oid_lex_sort(keys %$ret)) {
Packit 667938
      if (&Net::SNMP::oid_base_match($soid, $oid)) {
Packit 667938
	$inst = substr($oid, length($soid)+1);
Packit 667938
	undef @row;
Packit 667938
	foreach $toid (@enoid) {
Packit 667938
	  push @row, $ret->{$toid . "." . $inst};
Packit 667938
	}
Packit 667938
	&$fun($inst, @row);
Packit 667938
	$nr++;
Packit 667938
      } else {
Packit 667938
	return($nr) if ($nr > 0);
Packit 667938
      }
Packit 667938
    }
Packit 667938
    return($nr);
Packit 667938
  } else {
Packit 667938
    $ret = join(' ', @vars);
Packit 667938
    error_msg("SNMPMAPTABLE Problem for $ret on ${host}: " . $session->error());
Packit 667938
    return undef;
Packit 667938
  }
Packit 667938
}
Packit 667938
Packit 667938
=head2 snmpwalkhash() - send a SNMP get-next-request to the remote agent
Packit 667938
Packit 667938
    @result = snmpwalkhash(
Packit 667938
		[community@]host[:port[:timeout[:retries[:backoff[:version]]]]],
Packit 667938
		\&function(),
Packit 667938
		[\%param_hash],
Packit 667938
		@oids,
Packit 667938
		[\%hash]
Packit 667938
	    );
Packit 667938
Packit 667938
This function performs a sequence of SNMP get-next-request or get-bulk-request
Packit 667938
(if the SNMP version is 2 or higher) queries to gather data from the remote
Packit 667938
agent on the host specified.  The message is built using the list of
Packit 667938
OBJECT IDENTIFIERs passed as an array.  Each OBJECT IDENTIFIER is placed into a
Packit 667938
single SNMP GetNextRequest-PDU in the same order that it held in the original
Packit 667938
list.  Queries continue until all the returned OBJECT IDENTIFIERs are outside
Packit 667938
of the tree specified by the initial OBJECT IDENTIFIERs.
Packit 667938
Packit 667938
The B<\&function> is called once for every returned value.  It is passed a
Packit 667938
reference to a hash, the hostname, the textual OBJECT IDENTIFIER, the
Packit 667938
dotted-numberic OBJECT IDENTIFIER, the instance, the value and the requested
Packit 667938
textual OBJECT IDENTIFIER.  That function can customize the result so the
Packit 667938
values can be extracted later by hosts, by oid_names, by oid_numbers,
Packit 667938
by instances... like these:
Packit 667938
Packit 667938
    $hash{$host}{$name}{$inst} = $value;
Packit 667938
    $hash{$host}{$oid}{$inst} = $value;
Packit 667938
    $hash{$name}{$inst} = $value;
Packit 667938
    $hash{$oid}{$inst} = $value;
Packit 667938
    $hash{$oid . '.' . $ints} = $value;
Packit 667938
    $hash{$inst} = $value;
Packit 667938
    ...
Packit 667938
Packit 667938
If the last argument to B<snmpwalkhash> is a reference to a hash, that hash
Packit 667938
reference is passed to the passed-in function instead of a local hash
Packit 667938
reference.  That way the function can look up other objects unrelated
Packit 667938
to the current invocation of B<snmpwalkhash>.
Packit 667938
Packit 667938
The snmpwalkhash routine returns the hash.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# Walk the MIB, putting everything you find into hashes.
Packit 667938
#
Packit 667938
sub snmpwalkhash($$@) {
Packit 667938
#  my($host, $hash_sub, @vars) = @_;
Packit 667938
  return(&snmpwalk_flg( @_ ));
Packit 667938
}
Packit 667938
Packit 667938
Packit 667938
=head2 snmpmapOID() - add texual OBJECT INDENTIFIER mapping
Packit 667938
Packit 667938
    snmpmapOID(
Packit 667938
	$text1, $oid1,
Packit 667938
	[ $text2, $oid2 ...]
Packit 667938
    );
Packit 667938
Packit 667938
This routine adds entries to the table that maps textual representation of
Packit 667938
OBJECT IDENTIFIERs to their dotted notation.  For example, 
Packit 667938
Packit 667938
    snmpmapOID('ciscoCPU', '1.3.6.1.4.1.9.9.109.1.1.1.1.5.1');
Packit 667938
Packit 667938
allows the string 'ciscoCPU' to be used as an OBJECT IDENTIFIER in any SNMP
Packit 667938
query routine.
Packit 667938
Packit 667938
This routine doesn't return anything.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
#  Add passed-in text, OID pairs to the OID mapping table.
Packit 667938
#
Packit 667938
sub snmpmapOID(@)
Packit 667938
{
Packit 667938
  my(@vars) = @_;
Packit 667938
  my($oid, $txt);
Packit 667938
Packit 667938
  $Net_SNMP_util::ErrorMessage = '';
Packit 667938
  while($#vars >= 0) {
Packit 667938
    $txt = shift @vars;
Packit 667938
    $oid = shift @vars;
Packit 667938
Packit 667938
    next unless($txt =~ /^[a-zA-Z][\w\-]*(\.[a-zA-Z][\w\-])*$/);
Packit 667938
    next unless($oid =~ /^\d+(\.\d+)*$/);
Packit 667938
Packit 667938
    $Net_SNMP_util::OIDS{$txt} = $oid;
Packit 667938
    $RevNeeded = 1;
Packit 667938
    print "snmpmapOID: $txt => $oid\n" if $Net_SNMP_util::Debug;
Packit 667938
  }
Packit 667938
Packit 667938
  return undef;
Packit 667938
}
Packit 667938
Packit 667938
=head2 snmpLoad_OID_Cache() - Read a file of cached OID mappings
Packit 667938
Packit 667938
    $result = snmpLoad_OID_Cache(
Packit 667938
		$file
Packit 667938
    );
Packit 667938
Packit 667938
This routine opens the file named by the B<$file> argument and reads it.
Packit 667938
The file should contain text, OBJECT IDENTIFIER pairs, one pair
Packit 667938
per line.  It adds the pairs as entries to the table that maps textual
Packit 667938
representation of OBJECT IDENTIFIERs to their dotted notation.
Packit 667938
Blank lines and anything after a '#' or between '--' is ignored.
Packit 667938
Packit 667938
This routine returns 0 on success and -1 if the B<$file> could not be opened.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# Open the passed-in file name and read it in to populate
Packit 667938
# the cache of text-to-OID map table.  It expects lines
Packit 667938
# with two fields, the first the textual string like "ifInOctets",
Packit 667938
# and the second the OID value, like "1.3.6.1.2.1.2.2.1.10".
Packit 667938
#
Packit 667938
# blank lines and anything after a '#' or between '--' is ignored.
Packit 667938
#
Packit 667938
sub snmpLoad_OID_Cache ($) {
Packit 667938
  my($arg) = @_;
Packit 667938
  my($txt, $oid);
Packit 667938
Packit 667938
  $Net_SNMP_util::ErrorMessage = '';
Packit 667938
  if (!open(CACHE, $arg)) {
Packit 667938
    error_msg("snmpLoad_OID_Cache: Can't open ${arg}: $!");
Packit 667938
    return -1;
Packit 667938
  }
Packit 667938
Packit 667938
  while(<CACHE>) {
Packit 667938
    s/#.*//;				# '#' starts a comment
Packit 667938
    s/--.*?--/ /g;			# comment delimited by '--', like MIBs
Packit 667938
    s/--.*//;				# comment started by '--'
Packit 667938
    next if (/^$/);
Packit 667938
    next unless (/\s/);			# must have whitespace as separator
Packit 667938
    chomp;
Packit 667938
    ($txt, $oid) = split(' ', $_, 2);
Packit 667938
    $txt = $1 if ($txt =~ /^[\'\"](.*)[\'\"]/);
Packit 667938
    $oid = $1 if ($oid =~ /^[\'\"](.*)[\'\"]/);
Packit 667938
    if (($txt =~ /^\.?\d+(\.\d+)*\.?$/)
Packit 667938
    and  ($oid !~ /^\.?\d+(\.\d+)*\.?$/)) {
Packit 667938
	my($a) = $oid;
Packit 667938
	$oid = $txt;
Packit 667938
	$txt = $a;
Packit 667938
    }
Packit 667938
    $oid =~ s/^\.//;
Packit 667938
    $oid =~ s/\.$//;
Packit 667938
    &snmpmapOID($txt, $oid);
Packit 667938
  }
Packit 667938
  close(CACHE);
Packit 667938
  return 0;
Packit 667938
}
Packit 667938
Packit 667938
=head2 snmpMIB_to_OID() - Read a MIB file for textual OID mappings
Packit 667938
Packit 667938
    $result = snmpMIB_to_OID(
Packit 667938
		$file
Packit 667938
    );
Packit 667938
Packit 667938
This routine opens the file named by the B<$file> argument and reads it.
Packit 667938
The file should be an SNMP Management Information Base (MIB) file
Packit 667938
that describes OBJECT IDENTIFIERs supported by an SNMP agent.
Packit 667938
per line.  It adds the textual representation of the OBJECT IDENTIFIERs
Packit 667938
to the text-to-OID mapping table.
Packit 667938
Packit 667938
This routine returns the number of entries added to the table or -1 if
Packit 667938
the B<$file> could not be opened.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# Read in the passed MIB file, parsing it
Packit 667938
# for their text-to-OID mappings
Packit 667938
#
Packit 667938
sub snmpMIB_to_OID ($) {
Packit 667938
  my($arg) = @_;
Packit 667938
  my($cnt, $quote, $buf, %tOIDs, $tgot);
Packit 667938
  my($var, @parts, $strt, $indx, $ind, $val);
Packit 667938
Packit 667938
  $Net_SNMP_util::ErrorMessage = '';
Packit 667938
  if (!open(MIB, $arg)) {
Packit 667938
    error_msg("snmpMIB_to_OID: Can't open ${arg}: $!");
Packit 667938
    return -1;
Packit 667938
  }
Packit 667938
  print "snmpMIB_to_OID: loading $arg\n" if $Net_SNMP_util::Debug;
Packit 667938
  $cnt = 0;
Packit 667938
  $quote = 0;
Packit 667938
  $tgot = 0;
Packit 667938
  $buf = '';
Packit 667938
  while(<MIB>) {
Packit 667938
    if ($quote) {
Packit 667938
      next unless /"/;
Packit 667938
      $quote = 0;
Packit 667938
    }
Packit 667938
    chomp;
Packit 667938
    $buf .= ' ' . $_;
Packit 667938
Packit 667938
    $buf =~ s/"[^"]*"//g;	# throw away quoted strings
Packit 667938
    $buf =~ s/--.*?--/ /g;	# throw away comments (-- anything --)
Packit 667938
    $buf =~ s/--.*//;		# throw away comments (-- anything to EOL)
Packit 667938
    $buf =~ s/\s+/ /g;		# clean up multiple spaces
Packit 667938
Packit 667938
    if ($buf =~ /"/) {
Packit 667938
      $quote = 1;
Packit 667938
      next;
Packit 667938
    }
Packit 667938
Packit 667938
    if ($buf =~ /DEFINITIONS *::= *BEGIN/) {
Packit 667938
	$cnt += MIB_fill_OID(\%tOIDs) if ($tgot);
Packit 667938
	$buf = '';
Packit 667938
	%tOIDs = ();
Packit 667938
	$tgot = 0;
Packit 667938
	next;
Packit 667938
    }
Packit 667938
    $buf =~ s/OBJECT-TYPE/OBJECT IDENTIFIER/;
Packit 667938
    $buf =~ s/OBJECT-IDENTITY/OBJECT IDENTIFIER/;
Packit 667938
    $buf =~ s/OBJECT-GROUP/OBJECT IDENTIFIER/;
Packit 667938
    $buf =~ s/MODULE-IDENTITY/OBJECT IDENTIFIER/;
Packit 667938
    $buf =~ s/NOTIFICATION-TYPE/OBJECT IDENTIFIER/;
Packit 667938
    $buf =~ s/ IMPORTS .*\;//;
Packit 667938
    $buf =~ s/ SEQUENCE *{.*}//;
Packit 667938
    $buf =~ s/ SYNTAX .*//;
Packit 667938
    $buf =~ s/ [\w\-]+ *::= *OBJECT IDENTIFIER//;
Packit 667938
    $buf =~ s/ OBJECT IDENTIFIER.*::= *{/ OBJECT IDENTIFIER ::= {/;
Packit 667938
Packit 667938
    if ($buf =~ / ([\w\-]+) OBJECT IDENTIFIER *::= *{([^}]+)}/) {
Packit 667938
      $var = $1;
Packit 667938
      $buf = $2;
Packit 667938
      $buf =~ s/ +$//;
Packit 667938
      $buf =~ s/\s+\(/\(/g;	# remove spacing around '('
Packit 667938
      $buf =~ s/\(\s+/\(/g;
Packit 667938
      $buf =~ s/\s+\)/\)/g;	# remove spacing before ')'
Packit 667938
      @parts = split(' ', $buf);
Packit 667938
      $strt = '';
Packit 667938
      foreach $indx (@parts) {
Packit 667938
	if ($indx =~ /([\w\-]+)\((\d+)\)/) {
Packit 667938
	  $ind = $1;
Packit 667938
	  $val = $2;
Packit 667938
	  if (exists($tOIDs{$strt})) {
Packit 667938
	    $tOIDs{$ind} = $tOIDs{$strt} . '.' . $val;
Packit 667938
	  } elsif ($strt ne '') {
Packit 667938
	    $tOIDs{$ind} = "${strt}.${val}";
Packit 667938
	  } else {
Packit 667938
	    $tOIDs{$ind} = $val;
Packit 667938
	  }
Packit 667938
	  $strt = $ind;
Packit 667938
	  $tgot = 1;
Packit 667938
	} elsif ($indx =~ /^\d+$/) {
Packit 667938
	  if (exists($tOIDs{$strt})) {
Packit 667938
	    $tOIDs{$var} = $tOIDs{$strt} . '.' . $indx;
Packit 667938
	  } else {
Packit 667938
	    $tOIDs{$var} = "${strt}.${indx}";
Packit 667938
	  }
Packit 667938
	  $tgot = 1;
Packit 667938
	} else {
Packit 667938
	  $strt = $indx;
Packit 667938
	}
Packit 667938
      }
Packit 667938
      $buf = '';
Packit 667938
    }
Packit 667938
  }
Packit 667938
  $cnt += MIB_fill_OID(\%tOIDs) if ($tgot);
Packit 667938
  $RevNeeded = 1 if ($cnt > 0);
Packit 667938
  return $cnt;
Packit 667938
}
Packit 667938
Packit 667938
=head2 snmpQueue_MIB_File() - queue a MIB file for reading "on demand"
Packit 667938
Packit 667938
    snmpQueue_MIB_File(
Packit 667938
	$file1,
Packit 667938
	[$file2, ...]
Packit 667938
    );
Packit 667938
Packit 667938
This routine queues the list of SNMP MIB files for later processing.
Packit 667938
Whenever a text-to-OBJECT IDENTIFIER lookup fails, the list of queued MIB
Packit 667938
files is consulted.  If it isn't empty, the first MIB file in the list is
Packit 667938
removed and passed to B<snmpMIB_to_OID()>.  The lookup is attempted again,
Packit 667938
and if that still fails the next MIB file in the list is removed and passed
Packit 667938
to B<snmpMIB_to_OID()>. This process continues until the lookup succeeds
Packit 667938
or the list is exhausted.
Packit 667938
Packit 667938
This routine doesn't return anything.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
#
Packit 667938
# Save the passed-in list of MIB files until an OID can't be
Packit 667938
# found in the existing table.  At that time the MIB file will
Packit 667938
# be loaded, and the lookup attempted again.
Packit 667938
#
Packit 667938
sub snmpQueue_MIB_File (@) {
Packit 667938
  my(@files) = @_;
Packit 667938
  my($file);
Packit 667938
Packit 667938
  $Net_SNMP_util::ErrorMessage = '';
Packit 667938
  foreach $file (@files) {
Packit 667938
    push(@Net_SNMP_util::MIB_Files, $file);
Packit 667938
  }
Packit 667938
}
Packit 667938
Packit 667938
# [private methods] -------------------------------------
Packit 667938
Packit 667938
#
Packit 667938
# Start an snmp session
Packit 667938
#
Packit 667938
sub snmpopen ($$$) {
Packit 667938
  my($host, $type, $vars) = @_;
Packit 667938
  my($nhost, $port, $community, $lhost, $lport, $nlhost);
Packit 667938
  my($timeout, $retries, $backoff, $version, $v4onlystr);
Packit 667938
  my($opts, %args, $tmp, $sess);
Packit 667938
  my($debug, $maxmsgsize);
Packit 667938
Packit 667938
  $type = 0 if (!defined($type));
Packit 667938
  $community = "public";
Packit 667938
  $nlhost = "";
Packit 667938
Packit 667938
  ($community, $host) = ($1, $2) if ($host =~ /^(.*)@([^@]+)$/);
Packit 667938
Packit 667938
  # We can't split on the : character because a numeric IPv6
Packit 667938
  # address contains a variable number of :'s
Packit 667938
  if( ($host =~ /^(\[.*\]):(.*)$/) or ($host =~ /^(\[.*\])$/) ) {
Packit 667938
    # Numeric IPv6 address between []
Packit 667938
    ($host, $opts) = ($1, $2);
Packit 667938
  } else {
Packit 667938
    # Hostname or numeric IPv4 address
Packit 667938
    ($host, $opts) = split(':', $host, 2);
Packit 667938
  }
Packit 667938
  ($port, $timeout, $retries, $backoff, $version, $v4onlystr)
Packit 667938
    = split(':', $opts, 6) if(defined($opts) and (length $opts > 0) );
Packit 667938
Packit 667938
  undef($timeout) if (defined($timeout) and length($timeout) <= 0);
Packit 667938
  undef($retries) if (defined($retries) and length($retries) <= 0);
Packit 667938
  undef($backoff) if (defined($backoff) and length($backoff) <= 0);
Packit 667938
  undef($version) if (defined($version) and length($version) <= 0);
Packit 667938
Packit 667938
  $v4onlystr = "" unless defined $v4onlystr;
Packit 667938
Packit 667938
  if (defined($port) and ($port =~ /^([^!]*)!(.*)$/)) {
Packit 667938
    ($port, $lhost) = ($1, $2);
Packit 667938
    $nlhost = $lhost;
Packit 667938
    ($lhost, $lport) = ($1, $2) if ($lhost =~ /^(.*)!(.*)$/);
Packit 667938
    undef($lport) if (defined($lport) and (length($lport) <= 0));
Packit 667938
  }
Packit 667938
  undef($port) if (defined($port) and length($port) <= 0);
Packit 667938
Packit 667938
  if (ref $vars->[0] eq 'HASH') {
Packit 667938
    undef($debug);
Packit 667938
    undef($maxmsgsize);
Packit 667938
    undef $Net_SNMP_util::ContextEngineID;
Packit 667938
    undef $Net_SNMP_util::ContextName;
Packit 667938
    $opts = shift @$vars;
Packit 667938
    foreach $type (keys %$opts) {
Packit 667938
      if ($type =~ /^-?return_array_refs$/i) {
Packit 667938
	$Net_SNMP_util::ReturnArrayRefs = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?return_hash_refs$/i) {
Packit 667938
	$Net_SNMP_util::ReturnHashRefs = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?contextengineid$/i) {
Packit 667938
	$Net_SNMP_util::ContextEngineID = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?contextname$/i) {
Packit 667938
	$Net_SNMP_util::ContextName = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?maxrepetitions$/i) {
Packit 667938
	$Net_SNMP_util::MaxRepetitions = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?default_max_repetitions$/i) {
Packit 667938
	$Net_SNMP_util::MaxRepetitions = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?version$/i) {
Packit 667938
	$version = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?port$/i) {
Packit 667938
	$port = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?localaddr$/i) {
Packit 667938
	$lhost = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?community$/i) {
Packit 667938
	$community = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?timeout$/i) {
Packit 667938
	$timeout = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?retries$/i) {
Packit 667938
	$retries = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?maxmsgsize$/i) {
Packit 667938
	$maxmsgsize = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?debug$/i) {
Packit 667938
	$debug = $opts->{$type};
Packit 667938
      } elsif ($type =~ /^-?backoff$/i) {
Packit 667938
	next;		# XXXX not implemented in Net::SNMP
Packit 667938
      } elsif ($type =~ /^-?avoid_negative_request_ids$/i) {
Packit 667938
	next;		# XXXX not implemented in Net::SNMP
Packit 667938
      } elsif ($type =~ /^-?lenient_source_/i) {
Packit 667938
	next;		# XXXX not implemented in Net::SNMP
Packit 667938
      } elsif ($type =~ /^-?use_16bit_request_ids$/i) {
Packit 667938
	next;		# XXXX not implemented in Net::SNMP
Packit 667938
      } elsif ($type =~ /^-?use_getbulk$/i) {
Packit 667938
	next;		# XXXX not implemented in Net::SNMP
Packit 667938
      } else {
Packit 667938
	$tmp = $type;
Packit 667938
	$tmp = '-' . $tmp unless ($tmp =~ /^-/);
Packit 667938
	$args{$tmp} = $opts->{$type};
Packit 667938
      }
Packit 667938
    }
Packit 667938
  }
Packit 667938
Packit 667938
  $port = 162 if ($type == 1 and !defined($port));
Packit 667938
  $nhost = "$community\@$host";
Packit 667938
  $nhost .= ":" . $port if (defined($port));
Packit 667938
  undef($lhost) if (defined($lhost) and (length($lhost) <= 0));
Packit 667938
Packit 667938
  $version = '1' unless defined $version;
Packit 667938
  if ($version =~ /1/) {
Packit 667938
    $version = 1;
Packit 667938
  } elsif ($version =~ /2/) {
Packit 667938
    $version = 2;
Packit 667938
  } elsif ($version =~ /3/) {
Packit 667938
    $version = 3;
Packit 667938
  }
Packit 667938
  $Net_SNMP_util::ErrorMessage = '';
Packit 667938
  if ((!defined($Net_SNMP_util::Session))
Packit 667938
    or ($Net_SNMP_util::Host ne $nhost)
Packit 667938
    or ($Net_SNMP_util::Version ne $version)
Packit 667938
    or ($Net_SNMP_util::LHost ne $nlhost)
Packit 667938
    or ($Net_SNMP_util::IPv4only ne $v4onlystr)) {
Packit 667938
    if (defined($Net_SNMP_util::Session)) {
Packit 667938
      $Net_SNMP_util::Session->close();    
Packit 667938
      undef $Net_SNMP_util::Session;
Packit 667938
      undef $Net_SNMP_util::Host;
Packit 667938
      undef $Net_SNMP_util::Version;
Packit 667938
      undef $Net_SNMP_util::LHost;
Packit 667938
      undef $Net_SNMP_util::IPv4only;
Packit 667938
    }
Packit 667938
Packit 667938
    $args{'-hostname'} = $host;
Packit 667938
    $args{'-port'} = $port if (defined($port));
Packit 667938
    $args{'-localaddr'} = $lhost if (defined($lhost));
Packit 667938
    $args{'-localport'} = $lport if (defined($lport));
Packit 667938
    $args{'-version'} = $version;
Packit 667938
    $args{'-domain'} = "udp/ipv4" if (length($v4onlystr) > 0);
Packit 667938
    $args{'-timeout'} = $timeout if (defined($timeout));
Packit 667938
    $args{'-retries'} = $retries if (defined($retries));
Packit 667938
    $args{'-maxmsgsize'} = $maxmsgsize if (defined($maxmsgsize));
Packit 667938
    $args{'-debug'} = $debug if (defined($debug));
Packit 667938
    $args{'-community'} = $community unless ($community eq "public");
Packit 667938
    if ($version == 3) {
Packit 667938
	delete $args{'-community'}
Packit 667938
    } else {
Packit 667938
	delete $args{'-username'};
Packit 667938
	delete $args{'-authkey'};
Packit 667938
	delete $args{'-authpassword'};
Packit 667938
	delete $args{'-authprotocol'};
Packit 667938
	delete $args{'-privkey'};
Packit 667938
	delete $args{'-privpassword'};
Packit 667938
	delete $args{'-privprotocol'};
Packit 667938
    }
Packit 667938
Packit 667938
    ($sess, $tmp) = Net::SNMP->session(%args);
Packit 667938
Packit 667938
    if (defined($sess)) {
Packit 667938
      $Net_SNMP_util::Session = $sess;
Packit 667938
      $Net_SNMP_util::Host = $nhost;
Packit 667938
      $Net_SNMP_util::Version = $version;
Packit 667938
      $Net_SNMP_util::LHost = $nlhost;
Packit 667938
      $Net_SNMP_util::IPv4only = $v4onlystr;
Packit 667938
    } else {
Packit 667938
      error_msg("SNMPopen failed: $tmp\n");
Packit 667938
      return(undef);
Packit 667938
    }
Packit 667938
    return $Net_SNMP_util::Session;
Packit 667938
  } else {
Packit 667938
    $Net_SNMP_util::Session->timeout($timeout)
Packit 667938
      if (defined($timeout) and (length($timeout) > 0));
Packit 667938
    $Net_SNMP_util::Session->retries($retries)
Packit 667938
      if (defined($retries) and (length($retries) > 0));
Packit 667938
    $Net_SNMP_util::Session->maxmsgsize($maxmsgsize)
Packit 667938
      if (defined($maxmsgsize) and (length($maxmsgsize) > 0));
Packit 667938
    $Net_SNMP_util::Session->debug($debug)
Packit 667938
      if (defined($debug) and (length($debug) > 0));
Packit 667938
    $Net_SNMP_util::Session->{_context_engine_id} = undef
Packit 667938
      if (!defined($Net_SNMP_util::ContextEngineID));
Packit 667938
    $Net_SNMP_util::Session->{_context_name} = undef
Packit 667938
      if (!defined($Net_SNMP_util::ContextName));
Packit 667938
  }
Packit 667938
  return $Net_SNMP_util::Session;
Packit 667938
}
Packit 667938
Packit 667938
#
Packit 667938
#  Given an OID in either ASN.1 or mixed text/ASN.1 notation, return an OID.
Packit 667938
#
Packit 667938
sub toOID(@) {
Packit 667938
  my(@vars) = @_;
Packit 667938
  my($oid, $var, $tmp, $tmpv, @retvar);
Packit 667938
Packit 667938
  @retvar = ();
Packit 667938
  foreach $var (@vars) {
Packit 667938
    ($oid, $tmp) = &Check_OID($var);
Packit 667938
    if (!$oid and $Net_SNMP_util::CacheLoaded == 0) {
Packit 667938
      $tmp = $Net_SNMP_util::SuppressWarnings;
Packit 667938
      $Net_SNMP_util::SuppressWarnings = 1000;
Packit 667938
Packit 667938
      &snmpLoad_OID_Cache($Net_SNMP_util::CacheFile);
Packit 667938
Packit 667938
      $Net_SNMP_util::CacheLoaded = 1;
Packit 667938
      $Net_SNMP_util::SuppressWarnings = $tmp;
Packit 667938
Packit 667938
      ($oid, $tmp) = &Check_OID($var);
Packit 667938
    }
Packit 667938
    while (!$oid and $#Net_SNMP_util::MIB_Files >= 0) {
Packit 667938
      $tmp = $Net_SNMP_util::SuppressWarnings;
Packit 667938
      $Net_SNMP_util::SuppressWarnings = 1000;
Packit 667938
Packit 667938
      snmpMIB_to_OID(shift(@Net_SNMP_util::MIB_Files));
Packit 667938
Packit 667938
      $Net_SNMP_util::SuppressWarnings = $tmp;
Packit 667938
Packit 667938
      ($oid, $tmp) = &Check_OID($var);
Packit 667938
      if ($oid) {
Packit 667938
	open(CACHE, ">>$Net_SNMP_util::CacheFile");
Packit 667938
	print CACHE "$tmp\t$oid\n";
Packit 667938
	close(CACHE);
Packit 667938
      }
Packit 667938
    }
Packit 667938
    if ($oid) {
Packit 667938
      $var =~ s/^$tmp/$oid/;
Packit 667938
    } else {
Packit 667938
      carp("Unknown SNMP var $var\n")
Packit 667938
	unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
      next;
Packit 667938
    }
Packit 667938
    while ($var =~ /\"([^\"]*)\"/) {
Packit 667938
      $tmp = sprintf("%d.%s", length($1), join(".", map(ord, split(//, $1))));
Packit 667938
      $var =~ s/\"$1\"/$tmp/;
Packit 667938
    }
Packit 667938
    print "toOID: $var\n" if $Net_SNMP_util::Debug;
Packit 667938
    push(@retvar, $var);
Packit 667938
  }
Packit 667938
  return @retvar;
Packit 667938
}
Packit 667938
Packit 667938
#
Packit 667938
# Check to see if an OID is in the text-to-OID cache.
Packit 667938
# Returns the OID and the corresponding text as two separate
Packit 667938
# elements.
Packit 667938
#
Packit 667938
sub Check_OID ($) {
Packit 667938
  my($var) = @_;
Packit 667938
  my($tmp, $tmpv, $oid);
Packit 667938
Packit 667938
  if ($var =~ /^[a-zA-Z][\w\-]*(\.[a-zA-Z][\w\-]*)*/) {
Packit 667938
    $tmp = $&;
Packit 667938
    $tmpv = $tmp;
Packit 667938
    for (;;) {
Packit 667938
      last if exists($Net_SNMP_util::OIDS{$tmpv});
Packit 667938
      last if !($tmpv =~ s/^[^\.]*\.//);
Packit 667938
    }
Packit 667938
    $oid = $Net_SNMP_util::OIDS{$tmpv};
Packit 667938
    if ($oid) {
Packit 667938
      return ($oid, $tmp);
Packit 667938
    } else {
Packit 667938
      my @empty = ();
Packit 667938
      return @empty;
Packit 667938
    }
Packit 667938
  }
Packit 667938
  return ($var, $var);
Packit 667938
}
Packit 667938
Packit 667938
sub snmpwalk_flg ($$@) {
Packit 667938
  my($host, $hash_sub, @vars) = @_;
Packit 667938
  my($session, %args, @enoid, @poid, $toid, $oid, $got);
Packit 667938
  my($val, $ret, %soid, %nsoid, @retvals, $tmp);
Packit 667938
  my(%rethash, $h_ref, @tmprefs);
Packit 667938
  my($stop);
Packit 667938
Packit 667938
  $h_ref = (ref $vars[$#vars] eq "HASH") ? pop(@vars) : \%rethash;
Packit 667938
Packit 667938
  $session = &snmpopen($host, 0, \@vars);
Packit 667938
  if (!defined($session)) {
Packit 667938
    carp "SNMPWALK Problem for $host"
Packit 667938
      unless ($Net_SNMP_util::SuppressWarnings > 1);
Packit 667938
    if (defined($hash_sub)) {
Packit 667938
      return ($h_ref) if ($SNMP_util::Return_hash_refs);
Packit 667938
      return (%$h_ref);
Packit 667938
    } else {
Packit 667938
      @retvals = ();
Packit 667938
      return (@retvals);
Packit 667938
    }
Packit 667938
  }
Packit 667938
Packit 667938
  @enoid = toOID(@vars);
Packit 667938
  if ($#enoid < 0) {
Packit 667938
    if (defined($hash_sub)) {
Packit 667938
      return ($h_ref) if ($SNMP_util::Return_hash_refs);
Packit 667938
      return (%$h_ref);
Packit 667938
    } else {
Packit 667938
      @retvals = ();
Packit 667938
      return (@retvals);
Packit 667938
    }
Packit 667938
  }
Packit 667938
Packit 667938
  #
Packit 667938
  # Create/Refresh a reversed hash with oid -> name
Packit 667938
  #
Packit 667938
  if (defined($hash_sub) and ($RevNeeded)) {
Packit 667938
      %revOIDS = reverse %Net_SNMP_util::OIDS;
Packit 667938
      $RevNeeded = 0;
Packit 667938
  }
Packit 667938
Packit 667938
  #
Packit 667938
  # Create temporary array of refs to return values
Packit 667938
  #
Packit 667938
  foreach $oid (0..$#enoid)  {
Packit 667938
    my $tmparray = [];
Packit 667938
    $tmprefs[$oid] = $tmparray;
Packit 667938
    $nsoid{$oid} = $oid;
Packit 667938
  }
Packit 667938
Packit 667938
  $got = 0;
Packit 667938
  @poid = @enoid;
Packit 667938
Packit 667938
  if ($Net_SNMP_util::Version > 1 and $Net_SNMP_util::MaxRepetitions > 0) {
Packit 667938
    $args{'-maxrepetitions'} = $Net_SNMP_util::MaxRepetitions;
Packit 667938
  }
Packit 667938
  if ($Net_SNMP_util::Version > 2) {
Packit 667938
    $args{'-contextengineid'} = $Net_SNMP_util::ContextEngineID
Packit 667938
      if (defined($Net_SNMP_util::ContextEngineID));
Packit 667938
    $args{'-contextname'} = $Net_SNMP_util::ContextName
Packit 667938
      if (defined($Net_SNMP_util::ContextName));
Packit 667938
  }
Packit 667938
Packit 667938
  while($#poid >= 0) {
Packit 667938
    $args{'-varbindlist'} = \@poid;
Packit 667938
    if (($Net_SNMP_util::Version > 1)
Packit 667938
    and ($Net_SNMP_util::MaxRepetitions > 1)) {
Packit 667938
      $ret = $session->get_bulk_request(%args);
Packit 667938
    } else {
Packit 667938
      $ret = $session->get_next_request(%args);
Packit 667938
    }
Packit 667938
    last if (!defined($ret));
Packit 667938
Packit 667938
    %soid = %nsoid;
Packit 667938
    undef %nsoid;
Packit 667938
    $stop = 0;
Packit 667938
    foreach $oid (&Net::SNMP::oid_lex_sort(keys %$ret)) {
Packit 667938
      $got = 1;
Packit 667938
      $tmp = -1;
Packit 667938
      foreach $toid (@enoid) {
Packit 667938
	$tmp++;
Packit 667938
	if (&Net::SNMP::oid_base_match($toid, $oid)
Packit 667938
	and (!exists($soid{$toid}) or ($oid ne $soid{$toid}))) {
Packit 667938
	  $nsoid{$toid} = $oid;
Packit 667938
	  if (defined($hash_sub)) {
Packit 667938
	    #
Packit 667938
	    # extract name of the oid, if possible, the rest becomes the
Packit 667938
	    # instance
Packit 667938
	    #
Packit 667938
	    my $inst = "";
Packit 667938
	    my $upo = $toid;
Packit 667938
	    while (!exists($revOIDS{$upo}) and length($upo)) {
Packit 667938
	      $upo =~ s/(\.\d+?)$//;
Packit 667938
	      if (defined($1) and length($1)) {
Packit 667938
		$inst = $1 . $inst;
Packit 667938
	      } else {
Packit 667938
		$upo = "";
Packit 667938
		last;
Packit 667938
	      }
Packit 667938
	    }	
Packit 667938
	    if (length($upo) and exists($revOIDS{$upo})) {
Packit 667938
	      $upo = $revOIDS{$upo} . $inst;
Packit 667938
	    } else {
Packit 667938
	      $upo = $toid;
Packit 667938
	    }
Packit 667938
Packit 667938
	    my $qoid = $oid;
Packit 667938
	    my $tmpo;
Packit 667938
	    $inst = "";
Packit 667938
	    while (!exists($revOIDS{$qoid}) and length($qoid)) {
Packit 667938
	      $qoid =~ s/(\.\d+?)$//;
Packit 667938
	      if (defined($1) and length($1)) {
Packit 667938
		$inst = $1 . $inst;
Packit 667938
	      } else {
Packit 667938
		$qoid = "";
Packit 667938
		last;
Packit 667938
	      }
Packit 667938
	    }	
Packit 667938
	    if (length($qoid) and exists($revOIDS{$qoid})) {
Packit 667938
	      $tmpo = $qoid;
Packit 667938
	      $qoid = $revOIDS{$qoid};
Packit 667938
	    } else {
Packit 667938
	      $qoid = $oid;
Packit 667938
	      $tmpo = $toid;
Packit 667938
	      $inst = substr($oid, length($tmpo)+1);
Packit 667938
	    }
Packit 667938
	    #
Packit 667938
	    # call hash_sub
Packit 667938
	    #
Packit 667938
	    &$hash_sub($h_ref, $host, $qoid, $tmpo, $inst, $ret->{$oid}, $upo);
Packit 667938
	  } else {
Packit 667938
	    my $tmpo;
Packit 667938
	    my $tmpv = $ret->{$oid};
Packit 667938
	    $tmpo = substr($oid, length($toid)+1);
Packit 667938
	    push @{$tmprefs[$tmp]}, "$tmpo:$tmpv";
Packit 667938
	  }
Packit 667938
	} else {
Packit 667938
	  $stop = 1 if ($#enoid == 0);
Packit 667938
	}
Packit 667938
      }
Packit 667938
    }
Packit 667938
    undef @poid;
Packit 667938
    @poid = values %nsoid if (!$stop);
Packit 667938
  }
Packit 667938
  if ($got) {
Packit 667938
    if (defined($hash_sub)) {
Packit 667938
	return ($h_ref) if ($Net_SNMP_util::ReturnHashRefs);
Packit 667938
    	return (%$h_ref);
Packit 667938
    } elsif ($Net_SNMP_util::Return_array_refs)  {
Packit 667938
      return (@tmprefs);
Packit 667938
    } else {
Packit 667938
      do {
Packit 667938
	$got = 0;
Packit 667938
	foreach $toid (0..$#enoid) {
Packit 667938
	  next if (scalar(@{$tmprefs[$toid]}) <= 0);
Packit 667938
	  $got = 1;
Packit 667938
	  $oid = shift(@{$tmprefs[$toid]});
Packit 667938
	  if ($#enoid > 0) {
Packit 667938
	    ($oid, $val) = split(':', $oid, 2);
Packit 667938
	    $oid = $enoid[$toid] . '.' . $oid;
Packit 667938
	    push(@retvals, "$oid:$val");
Packit 667938
	  } else {
Packit 667938
	    push(@retvals, $oid);
Packit 667938
	  }
Packit 667938
	}
Packit 667938
      } while($got);
Packit 667938
      return (@retvals);
Packit 667938
    }
Packit 667938
  } else {
Packit 667938
    $ret = join(' ', @vars);
Packit 667938
    error_msg("SNMPWALK Problem for $ret on ${host}: " . $session->error());
Packit 667938
    if (defined($hash_sub)) {
Packit 667938
      return ($h_ref) if ($SNMP_util::Return_hash_refs);
Packit 667938
      return (%$h_ref);
Packit 667938
    } else {
Packit 667938
      @retvals = ();
Packit 667938
      return (@retvals);
Packit 667938
    }
Packit 667938
  }
Packit 667938
}
Packit 667938
Packit 667938
#
Packit 667938
# When passed a string, return the ASN.1 type that corresponds to the
Packit 667938
# string.
Packit 667938
#
Packit 667938
sub ASNtype($) {
Packit 667938
  my($type) = @_;
Packit 667938
Packit 667938
  $type =~ tr/A-Z/a-z/;
Packit 667938
  if ($type eq "int") {
Packit 667938
    $type = 0x02;
Packit 667938
  } elsif ($type eq "integer") {
Packit 667938
    $type = 0x02;
Packit 667938
  } elsif ($type eq "string") {
Packit 667938
    $type = 0x04;
Packit 667938
  } elsif ($type eq "octetstring") {
Packit 667938
    $type = 0x04;
Packit 667938
  } elsif ($type eq "octet string") {
Packit 667938
    $type = 0x04;
Packit 667938
  } elsif ($type eq "oid") {
Packit 667938
    $type = 0x06;
Packit 667938
  } elsif ($type eq "object id") {
Packit 667938
    $type = 0x06;
Packit 667938
  } elsif ($type eq "object identifier") {
Packit 667938
    $type = 0x06;
Packit 667938
  } elsif ($type eq "ipaddr") {
Packit 667938
    $type = 0x40;
Packit 667938
  } elsif ($type eq "ip address") {
Packit 667938
    $type = 0x40;
Packit 667938
  } elsif ($type eq "timeticks") {
Packit 667938
    $type = 0x43;
Packit 667938
  } elsif ($type eq "uint") {
Packit 667938
    $type = 0x47;
Packit 667938
  } elsif ($type eq "uinteger") {
Packit 667938
    $type = 0x47;
Packit 667938
  } elsif ($type eq "uinteger32") {
Packit 667938
    $type = 0x47;
Packit 667938
  } elsif ($type eq "unsigned int") {
Packit 667938
    $type = 0x47;
Packit 667938
  } elsif ($type eq "unsigned integer") {
Packit 667938
    $type = 0x47;
Packit 667938
  } elsif ($type eq "unsigned integer32") {
Packit 667938
    $type = 0x47;
Packit 667938
  } elsif ($type eq "counter") {
Packit 667938
    $type = 0x41;
Packit 667938
  } elsif ($type eq "counter32") {
Packit 667938
    $type = 0x41;
Packit 667938
  } elsif ($type eq "counter64") {
Packit 667938
    $type = 0x46;
Packit 667938
  } elsif ($type eq "gauge") {
Packit 667938
    $type = 0x42;
Packit 667938
  } elsif ($type eq "gauge32") {
Packit 667938
    $type = 0x42;
Packit 667938
  } elsif (($type <= 0) or ($type > 255)) {
Packit 667938
    return undef;
Packit 667938
  }
Packit 667938
  return $type;
Packit 667938
}
Packit 667938
Packit 667938
#
Packit 667938
# set the ErrorMessage global and print an error message
Packit 667938
#
Packit 667938
sub error_msg($)
Packit 667938
{
Packit 667938
  my($msg) = @_;
Packit 667938
  $Net_SNMP_util::ErrorMessage = $msg;
Packit 667938
  if ($Net_SNMP_util::SuppressWarnings <= 1) {
Packit 667938
    $Carp::CarpLevel++;
Packit 667938
    carp($msg);
Packit 667938
    $Carp::CarpLevel--;
Packit 667938
  }
Packit 667938
}
Packit 667938
Packit 667938
#
Packit 667938
# Fill the OIDS hash with results from the MIB parsing
Packit 667938
#
Packit 667938
sub MIB_fill_OID($)
Packit 667938
{
Packit 667938
  my($href) = @_;
Packit 667938
  my($cnt, $changed, @del, $var, $val, @parts, $indx);
Packit 667938
  my(%seen);
Packit 667938
Packit 667938
  $cnt = 0;
Packit 667938
  do {
Packit 667938
    $changed = 0;
Packit 667938
    @del = ();
Packit 667938
    foreach $var (keys %$href) {
Packit 667938
      $val = $href->{$var};
Packit 667938
      @parts = split('\.', $val);
Packit 667938
      $val = '';
Packit 667938
      foreach $indx (@parts) {
Packit 667938
	if ($indx =~ /^\d+$/) {
Packit 667938
	  $val .= '.' . $indx;
Packit 667938
	} else {
Packit 667938
	  if (exists($Net_SNMP_util::OIDS{$indx})) {
Packit 667938
	    $val = $Net_SNMP_util::OIDS{$indx};
Packit 667938
	  } else {
Packit 667938
	    $val .= '.' . $indx;
Packit 667938
	  }
Packit 667938
	}
Packit 667938
      }
Packit 667938
      if ($val =~ /^[\d\.]+$/) {
Packit 667938
	$val =~ s/^\.+//;
Packit 667938
	if (!exists($Net_SNMP_util::OIDS{$var})
Packit 667938
	|| (length($val) > length($Net_SNMP_util::OIDS{$var}))) {
Packit 667938
	  $Net_SNMP_util::OIDS{$var} = $val;
Packit 667938
	  print "'$var' => '$val'\n" if $Net_SNMP_util::Debug;
Packit 667938
	  $changed = 1;
Packit 667938
	  $cnt++;
Packit 667938
	}
Packit 667938
	push @del, $var;
Packit 667938
      }
Packit 667938
    }
Packit 667938
    foreach $var (@del) {
Packit 667938
      delete $href->{$var};
Packit 667938
    }
Packit 667938
  } while($changed);
Packit 667938
Packit 667938
  $Carp::CarpLevel++;
Packit 667938
  foreach $var (sort keys %$href) {
Packit 667938
    $val = $href->{$var};
Packit 667938
    $val =~ s/\..*//;
Packit 667938
    next if (exists($seen{$val}));
Packit 667938
    $seen{$val} = 1;
Packit 667938
    $seen{$var} = 1;
Packit 667938
    error_msg(
Packit 667938
	"snmpMIB_to_OID: prefix \"$val\" unknown, load the parent MIB first.\n"
Packit 667938
    );
Packit 667938
  }
Packit 667938
  $Carp::CarpLevel--;
Packit 667938
  return $cnt;
Packit 667938
}
Packit 667938
Packit 667938
Packit 667938
# [documentation] ------------------------------------------------------------
Packit 667938
Packit 667938
=head1 EXPORTS
Packit 667938
Packit 667938
The Net_SNMP_util module uses the F<Exporter> module to export useful
Packit 667938
constants and subroutines.  These exportable symbols are defined below and
Packit 667938
follow the rules and conventions of the F<Exporter> module (see L<Exporter>).
Packit 667938
Packit 667938
=over
Packit 667938
Packit 667938
=item Exportable
Packit 667938
Packit 667938
&snmpget, &snmpgetnext, &snmpgetbulk, &snmpwalk, &snmpset, &snmptrap,
Packit 667938
&snmpmaptable, &snmpmaptable4, &snmpwalkhash, &snmpmapOID, &snmpMIB_to_OID,
Packit 667938
&snmpLoad_OID_Cache, &snmpQueue_MIB_File, ErrorMessage
Packit 667938
Packit 667938
=back
Packit 667938
Packit 667938
=head1 EXAMPLES
Packit 667938
Packit 667938
=head2 1. SNMPv1 get-request for sysUpTime
Packit 667938
Packit 667938
This example gets the sysUpTime from a remote host.
Packit 667938
Packit 667938
    #! /usr/local/bin/perl
Packit 667938
    use strict;
Packit 667938
    use Net_SNMP_util;
Packit 667938
    my ($host, $ret)
Packit 667938
    $host = shift || 'localhost';
Packit 667938
    $ret = snmpget($host, 'sysUpTime');
Packit 667938
Packit 667938
    print("sysUpTime for $host is $ret\n");
Packit 667938
Packit 667938
    exit 0;
Packit 667938
Packit 667938
=head2 2. SNMPv3 set-request of sysContact
Packit 667938
Packit 667938
This example sets the sysContact information on the remote host to 
Packit 667938
"Help Desk x911".  The parameters passed to the snmpset function are for
Packit 667938
the demonstration of syntax only.  These parameters will need to be
Packit 667938
set according to the SNMPv3 parameters of the remote host used by the script. 
Packit 667938
Packit 667938
    #! /usr/local/bin/perl
Packit 667938
    use strict;
Packit 667938
    use Net_SNMP_util;
Packit 667938
    my($host, %v3hash, $ret);
Packit 667938
    $host = shift || 'localhost';
Packit 667938
    $v3hash{'-version'}		= 'snmpv3';
Packit 667938
    $v3hash{'-username'}	= 'myv3Username';
Packit 667938
    $v3hash{'-authkey'}		= '0x05c7fbde31916f64da4d5b77156bdfa7';
Packit 667938
    $v3hash{'-authprotocol'}	= 'md5';
Packit 667938
    $v3hash{'-privkey'}		= '0x93725fd3a02a48ce02df4e065a1c1746';
Packit 667938
Packit 667938
    $ret = snmpset($host, \%v3hash, 'sysContact', 'string', 'Help Desk x911');
Packit 667938
Packit 667938
    print "sysContact on $host is now $ret\n";
Packit 667938
    exit 0;
Packit 667938
Packit 667938
=head2 3. SNMPv2c walk for ifTable
Packit 667938
Packit 667938
This example gets the contents of the ifTable by sending get-bulk-requests
Packit 667938
until the responses are no longer part of the ifTable.  The ifTable can also
Packit 667938
be retrieved using C<snmpmaptable>.
Packit 667938
Packit 667938
    #! /usr/local/bin/perl
Packit 667938
    use strict;
Packit 667938
    use Net_SNMP_util;
Packit 667938
    my($host, @ret, $oid, $val);
Packit 667938
    $host = shift || 'localhost';
Packit 667938
Packit 667938
    @ret = snmpwalk($host . ':::::2', 'ifTable');
Packit 667938
    foreach $val (@ret) {
Packit 667938
	($oid, $val) = split(':', $val, 2);
Packit 667938
	print "$oid => $val\n";
Packit 667938
    }
Packit 667938
    exit 0;
Packit 667938
Packit 667938
=head2 4. SNMPv2c maptable collecting ifDescr, ifInOctets, and ifOutOctets.
Packit 667938
Packit 667938
This example collects a table containing the columns ifDescr, ifInOctets, and
Packit 667938
ifOutOctets.  A printing function is called once per row.
Packit 667938
Packit 667938
    #! /usr/local/bin/perl
Packit 667938
    use strict;
Packit 667938
    use Net_SNMP_util;
Packit 667938
Packit 667938
    sub printfun($$$$) {
Packit 667938
	my($inst, $desc, $in, $out) = @_;
Packit 667938
	printf "%3d %-52.52s %10d %10d\n", $inst, $desc, $in, $out;
Packit 667938
    }
Packit 667938
Packit 667938
    my($host, @ret);
Packit 667938
    $host = shift || 'localhost';
Packit 667938
Packit 667938
    printf "%-3s %-52s %10s %10s\n", "Int", "Description", "In", "Out";
Packit 667938
    @ret = snmpmaptable($host . ':::::2', \&printfun,
Packit 667938
			'ifDescr', 'ifInOctets', 'ifOutOctets');
Packit 667938
Packit 667938
    exit 0;
Packit 667938
Packit 667938
=head1 REQUIREMENTS
Packit 667938
Packit 667938
=over
Packit 667938
Packit 667938
=item *
Packit 667938
Packit 667938
The Net_SNMP_util module uses syntax that is not supported in versions of Perl 
Packit 667938
earlier than v5.6.0. 
Packit 667938
Packit 667938
=item *
Packit 667938
Packit 667938
The Net_SNMP_util module uses the F<Net::SNMP> module, and as such may depend
Packit 667938
on other modules.  Please see the documentaion on F<Net::SNMP> for more
Packit 667938
information.
Packit 667938
Packit 667938
=back
Packit 667938
Packit 667938
=head1 AUTHOR
Packit 667938
Packit 667938
Mike Mitchell <Mike.Mitchell@sas.com>
Packit 667938
Packit 667938
=head1 ACKNOWLEGEMENTS
Packit 667938
Packit 667938
The original concept for this module was based on F<SNMP_Session.pm> written
Packit 667938
by Simon Leinen <simon@switch.ch>
Packit 667938
Packit 667938
=head1 COPYRIGHT
Packit 667938
Packit 667938
Copyright (c) 2007 Mike Mitchell.  All rights reserved.  This program 
Packit 667938
is free software; you may redistribute it and/or modify it under the same
Packit 667938
terms as Perl itself.
Packit 667938
Packit 667938
=cut
Packit 667938
Packit 667938
# ======================================================================
Packit 667938
1; # [end Net_SNMP_util]