From b5fec8dbdeafbe8664dde133108b25fc5e299c50 Mon Sep 17 00:00:00 2001 From: Bill Fenner <> Date: Mon, 30 Jul 2007 15:25:28 +0000 Subject: [PATCH] Add support for POWER-ETHERNET-MIB and CISCO-POWER-ETHERNET-EXT-MIB --- ChangeLog | 1 + Info/CiscoPower.pm | 147 ++++++++++++++++++++++++++++ Info/PowerEthernet.pm | 219 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 367 insertions(+) create mode 100644 Info/CiscoPower.pm create mode 100644 Info/PowerEthernet.pm diff --git a/ChangeLog b/ChangeLog index 34ca2543..232bd3f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -52,6 +52,7 @@ version 1.05 have ENTITY-MIB support in Bayhub, Baystack, BayRS, NortelStack, and Passport classes. + Enable use of MIB Leaf node names in SNMP sets. + + Add POWER-ETHERNET-MIB and CISCO-POWER-ETHERNET-EXT-MIB support. * Fix for bug where an SNMP error in any operation would cause subsequent table get operations to fail while using the same session, originally diff --git a/Info/CiscoPower.pm b/Info/CiscoPower.pm new file mode 100644 index 00000000..584be8f1 --- /dev/null +++ b/Info/CiscoPower.pm @@ -0,0 +1,147 @@ +# SNMP::Info::CiscoPower +# Bill Fenner +# +# Copyright (c) 2007 Bill Fenner +# +# 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::CiscoPower; +$VERSION = '1.05'; +# $Id$ + +use strict; + +use Exporter; +use SNMP::Info; + +use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/; +@SNMP::Info::CiscoPower::ISA = qw/SNMP::Info Exporter/; +@SNMP::Info::CiscoPower::EXPORT_OK = qw//; + +%MIBS = ('CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex'); + +%GLOBALS = ( + ); + +%FUNCS = ( + 'cpeth_ent_phy' => 'cpeExtPsePortEntPhyIndex', + ); + +%MUNGE = ( + ); + +# Cisco overcame the limitation of the module.port index of the +# pethPsePortTable by adding another mapping table, which maps +# a pethPsePortTable row to an entPhysicalTable index, which can +# then be mapped to ifIndex. +sub peth_port_ifindex { + my $cpeth = shift; + my $partial = shift; + + my $ent_phy = $cpeth->cpeth_ent_phy($partial); + my $e_port = $cpeth->e_port(); + + my $peth_port_ifindex = {}; + foreach my $i (keys %$ent_phy) { + if ($e_port->{$ent_phy->{$i}}) { + $peth_port_ifindex->{$i} = $e_port->{$ent_phy->{$i}}; + } + } + return $peth_port_ifindex; +} + +1; + +=head1 NAME + +SNMP::Info::CiscoPower - SNMP Interface to data stored in CISCO-POWER-ETHERNET-EXT-MIB. + +=head1 AUTHOR + +Bill Fenner + +=head1 SYNOPSIS + + # Let SNMP::Info determine the correct subclass for you. + my $poe = new SNMP::Info( + AutoSpecify => 1, + Debug => 1, + # These arguments are passed directly on to SNMP::Session + DestHost => 'myswitch', + Community => 'public', + Version => 2 + ) + or die "Can't connect to DestHost.\n"; + + my $class = $poe->class(); + print "SNMP::Info determined this device to fall under subclass : $class\n"; + +=head1 DESCRIPTION + +The Info::PowerEthernet class needs a per-device helper function to +properly map the pethPsePortTable to ifIndex values. This class +provides that helper, using CISCO-POWER-ETHERNET-EXT-MIB. +It does not define any helpers for the extra values that this MIB +contains. + +Create or use a device subclass that inherit this class. Do not use directly. + +For debugging purposes you can call this class directly as you would SNMP::Info + + my $poe = new SNMP::Info::CiscoPower (...); + +=head2 Inherited Classes + +none. + +Note that it requires that the device inherits from Info::Entity. + +=head2 Required MIBs + +=over + +=item CISCO-POWER-ETHERNET-EXT-MIB + +=back + +=head1 GLOBALS + +none. + +=head1 TABLE METHODS + +These are methods that return tables of information in the form of a reference +to a hash. + +=head2 Power Port Table + +=over + +=item $poe->peth_port_ifindex() + +Maps the pethPsePortTable to ifIndex by way of the ENTITY-MIB. + +=back + +=cut diff --git a/Info/PowerEthernet.pm b/Info/PowerEthernet.pm new file mode 100644 index 00000000..d403c17f --- /dev/null +++ b/Info/PowerEthernet.pm @@ -0,0 +1,219 @@ +# SNMP::Info::PowerEthernet +# Bill Fenner +# +# Copyright (c) 2007 Bill Fenner +# +# 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::PowerEthernet; +$VERSION = '1.05'; +# $Id$ + +use strict; + +use Exporter; +use SNMP::Info; + +use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/; +@SNMP::Info::PowerEthernet::ISA = qw/SNMP::Info Exporter/; +@SNMP::Info::PowerEthernet::EXPORT_OK = qw//; + +%MIBS = ('POWER-ETHERNET-MIB' => 'pethPsePortDetectionStatus'); + +%GLOBALS = ( + ); + +%FUNCS = ( + # parts of pethPsePortTable + 'peth_port_admin' => 'pethPsePortAdminEnable', + 'peth_port_status' => 'pethPsePortDetectionStatus', + 'peth_port_class' => 'pethPsePortPowerClassifications', + # pethMainPseTable + 'peth_power_watts' => 'pethMainPsePower', + 'peth_power_status' => 'pethMainPseOperStatus', + 'peth_power_consumption' => 'pethMainPseConsumptionPower', + 'peth_power_threshold' => 'pethMainPseUsageThreshold', + ); + +%MUNGE = ( + ); + +# POWER-ETHERNET-MIB doesn't define a mapping of its +# "module"/"port" index to ifIndex. Different vendors +# do this in different ways. This is a poor fallback: +# if all of the module values = 1, return the port number +# on the assumption that port number = ifindex. +# If there is a module != 1, this heuristic doesn't work +# so returns undef. +sub peth_port_ifindex { + my $peth = shift; + my $partial = shift; + + my $peth_port_status = $peth->peth_port_status($partial); + my $peth_port_ifindex; + + foreach my $i (keys %$peth_port_status) { + my ($module, $port) = split(/\./, $i); + if ($module != 1) { + # This heuristic won't work, so say that we got nothing. + # If you have this case, you have to write a device-specific + # version of this function. + return undef; + } + $peth_port_ifindex->{$i} = $port; + } + return $peth_port_ifindex; +} + +1; + +=head1 NAME + +SNMP::Info::PowerEthernet - SNMP Interface to data stored in POWER-ETHERNET-MIB. + +=head1 AUTHOR + +Bill Fenner + +=head1 SYNOPSIS + + # Let SNMP::Info determine the correct subclass for you. + my $poe = new SNMP::Info( + AutoSpecify => 1, + Debug => 1, + # These arguments are passed directly on to SNMP::Session + DestHost => 'myswitch', + Community => 'public', + Version => 2 + ) + or die "Can't connect to DestHost.\n"; + + my $class = $poe->class(); + print "SNMP::Info determined this device to fall under subclass : $class\n"; + +=head1 DESCRIPTION + +POWER-ETHERNET-MIB is used to describe PoE (IEEE 802.3af) + +Create or use a device subclass that inherit this class. Do not use directly. + +For debugging purposes you can call this class directly as you would SNMP::Info + + my $poe = new SNMP::Info::PowerEthernet (...); + +=head2 Inherited Classes + +none. + +=head2 Required MIBs + +=over + +=item POWER-ETHERNET-MIB + +=back + +=head1 GLOBALS + +none. + +=head1 TABLE METHODS + +These are methods that return tables of information in the form of a reference +to a hash. + +=head2 Power Port Table + +Selected values from the C + +=over + +=item $poe->peth_port_admin() + +Administrative status: is this port permitted to deliver power? + +C + +=item $poe->peth_port_status() + +Current status: is this port delivering power, searching, disabled, etc? + +C + +=item $poe->peth_port_class() + +Device class: if status is deliveringPower, this represents the 802.3af +class of the device being powered. + +C + +=item $poe->peth_port_ifindex() + +A mapping function from the pethPsePortTable INDEX of +module.port to an ifIndex. The default mapping ignores the +module (returning undef if there are any module values greater +than 1) and returns the port number, assuming that there is a +1:1 mapping. + +This mapping is more or less left up to the device vendor to +implement; the MIB gives only very weak guidance. +A given device class may implement its own version +of this function (e.g., see Info::CiscoPower). + +=back + +=head2 Power Supply Table + +=over + +=item $poe->peth_power_watts() + +The power supply's capacity, in watts. + +C + +=item $poe->peth_power_status() + +The power supply's operational status. + +C + +=item $poe->peth_power_consumption() + +How much power, in watts, this power supply has been committed to +deliver. (Note: certain devices seem to supply this value in milliwats, +so be cautious interpreting it.) + +C + +=item $poe->peth_power_threshold() + +The threshold (in percent) of consumption required to raise an +alarm. + +C + +=back + +=cut