1338 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1338 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
NAME
 | 
						||
 | 
						||
    SNMP::Info - Object Oriented Perl5 Interface to Network devices and MIBs
 | 
						||
    through SNMP.
 | 
						||
 | 
						||
VERSION
 | 
						||
 | 
						||
    SNMP::Info - Version 0.9
 | 
						||
 | 
						||
AUTHOR
 | 
						||
 | 
						||
    SNMP::Info was created at UCSC for the netdisco project
 | 
						||
    (www.netdisco.org) and is written and maintained by Max Baker.
 | 
						||
 | 
						||
SYNOPSIS
 | 
						||
 | 
						||
     use SNMP::Info;
 | 
						||
 | 
						||
     my $info = new SNMP::Info( 
 | 
						||
                                # Auto Discover more specific Device Class
 | 
						||
                                AutoSpecify => 1,
 | 
						||
                                Debug       => 1,
 | 
						||
                                # The rest is passed to SNMP::Session
 | 
						||
                                DestHost    => 'router',
 | 
						||
                                Community   => 'public',
 | 
						||
                                Version     => 2 
 | 
						||
                              ) or die "Can't connect to device.\n";
 | 
						||
 | 
						||
     my $err = $info->error();
 | 
						||
     die "SNMP Community or Version probably wrong connecting to device. $err\n" if defined $err;
 | 
						||
 | 
						||
     $name  = $info->name();
 | 
						||
     $class = $info->class();
 | 
						||
     print "SNMP::Info is using this device class : $class\n";
 | 
						||
 | 
						||
     # Find out the Duplex status for the ports
 | 
						||
     my $interfaces = $info->interfaces();
 | 
						||
     my $i_duplex   = $info->i_duplex();
 | 
						||
 | 
						||
     # Get CDP Neighbor info
 | 
						||
     my $c_if       = $info->c_if();
 | 
						||
     my $c_ip       = $info->c_ip();
 | 
						||
     my $c_port     = $info->c_port();
 | 
						||
 | 
						||
     # Print out data per port
 | 
						||
     foreach my $iid (keys %$interfaces){
 | 
						||
        my $duplex = $i_duplex->{$iid};
 | 
						||
        # Print out physical port name, not snmp iid
 | 
						||
        my $port  = $interfaces->{$iid};
 | 
						||
 | 
						||
        # The CDP Table has table entries different than the interface tables.
 | 
						||
        # So we use c_if to get the map from cdp table to interface table.
 | 
						||
 | 
						||
        my %c_map = reverse %$c_if; 
 | 
						||
        my $c_key = $c_map{$iid};
 | 
						||
        my $neighbor_ip   = $c_ip->{$c_key};
 | 
						||
        my $neighbor_port = $c_port->{$c_key};
 | 
						||
 | 
						||
        print "$port: $duplex duplex";
 | 
						||
        print " connected to $neighbor_ip / $neighbor_port\n" if defined $remote_ip;
 | 
						||
        print "\n";
 | 
						||
 | 
						||
     }
 | 
						||
 | 
						||
SUPPORT
 | 
						||
 | 
						||
    Please direct all support, help, and bug requests to the snmp-info-users
 | 
						||
    Mailing List at
 | 
						||
    <http://lists.sourceforge.net/lists/listinfo/snmp-info-users>.
 | 
						||
 | 
						||
DESCRIPTION
 | 
						||
 | 
						||
    SNMP::Info gives an object oriented interface to information obtained
 | 
						||
    through SNMP.
 | 
						||
 | 
						||
    This module lives at http://snmp-info.sourceforge.net Check for newest
 | 
						||
    version and documentation.
 | 
						||
 | 
						||
    This module is geared towards network devices. Subclasses exist for a
 | 
						||
    number of network devices and common MIBs.
 | 
						||
 | 
						||
    The idea behind this module is to give a common interface to data from
 | 
						||
    network devices, leaving the device-specific hacks behind the scenes in
 | 
						||
    subclasses.
 | 
						||
 | 
						||
    In the SYNOPSIS example we fetch the name of all the ports on the device
 | 
						||
    and the duplex 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 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.
 | 
						||
 | 
						||
REQUIREMENTS
 | 
						||
 | 
						||
    1. Net-SNMP
 | 
						||
        To use this module, you must have Net-SNMP installed on your system.
 | 
						||
        More specifically you need the Perl modules that come with it.
 | 
						||
 | 
						||
        DO NOT INSTALL SNMP:: or Net::SNMP from CPAN!
 | 
						||
 | 
						||
        The SNMP module is matched to an install of net-snmp, and must be
 | 
						||
        installed from the net-snmp source tree.
 | 
						||
 | 
						||
        The Perl module "SNMP" is found inside the net-snmp distribution. Go
 | 
						||
        to the perl/ directory of the distribution to install it, or run
 | 
						||
        "./configure --with-perl-modules" from the top directory of the
 | 
						||
        net-snmp distribution.
 | 
						||
 | 
						||
        Net-SNMP can be found at http://net-snmp.sourceforge.net
 | 
						||
 | 
						||
        Version 5.1.2 or greater is recommended.
 | 
						||
 | 
						||
        Various version 4's and 5.0 and 5.1 series will work. 5.0.1 is kinda
 | 
						||
        flaky on the Perl side.
 | 
						||
 | 
						||
        Redhat Users: Certain versions that comes with certain versions of
 | 
						||
        Redhat/Fedora doesn't have the Perl library installed. Uninstall the
 | 
						||
        RPM and install by hand.
 | 
						||
 | 
						||
    2. MIBS
 | 
						||
        SNMP::Info operates on textual descriptors found in MIBs.
 | 
						||
 | 
						||
        If you are using SNMP::Info separate from Netdisco, download the
 | 
						||
        Netdisco-MIB package at
 | 
						||
 | 
						||
         http://sourceforge.net/project/showfiles.php?group_id=80033&package_id=135517
 | 
						||
 | 
						||
        Make sure that your snmp.conf is updated to point to your MIB
 | 
						||
        directory and that the MIBs are world-readable.
 | 
						||
 | 
						||
        To do it by hand:
 | 
						||
 | 
						||
        Then run "snmpconf" and setup that directory as default. Move
 | 
						||
        snmp.conf into /usr/local/share/snmp when you are done.
 | 
						||
 | 
						||
        Basic MIBs
 | 
						||
            A minimum amount of MIBs to have are the Version 2 MIBs from
 | 
						||
            Cisco, found at
 | 
						||
 | 
						||
            ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
						||
 | 
						||
            To install them :
 | 
						||
 | 
						||
             mkdir -p /usr/local/share/snmp/mibs && cd /usr/local/share/snmp/mibs && tar xvfz /path/to/v2.tar.gz 
 | 
						||
 | 
						||
        Version 1 MIBs
 | 
						||
            You will also need to install some of the version one MIBs from
 | 
						||
            Cisco :
 | 
						||
 | 
						||
            ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
 | 
						||
 | 
						||
            Extract
 | 
						||
 | 
						||
            BRIDGE-MIB
 | 
						||
            SNMP-REPEATER-MIB
 | 
						||
            STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)
 | 
						||
            TOKEN-RING-RMON-MIB
 | 
						||
 | 
						||
            by running
 | 
						||
 | 
						||
             mkdir -p /usr/local/share/snmp/mibs
 | 
						||
             cd /usr/local/share/snmp/mibs
 | 
						||
             tar xvfz /path/to/v1.tar.gz BRIDGE-MIB.my SNMP-REPEATER-MIB.my ESSWITCH-MIB.my TOKEN-RING-RMON-MIB.my
 | 
						||
 | 
						||
        More Specific MIBs
 | 
						||
            Some non-cisco subclasses will need MIBs other than the basic
 | 
						||
            one available from Cisco.
 | 
						||
 | 
						||
            Check below under each subclass for requirements.
 | 
						||
 | 
						||
