From ddeb705f137c02a5e4fdabab25957492e8dd8e0b Mon Sep 17 00:00:00 2001 From: Max Baker <> Date: Thu, 6 Mar 2003 21:41:07 +0000 Subject: [PATCH] ver_03 --- Info/CDP.pm | 89 ++++++++------- Info/Layer2/Bay.pm | 13 +-- Info/Layer2/C1900.pm | 13 +-- Info/Layer2/C2900.pm | 15 +-- Info/Layer2/Catalyst.pm | 13 +-- Info/Layer2/HP.pm | 232 ++++++++++++++-------------------------- Info/Layer3/Aironet.pm | 13 +-- Info/Layer3/C3550.pm | 16 +-- Info/Layer3/Foundry.pm | 15 +-- 9 files changed, 148 insertions(+), 271 deletions(-) diff --git a/Info/CDP.pm b/Info/CDP.pm index d8f24767..caffcf4a 100644 --- a/Info/CDP.pm +++ b/Info/CDP.pm @@ -28,7 +28,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::CDP; -$VERSION = 0.2; +$VERSION = 0.3; # $Id$ use strict; @@ -73,11 +73,20 @@ $INIT = 0; ); %MUNGE = ( - 'c_capabilities' => \&SNMP::Info::munge_octet2hex, + 'c_capabilities' => \&munge_caps, 'c_ip' => \&SNMP::Info::munge_ip ); +sub munge_caps { + my $caps = shift; + return undef unless defined $caps; + + my $bits = substr(unpack("B*",$caps),-7); + return $bits; + + +} sub hasCDP { my $cdp = shift; @@ -103,8 +112,11 @@ SNMP::Info::CDP - Perl5 Interface to Cisco Discovery Protocol (CDP) using SNMP =head1 DESCRIPTION -CDP provides Layer 2 discovery of attached devices that also -speak CDP, including switches, routers and hubs. +SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented +interface to CDP information through SNMP. + +CDP is a Layer 2 protocol that supplies topology information of devices that also speak CDP, +mostly switches and routers. =head1 AUTHOR @@ -112,38 +124,19 @@ Max Baker (C) =head1 SYNOPSIS - my $cdp = new SNMP::Info::CDP( DestHost => 'router' , - Community => 'public' ); + my $info = new SNMP::Info ( DestHost => 'router', + Community => 'public' + ); + + my $type = $info->device_type(); + + my $cdp = new $type ( DestHost => 'router', + Community => 'public); + $hascdp = $cdp->hasCDP() ? 'yes' : 'no'; - @neighbor_ips = values( %{$cdp->ip()} ); + @neighbor_ips = values( %{$cdp->c_ip()} ); -=head1 CREATING AN OBJECT - -=over - -=item new SNMP::Info::CDP() - -Arguments passed to new() are passed on to SNMP::Session::new() - - - my $cdp = new SNMP::Info::CDP( - DestHost => $host, - Community => 'public' - ) - die "Couldn't connect.\n" unless defined $cdp; - -=item $cdp->session() - -Sets or returns the SNMP::Session object - - # Get - my $sess = $cdp->session(); - - # Set - my $newsession = new SNMP::Session(...); - $cdp->session($newsession); - -=back +See L for all inherited methods. =head2 Your Device May Vary @@ -230,9 +223,33 @@ Returns remote platform id =item $cdp->c_capabilities() -Returns Device Functional Capabilities bitmap. +Returns Device Functional Capabilities. Results are munged into an ascii +binary string, 7 digits long, MSB. Each digit represents a bit from the +table below. -Anyone know where I can get info on how to decode this? +From L: + +(Bit) - Description + +=over + +=item (0x40) - Provides level 1 functionality. + +=item (0x20) - The bridge or switch does not forward IGMP Report packets on nonrouter ports. + +=item (0x10) - Sends and receives packets for at least one network layer protocol. If the device is routing the protocol, this bit should not be set. + +=item (0x08) - Performs level 2 switching. The difference between this bit and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This device is assumed to be deployed in a physical loop-free topology. + +=item (0x04) - Performs level 2 source-route bridging. A source-route bridge would set both this bit and bit 0x02. + +=item (0x02) - Performs level 2 transparent bridging. + +=item (0x01) - Performs level 3 routing for at least one network layer protocol. + +=back + +Thanks to Martin Lorensen C for a pointer to this information. (B) diff --git a/Info/Layer2/Bay.pm b/Info/Layer2/Bay.pm index d181d4c2..07cbdbb7 100644 --- a/Info/Layer2/Bay.pm +++ b/Info/Layer2/Bay.pm @@ -28,7 +28,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::Layer2::Bay; -$VERSION = 0.2; +$VERSION = 0.3; # $Id$ use strict; @@ -276,17 +276,6 @@ Arguments passed to new() are passed on to SNMP::Session::new() ) die "Couldn't connect.\n" unless defined $bay; -=item $bay->session() - -Sets or returns the SNMP::Session object - - # Get - my $sess = $bay->session(); - - # Set - my $newsession = new SNMP::Session(...); - $bay->session($newsession); - =back =head1 GLOBALS diff --git a/Info/Layer2/C1900.pm b/Info/Layer2/C1900.pm index 854e359c..f06dee24 100644 --- a/Info/Layer2/C1900.pm +++ b/Info/Layer2/C1900.pm @@ -28,7 +28,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::Layer2::C1900; -$VERSION = 0.2; +$VERSION = 0.3; # $Id$ use strict; @@ -192,17 +192,6 @@ Arguments passed to new() are passed on to SNMP::Session::new() ) die "Couldn't connect.\n" unless defined $c1900; -=item $c1900->session() - -Sets or returns the SNMP::Session object - - # Get - my $sess = $c1900->session(); - - # Set - my $newsession = new SNMP::Session(...); - $c1900->session($newsession); - =back =head1 GLOBALS diff --git a/Info/Layer2/C2900.pm b/Info/Layer2/C2900.pm index 6280d575..daef8e6a 100644 --- a/Info/Layer2/C2900.pm +++ b/Info/Layer2/C2900.pm @@ -1,7 +1,7 @@ # SNMP::Info::Layer2::C2900 # Max Baker # -# Copyright (c) 2002, Regents of the University of California +# Copyright (c) 2002,2003 Regents of the University of California # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,7 +28,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::Layer2::C2900; -$VERSION = 0.2; +$VERSION = 0.3; # $Id$ use strict; @@ -174,17 +174,6 @@ Arguments passed to new() are passed on to SNMP::Session::new() ) die "Couldn't connect.\n" unless defined $c2900; -=item $c2900->session() - -Sets or returns the SNMP::Session object - - # Get - my $sess = $c2900->session(); - - # Set - my $newsession = new SNMP::Session(...); - $c2900->session($newsession); - =back =head1 GLOBALS diff --git a/Info/Layer2/Catalyst.pm b/Info/Layer2/Catalyst.pm index b35ba98b..4ebb43e3 100644 --- a/Info/Layer2/Catalyst.pm +++ b/Info/Layer2/Catalyst.pm @@ -28,7 +28,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::Layer2::Catalyst; -$VERSION = 0.2; +$VERSION = 0.3; # $Id$ use strict; @@ -289,17 +289,6 @@ Arguments passed to new() are passed on to SNMP::Session::new() ) die "Couldn't connect.\n" unless defined $cat; -=item $cat->session() - -Sets or returns the SNMP::Session object - - # Get - my $sess = $cat->session(); - - # Set - my $newsession = new SNMP::Session(...); - $cat->session($newsession); - =back =head1 GLOBAL Values diff --git a/Info/Layer2/HP.pm b/Info/Layer2/HP.pm index 19eb59df..8d3c7d3d 100644 --- a/Info/Layer2/HP.pm +++ b/Info/Layer2/HP.pm @@ -28,7 +28,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::Layer2::HP; -$VERSION = 0.2; +$VERSION = 0.3; # $Id$ use strict; @@ -69,17 +69,17 @@ $INIT = 0; %MYFUNCS = ( 'i_type2' => 'ifType', - 'e_map' => 'entAliasMappingIdentifier', - 'e_name' => 'entPhysicalName', 'e_class' => 'entPhysicalClass', - 'e_parent' => 'entPhysicalContainedIn', 'e_descr' => 'entPhysicalDescr', - 'e_type' => 'entPhysicalVendorType', - 'e_model' => 'entPhysicalModelName', - 'e_hwver' => 'entPhysicalHardwareRev', - 'e_swver' => 'entPhysicalSoftwareRev', 'e_fwver' => 'entPhysicalFirmwareRev', + 'e_hwver' => 'entPhysicalHardwareRev', + 'e_map' => 'entAliasMappingIdentifier', + 'e_model' => 'entPhysicalModelName', + 'e_name' => 'entPhysicalName', + 'e_parent' => 'entPhysicalContainedIn', 'e_serial' => 'entPhysicalSerialNum', + 'e_swver' => 'entPhysicalSoftwareRev', + 'e_type' => 'entPhysicalVendorType', # RFC1271 'l_descr' => 'logDescription' @@ -337,26 +337,6 @@ sub i_duplex_admin { return \%i_duplex_admin; } -#sub i_up_admin { -# my $hp = shift; -# -# my $mau_index = $hp->mau_index(); -# my $mau_status = $hp->mau_status(); -# -# my %i_up_admin; -# foreach my $mau_port (keys %$mau_status){ -# my $iid = $mau_index->{$mau_port}; -# next unless defined $iid; -# my $status = $mau_status->{$mau_port}; -# -# $i_up_admin{$iid} = ($status =~ /shutdown/i) ? -# 'down' : 'up'; -# } -# -# return \%i_up_admin; -# -#} - 1; __END__ @@ -391,6 +371,8 @@ Max Baker (C) my $hp = new SNMP::Info::Layer2::HP(DestHost => 'router' , Community => 'public' ); + See SNMP::Info and SNMP::Info::Layer2 for all the inherited methods. + =head1 CREATING AN OBJECT =over @@ -407,176 +389,126 @@ Arguments passed to new() are passed on to SNMP::Session::new() ) die "Couldn't connect.\n" unless defined $hp; -=item $hp->session() - -Sets or returns the SNMP::Session object - - # Get - my $sess = $hp->session(); - - # Set - my $newsession = new SNMP::Session(...); - $hp->session($newsession); - -=item $hp->all(), $hp->load_all() - -Runs each of the HP List methods and returns a hash reference. - -$hp->all() will call $hp->load_all() once and then return cahced valued. -Use $hp->load_all() to reload from the device. - =back =head1 HP Global Configuration Values =over -=item $hp->name() -(B) +=item $hp->log() -=item $hp->ip() -(B) - -=item $hp->netmask() -(B) - -=item $hp->broadcast() -(B) - -=item $hp->location() -(B) - -=item $hp->contact() -(B) - -=item $hp->description() -(B) - -=item $hp->layers() -(B) - -=item $hp->serial() -(B) +Returns all the log entries from the switch's log that are not Link up or down messages. =item $hp->model() -(B) -=item $hp->ps1_type() -(B) +Returns the model number of the HP Switch. Will translate between the HP Part number and +the common model number with this map : -=item $hp->ps2_type() -(B) + %MODEL_MAP = ( + 'J4812A' => '2512', + 'J4819A' => '5308XL', + 'J4813A' => '2524', + 'J4805A' => '5304XL', + 'J4815A' => '3324XL', + 'J4865A' => '4108GL', + 'J4887A' => '4104GL', + 'J4874A' => '9315', + ); -=item $hp->ps1_status() -(B) +=item $hp->serial() -=item $hp->ps2_status() -(B) +Returns serial number if available through SNMP =item $hp->slots() -(B) -=item $hp->fan() -(B) +Returns number of entries in $hp->e_name that have 'slot' in them. + +=item $hp->vendor() + +hp =back -=head1 CATALYST TABLE ENTRIES +=head1 HP Table Values -=head2 Module table +=head2 Entity Table =over -=item $hp->m_type(), $hp->load_m_type() -(B) +=item $hp->e_class() -=item $hp->m_model(), $hp->load_m_model() -(B) +(C) -=item $hp->m_serial(), $hp->load_m_serial() -(B) +=item $hp->e_descr() -=item $hp->m_status(), $hp->load_m_status() -(B) +(C) -=item $hp->m_name(), $hp->load_m_name() -(B) +=item $hp->e_fwver() -=item $hp->m_ports(), $hp->load_m_ports() -(B) +(C) -=item $hp->m_ports_status(), $hp->load_m_ports_status() - Returns a list of space separated status strings for the ports. - To see the status of port 4 : - @ports_status = split(' ', $hp->m_ports_status() ); - $port4 = $ports_status[3]; +=item $hp->e_hwver() -(B) +(C) -=item $hp->m_ports_hwver(), $hp->load_m_ports_hwver() -(B) +=item $hp->e_map() -=item $hp->m_ports_fwver(), $hp->load_m_ports_fwver() -(B) +(C) -=item $hp->m_ports_swver(), $hp->load_m_ports_swver() -(B) +=item $hp->e_model() -=item $hp->m_ports_ip(), $hp->load_m_ports_ip() -(B) +(C) -=item $hp->m_ports_sub1(), $hp->load_m_ports_sub1() -(B) +=item $hp->e_name() -=item $hp->m_ports_sub2(), $hp->load_m_ports_sub2() -(B) +(C) +=item $hp->e_parent() + +(C) + +=item $hp->e_port() + +Maps EntityTable entries to the Interface Table (IfTable) using +$hp->e_map() + +=item $hp->e_serial() + +(C) + +=item $hp->e_swver() + +(C) + +=item $hp->e_type() + +(C) =back -=head2 Port Entry Table +=head2 Overriden Methods from SNMP::Info::Layer2 =over -=item $hp->p_name(), $hp->load_p_name() -(B) +=item $hp->interfaces() -=item $hp->p_type(), $hp->load_p_type() -(B) +=item $hp->i_duplex() -=item $hp->p_status(), $hp->load_p_status() -(B) +Maps $hp->mau_index() with $hp->mau_link(). Methods inherited from +SNMP::Info::MAU. -=item $hp->p_status2(), $hp->load_p_status2() -(B) +=item $hp->i_duplex_admin() -=item $hp->p_speed(), $hp->load_p_speed() -(B) +Maps $hp->mau_index() with $hp->mau_auto(), $hp->mau_autostat(), +$hp->typeadmin(), and $mau_autosent(). Methods inherited from +SNMP::Info::MAU. -=item $hp->p_duplex(), $hp->load_p_duplex() -(B) +=item $hp->i_name() -=item $hp->p_port(), $hp->load_p_port() -(B) - -=back - -=head2 VLAN Entry Table - -ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-communityIndexing.html - -=over - -=item $hp->v_state(), $hp->load_v_state() -(B) - -=item $hp->v_type(), $hp->load_v_type() -(B) - -=item $hp->v_name(), $hp->load_v_name() -(B) - -=item $hp->v_mtu(), $hp->load_v_mtu() -(B) +Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias() + +=item $hp->i_type() + +Crosses i_type() with $hp->e_descr() using $hp->e_port() =back diff --git a/Info/Layer3/Aironet.pm b/Info/Layer3/Aironet.pm index 4b8797c2..65d2e23f 100644 --- a/Info/Layer3/Aironet.pm +++ b/Info/Layer3/Aironet.pm @@ -28,7 +28,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::Layer3::Aironet; -$VERSION = 0.2; +$VERSION = 0.3; # $Id$ use strict; @@ -221,17 +221,6 @@ Arguments passed to new() are passed on to SNMP::Session::new() ) die "Couldn't connect.\n" unless defined $aironet; -=item $aironet->session() - -Sets or returns the SNMP::Session object - - # Get - my $sess = $aironet->session(); - - # Set - my $newsession = new SNMP::Session(...); - $aironet->session($newsession); - =back =head1 Globals diff --git a/Info/Layer3/C3550.pm b/Info/Layer3/C3550.pm index d5f6e696..4e33443d 100644 --- a/Info/Layer3/C3550.pm +++ b/Info/Layer3/C3550.pm @@ -28,7 +28,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::Layer3::C3550; -$VERSION = 0.2; +$VERSION = 0.3; # $Id$ use strict; @@ -217,6 +217,9 @@ Max Baker (C) my $c3550 = new SNMP::Info::Layer3::C3550(DestHost => 'router' , Community => 'public' ); + +See L and L for all the inherited methods. + =head1 CREATING AN OBJECT =over @@ -233,17 +236,6 @@ Arguments passed to new() are passed on to SNMP::Session::new() ) die "Couldn't connect.\n" unless defined $c3550; -=item $c3550->session() - -Sets or returns the SNMP::Session object - - # Get - my $sess = $c3550->session(); - - # Set - my $newsession = new SNMP::Session(...); - $c3550->session($newsession); - =back =head1 GLOBAL Values diff --git a/Info/Layer3/Foundry.pm b/Info/Layer3/Foundry.pm index cd2c9fde..3313eca4 100644 --- a/Info/Layer3/Foundry.pm +++ b/Info/Layer3/Foundry.pm @@ -28,7 +28,7 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::Layer3::Foundry; -$VERSION = 0.2; +$VERSION = 0.3; # $Id$ use strict; @@ -242,6 +242,8 @@ Max Baker (C) my $foundry = new SNMP::Info::Layer3::Foundry(DestHost => 'switch' , Community => 'public' ); +See L and L for all inherited methods. + =head1 CREATING AN OBJECT =over @@ -258,17 +260,6 @@ Arguments passed to new() are passed on to SNMP::Session::new() ) die "Couldn't connect.\n" unless defined $foundry; -=item $foundry->session() - -Sets or returns the SNMP::Session object - - # Get - my $sess = $foundry->session(); - - # Set - my $newsession = new SNMP::Session(...); - $foundry->session($newsession); - =back =head1 GLOBAL VALUES