From bbd45f82ab0cdfefd239797bb0d06dd67f929cea Mon Sep 17 00:00:00 2001 From: Max Baker <> Date: Thu, 28 Oct 2004 21:43:53 +0000 Subject: [PATCH] + 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. --- Info.pm | 185 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 152 insertions(+), 33 deletions(-) diff --git a/Info.pm b/Info.pm index 9c8057d3..fa4f8739 100644 --- a/Info.pm +++ b/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. 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,25 +798,40 @@ 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)/); # Aironet - non IOS $objtype = 'SNMP::Info::Layer3::Aironet' if ($desc =~ /Cisco/ and $desc =~ /\D(BR500)\D/) ; - + } elsif ($info->has_layer(1)) { $objtype = 'SNMP::Info::Layer1'; # Allied crap-o-hub $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); - } + } return $objtype; } @@ -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 ); }