DESIGN GOALS
 | 
						||
 | 
						||
    1. Use of textual MIB leaf identifier and enumerated values
 | 
						||
 | 
						||
        * All values are retrieved via MIB Leaf node names
 | 
						||
            For example SNMP::Info has an entry in its %GLOBALS hash for
 | 
						||
            ``sysName'' instead of 1.3.6.1.2.1.1.5.
 | 
						||
 | 
						||
        * Data returned is in the enumerated value form.
 | 
						||
            For Example instead of looking up 1.3.6.1.2.1.2.2.1.3 and
 | 
						||
            getting back 23
 | 
						||
 | 
						||
            SNMP::Info will ask for "RFC1213-MIB::ifType" and will get back
 | 
						||
            "ppp".
 | 
						||
 | 
						||
    2. SNMP::Info is easily extended to new devices
 | 
						||
        You can create a new subclass for a device by providing four hashes
 | 
						||
        : %GLOBALS, %MIBS, %FUNCS, and %MUNGE.
 | 
						||
 | 
						||
        Or you can override any existing methods from a parent class by
 | 
						||
        making a short subroutine.
 | 
						||
 | 
						||
        See the section EXTENDING SNMP::INFO for more details.
 | 
						||
 | 
						||
        When you make a new subclass for a device, please be sure to send it
 | 
						||
        back to the developers (via Source Forge or the mailing list) for
 | 
						||
        inclusion in the next version.
 | 
						||
 | 
						||
SUBCLASSES
 | 
						||
 | 
						||
    These are the subclasses that implement MIBs and support devices:
 | 
						||
 | 
						||
    Required MIBs not included in the install instructions above are noted
 | 
						||
    here.
 | 
						||
 | 
						||
  MIB Subclasses
 | 
						||
 | 
						||
    These subclasses implement method to access one or more MIBs. These are
 | 
						||
    not used directly, but rather inherited from device subclasses.
 | 
						||
 | 
						||
    For more info run "perldoc" on any of the following module names.
 | 
						||
 | 
						||
    SNMP::Info::Bridge
 | 
						||
        BRIDGE-MIB (RFC1286). QBRIDGE-MIB. Inherited by devices with Layer2
 | 
						||
        support.
 | 
						||
 | 
						||
    SNMP::Info::CDP
 | 
						||
        CISCO-CDP-MIB. Cisco Discovery Protocol (CDP) Support. Inherited by
 | 
						||
        devices serving Layer2 or Layer3.
 | 
						||
 | 
						||
    SNMP::Info::CiscoStack
 | 
						||
        CISCO-STACK-MIB and CISCO-PORT-SECURITY-MIB
 | 
						||
 | 
						||
    SNMP::Info::CiscoStats
 | 
						||
        Provides common interfaces for memory, cpu, and os statistics for
 | 
						||
        Cisco devices. Provides methods for information in :
 | 
						||
        OLD-CISCO-CPU-MIB, CISCO-PROCESS-MIB and CISCO-MEMORY-POOL-MIB
 | 
						||
 | 
						||
    SNMP::Info::CiscoVTP
 | 
						||
        CISCO-VTP-MIB, CISCO-VLAN-MEMBERSHIP-MIB,
 | 
						||
        CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB
 | 
						||
 | 
						||
    SNMP::Info::Entity
 | 
						||
        ENTITY-MIB. Used for device info in Cisco and other vendors.
 | 
						||
 | 
						||
    SNMP::Info::EtherLike
 | 
						||
        ETHERLIKE-MIB (RFC1398) - Some Layer3 devices implement this MIB, as
 | 
						||
        well as some Aironet Layer 2 devices (non Cisco).
 | 
						||
 | 
						||
    SNMP::Info::FDP
 | 
						||
        Foundry Discovery Protocol. FOUNDRY-SN-SWITCH-GROUP-MIB
 | 
						||
 | 
						||
    SNMP::Info::MAU
 | 
						||
        MAU-MIB (RFC2668). Some Layer2 devices use this for extended
 | 
						||
        Ethernet (Media Access Unit) interface information.
 | 
						||
 | 
						||
    SNMP::Info::NortelStack
 | 
						||
        S5-AGENT-MIB, S5-CHASSIS-MIB.
 | 
						||
 | 
						||
    SNMP::Info::RapidCity
 | 
						||
        RAPID-CITY. Inhertited by Nortel Networks switches for duplex and
 | 
						||
        VLAN information.
 | 
						||
 | 
						||
    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.
 | 
						||
 | 
						||
  Device Subclasses
 | 
						||
 | 
						||
    These subclasses inherit from one or more classes to provide a common
 | 
						||
    interface to data obtainable from network devices.
 | 
						||
 | 
						||
    All the required MIB files are included in the netdisco-mib package.
 | 
						||
    (See Above).
 | 
						||
 | 
						||
    SNMP::Info::Layer1
 | 
						||
        Generic Layer1 Device subclass.
 | 
						||
 | 
						||
        SNMP::Info::Layer1::Allied
 | 
						||
            Subclass for Allied Telesys Repeaters / Hubs.
 | 
						||
 | 
						||
            Requires ATI-MIB
 | 
						||
 | 
						||
            See SNMP::Info::Layer1::Allied for where to get MIBs required.
 | 
						||
 | 
						||
        SNMP::Info::Layer1::Asante
 | 
						||
            Subclass for Asante 1012 Hubs.
 | 
						||
 | 
						||
            Requires ASANTE-HUB1012-MIB
 | 
						||
 | 
						||
            See SNMP::Info::Layer1::Asante for where to get MIBs required.
 | 
						||
 | 
						||
        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.
 | 
						||
 | 
						||
    SNMP::Info::Layer2
 | 
						||
        Generic Layer2 Device subclass.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::Aironet
 | 
						||
            Class for Cisco Aironet wireless devices that run IOS. See also
 | 
						||
            Layer3::Aironet for Aironet devices that don't run IOS.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::Allied
 | 
						||
            Allied Telesys switches.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::Bay
 | 
						||
            Depricated. Use BayStack.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::Baystack
 | 
						||
            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.
 | 
						||
 | 
						||
            See SNMP::Info::Layer2::Baystack for where to get MIBs required.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::C1900
 | 
						||
            Subclass for Cisco Catalyst 1900 and 1900c Devices running
 | 
						||
            CatOS.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::C2900
 | 
						||
            Subclass for Cisco Catalyst 2900, 2950, 3500XL, and 3548 devices
 | 
						||
            running IOS.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::Catalyst
 | 
						||
            Subclass for Cisco Catalyst switches running CatOS. These
 | 
						||
            switches usually report a model number that starts with "wsc".
 | 
						||
            Note that this class does not support everything that has the
 | 
						||
            name Catalyst.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::Centillion
 | 
						||
            Subclass for Nortel/Bay Centillion and 5000BH ATM switches.
 | 
						||
 | 
						||
            See SNMP::Info::Layer2::Centillion for where to get MIBs
 | 
						||
            required.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::HP
 | 
						||
            Subclass for HP Procurve Switches
 | 
						||
 | 
						||
            Requires HP-ICF-OID and ENTITY-MIB downloaded from HP.
 | 
						||
 | 
						||
            See SNMP::Info::Layer2::HP for more info.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::NAP222x
 | 
						||
            Subclass for Nortel Networks' 222x series wireless access
 | 
						||
            points.
 | 
						||
 | 
						||
            See SNMP::Info::Layer2::NAP222x for where to get MIBs required.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::Orinoco
 | 
						||
            Subclass for Orinoco wireless access points.
 | 
						||
 | 
						||
        SNMP::Info::Layer2::ZyXEL_DSLAM
 | 
						||
            Zyxel DSLAMs. Need I say more?
 | 
						||
 | 
						||
    SNMP::Info::Layer3
 | 
						||
        Generic Layer3 and Layer2+3 Device subclass.
 | 
						||
 | 
						||
        SNMP::Info::Layer3::Aironet
 | 
						||
            Subclass for Cisco Aironet wireless access points (AP) not
 | 
						||
            running IOS. These are usually older devices.
 | 
						||
 | 
						||
            MIBs for these devices now included in v2.tar.gz available from
 | 
						||
            ftp.cisco.com.
 | 
						||
 | 
						||
            Note Layer2::Aironet
 | 
						||
 | 
						||
        SNMP::Info::Layer3::AlteonAD
 | 
						||
            Subclass for Nortel Networks' Alteon Ace Director series L2-7
 | 
						||
            switches.
 | 
						||
 | 
						||
            See SNMP::Info::Layer3::AlteonAD for where to get MIBs required.
 | 
						||
 | 
						||
        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.
 | 
						||
 | 
						||
        SNMP::Info::Layer3::C3550
 | 
						||
            Subclass for Cisco Catalyst 3550,3540,3560 2/3 switches running
 | 
						||
            IOS.
 | 
						||
 | 
						||
        SNMP::Info::Layer3::C6500
 | 
						||
            This class covers Catalyst 6500s in native mode, hybrid mode.
 | 
						||
            Catalyst 4000's, 3750's, 2970's and probably others.
 | 
						||
 | 
						||
        SNMP::Info::Layer3::Cisco
 | 
						||
            This is a simple wrapper around Layer3 for IOS devices. It adds
 | 
						||
            on CiscoVTP.
 | 
						||
 | 
						||
        SNMP::Info::Layer3::Contivity
 | 
						||
            Subclass for Nortel Networks' Contivity VPN concentrators.
 | 
						||
 | 
						||
            See SNMP::Info::Layer3::Contivity for where to get MIBs
 | 
						||
            required.
 | 
						||
 | 
						||
        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.
 | 
						||
 | 
						||
        SNMP::Info::Layer3::Passport
 | 
						||
            Subclass for Nortel Networks' Passport 8600 series switches.
 | 
						||
 | 
						||
            See SNMP::Info::Layer3::Passport for where to get MIBs required.
 | 
						||
 | 
						||
