From 0ce8a55b8810800f9d470a7120b7efddaad5c20f Mon Sep 17 00:00:00 2001 From: Nic Bernstein Date: Fri, 2 Aug 2013 10:44:58 -0500 Subject: [PATCH] ADD SUPPORT FOR CISCO SMALL BUSINESS DEVICES New Feature: Support for the Cisco Small Business product line. These switches, currently the Sx300 and Sx500, were inherited from Linksys and do not run IOS. This has been tested with the following Cisco products: - SRW2024P-K9 V02i (SG 300-28P) - SRW208P-K9 V02 (SF 300-8P) - SRW224G4P-K9 V02 (SF 300-24P) We welcome reports from others, either success or failure. --- DeviceMatrix.txt | 6 + Info.pm | 13 ++ Info/Layer2/CiscoSB.pm | 262 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 281 insertions(+) create mode 100644 Info/Layer2/CiscoSB.pm diff --git a/DeviceMatrix.txt b/DeviceMatrix.txt index d594d8fd..bb251548 100644 --- a/DeviceMatrix.txt +++ b/DeviceMatrix.txt @@ -657,6 +657,12 @@ note: !Arpnip only available for 4.x software releases. class: Layer3::CiscoFWSM arpnip: yes +device: Sx300, Sx500 series +device-family: Small Business switches +class: Layer2::CiscoSB +arpnip: no +macsuck: yes + # # Citrix # diff --git a/Info.pm b/Info.pm index 6f754338..2ba1d803 100644 --- a/Info.pm +++ b/Info.pm @@ -540,6 +540,13 @@ in more specific subclasses. See documentation in L for details. +=item SNMP::Info::Layer2::CiscoSB + +Subclass for Cisco's "Small Business" product line, acquired from +Linksys. This currently comprises the Sx300/500 line of switches. + +See documentation in L for details. + =item SNMP::Info::Layer2::HP Subclass for more recent HP Procurve Switches @@ -1348,6 +1355,7 @@ sub device_type { } my $id = $info->id() || 'undef'; + my $soid = $id; # Hash for generic fallback to a device class if unable to determine using # the sysDescr regex. @@ -1560,6 +1568,11 @@ sub device_type { $objtype = 'SNMP::Info::Layer3::C6500' if ( $desc =~ /(C2970|C2960)/ ); + # Cisco Small Business (300 500) series override + # This is for enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1) + $objtype = 'SNMP::Info::Layer2::CiscoSB' + if ( $soid =~ /^\.1\.3\.6\.1\.4\.1\.9\.6\.1/ ); + # HP, older ProCurve models (1600, 2400, 2424m, 4000, 8000) $objtype = 'SNMP::Info::Layer2::HP4000' if $desc =~ /\b(J4093A|J4110A|J4120A|J4121A|J4122A|J4122B)\b/; diff --git a/Info/Layer2/CiscoSB.pm b/Info/Layer2/CiscoSB.pm new file mode 100644 index 00000000..1b2e0d35 --- /dev/null +++ b/Info/Layer2/CiscoSB.pm @@ -0,0 +1,262 @@ +# SNMP::Info::Layer2::CiscoSB +# $Id$ +# +# Copyright (c) 2013 Nic Bernstein +# +# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond. +# +# Copyright (c) 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::Layer2::CiscoSB; + +use strict; +use Exporter; +use SNMP::Info::Layer2; +use SNMP::Info::Entity; +use SNMP::Info::EtherLike; +use SNMP::Info::CiscoStats; +use SNMP::Info::CiscoConfig; +use SNMP::Info::CDP; + +@SNMP::Info::Layer2::CiscoSB::ISA + = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike + SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/; +@SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//; + +use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; + +$VERSION = '3.03'; + +# NB - This is a huge hack. This is our index into the various +# Entity MIB tables. This should be devined by using the entPhysicalContainsTable +# and working from there, but the current Entity.pm doesn't provide +# direct support for the entityMapping branch of the MIB. +# This must be revisited. +our $magic_number = 67108992; + +%GLOBALS = ( + %SNMP::Info::Layer2::GLOBALS, + %SNMP::Info::Entity::GLOBALS, + %SNMP::Info::EtherLike::GLOBALS, + %SNMP::Info::CiscoStats::GLOBALS, + %SNMP::Info::CiscoConfig::GLOBALS, + %SNMP::Info::CDP::GLOBALS, + 'descr' => 'sysDescr' +); + +%FUNCS = ( + %SNMP::Info::Layer2::FUNCS, + %SNMP::Info::Entity::FUNCS, + %SNMP::Info::EtherLike::FUNCS, + %SNMP::Info::CiscoStats::FUNCS, + %SNMP::Info::CiscoConfig::FUNCS, + %SNMP::Info::CDP::FUNCS, +); + +%MIBS = ( + %SNMP::Info::Layer2::MIBS, + %SNMP::Info::Entity::MIBS, + %SNMP::Info::EtherLike::MIBS, + %SNMP::Info::CiscoStats::MIBS, + %SNMP::Info::CiscoConfig::MIBS, + %SNMP::Info::CDP::MIBS, +); + +%MUNGE = ( + %SNMP::Info::Layer2::MUNGE, + %SNMP::Info::Entity::MUNGE, + %SNMP::Info::EtherLike::MUNGE, + %SNMP::Info::CiscoStats::MUNGE, + %SNMP::Info::CiscoConfig::MUNGE, + %SNMP::Info::CDP::MUNGE, +); + + +sub vendor { + return 'cisco'; +} + +sub serial { + my $ciscosb = shift; + my $serial = $ciscosb->e_serial(); + + return $serial->{$magic_number}; +} + +sub os_ver { + my $ciscosb = shift; + my $os_ver = $ciscosb->e_swver(); + + return $os_ver->{$magic_number}; +} + +# Grab e_model from Entity and tag on e_hwver +sub model { + my $ciscosb = shift; + my $model = $ciscosb->e_model(); + my $e_hwver = $ciscosb->e_hwver(); + + $model = "$model->{$magic_number} $e_hwver->{$magic_number}"; + + return $model; +} + +# ifDescr is the same for all interfaces in a class, but the ifName is +# unique, so let's use that for port name. +sub interfaces { + my $ciscosb = shift; + my $partial = shift; + + my $interfaces = $ciscosb->i_name($partial); + + return $interfaces; +} + + +1; +__END__ + +=head1 NAME + +SNMP::Info::Layer2::CiscoSB - SNMP Interface to Cisco Small Business series + +=head1 AUTHOR + +Nic Bernstein (shamelessly stolen from Max Baker's Aironet code) + +=head1 SYNOPSIS + + # Let SNMP::Info determine the correct subclass for you. + my $ciscosb = new SNMP::Info( + AutoSpecify => 1, + Debug => 1, + DestHost => 'myswitch', + Community => 'public', + Version => 2 + ) + or die "Can't connect to DestHost.\n"; + + my $class = $ciscosb->class(); + print "SNMP::Info determined this device to fall under subclass : $class\n"; + +=head1 DESCRIPTION + +Provides interface to SNMP Data available on Cisco Small Business (nee LinkSys) +managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1)] + +Currently implemented via a "magic number" which is our index into the +Entity MIB tables. This is a hack, but this number seems to be constant +between various models, and a work around will take time. + +=head2 Inherited Classes + +=over + +=item SNMP::Info::Layer2 + +=item SNMP::Info::Entity + +=item SNMP::Info::EtherLike + +=item SNMP::Info::CiscoStats + +=item SNMP::Info::CiscoConfig + +=back + +=head2 Required MIBs + +=over + +=item Inherited Classes + +MIBs required by the inherited classes listed above. + +=back + +=head1 GLOBALS + +These are methods that return scalar value from SNMP + +=over + +=item $ciscosb->vendor() + +Returns 'cisco' + +=item $ciscosb->os_ver() + +Returns software version (entPhysicalSoftwareRev) + +=item $ciscosb->serial() + +Returns serial number of unit (entPhysicalSerialNum) + +=item $ciscosb->model() + +Returns model and hardware revision of unit (entPhysicalModelName+entPhysicalHardwareRev) + +=back + +=head2 Globals imported from SNMP::Info::Layer2 + +See documentation in L for details. + +=head2 Globals imported from SNMP::Info::Entity + +See documentation in L for details. + +=head2 Globals imported from SNMP::Info::EtherLike + +See documentation in L for details. + +=head1 TABLE METHODS + +=head2 Overrides + +=over + +=item $ciscosb->interfaces() + +Uses the i_name() field. + +=back + +=head2 Table Methods imported from SNMP::Info::Layer2 + +See documentation in L for details. + +=head2 Table Methods imported from SNMP::Info::Entity + +See documentation in L for details. + +=head2 Table Methods imported from SNMP::Info::EtherLike + +See documentation in L for details. + +=cut