| SNMP-Info documentation | Contained in the SNMP-Info distribution. |
ipNetToMediaTable)bgpPeerTable)ospfIfTable)ospfNbrTable)SNMP::Info::Layer3 - SNMP Interface to network devices serving Layer3 or Layers 2 & 3
Max Baker
# Let SNMP::Info determine the correct subclass for you.
my $l3 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $l3->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
# Let's get some basic Port information
my $interfaces = $l3->interfaces();
my $i_up = $l3->i_up();
my $i_speed = $l3->i_speed();
foreach my $iid (keys %$interfaces) {
my $port = $interfaces->{$iid};
my $up = $i_up->{$iid};
my $speed = $i_speed->{$iid}
print "Port $port is $up. Port runs at $speed.\n";
}
This class is usually used as a superclass for more specific device classes listed under SNMP::Info::Layer3::* Please read all docs under SNMP::Info first.
Provides generic methods for accessing SNMP data for Layer 3 network devices. Includes support for Layer2+3 devices.
For speed or debugging purposes you can call the subclass directly, but not after determining a more specific class using the method above.
my $l3 = new SNMP::Info::Layer3(...);
See "Required MIBs" in SNMP::Info for its MIB requirements.
See "Required MIBs" in SNMP::Info::Bridge for its MIB requirements.
See "Required MIBs" in SNMP::Info::EtherLike for its MIB requirements.
See "Required MIBs" in SNMP::Info::Entity for its MIB requirements.
See "Required MIBs" in SNMP::Info::PowerEthernet for its MIB requirements.
See "Required MIBs" in SNMP::Info::IPv6 for its MIB requirements.
These are methods that return scalar value from SNMP
Returns root port mac address
(ifPhysAddress.1)
(ospfRouterId.0)
(bgpIdentifier.0)
Returns the BGP identifier of the local system
Returns the local autonomous system number
(bgpLocalAs.0)
Tries to reference $l3->id() to one of the product MIBs listed above
Removes 'cisco' from cisco devices for readability.
Tries to cull a serial number from ENTITY-MIB, description, and OLD-CISCO-... MIB.
Tries to cull a Vendor name from sysDescr
Returns the primary IP used to communicate with the device. Returns the first
found: OSPF Router ID (ospfRouterId) or any OSPF Host IP Address
(ospfHostIpAddress).
See "GLOBALS" in SNMP::Info for details.
See "GLOBALS" in SNMP::Info::Bridge for details.
See "GLOBALS" in SNMP::Info::EtherLike for details.
See "GLOBALS" in SNMP::Info::Entity for details.
These are methods that return tables of information in the form of a reference to a hash.
Returns the map between SNMP Interface Identifier (iid) and physical port name.
Only returns those iids that have a description listed in $l3->i_description()
Returns reference to hash. Creates a key for each IID that should be ignored.
Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
Returns reference to hash of iid to human set name.
Defaults to ifName, but checks for an ifAlias
Returns reference to hash of iid to current link duplex setting.
Maps $l3->el_index() to $l3->el_duplex, then culls out full,half, or auto and sets the map to that value.
See SNMP::Info::Etherlike for the el_index() and el_duplex() methods.
ipNetToMediaTable)Returns reference to hash. Maps ARP table entries to Interface IIDs
(ipNetToMediaIfIndex)
If the device doesn't support ipNetToMediaIfIndex, this will try
the deprecated atIfIndex.
Returns reference to hash. Maps ARP table entries to MAC addresses.
(ipNetToMediaPhysAddress)
If the device doesn't support ipNetToMediaPhysAddress, this will try
the deprecated atPhysAddress.
Returns reference to hash. Maps ARP table entries to IP addresses.
(ipNetToMediaNetAddress)
If the device doesn't support ipNetToMediaNetAddress, this will try
the deprecated atNetAddress.
The atTable has been deprecated since 1991. You should never need
to use these methods. See ipNetToMediaTable above.
Returns reference to map of IID to Arp Cache Entry
(atIfIndex)
Returns reference to hash of Arp Cache Entries to MAC address
(atPhysAddress)
Returns reference to hash of Arp Cache Entries to IP Address
(atNetAddress)
bgpPeerTable)Returns reference to hash of BGP peer to local IP address
(bgpPeerLocalAddr)
Returns reference to hash of BGP peer to BGP peer identifier
(bgpPeerIdentifier)
Returns reference to hash of BGP peer to BGP peer state
(bgpPeerState)
Returns reference to hash of BGP peer to BGP peer autonomous system number
(bgpPeerRemoteAs)
Returns reference to hash of BGP peer to BGP peer IP address
(bgpPeerRemoteAddr)
Returns reference to hash of BGP peer to the total number of times the BGP FSM transitioned into the established state
(bgpPeerFsmEstablishedTransitions)
Returns reference to hash of BGP peer to the total number of messages received from the remote peer on this connection
(bgpPeerInTotalMessages)
Returns reference to hash of BGP peer to the elapsed time in seconds since the last BGP UPDATE message was received from the peer.
(bgpPeerInUpdateElapsedTime)
Returns reference to hash of BGP peer to the number of BGP UPDATE messages received on this connection
(bgpPeerInUpdates)
Returns reference to hash of BGP peer to the total number of messages transmitted to the remote peer on this connection
(bgpPeerOutTotalMessages)
Returns reference to hash of BGP peer to the number of BGP UPDATE messages transmitted on this connection
(bgpPeerOutUpdates)
ospfIfTable)Returns reference to hash of OSPF interface IP addresses
(ospfIfIpAddress)
Returns reference to hash of the OSPF area to which the interfaces connect
(ospfIfAreaId)
Returns reference to hash of the OSPF interfaces' type
(ospfIfType)
Returns reference to hash of the OSPF interfaces' hello interval
(ospfIfHelloInterval)
Returns reference to hash of the OSPF interfaces' dead interval
(ospfIfRtrDeadInterval)
Returns reference to hash of the OSPF interfaces' administrative status
(ospfIfAdminStat)
Returns reference to hash of the OSPF interfaces' state
(ospfIfState)
ospfNbrTable)Returns reference to hash of IP addresses the neighbor is using in its IP Source Addresses
(ospfNbrIpAddr)
Returns reference to hash of neighbor Router IDs
(ospfNbrRtrId)
Returns reference to hash of state of the relationship with the neighbor routers
(ospfNbrState)
See "TABLE METHODS" in SNMP::Info for details.
See "TABLE METHODS" in SNMP::Info::Bridge for details.
See "TABLE METHODS" in SNMP::Info::EtherLike for details.
See "TABLE METHODS" in SNMP::Info::Entity for details.
See "TABLE METHODS" in SNMP::Info::PowerEthernet for details.
See "TABLE METHODS" in SNMP::Info::IPv6 for details.
| SNMP-Info documentation | Contained in the SNMP-Info distribution. |
# SNMP::Info::Layer3 - SNMP Interface to Layer3 devices # $Id$ # # Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on # # Copyright (c) 2002,2003 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. package SNMP::Info::Layer3; use strict; use Exporter; use SNMP::Info; use SNMP::Info::Bridge; use SNMP::Info::EtherLike; use SNMP::Info::Entity; use SNMP::Info::PowerEthernet; use SNMP::Info::IPv6; @SNMP::Info::Layer3::ISA = qw/ SNMP::Info::PowerEthernet SNMP::Info::IPv6 SNMP::Info::Entity SNMP::Info::EtherLike SNMP::Info::Bridge SNMP::Info Exporter/; @SNMP::Info::Layer3::EXPORT_OK = qw//; use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; $VERSION = '2.05'; %MIBS = ( %SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS, %SNMP::Info::EtherLike::MIBS, %SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS, %SNMP::Info::IPv6::MIBS, 'IP-MIB' => 'ipNetToMediaIfIndex', 'OSPF-MIB' => 'ospfRouterId', 'BGP4-MIB' => 'bgpIdentifier', ); %GLOBALS = ( # Inherit the super class ones %SNMP::Info::GLOBALS, %SNMP::Info::Bridge::GLOBALS, %SNMP::Info::EtherLike::GLOBALS, %SNMP::Info::Entity::GLOBALS, %SNMP::Info::PowerEthernet::GLOBALS, %SNMP::Info::IPv6::GLOBALS, 'mac' => 'ifPhysAddress.1', 'serial1' => '.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0 'router_ip' => 'ospfRouterId.0', 'bgp_id' => 'bgpIdentifier.0', 'bgp_local_as' => 'bgpLocalAs.0', ); %FUNCS = ( %SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS, %SNMP::Info::EtherLike::FUNCS, %SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS, %SNMP::Info::IPv6::FUNCS, # Obsolete Address Translation Table (ARP Cache) 'old_at_index' => 'atIfIndex', 'old_at_paddr' => 'atPhysAddress', 'old_at_netaddr' => 'atNetAddress', # IP-MIB IP Net to Media Table (ARP Cache) 'at_index' => 'ipNetToMediaIfIndex', 'at_paddr' => 'ipNetToMediaPhysAddress', 'at_netaddr' => 'ipNetToMediaNetAddress', # OSPF-MIB::ospfIfTable 'ospf_if_ip' => 'ospfIfIpAddress', 'ospf_if_area' => 'ospfIfAreaId', 'ospf_if_type' => 'ospfIfType', 'ospf_if_hello' => 'ospfIfHelloInterval', 'ospf_if_dead' => 'ospfIfRtrDeadInterval', 'ospf_if_admin' => 'ospfIfAdminStat', 'ospf_if_state' => 'ospfIfState', # OSPF-MIB::ospfNbrTable 'ospf_ip' => 'ospfHostIpAddress', 'ospf_peers' => 'ospfNbrIpAddr', 'ospf_peer_id' => 'ospfNbrRtrId', 'ospf_peer_state' => 'ospfNbrState', # BGP4-MIB::bgpPeerTable 'bgp_peers' => 'bgpPeerLocalAddr', 'bgp_peer_id' => 'bgpPeerIdentifier', 'bgp_peer_state' => 'bgpPeerState', 'bgp_peer_as' => 'bgpPeerRemoteAs', 'bgp_peer_addr' => 'bgpPeerRemoteAddr', 'bgp_peer_fsm_est_trans' => 'bgpPeerFsmEstablishedTransitions', 'bgp_peer_in_tot_msgs' => 'bgpPeerInTotalMessages', 'bgp_peer_in_upd_el_time' => 'bgpPeerInUpdateElapsedTime', 'bgp_peer_in_upd' => 'bgpPeerInUpdates', 'bgp_peer_out_tot_msgs' => 'bgpPeerOutTotalMessages', 'bgp_peer_out_upd' => 'bgpPeerOutUpdates', # IP-MIB Net to Physical Table (ARP Cache) 'n2p_paddr' => 'ipNetToPhysicalPhysAddress', 'n2p_lastupdate' => 'ipNetToPhysicalLastUpdated', 'n2p_ptype' => 'ipNetToPhysicalType', 'n2p_pstate' => 'ipNetToPhysicalState', 'n2p_pstatus' => 'ipNetToPhysicalRowStatus', ); %MUNGE = ( # Inherit all the built in munging %SNMP::Info::MUNGE, %SNMP::Info::Bridge::MUNGE, %SNMP::Info::EtherLike::MUNGE, %SNMP::Info::Entity::MUNGE, %SNMP::Info::PowerEthernet::MUNGE, %SNMP::Info::IPv6::MUNGE, 'old_at_paddr' => \&SNMP::Info::munge_mac, 'at_paddr' => \&SNMP::Info::munge_mac, 'n2p_paddr' => \&SNMP::Info::munge_mac, ); # Method OverRides sub root_ip { my $l3 = shift; my $router_ip = $l3->router_ip(); my $ospf_ip = $l3->ospf_ip(); # return the first one found here (should be only one) if ( defined $ospf_ip and scalar( keys %$ospf_ip ) ) { foreach my $key ( keys %$ospf_ip ) { my $ip = $ospf_ip->{$key}; next if $ip eq '0.0.0.0'; next unless $l3->snmp_connect_ip($ip); print " SNMP::Layer3::root_ip() using $ip\n" if $l3->debug(); return $ip; } } return $router_ip if (( defined $router_ip ) and ( $router_ip ne '0.0.0.0' ) and ( $l3->snmp_connect_ip($router_ip) ) ); return; } sub i_ignore { my $l3 = shift; my $partial = shift; my $interfaces = $l3->interfaces($partial) || {}; my %i_ignore; foreach my $if ( keys %$interfaces ) { # lo -> cisco aironet 350 loopback if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|null)/i ) { $i_ignore{$if}++; } } return \%i_ignore; } sub serial { my $l3 = shift; my $serial1 = $l3->serial1(); my $e_descr = $l3->e_descr() || {}; my $e_serial = $l3->e_serial() || {}; my $serial2 = $e_serial->{1} || undef; my $chassis = $e_descr->{1} || undef; # precedence # serial2,chassis parse,serial1 return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ ); return $1 if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i ); return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ ); return; } # $l3->model() - the sysObjectID returns an IID to an entry in # the CISCO-PRODUCT-MIB. Look it up and return it. sub model { my $l3 = shift; my $id = $l3->id(); unless ( defined $id ) { print " SNMP::Info::Layer3::model() - Device does not support sysObjectID\n" if $l3->debug(); return; } my $model = &SNMP::translateObj($id); return $id unless defined $model; $model =~ s/^cisco//i; $model =~ s/^catalyst//; $model =~ s/^cat//; return $model; } sub i_name { my $l3 = shift; my $partial = shift; my $i_index = $l3->i_index($partial); my $i_alias = $l3->i_alias($partial); my $i_name2 = $l3->orig_i_name($partial); my %i_name; foreach my $iid ( keys %$i_name2 ) { my $name = $i_name2->{$iid}; my $alias = $i_alias->{$iid}; $i_name{$iid} = ( defined $alias and $alias !~ /^\s*$/ ) ? $alias : $name; } return \%i_name; } sub i_duplex { my $l3 = shift; my $partial = shift; my $el_index = $l3->el_index($partial); my $el_duplex = $l3->el_duplex($partial); my %i_index; foreach my $el_port ( keys %$el_duplex ) { my $iid = $el_index->{$el_port}; next unless defined $iid; my $duplex = $el_duplex->{$el_port}; next unless defined $duplex; $i_index{$iid} = 'half' if $duplex =~ /half/i; $i_index{$iid} = 'full' if $duplex =~ /full/i; $i_index{$iid} = 'auto' if $duplex =~ /auto/i; } return \%i_index; } # $l3->interfaces() - Map the Interfaces to their physical names sub interfaces { my $l3 = shift; my $partial = shift; my $interfaces = $l3->i_index($partial); my $descriptions = $l3->i_description($partial); my %interfaces = (); foreach my $iid ( keys %$interfaces ) { my $desc = $descriptions->{$iid}; next unless defined $desc; $interfaces{$iid} = $desc; } return \%interfaces; } sub vendor { my $l3 = shift; my $descr = $l3->description(); my $id = $l3->id(); # .1.3.6.1.4.1.9.1 is the CISCO-PRODUCTS-MIB # .1.3.6.1.4.1.9.9.368.4 is an old tree that Cisco CSSs were numbered from return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/; return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/; return 'cisco' if ( $descr =~ /(cisco|\bios\b)/i ); return 'foundry' if ( $descr =~ /foundry/i ); return 'unknown'; } sub at_index { my $l3 = shift; my $partial = shift; return $l3->orig_at_index($partial) || $l3->old_at_index($partial); } sub at_paddr { my $l3 = shift; my $partial = shift; return $l3->orig_at_paddr($partial) || $l3->old_at_paddr($partial); } sub at_netaddr { my $l3 = shift; my $partial = shift; return $l3->orig_at_netaddr($partial) || $l3->old_at_netaddr($partial); } 1; __END__