Thanks
 | 
						||
 | 
						||
    Thanks for testing and coding help (in no particular order) to : Andy
 | 
						||
    Ford, Brian Wilson, Jean-Philippe Luiggi, D<>na Watanabe, Bradley Baetz,
 | 
						||
    Eric Miller, and people listed on the Netdisco README!
 | 
						||
 | 
						||
USAGE
 | 
						||
 | 
						||
  Constructor
 | 
						||
 | 
						||
    new()
 | 
						||
        Creates a new object and connects via SNMP::Session.
 | 
						||
 | 
						||
         my $info = new SNMP::Info( 'Debug'       => 1,
 | 
						||
                                    'AutoSpecify' => 1,
 | 
						||
                                    'BigInt'      => 1
 | 
						||
                                    'DestHost'    => 'myrouter',
 | 
						||
                                    'Community'   => 'public',
 | 
						||
                                    '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*
 | 
						||
         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.
 | 
						||
 | 
						||
        See SNMP::Session for a list of other possible arguments.
 | 
						||
 | 
						||
        A Note about the wrong Community string or wrong SNMP Version :
 | 
						||
 | 
						||
        If a connection is using the wrong community string or the wrong
 | 
						||
        SNMP version, the creation of the object will not fail. The device
 | 
						||
        still answers the call on the SNMP port, but will not return
 | 
						||
        information. Check the error() method after you create the device
 | 
						||
        object to see if there was a problem in connecting.
 | 
						||
 | 
						||
        A note about SNMP Versions :
 | 
						||
 | 
						||
        Some older devices don't support SNMP version 2, and will not return
 | 
						||
        anything when a connection under Version 2 is attempted.
 | 
						||
 | 
						||
        Some newer devices will support Version 1, but will not return all
 | 
						||
        the data they might have if you had connected under Version 1
 | 
						||
 | 
						||
        When trying to get info from a new device, you may have to try
 | 
						||
        version 2 and then fallback to version 1.
 | 
						||
 | 
						||
  Data is Cached
 | 
						||
 | 
						||
    Methods and subroutines requesting data from a device will only load the
 | 
						||
    data once, and then return cached versions of that data.
 | 
						||
 | 
						||
    Run $info->load_METHOD() where method is something like 'i_name' to
 | 
						||
    reload data from a table method.
 | 
						||
 | 
						||
    Run $info->clear_cache() to clear the cache to allow reload of both
 | 
						||
    globals and table methods.
 | 
						||
 | 
						||
  Object Scalar Methods
 | 
						||
 | 
						||
    These are for package related data, not direcly supplied from SNMP.
 | 
						||
 | 
						||
    $info->clear_cache()
 | 
						||
        Clears the cached data. This includes GLOBALS data and TABLE METHOD
 | 
						||
        data.
 | 
						||
 | 
						||
    $info->debug(1)
 | 
						||
        Returns current debug status, and optionally toggles debugging info
 | 
						||
        for this object.
 | 
						||
 | 
						||
    $info->device_type()
 | 
						||
        Returns the Subclass name for this device. "SNMP::Info" is returned
 | 
						||
        if no more specific class is available.
 | 
						||
 | 
						||
        First the device is checked for Layer 3 support and a specific
 | 
						||
        subclass, then Layer 2 support and subclasses are checked for.
 | 
						||
 | 
						||
        This means that Layer 2 / 3 switches and routers will fall under the
 | 
						||
        SNMP::Info::Layer3 subclasses.
 | 
						||
 | 
						||
        If the device still can be connected to via SNMP::Info, then
 | 
						||
        SNMP::Info is returned.
 | 
						||
 | 
						||
        Algorithm for Subclass Detection:
 | 
						||
 | 
						||
                Layer3 Support                     -> SNMP::Info::Layer3
 | 
						||
                    Aironet (BR500,AP340,350,1200) -> SNMP::Info::Layer3::Aironet
 | 
						||
                             AP4800... All Non IOS
 | 
						||
                    Catalyst 3550,3548,3560        -> SNMP::Info::Layer3::C3550
 | 
						||
                    Catalyst 6500, 4000, 3750      -> SNMP::Info::Layer3::C6500
 | 
						||
                    Cisco Generic L3 IOS device    -> SNMP::Info::Layer3::Cisco
 | 
						||
                    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
 | 
						||
                    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
 | 
						||
 | 
						||
    $info->error(no_clear)
 | 
						||
        Returns Error message if there is an error, or undef if there is
 | 
						||
        not.
 | 
						||
 | 
						||
        Reading the error will clear the error unless you set the no_clear
 | 
						||
        flag.
 | 
						||
 | 
						||
    $info->has_layer(3)
 | 
						||
        Returns non-zero if the device has the supplied layer in the OSI
 | 
						||
        Model
 | 
						||
 | 
						||
        Returns "undef" if the device doesn't support the layers() call.
 | 
						||
 | 
						||
    $info->snmp_comm()
 | 
						||
        Returns SNMP Community string used in connection.
 | 
						||
 | 
						||
    $info->snmp_ver()
 | 
						||
        Returns SNMP Version used for this connection
 | 
						||
 | 
						||
    $info->specify()
 | 
						||
        Returns an object of a more-specific subclass.
 | 
						||
 | 
						||
         my $info = new SNMP::Info(...);
 | 
						||
         # Returns more specific object type
 | 
						||
         $info = $info->specific();
 | 
						||
 | 
						||
        Usually this method is called internally from new(AutoSpecify => 1)
 | 
						||
 | 
						||
        See device_type() entry for how a subclass is chosen.
 | 
						||
 | 
						||
    $info->cisco_comm_indexing()
 | 
						||
        Returns 0. Is an overridable method used for vlan indexing for snmp
 | 
						||
        calls on certain Cisco devices.
 | 
						||
 | 
						||
        See
 | 
						||
        <ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-community
 | 
						||
        Indexing.html>
 | 
						||
 | 
						||
  Globals (Scalar Methods)
 | 
						||
 | 
						||
    These are methods to return scalar data from RFC1213.
 | 
						||
 | 
						||
    Some subset of these is probably available for any network device that
 | 
						||
    speaks SNMP.
 | 
						||
 | 
						||
    $info->uptime()
 | 
						||
        Uptime in hundredths of seconds since device became available.
 | 
						||
 | 
						||
        (sysUpTime)
 | 
						||
 | 
						||
    $info->contact()
 | 
						||
        (sysContact)
 | 
						||
 | 
						||
    $info->name()
 | 
						||
        (sysName)
 | 
						||
 | 
						||
    $info->location()
 | 
						||
        (sysLocation)
 | 
						||
 | 
						||
    $info->layers()
 | 
						||
        This returns a binary encoded string where each digit represents a
 | 
						||
        layer of the OSI model served by the device.
 | 
						||
 | 
						||
            eg: 01000010  means layers 2 (physical) and 7 (Application) 
 | 
						||
                          are served.
 | 
						||
 | 
						||
        Note: This string is 8 digits long.
 | 
						||
 | 
						||
        See $info->has_layer()
 | 
						||
 | 
						||
        (sysServices)
 | 
						||
 | 
						||
    $info->ports()
 | 
						||
        Number of interfaces available on this device.
 | 
						||
 | 
						||
        Not too useful as the number of SNMP interfaces usually does not
 | 
						||
        correspond with the number of physical ports
 | 
						||
 | 
						||
        (ifNumber)
 | 
						||
 | 
						||
  Table Methods
 | 
						||
 | 
						||
    Each of these methods returns a hash_reference to a hash keyed on the
 | 
						||
    interface index in SNMP.
 | 
						||
 | 
						||
    Example : $info->interfaces() might return
 | 
						||
 | 
						||
        { '1.12' => 'FastEthernet/0',
 | 
						||
          '2.15' => 'FastEthernet/1',
 | 
						||
          '9.99' => 'FastEthernet/2'
 | 
						||
        }
 | 
						||
 | 
						||
    The key is what you would see if you were to do an snmpwalk, and in some
 | 
						||
    cases changes between reboots of the network device.
 | 
						||
 | 
						||
  Partial Table Fetches
 | 
						||
 | 
						||
    If you want to get only a part of an SNMP table and you know the IID for
 | 
						||
    the part of the table that you want, you can specify it in the call:
 | 
						||
 | 
						||
        $local_routes = $info->ipr_route('192.168.0');
 | 
						||
 | 
						||
    This will only fetch entries in the table that start with 192.168.0,
 | 
						||
    which in this case are routes on the local network.
 | 
						||
 | 
						||
    Remember that you must supply the partial IID (a numeric OID).
 | 
						||
 | 
						||
    Partial table results are not cached.
 | 
						||
 | 
						||
  Interface Information
 | 
						||
 | 
						||
    $info->interfaces()
 | 
						||
        This methods is overriden in each subclass to provide a mapping
 | 
						||
        between the Interface Table Index (iid) and the physical port name.
 | 
						||
 | 
						||
    $info->if_ignore()
 | 
						||
        Returns a reference to a hash where key values that exist are
 | 
						||
        interfaces to ignore.
 | 
						||
 | 
						||
        Ignored interfaces are ones that are usually not physical ports or
 | 
						||
        Virtual Lans (VLANs) such as the Loopback interface, or the CPU
 | 
						||
        interface.
 | 
						||
 | 
						||
    $info->i_index()
 | 
						||
        Default SNMP IID to Interface index.
 | 
						||
 | 
						||
        (ifIndex)
 | 
						||
 | 
						||
    $info->i_description()
 | 
						||
        Description of the interface. Usually a little longer single word
 | 
						||
        name that is both human and machine friendly. Not always.
 | 
						||
 | 
						||
        (ifDescr)
 | 
						||
 | 
						||
    $info->i_type()
 | 
						||
        Interface type, such as Vlan, 10baseT, Ethernet, Serial
 | 
						||
 | 
						||
        (ifType)
 | 
						||
 | 
						||
    $info->i_mtu()
 | 
						||
        INTEGER. Interface MTU value.
 | 
						||
 | 
						||
        (ifMtu)
 | 
						||
 | 
						||
    $info->i_speed()
 | 
						||
        Speed of the link, human format. See munge_speed() later in document
 | 
						||
        for details.
 | 
						||
 | 
						||
        (ifSpeed)
 | 
						||
 | 
						||
    $info->i_mac()
 | 
						||
        MAC address of the interface. Note this is just the MAC of the port,
 | 
						||
        not anything connected to it.
 | 
						||
 | 
						||
        (ifPhysAddress)
 | 
						||
 | 
						||
    $info->i_up()
 | 
						||
        Link Status of the interface. Typical values are 'up' and 'down'.
 | 
						||
 | 
						||
        (ifOperStatus)
 | 
						||
 | 
						||
    $info->i_up_admin()
 | 
						||
        Administrative status of the port. Typical values are 'enabled' and
 | 
						||
        'disabled'.
 | 
						||
 | 
						||
        (ifAdminStatus)
 | 
						||
 | 
						||
    $info->i_lastchange()
 | 
						||
        The value of sysUpTime when this port last changed states (up,down).
 | 
						||
 | 
						||
        (IfLastChange)
 | 
						||
 | 
						||
    $info->i_name()
 | 
						||
        Interface Name field. Supported by a smaller subset of devices, this
 | 
						||
        fields is often human set.
 | 
						||
 | 
						||
        (ifName)
 | 
						||
 | 
						||
    $info->i_alias()
 | 
						||
        Interface Name field. For certain devices this is a more human
 | 
						||
        friendly form of i_description(). For others it is a human set field
 | 
						||
        like i_name().
 | 
						||
 | 
						||
        (ifAlias)
 | 
						||
 | 
						||
  Interface Statistics
 | 
						||
 | 
						||
    $info->i_octet_in(), $info->i_octets_out(), $info->i_octet_in64(),
 | 
						||
    $info->i_octets_out64()
 | 
						||
        Bandwidth.
 | 
						||
 | 
						||
        Number of octets sent/received on the interface including framing
 | 
						||
        characters.
 | 
						||
 | 
						||
        64 bit version may not exist on all devices.
 | 
						||
 | 
						||
        NOTE: To manipulate 64 bit counters you need to use Math::BigInt,
 | 
						||
        since the values are too large for a normal Perl scalar. Set the
 | 
						||
        global $SNMP::Info::BIGINT to 1 , or pass the BigInt value to new()
 | 
						||
        if you want SNMP::Info to do it for you.
 | 
						||
 | 
						||
        (ifInOctets) (ifOutOctets) (ifHCInOctets) (ifHCOutOctets)
 | 
						||
 | 
						||
    $info->i_errors_in(), $info->i_errors_out()
 | 
						||
        Number of packets that contained an error prventing delivery. See
 | 
						||
        IF-MIB for more info.
 | 
						||
 | 
						||
        (ifInErrors) (ifOutErrors)
 | 
						||
 | 
						||
    $info->i_pkts_ucast_in(), $info->i_pkts_ucast_out(),
 | 
						||
    $info->i_pkts_ucast_in64(), $info->i_pkts_ucast_out64()
 | 
						||
        Number of packets not sent to a multicast or broadcast address.
 | 
						||
 | 
						||
        64 bit version may not exist on all devices.
 | 
						||
 | 
						||
        (ifInUcastPkts) (ifOutUcastPkts) (ifHCInUcastPkts)
 | 
						||
        (ifHCOutUcastPkts)
 | 
						||
 | 
						||
    $info->i_pkts_nucast_in(), $info->i_pkts_nucast_out(),
 | 
						||
        Number of packets sent to a multicast or broadcast address.
 | 
						||
 | 
						||
        These methods are depricated by i_pkts_multi_in() and
 | 
						||
        i_pkts_bcast_in() according to IF-MIB. Actual device usage may vary.
 | 
						||
 | 
						||
        (ifInNUcastPkts) (ifOutNUcastPkts)
 | 
						||
 | 
						||
    $info->i_pkts_multi_in() $info->i_pkts_multi_out(),
 | 
						||
    $info->i_pkts_multi_in64(), $info->i_pkts_multi_out64()
 | 
						||
        Number of packets sent to a multicast address.
 | 
						||
 | 
						||
        64 bit version may not exist on all devices.
 | 
						||
 | 
						||
        (ifInMulticastPkts) (ifOutMulticastPkts) (ifHCInMulticastPkts)
 | 
						||
        (ifHCOutMulticastPkts)
 | 
						||
 | 
						||
    $info->i_pkts_bcast_in() $info->i_pkts_bcast_out(),
 | 
						||
    $info->i_pkts_bcast_in64() $info->i_pkts_bcast_out64()
 | 
						||
        Number of packets sent to a broadcast address on an interface.
 | 
						||
 | 
						||
        64 bit version may not exist on all devices.
 | 
						||
 | 
						||
        (ifInBroadcastPkts) (ifOutBroadcastPkts) (ifHCInBroadcastPkts)
 | 
						||
        (ifHCOutBroadcastPkts)
 | 
						||
 | 
						||
  IP Address Table
 | 
						||
 | 
						||
    Each entry in this table is an IP address in use on this device. Usually
 | 
						||
    this is implemented in Layer3 Devices.
 | 
						||
 | 
						||
    $info->ip_index()
 | 
						||
        Maps the IP Table to the IID
 | 
						||
 | 
						||
        (ipAdEntIfIndex)
 | 
						||
 | 
						||
    $info->ip_table()
 | 
						||
        Maps the Table to the IP address
 | 
						||
 | 
						||
        (ipAdEntAddr)
 | 
						||
 | 
						||
    $info->ip_netmask()
 | 
						||
        Gives netmask setting for IP table entry.
 | 
						||
 | 
						||
        (ipAdEntNetMask)
 | 
						||
 | 
						||
    $info->ip_broadcast()
 | 
						||
        Gives broadcast address for IP table entry.
 | 
						||
 | 
						||
        (ipAdEntBcastAddr)
 | 
						||
 | 
						||
  IP Routing Table
 | 
						||
 | 
						||
    $info->ipr_route()
 | 
						||
        The route in question. A value of 0.0.0.0 is the default gateway
 | 
						||
        route.
 | 
						||
 | 
						||
        ("ipRouteDest")
 | 
						||
 | 
						||
    $info->ipr_if()
 | 
						||
        The interface (IID) that the route is on. Use interfaces() to map.
 | 
						||
 | 
						||
        ("ipRouteIfIndex")
 | 
						||
 | 
						||
    $info->ipr_1()
 | 
						||
        Primary routing metric for this route.
 | 
						||
 | 
						||
        ("ipRouteMetric1")
 | 
						||
 | 
						||
    $info->ipr_2()
 | 
						||
        If metrics are not used, they should be set to -1
 | 
						||
 | 
						||
        ("ipRouteMetric2")
 | 
						||
 | 
						||
    $info->ipr_3()
 | 
						||
        ("ipRouteMetric3")
 | 
						||
 | 
						||
    $info->ipr_4()
 | 
						||
        ("ipRouteMetric4")
 | 
						||
 | 
						||
    $info->ipr_5()
 | 
						||
        ("ipRouteMetric5")
 | 
						||
 | 
						||
    $info->ipr_dest()
 | 
						||
        From RFC1213:
 | 
						||
 | 
						||
          "The IP address of the next hop of this route.
 | 
						||
          (In the case of a route bound to an interface
 | 
						||
          which is realized via a broadcast media, the value
 | 
						||
          of this field is the agent's IP address on that
 | 
						||
          interface.)"
 | 
						||
 | 
						||
        ("ipRouteNextHop")
 | 
						||
 | 
						||
    $info->ipr_type()
 | 
						||
        From RFC1213:
 | 
						||
 | 
						||
            other(1),        -- none of the following
 | 
						||
            invalid(2),      -- an invalidated route
 | 
						||
                             -- route to directly
 | 
						||
            direct(3),       -- connected (sub-)network
 | 
						||
                             -- route to a non-local
 | 
						||
            indirect(4)      -- host/network/sub-network
 | 
						||
 | 
						||
              "The type of route.  Note that the values
 | 
						||
              direct(3) and indirect(4) refer to the notion of
 | 
						||
              direct and indirect routing in the IP
 | 
						||
              architecture.
 | 
						||
 | 
						||
              Setting this object to the value invalid(2) has
 | 
						||
              the effect of invalidating the corresponding entry
 | 
						||
              in the ipRouteTable object.  That is, it
 | 
						||
              effectively disassociates the destination
 | 
						||
              identified with said entry from the route
 | 
						||
              identified with said entry.  It is an
 | 
						||
              implementation-specific matter as to whether the
 | 
						||
              agent removes an invalidated entry from the table.
 | 
						||
              Accordingly, management stations must be prepared
 | 
						||
              to receive tabular information from agents that
 | 
						||
              corresponds to entries not currently in use.
 | 
						||
              Proper interpretation of such entries requires
 | 
						||
              examination of the relevant ipRouteType object."
 | 
						||
 | 
						||
        ("ipRouteType")
 | 
						||
 | 
						||
    $info->ipr_proto()
 | 
						||
        From RFC1213:
 | 
						||
 | 
						||
            other(1),       -- none of the following
 | 
						||
                            -- non-protocol information,
 | 
						||
                            -- e.g., manually configured
 | 
						||
            local(2),       -- entries
 | 
						||
                            -- set via a network
 | 
						||
            netmgmt(3),     -- management protocol
 | 
						||
                            -- obtained via ICMP,
 | 
						||
            icmp(4),        -- e.g., Redirect
 | 
						||
                            -- the remaining values are
 | 
						||
                            -- all gateway routing
 | 
						||
                            -- protocols
 | 
						||
            egp(5),
 | 
						||
            ggp(6),
 | 
						||
            hello(7),
 | 
						||
            rip(8),
 | 
						||
            is-is(9),
 | 
						||
            es-is(10),
 | 
						||
            ciscoIgrp(11),
 | 
						||
            bbnSpfIgp(12),
 | 
						||
            ospf(13),
 | 
						||
            bgp(14)
 | 
						||
 | 
						||
        ("ipRouteProto")
 | 
						||
 | 
						||
    $info->ipr_age()
 | 
						||
        Seconds since route was last updated or validated.
 | 
						||
 | 
						||
        ("ipRouteAge")
 | 
						||
 | 
						||
    $info->ipr_mask()
 | 
						||
        Subnet Mask of route. 0.0.0.0 for default gateway.
 | 
						||
 | 
						||
        ("ipRouteMask")
 | 
						||
 | 
						||
    $info->ipr_info()
 | 
						||
        Reference to MIB definition specific to routing protocol.
 | 
						||
 | 
						||
        ("ipRouteInfo")
 | 
						||
 | 
						||
SETTING DATA VIA SNMP
 | 
						||
 | 
						||
    This section explains how to use SNMP::Info to do SNMP Set operations.
 | 
						||
 | 
						||
    $info->set_METHOD($value)
 | 
						||
        Sets the global METHOD to value. Assumes that iid is .0
 | 
						||
 | 
						||
        Returns undef if failed, or the return value from
 | 
						||
        SNMP::Session::set() (snmp_errno)
 | 
						||
 | 
						||
         $info->set_location("Here!");
 | 
						||
 | 
						||
    $info->set_METHOD($value,$iid)
 | 
						||
        Table Methods. Set iid of method to value.
 | 
						||
 | 
						||
        Returns undef if failed, or the return value from
 | 
						||
        SNMP::Session::set() (snmp_errno)
 | 
						||
 | 
						||
         # Disable a port administratively
 | 
						||
         my %if_map = reverse %{$info->interfaces()}
 | 
						||
         $info->set_i_up_admin('down', $if_map{'FastEthernet0/0'}) 
 | 
						||
            or die "Couldn't disable the port. ",$info->error(1);
 | 
						||
 | 
						||
    NOTE: You must be connected to your device with a "ReadWrite" community
 | 
						||
    string in order for set operations to work.
 | 
						||
 | 
						||
    NOTE: This will only set data listed in %FUNCS and %GLOBALS. For data
 | 
						||
    acquired from overriden methods (subroutines) specific set_METHOD()
 | 
						||
    subroutines will need to be added if they haven't been already.
 | 
						||
 | 
						||
Quiet Mode
 | 
						||
 | 
						||
    SNMP::Info will not chirp anything to STDOUT unless there is a serious
 | 
						||
    error (in which case it will probably die).
 | 
						||
 | 
						||
    To get lots of debug info, set the Debug flag when calling new() or call
 | 
						||
    $info->debug(1);
 | 
						||
 | 
						||
    When calling a method check the return value. If the return value is
 | 
						||
    undef then check $info->error()
 | 
						||
 | 
						||
    Beware, calling $info->error() clears the error.
 | 
						||
 | 
						||
     my $name = $info->name() or die "Couldn't get sysName!" . $name->error();
 | 
						||
 | 
						||
EXTENDING SNMP::INFO
 | 
						||
 | 
						||
  Data Structures required in new Subclass
 | 
						||
 | 
						||
    A class inheriting this class must implement these data structures :
 | 
						||
 | 
						||
    $INIT
 | 
						||
        Used to flag if the MIBs have been loaded yet.
 | 
						||
 | 
						||
    %GLOBALS
 | 
						||
        Contains a hash in the form ( method_name => SNMP iid name ) These
 | 
						||
        are scalar values such as name,uptime, etc.
 | 
						||
 | 
						||
        When choosing the name for the methods, be aware that other new Sub
 | 
						||
        Modules might inherit this one to get it's features. Try to choose a
 | 
						||
        prefix for methods that will give it's own name space inside the
 | 
						||
        SNMP::Info methods.
 | 
						||
 | 
						||
    %FUNCS
 | 
						||
        Contains a hash in the form ( method_name => SNMP iid) These are
 | 
						||
        table entries, such as the IfIndex
 | 
						||
 | 
						||
    %MIBS
 | 
						||
        A list of each mib needed.
 | 
						||
 | 
						||
        ('MIB-NAME' => 'itemToTestForPresence')
 | 
						||
 | 
						||
        The value for each entry should be a MIB object to check for to make
 | 
						||
        sure that the MIB is present and has loaded correctly.
 | 
						||
 | 
						||
        $info->init() will throw an exception if a MIB does not load.
 | 
						||
 | 
						||
    %MUNGE
 | 
						||
        A map between method calls (from %FUNCS or %GLOBALS) and subroutine
 | 
						||
        methods. The subroutine called will be passed the data as it gets it
 | 
						||
        from SNMP and it should return that same data in a more human
 | 
						||
        friendly format.
 | 
						||
 | 
						||
        Sample %MUNGE:
 | 
						||
 | 
						||
         (my_ip     => \&munge_ip,
 | 
						||
          my_mac    => \&munge_mac,
 | 
						||
          my_layers => \&munge_dec2bin
 | 
						||
         )
 | 
						||
 | 
						||
  Sample Subclass
 | 
						||
 | 
						||
    Let's make a sample Layer 2 Device subclass. This class will inherit the
 | 
						||
    Cisco Vlan module as an example.
 | 
						||
 | 
						||
    ----------------------- snip --------------------------------
 | 
						||
 | 
						||
     # SNMP::Info::Layer2::Sample
 | 
						||
 | 
						||
     package SNMP::Info::Layer2::Sample;
 | 
						||
 | 
						||
     $VERSION = 0.1;
 | 
						||
 | 
						||
     use strict;
 | 
						||
 | 
						||
     use Exporter;
 | 
						||
     use SNMP::Info::Layer2;
 | 
						||
     use SNMP::Info::CiscoVTP;
 | 
						||
 | 
						||
     @SNMP::Info::Layer2::Sample::ISA = qw/SNMP::Info::Layer2
 | 
						||
                                           SNMP::Info::CiscoVTP Exporter/;
 | 
						||
     @SNMP::Info::Layer2::Sample::EXPORT_OK = qw//;
 | 
						||
 | 
						||
     use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
 | 
						||
 | 
						||
     %MIBS    = (%SNMP::Info::Layer2::MIBS,
 | 
						||
                 %SNMP::Info::CiscoVTP::MIBS,
 | 
						||
                 'SUPER-DOOPER-MIB'  => 'supermibobject'
 | 
						||
                );
 | 
						||
 | 
						||
     %GLOBALS = (%SNMP::Info::Layer2::GLOBALS,
 | 
						||
                 %SNMP::Info::CiscoVTP::GLOBALS,
 | 
						||
                 'name'              => 'supermib_supername',
 | 
						||
                 'favorite_color'    => 'supermib_fav_color_object',
 | 
						||
                 'favorite_movie'    => 'supermib_fav_movie_val'
 | 
						||
                 );
 | 
						||
 | 
						||
     %FUNCS   = (%SNMP::Info::Layer2::FUNCS,
 | 
						||
                 %SNMP::Info::CiscoVTP::FUNCS,
 | 
						||
                 # Super Dooper MIB - Super Hero Table
 | 
						||
                 'super_hero_index'  => 'SuperHeroIfIndex',
 | 
						||
                 'super_hero_name'   => 'SuperHeroIfName',
 | 
						||
                 'super_hero_powers' => 'SuperHeroIfPowers'
 | 
						||
                );
 | 
						||
 | 
						||
     %MUNGE   = (%SNMP::Info::Layer2::MUNGE,
 | 
						||
                 %SNMP::Info::CiscoVTP::MUNGE,
 | 
						||
                 'super_hero_powers' => \&munge_powers
 | 
						||
                );
 | 
						||
 | 
						||
     # OverRide uptime() method from %SNMP::Info::GLOBALS
 | 
						||
     sub uptime {
 | 
						||
         my $sample = shift;
 | 
						||
 | 
						||
         my $name   = $sample->name();
 | 
						||
 | 
						||
         # this is silly but you get the idea
 | 
						||
         return '600' if defined $name ;
 | 
						||
     }
 | 
						||
 | 
						||
     # Create our own munge function
 | 
						||
     sub munge_powers {
 | 
						||
         my $power = shift;
 | 
						||
 | 
						||
         # Take the returned obscure value and return something useful.
 | 
						||
         return 'Fire' if $power =~ /reallyhot/i;
 | 
						||
         return 'Ice'  if $power =~ /reallycold/i;
 | 
						||
 | 
						||
         # Else 
 | 
						||
         return $power;
 | 
						||
     }
 | 
						||
 | 
						||
     # Copious Documentation here!!!
 | 
						||
     =head1 NAME
 | 
						||
     =head1 AUTHOR
 | 
						||
     =head1 SYNOPSIS
 | 
						||
     =head1 DESCRIPTION
 | 
						||
     =head2 Inherited Classes
 | 
						||
     =head2 Required MIBs
 | 
						||
     =head1 GLOBALS
 | 
						||
     =head2 Overrides
 | 
						||
     =head1 TABLE METHODS
 | 
						||
     =head2 Overrides
 | 
						||
     =cut
 | 
						||
 | 
						||
     1; # don't forget this line
 | 
						||
    ----------------------- snip --------------------------------
 | 
						||
 | 
						||
    Be sure and send the debugged version to
 | 
						||
    snmp-info-users@lists.sourceforge.net to be included in the next version
 | 
						||
    of SNMP::Info.
 | 
						||
 | 
						||
SNMP::INFO INTERNALS
 | 
						||
 | 
						||
  Object Namespace
 | 
						||
 | 
						||
    Internal data is stored with bareword keys. For example $info->{debug}
 | 
						||
 | 
						||
    SNMP Data is stored or marked cached with keys starting with an
 | 
						||
    underscore. For example $info->{_name} is the cache for $info->name().
 | 
						||
 | 
						||
    Cached Table data is stored in $info->store() and marked cached per
 | 
						||
    above.
 | 
						||
 | 
						||
  Package Globals
 | 
						||
 | 
						||
    These set the default value for an object upon creation.
 | 
						||
 | 
						||
    $DEBUG
 | 
						||
        Default 0. Sends copious debug info to stdout. This global sets the
 | 
						||
        object's debug status in new() unless 'Debug' argument passed in
 | 
						||
        new(). Change objects' debug status with $info->debug().
 | 
						||
 | 
						||
    $BIGINT
 | 
						||
        Default 0. Set to true to have 64 bit counters return Math::BigInt
 | 
						||
        objects instead of scalar string values. See note under Interface
 | 
						||
        Statistics about 64 bit values.
 | 
						||
 | 
						||
    $NOSUCH
 | 
						||
        Default 1. Set to false to disable RetryNoSuch option for
 | 
						||
        SNMP::Session. Or see method in new() to do it on an object scope.
 | 
						||
 | 
						||
  Data Munging Callback Subroutines
 | 
						||
 | 
						||
    munge_speed()
 | 
						||
        Makes human friendly speed ratings using %SPEED_MAP
 | 
						||
 | 
						||
         %SPEED_MAP = (
 | 
						||
                        '56000'      => '56 kbps',
 | 
						||
                        '64000'      => '64 kbps',
 | 
						||
                        '1500000'    => '1.5 Mbps',
 | 
						||
                        '1536000'    => 'T1',      
 | 
						||
                        '1544000'    => 'T1',
 | 
						||
                        '2000000'    => '2.0 Mbps',
 | 
						||
                        '2048000'    => '2.048 Mbps',
 | 
						||
                        '3072000'    => 'Dual T1',
 | 
						||
                        '3088000'    => 'Dual T1',   
 | 
						||
                        '4000000'    => '4.0 Mbps',
 | 
						||
                        '10000000'   => '10 Mbps',
 | 
						||
                        '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',
 | 
						||
                        '155000000'  => 'OC-3',
 | 
						||
                        '155519000'  => 'OC-3',
 | 
						||
                        '155520000'  => 'OC-3',
 | 
						||
                        '400000000'  => '400 Mbps',
 | 
						||
                        '599040000'  => 'ATM on OC-12', 
 | 
						||
                        '622000000'  => 'OC-12',
 | 
						||
                        '622080000'  => 'OC-12',
 | 
						||
                        '1000000000' => '1.0 Gbps',
 | 
						||
                     )
 | 
						||
 | 
						||
    munge_ip()
 | 
						||
        Takes a binary IP and makes it dotted ASCII
 | 
						||
 | 
						||
    munge_mac()
 | 
						||
        Takes an octet stream (HEX-STRING) and returns a colon separated
 | 
						||
        ASCII hex string.
 | 
						||
 | 
						||
    munge_octet2hex()
 | 
						||
        Takes a binary octet stream and returns an ASCII hex string
 | 
						||
 | 
						||
    munge_dec2bin()
 | 
						||
        Takes a binary char and returns its ASCII binary representation
 | 
						||
 | 
						||
    munge_bits
 | 
						||
        Takes a SNMP2 'BITS' field and returns the ASCII bit string
 | 
						||
 | 
						||
    munge_counter64
 | 
						||
        If $BIGINT is set to true, then a Math::BigInt object is returned.
 | 
						||
        See Math::BigInt for details.
 | 
						||
 | 
						||
  Internaly Used Functions
 | 
						||
 | 
						||
    $info->init()
 | 
						||
        Used internally. Loads all entries in %MIBS.
 | 
						||
 | 
						||
    $info->args()
 | 
						||
        Returns a reference to the argument hash supplied to SNMP::Session
 | 
						||
 | 
						||
    $info->class()
 | 
						||
        Returns the class name of the object.
 | 
						||
 | 
						||
    $info->error_throw(error message)
 | 
						||
        Stores the error message for use by $info->error()
 | 
						||
 | 
						||
        If $info->debug() is true, then the error message is carped too.
 | 
						||
 | 
						||
    $info->funcs()
 | 
						||
        Returns a reference to the %FUNCS hash.
 | 
						||
 | 
						||
    $info->globals()
 | 
						||
        Returns a reference to the %GLOBALS hash.
 | 
						||
 | 
						||
    $info->mibs()
 | 
						||
        Returns a reference to the %MIBS hash.
 | 
						||
 | 
						||
    $info->munge()
 | 
						||
        Returns a reference ot the %MUNGE hash.
 | 
						||
 | 
						||
    $info->nosuch()
 | 
						||
        Returns NoSuch value set or not in new()
 | 
						||
 | 
						||
    $info->session()
 | 
						||
        Gets or Sets the SNMP::Session object.
 | 
						||
 | 
						||
    $info->store(new_store)
 | 
						||
        Returns or sets hash store for Table functions.
 | 
						||
 | 
						||
        Store is a hash reference in this format :
 | 
						||
 | 
						||
        $info->store = { attribute => { iid => value , iid2 => value2, ... }
 | 
						||
        };
 | 
						||
 | 
						||
    $info->_global()
 | 
						||
        Used internally by AUTOLOAD to load dynamic methods from %GLOBALS.
 | 
						||
 | 
						||
        Example: $info->name() calls autoload which calls
 | 
						||
        $info->_global('name').
 | 
						||
 | 
						||
    $info->_set(attr,val,iid)
 | 
						||
        Used internally by AUTOLOAD to run an SNMP set command for dynamic
 | 
						||
        methods listed in either %GLOBALS or %FUNCS.
 | 
						||
 | 
						||
        Example: $info->set_name('dog',3) uses autoload to resolve to
 | 
						||
        $info->_set('name','dog',3);
 | 
						||
 | 
						||
    $info->load_all()
 | 
						||
        Debugging routine. This does not include any overriden method or
 | 
						||
        method implemented by subroutine.
 | 
						||
 | 
						||
        Runs $info->load_METHOD() for each entry in $info->funcs();
 | 
						||
 | 
						||
        Returns $info->store() -- See store() entry.
 | 
						||
 | 
						||
        Note return value has changed since version 0.3
 | 
						||
 | 
						||
    $info->all()
 | 
						||
        Runs $info->load_all() once then returns $info->store();
 | 
						||
 | 
						||
        Use $info->load_all() to reload the data.
 | 
						||
 | 
						||
        Note return value has changed since version 0.3
 | 
						||
 | 
						||
    $info->_load_attr()
 | 
						||
        Used internally by AUTOLOAD to fetch data called from methods listed
 | 
						||
        in %FUNCS.
 | 
						||
 | 
						||
        Called from $info->load_METHOD();
 | 
						||
 | 
						||
    $info->_show_attr()
 | 
						||
        Used internaly by AUTOLOAD to return data called by methods listed
 | 
						||
        in %FUNCS.
 | 
						||
 | 
						||
        Called like $info->METHOD().
 | 
						||
 | 
						||
        The first time ran, it will call $info->load_METHOD(). Every time
 | 
						||
        after it will return cached data.
 | 
						||
 | 
						||
  AUTOLOAD
 | 
						||
 | 
						||
    Each entry in either %FUNCS or %GLOBALS is used by AUTOLOAD() to create
 | 
						||
    dynamic methods.
 | 
						||
 | 
						||
    Note that this AUTOLOAD is going to be run for all the classes listed in
 | 
						||
    the @ISA array in a subclass, so will be called with a variety of
 | 
						||
    package names. We check the %FUNCS and %GLOBALS of the package that is
 | 
						||
    doing the calling at this given instant.
 | 
						||
 | 
						||
    1. Returns unless method is listed in %FUNCS or %GLOBALS for given class
 | 
						||
    2. If the method exists in %GLOBALS it runs $info->_global(method)
 | 
						||
    unless already cached.
 | 
						||
    3. Method is in %FUNCS
 | 
						||
    4. Run $info->_load_attr(method) if not cached
 | 
						||
    5. Return $info->_show_attr(method).
 | 
						||
 | 
						||
    Override any dynamic method listed in one of these hashes by creating a
 | 
						||
    subroutine with the same name.
 | 
						||
 | 
						||
    For example to override $info->name() create `` sub name {...}'' in your
 | 
						||
    subclass.
 | 
						||
 | 
						||
COPYRIGHT AND LICENCE
 | 
						||
 | 
						||
    Changes from SNMP::Info Version 0.7 and on are: Copyright (c)2003, 2004
 | 
						||
    Max Baker - All rights reserved.
 | 
						||
 | 
						||
    Original Code is: Copyright (c) 2002-3, Regents of the University of
 | 
						||
    California All rights reserved.
 | 
						||
 | 
						||
    Redistribution and use in source and binary forms, with or without
 | 
						||
    modification, are permitted provided that the following conditions are
 | 
						||
    met:
 | 
						||
 | 
						||
        * Redistributions of source code must retain the above copyright notice,
 | 
						||
          this list of conditions and the following disclaimer.
 | 
						||
        * Redistributions in binary form must reproduce the above copyright notice,
 | 
						||
          this list of conditions and the following disclaimer in the documentation
 | 
						||
          and/or other materials provided with the distribution.
 | 
						||
        * Neither the name of the University of California, Santa Cruz nor the 
 | 
						||
          names of its contributors may be used to endorse or promote products 
 | 
						||
          derived from this software without specific prior written permission.
 | 
						||
 | 
						||
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 | 
						||
    IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 | 
						||
    TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 | 
						||
    PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 | 
						||
    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
						||
    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | 
						||
    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 | 
						||
    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 | 
						||
    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 | 
						||
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
						||
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
						||
 |