+ MibDir addition to allow for specifying mib dirs.
* _global() change so that failed data is cached and not
attempted to be retrieved.
This includes NOSUCH* type returns
+ All of jerneric's kick-ass Nortel additions and typo fixes.
This commit is contained in:
181
Info.pm
181
Info.pm
@@ -1,5 +1,4 @@
|
||||
# SNMP::Info - Max Baker
|
||||
# $Id$
|
||||
#
|
||||
# Portions Copyright (c) 2003,2004 Max Baker
|
||||
# All rights reserved.
|
||||
@@ -9,7 +8,7 @@
|
||||
# See COPYRIGHT at bottom
|
||||
|
||||
package SNMP::Info;
|
||||
$VERSION = 0.8;
|
||||
$VERSION = 0.9;
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
@@ -112,7 +111,7 @@ setting for that port with two methods -- interfaces() and i_duplex().
|
||||
The information may be coming from any number of MIB files and is very vendor specific.
|
||||
SNMP::Info provides you a common method for all supported devices.
|
||||
|
||||
Adding support for your own device is easy, and takes little much SNMP knowledge.
|
||||
Adding support for your own device is easy, and takes little SNMP knowledge.
|
||||
|
||||
The module is not limited to network devices. Any MIB or device can be given an objected oriented
|
||||
front-end by making a module that consists of a couple hashes. See EXTENDING SNMP::INFO.
|
||||
@@ -299,6 +298,25 @@ ETHERLIKE-MIB (RFC1398) - Some Layer3 devices implement this MIB, as well as som
|
||||
|
||||
MAU-MIB (RFC2668). Some Layer2 devices use this for extended Ethernet (Media Access Unit) interface information.
|
||||
|
||||
=item SNMP::Info::NortelStack
|
||||
|
||||
S5-AGENT-MIB, S5-CHASSIS-MIB.
|
||||
|
||||
See SNMP::Info::NortelStack for where to get MIBs required.
|
||||
|
||||
=item SNMP::Info::RapidCity
|
||||
|
||||
RAPID-CITY. Inhertited by Nortel Networks switches for duplex and VLAN information.
|
||||
|
||||
See SNMP::Info::RapidCity for where to get MIBs required.
|
||||
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
SYNOPTICS-ROOT-MIB, S5-ETH-MULTISEG-TOPOLOGY-MIB. Provides translation from Nortel Networks Topology
|
||||
Table information to CDP. Inherited by Nortel/Bay switches and hubs.
|
||||
|
||||
See SNMP::Info::SONMP for where to get MIBs required.
|
||||
|
||||
=back
|
||||
|
||||
=head3 Device Subclasses
|
||||
@@ -330,6 +348,13 @@ Requires ASANTE-HUB1012-MIB
|
||||
|
||||
See SNMP::Info::Layer1::Asante for where to get MIBs required.
|
||||
|
||||
=item SNMP::Info::Layer1::Bayhub
|
||||
|
||||
Subclass for Nortel/Bay hubs. This includes System 5000, 100 series,
|
||||
200 series, and probably more.
|
||||
|
||||
See SNMP::Info::Layer1::Bayhub for where to get MIBs required.
|
||||
|
||||
=back
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
@@ -347,14 +372,13 @@ Layer3::Aironet for Aironet devices that don't run IOS.
|
||||
|
||||
Allied Telesys switches.
|
||||
|
||||
=item SNMP::Info::Layer2::Bay
|
||||
=item SNMP::Info::Layer2::Baystack
|
||||
|
||||
Bay Networks BayStack switch Support. Provides translation from Bay Network Topology Table
|
||||
information to CDP.
|
||||
Subclass for Nortel/Bay Baystack switches. This includes 303, 304, 350, 380,
|
||||
410, 420, 425, 450, 460, 470, 5510, 5520, Business Policy Switch (BPS) and
|
||||
probably others.
|
||||
|
||||
Requires SYNOPTICS-ROOT-MIB and S5-ETH-MULTISEG-TOPOLOGY-MIB
|
||||
|
||||
See SNMP::Info::Bay for where to get MIBs required.
|
||||
See SNMP::Info::Layer2::Baystack for where to get MIBs required.
|
||||
|
||||
=item SNMP::Info::Layer2::C1900
|
||||
|
||||
@@ -370,14 +394,30 @@ Subclass for Cisco Catalyst switches running CatOS. These switches usually
|
||||
report a model number that starts with C<wsc>. Note that this class
|
||||
does not support everything that has the name Catalyst.
|
||||
|
||||
=item SNMP::Info::Layer2::Centillion
|
||||
|
||||
Subclass for Nortel/Bay Centillion and 5000BH ATM switches.
|
||||
|
||||
See SNMP::Info::Layer2::Centillion for where to get MIBs required.
|
||||
|
||||
=item SNMP::Info::Layer2::HP
|
||||
|
||||
Subclass for HP Procurve Swithces
|
||||
Subclass for HP Procurve Switches
|
||||
|
||||
Requires HP-ICF-OID and ENTITY-MIB downloaded from HP.
|
||||
|
||||
See SNMP::Info::Layer2::HP for more info.
|
||||
|
||||
=item SNMP::Info::Layer2::NAP222x
|
||||
|
||||
Subclass for Nortel Networks' 222x series wireless access points.
|
||||
|
||||
See SNMP::Info::Layer2::NAP222x for where to get MIBs required.
|
||||
|
||||
=item SNMP::Info::Layer2::Orinoco
|
||||
|
||||
Subclass for Orinoco wireless access points.
|
||||
|
||||
=item SNMP::Info::Layer2::ZyXEL_DSLAM
|
||||
|
||||
Zyxel DSLAMs. Need I say more?
|
||||
@@ -399,13 +439,18 @@ MIBs for these devices now included in v2.tar.gz available from ftp.cisco.com.
|
||||
|
||||
Note Layer2::Aironet
|
||||
|
||||
=item SNMP::Info::Layer3::Foundry
|
||||
=item SNMP::Info::Layer3::AlteonAD
|
||||
|
||||
Subclass for older Foundry Network devices. Outdated, but being updated for newer devices.
|
||||
Subclass for Nortel Networks' Alteon Ace Director series L2-7 switches.
|
||||
|
||||
Requires FOUNDRY-SN-ROOT-MIB.
|
||||
See SNMP::Info::Layer3::AlteonAD for where to get MIBs required.
|
||||
|
||||
See SNMP::Info::Layer3::Foundry for more info.
|
||||
=item SNMP::Info::Layer3::BayRS
|
||||
|
||||
Subclass for Nortel Networks' BayRS routers. This includes BCN, BLN, ASN, ARN,
|
||||
and AN routers.
|
||||
|
||||
See SNMP::Info::Layer3::BayRS for where to get MIBs required.
|
||||
|
||||
=item SNMP::Info::Layer3::C3550
|
||||
|
||||
@@ -416,6 +461,26 @@ Subclass for Cisco Catalyst 3550,3540,3560 2/3 switches running IOS.
|
||||
This class covers Catalyst 6500s in native mode, hybrid mode. Catalyst 4000's, 3750's, 2970's
|
||||
and probably others.
|
||||
|
||||
=item SNMP::Info::Layer3::Contivity
|
||||
|
||||
Subclass for Nortel Networks' Contivity VPN concentrators.
|
||||
|
||||
See SNMP::Info::Layer3::Contivity for where to get MIBs required.
|
||||
|
||||
=item SNMP::Info::Layer3::Foundry
|
||||
|
||||
Subclass for older Foundry Network devices. Outdated, but being updated for newer devices.
|
||||
|
||||
Requires FOUNDRY-SN-ROOT-MIB.
|
||||
|
||||
See SNMP::Info::Layer3::Foundry for more info.
|
||||
|
||||
=item SNMP::Info::Layer3::Passport
|
||||
|
||||
Subclass for Nortel Networks' Passport 8600 series switches.
|
||||
|
||||
See SNMP::Info::Layer3::Passport for where to get MIBs required.
|
||||
|
||||
=back
|
||||
|
||||
=back
|
||||
@@ -423,8 +488,8 @@ and probably others.
|
||||
=head2 Thanks
|
||||
|
||||
Thanks for testing and coding help (in no particular order) to :
|
||||
Andy Ford, Brian Wilson, Jean-Philippe Luiggi, D<>na Watanabe, Bradley Baetz, and
|
||||
people listed on the Netdisco README!
|
||||
Andy Ford, Brian Wilson, Jean-Philippe Luiggi, D<>na Watanabe, Bradley Baetz,
|
||||
Eric Miller, and people listed on the Netdisco README!
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
@@ -441,20 +506,23 @@ Creates a new object and connects via SNMP::Session.
|
||||
'BigInt' => 1
|
||||
'DestHost' => 'myrouter',
|
||||
'Community' => 'public',
|
||||
'Version' => 2
|
||||
'Version' => 2,
|
||||
'MibDirs' => ['dir1','dir2','dir3'],
|
||||
) or die;
|
||||
|
||||
SNMP::Info Specific Arguments :
|
||||
|
||||
AutoSpecify = Returns an object of a more specific device class
|
||||
*See specify() entry*
|
||||
Debug = Prints Lots of debugging messages
|
||||
Session = SNMP::Session object to use instead of connecting on own.
|
||||
BigInt = Return Math::BigInt objects for 64 bit counters. Sets on a global scope, not object.
|
||||
Debug = Prints Lots of debugging messages
|
||||
MibDirs = Array ref to list of directories in which to look for MIBs. Note this will
|
||||
be in addition to the ones setup in snmp.conf at the system level.
|
||||
RetryNoSuch = When using SNMP Version 1, try reading values even if they come back
|
||||
as "no such variable in this MIB". Defaults to true, set to false if
|
||||
so desired. This feature lets you read SNMPv2 data from an SNMP version
|
||||
1 connection, and should probably be left on.
|
||||
Session = SNMP::Session object to use instead of connecting on own.
|
||||
|
||||
All other arguments are passed to SNMP::Session.
|
||||
|
||||
@@ -498,13 +566,6 @@ sub new {
|
||||
$new_obj->{munge} = \%{$class . '::MUNGE'};
|
||||
}
|
||||
|
||||
# Initialize mibs if not done
|
||||
my $init_ref = $new_obj->{init};
|
||||
unless ( $$init_ref ) {
|
||||
$new_obj->init();
|
||||
$$init_ref=1;
|
||||
}
|
||||
|
||||
# SNMP::Info specific args :
|
||||
my $auto_specific = 0;
|
||||
if (defined $args{AutoSpecify}){
|
||||
@@ -526,6 +587,17 @@ sub new {
|
||||
$BIGINT = $args{BigInt};
|
||||
delete $args{BigInt};
|
||||
}
|
||||
if (defined $args{MibDirs}){
|
||||
$new_obj->{mibdirs} = $args{MibDirs};
|
||||
delete $args{MibDirs};
|
||||
}
|
||||
|
||||
# Initialize mibs if not done
|
||||
my $init_ref = $new_obj->{init};
|
||||
unless ( $$init_ref ) {
|
||||
$new_obj->init();
|
||||
$$init_ref=1;
|
||||
}
|
||||
|
||||
$new_obj->{nosuch} = $args{RetryNoSuch} || $NOSUCH;
|
||||
|
||||
@@ -632,18 +704,26 @@ Algorithm for Subclass Detection:
|
||||
Catalyst 3550,3548,3560 -> SNMP::Info::Layer3::C3550
|
||||
Catalyst 6500, 4000, 3750 -> SNMP::Info::Layer3::C6500
|
||||
Foundry -> SNMP::Info::Layer3::Foundry
|
||||
Nortel Passport LAN -> SNMP::Info::Layer3::Passport
|
||||
Alteon Ace Director -> SNMP::Info::Layer3::AlteonAD
|
||||
Nortel Contivity -> SNMP::Info::Layer3::Contivity
|
||||
Nortel BayRS Router -> SNMP::Info::Layer3::BayRS
|
||||
Elsif Layer2 (no Layer3) -> SNMP::Info::Layer2
|
||||
Aironet - IOS Devices -> SNMP::Info::Layer2::Aironet
|
||||
Bay Networks -> SNMP::Info::Layer2::Bay
|
||||
Catalyst 1900 -> SNMP::Info::Layer2::C1900
|
||||
Catalyst 2900XL,2950,3500XL -> SNMP::Info::Layer2::C2900
|
||||
Catalyst 2970 -> SNMP::Info::Layer3::C6500
|
||||
Catalyst 3550/3548 -> SNMP::Info::Layer3::C3550
|
||||
Catalyst WS-C 2926,5xxx -> SNMP::Info::Layer2::Catalyst
|
||||
HP Procurve -> SNMP::Info::Layer2::HP
|
||||
Nortel/Bay Centillion ATM -> SNMP::Info::Layer2::Centillion
|
||||
Nortel/Bay Baystack -> SNMP::Info::Layer2::Baystack
|
||||
Nortel AP 222x -> SNMP::Info::Layer2::NAP222x
|
||||
Orinco AP -> SNMP::Info::Layer2::Orinoco
|
||||
Elsif Layer1 Support -> SNMP::Info::Layer1
|
||||
Allied -> SNMP::Info::Layer1::Allied
|
||||
Asante -> SNMP::Info::Layer1::Asante
|
||||
Nortel/Bay Hub -> SNMP::Info::Layer1::Bayhub
|
||||
Else -> SNMP::Info
|
||||
ZyXEL_DSLAM -> SNMP::Info::Layer2::ZyXEL_DSLAM
|
||||
|
||||
@@ -680,6 +760,14 @@ sub device_type {
|
||||
$objtype = 'SNMP::Info::Layer3::C6500' if ($desc =~ /cisco/i and $desc =~ /3750/);
|
||||
$objtype = 'SNMP::Info::Layer3::C6500' if $desc =~ /Catalyst 4000/;
|
||||
$objtype = 'SNMP::Info::Layer3::C6500' if $desc =~ /s72033_rp/;
|
||||
# Nortel Passport 8600
|
||||
$objtype = 'SNMP::Info::Layer3::Passport' if $desc =~ /Passport/;
|
||||
# Nortel Alteon AD Series
|
||||
$objtype = 'SNMP::Info::Layer3::AlteonAD' if $desc =~ /Alteon\s[1A][8D]/;
|
||||
# Nortel Contivity
|
||||
$objtype = 'SNMP::Info::Layer3::Contivity' if $desc =~ /\bCES\b/;
|
||||
# Nortel BayRS
|
||||
$objtype = 'SNMP::Info::Layer3::BayRS' if $desc =~ /^\sImage:\s+rel\//;
|
||||
|
||||
# Allied Telesyn Layer2 managed switches. They report they have L3 support
|
||||
$objtype = 'SNMP::Info::Layer2::Allied' if ($desc =~ /Allied.*AT-80\d{2}\S*/i);
|
||||
@@ -710,8 +798,20 @@ sub device_type {
|
||||
# HP
|
||||
$objtype = 'SNMP::Info::Layer2::HP' if ($desc =~ /HP.*ProCurve/);
|
||||
|
||||
# Bay Switch
|
||||
$objtype = 'SNMP::Info::Layer2::Bay' if ($desc =~ /BayStack/);
|
||||
# Centillion ATM
|
||||
$objtype = 'SNMP::Info::Layer2::Centillion' if ($desc =~ /MCP/);
|
||||
|
||||
# BPS
|
||||
$objtype = 'SNMP::Info::Layer2::Baystack' if ($desc =~ /Business\sPolicy\sSwitch/i);
|
||||
|
||||
# BayStack Numbered
|
||||
$objtype = 'SNMP::Info::Layer2::Baystack' if ($desc =~ /BayStack\s[345]\d/);
|
||||
|
||||
# Nortel AP 222X
|
||||
$objtype = 'SNMP::Info::Layer2::NAP222x' if ($desc =~ /Access\s+Point\s+222/);
|
||||
|
||||
# Orinco
|
||||
$objtype = 'SNMP::Info::Layer2::Orinoco' if ($desc =~ /AP-\d{3}|WavePOINT/);
|
||||
|
||||
# Aironet - IOS
|
||||
$objtype = 'SNMP::Info::Layer2::Aironet' if ($desc =~ /(C1100|AP1200)/);
|
||||
@@ -725,6 +825,9 @@ sub device_type {
|
||||
$objtype = 'SNMP::Info::Layer1::Allied' if ($desc =~ /allied/i);
|
||||
$objtype = 'SNMP::Info::Layer1::Asante' if ($desc =~ /asante/i);
|
||||
|
||||
# Bay Hub
|
||||
$objtype = 'SNMP::Info::Layer1::Bayhub' if ($desc =~ /NMM.*Agent/);
|
||||
|
||||
# These devices don't claim to have Layer1-3 but we like em anyways.
|
||||
} else {
|
||||
$objtype = 'SNMP::Info::Layer2::ZyXEL_DSLAM' if ($desc =~ /8-port .DSL Module\(Annex .\)/i);
|
||||
@@ -1598,10 +1701,12 @@ Makes human friendly speed ratings using %SPEED_MAP
|
||||
'11000000' => '11 Mbps',
|
||||
'20000000' => '20 Mbps',
|
||||
'16000000' => '16 Mbps',
|
||||
'16777216' => '16 Mbps',
|
||||
'44210000' => 'T3',
|
||||
'44736000' => 'T3',
|
||||
'45000000' => '45 Mbps',
|
||||
'45045000' => 'DS3',
|
||||
'46359642' => 'DS3',
|
||||
'64000000' => '64 Mbps',
|
||||
'100000000' => '100 Mbps',
|
||||
'149760000' => 'ATM on OC-3',
|
||||
@@ -1632,10 +1737,12 @@ Makes human friendly speed ratings using %SPEED_MAP
|
||||
'11000000' => '11 Mbps',
|
||||
'20000000' => '20 Mbps',
|
||||
'16000000' => '16 Mbps',
|
||||
'16777216' => '16 Mbps',
|
||||
'44210000' => 'T3',
|
||||
'44736000' => 'T3',
|
||||
'45000000' => '45 Mbps',
|
||||
'45045000' => 'DS3',
|
||||
'46359642' => 'DS3',
|
||||
'51850000' => 'OC-1',
|
||||
'64000000' => '64 Mbps',
|
||||
'100000000' => '100 Mbps',
|
||||
@@ -1755,12 +1862,21 @@ sub init {
|
||||
if ($major < 5){
|
||||
# Seems to work under 4.2.0
|
||||
} elsif ($major == 5 and $minor == 0 and $rev < 2){
|
||||
carp("SNMP 5.0.1 seems to be rather buggy. Upgrade.\n");
|
||||
carp("Net-SNMP 5.0.1 seems to be rather buggy. Upgrade.\n");
|
||||
# This is a bug in net-snmp 5.0.1 perl module
|
||||
# see http://groups.google.com/groups?th=47aed6bf7be6a0f5
|
||||
&SNMP::init_snmp("perl");
|
||||
}
|
||||
|
||||
# Add MibDirs
|
||||
my $mibdirs = $self->{mibdirs} || [];
|
||||
|
||||
foreach my $d (@$mibdirs){
|
||||
next unless -d $d;
|
||||
print "SNMP::Info::init() - Adding new mibdir:$d\n" if $self->debug();
|
||||
&SNMP::addMibDirs($d);
|
||||
}
|
||||
|
||||
my $mibs = $self->mibs();
|
||||
|
||||
foreach my $mib (keys %$mibs){
|
||||
@@ -1915,6 +2031,9 @@ sub _global{
|
||||
print "SNMP::Info::_global $attr : $oid\n" if $self->debug();
|
||||
my $val = $sess->get($oid);
|
||||
|
||||
# mark as gotten. Even if it fails below, we don't want to keep failing.
|
||||
$self->{"_$attr"}=undef;
|
||||
|
||||
if ($sess->{ErrorStr} ){
|
||||
$self->error_throw("SNMP::Info::_global($attr) $sess->{ErrorStr}");
|
||||
return undef;
|
||||
@@ -2243,7 +2362,7 @@ sub AUTOLOAD {
|
||||
# Next check for entry in %GLOBALS
|
||||
if (defined $globals{$attr} ){
|
||||
# Return Cached Value if exists
|
||||
return $self->{"_${attr}"} if defined $self->{"_${attr}"};
|
||||
return $self->{"_${attr}"} if exists $self->{"_${attr}"};
|
||||
# Fetch New Value
|
||||
return $self->_global( $attr );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user