|
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]
|