From 0510dbfafcc4b9f7ab7d429cbacb6e4a30198efc Mon Sep 17 00:00:00 2001 From: Bill Fenner <> Date: Fri, 6 Mar 2009 20:09:38 +0000 Subject: [PATCH] Add Layer3::Arista. Work around Net-SNMP's failure to load IF-MIB because it prefers the obsolete RFC1213-MIB more completely: add the new ifOperState values explicitly (e.g., lowerLayerDown, dormant, notPresent,...) --- Info.pm | 16 ++- Info/Layer3/Arista.pm | 324 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 333 insertions(+), 7 deletions(-) create mode 100644 Info/Layer3/Arista.pm diff --git a/Info.pm b/Info.pm index 3e6d23d7..af774ce1 100644 --- a/Info.pm +++ b/Info.pm @@ -1203,6 +1203,7 @@ sub device_type { 6486 => 'SNMP::Info::Layer3::AlcatelLucent', 6527 => 'SNMP::Info::Layer3::Timetra', 8072 => 'SNMP::Info::Layer3::NetSNMP', + 30065 => 'SNMP::Info::Layer3::Arista', ); my %l2sysoidmap = ( @@ -2678,10 +2679,9 @@ sub munge_counter64 { =item munge_i_up -There is a collision between data in C and C. -For devices that fully implement C it might return 7 for -a port that is down. This munges the data against the C -by hand. +Net-SNMP tends to load C first, and so ignores the +updated enumeration for ifOperStatus in C. This munge +handles the "newer" definitions for the enumeraiton in IF-MIB. TODO: Get the precedence of MIBs and overriding of MIB data in Net-SNMP figured out. Heirarchy/precendence of MIBS in SNMP::Info. @@ -2692,9 +2692,11 @@ sub munge_i_up { my $i_up = shift; return unless defined $i_up; - $i_up = 'down' if $i_up eq '7'; - - return $i_up; + my %ifOperStatusMap = ( '4' => 'unknown', + '5' => 'dormant', + '6' => 'notPresent', + '7' => 'lowerLayerDown' ); + return $ifOperStatusMap{$i_up} || $i_up; } =item munge_port_list diff --git a/Info/Layer3/Arista.pm b/Info/Layer3/Arista.pm new file mode 100644 index 00000000..2826b6b0 --- /dev/null +++ b/Info/Layer3/Arista.pm @@ -0,0 +1,324 @@ +# SNMP::Info::Layer3::Arista +# $Id$ +# +# Copyright (c) 2008 Arista Networks, Inc. +# 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 Arista Networks, Inc. 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::Arista; + +use strict; +use Exporter; + +use SNMP::Info::Layer3; +use SNMP::Info::MAU; +use SNMP::Info::LLDP; + +@SNMP::Info::Layer3::Arista::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU + SNMP::Info::Layer3 Exporter/; +@SNMP::Info::Layer3::Arista::EXPORT_OK = qw//; + +use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; + +$VERSION = '2.00'; + +%MIBS = ( + %SNMP::Info::Layer3::MIBS, + %SNMP::Info::MAU::MIBS, + %SNMP::Info::LLDP::MIBS, + 'ARISTA-PRODUCTS-MIB' => 'aristaProducts', +); + +%GLOBALS = ( + %SNMP::Info::Layer3::GLOBALS, + %SNMP::Info::MAU::GLOBALS, + %SNMP::Info::LLDP::GLOBALS, +); + +%FUNCS = ( + %SNMP::Info::Layer3::FUNCS, + %SNMP::Info::MAU::FUNCS, + %SNMP::Info::LLDP::FUNCS, +); + +%MUNGE = ( + %SNMP::Info::Layer3::MUNGE, + %SNMP::Info::MAU::MUNGE, + %SNMP::Info::LLDP::MUNGE, +); + +# use MAU-MIB for admin. duplex and admin. speed +*SNMP::Info::Layer3::Arista::i_duplex_admin + = \&SNMP::Info::MAU::mau_i_duplex_admin; +*SNMP::Info::Layer3::Arista::i_speed_admin + = \&SNMP::Info::MAU::mau_i_speed_admin; + +sub vendor { + return 'Arista Networks, Inc.'; +} + +sub os { + return 'EOS'; +} + +sub os_ver { + my $arista = shift; + my $descr = $arista->description(); + my $os_ver = undef; + + $os_ver = $1 if ( $descr =~ /\s+EOS\s+version\s+(\S+)\s+/ ); + return $os_ver; +} + +sub model { + my $arista = shift; + my $id = $arista->id(); + + my $model = &SNMP::translateObj($id); + return $id unless defined $model; + + $model =~ s/^arista//; + return $model; +} + +# Use Q-BRIDGE-MIB + +sub fw_mac { + my $arista = shift; + my $partial = shift; + + return $arista->qb_fw_mac($partial); +} + +sub fw_port { + my $arista = shift; + my $partial = shift; + + return $arista->qb_fw_port($partial); +} + +# Use LLDP + +sub hasCDP { + my $arista = shift; + + return $arista->hasLLDP(); +} + +sub c_ip { + my $arista = shift; + my $partial = shift; + + return $arista->lldp_ip($partial); +} + +sub c_if { + my $arista = shift; + my $partial = shift; + + return $arista->lldp_if($partial); +} + +sub c_port { + my $arista = shift; + my $partial = shift; + + return $arista->lldp_port($partial); +} + +sub c_id { + my $arista = shift; + my $partial = shift; + + return $arista->lldp_id($partial); +} + +sub c_platform { + my $arista = shift; + my $partial = shift; + + return $arista->lldp_rem_sysdesc($partial); +} + +1; +__END__ + +=head1 NAME + +SNMP::Info::Layer3::Arista - SNMP Interface to Arista Networks EOS + +=head1 AUTHOR + +Bill Fenner + +=head1 SYNOPSIS + + # Let SNMP::Info determine the correct subclass for you. + my $arista = new SNMP::Info( + AutoSpecify => 1, + Debug => 1, + # These arguments are passed directly to SNMP::Session + DestHost => 'myswitch', + Community => 'public', + Version => 2 + ) + or die "Can't connect to DestHost.\n"; + + my $class = $arista->class(); + print "SNMP::Info determined this device to fall under subclass : $class\n"; + +=head1 DESCRIPTION + +Subclass for Arista Networks EOS-based devices + +=head2 Inherited Classes + +=over + +=item SNMP::Info::Layer3 + +=item SNMP::Info::MAU + +=item SNMP::Info::LLDP + +=back + +=head2 Required MIBs + +=over + +=item F + +=item Inherited Classes' MIBs + +See L for its own MIB requirements. + +See L for its own MIB requirements. + +See L for its own MIB requirements. + +=back + +=head1 GLOBALS + +These are methods that return scalar values from SNMP + +=over + +=item $arista->vendor() + + Returns 'Arista Networks, Inc.' + +=item $arista->hasCDP() + + Returns whether LLDP is enabled. + +=item $arista->model() + +Tries to reference $arista->id() to one of the product MIBs listed above + +Removes 'arista' from the name for readability. + +=item $arista->os() + +Returns 'EOS' + +=item $arista->os_ver() + +Grabs the os version from C + +=back + +=head2 Global Methods imported from SNMP::Info::Layer3 + +See documentation in L for details. + +=head2 Global Methods imported from SNMP::Info::MAU + +See documentation in L for details. + +=head2 Global Methods imported from SNMP::Info::Layer3 + +See documentation in L for details. + +=head1 TABLE METHODS + +These are methods that return tables of information in the form of a reference +to a hash. + +=over + +=item $arista->fw_mac() + +Use the F instead of F + +=item $arista->fw_port() + +Use the F instead of F + +=item $arista->c_id() + +Returns LLDP information. + +=item $arista->c_if() + +Returns LLDP information. + +=item $arista->c_ip() + +Returns LLDP information. + +=item $arista->c_platform() + +Returns LLDP information. + +=item $arista->c_port() + +Returns LLDP information. + +=item $arista->i_duplex_admin() + +Returns info from F + +=item $arista->i_speed_admin() + +Returns info from F + +=back + +=head2 Table Methods imported from SNMP::Info::Layer3 + +See documentation in L for details. + +=head2 Table Methods imported from SNMP::Info::MAU + +See documentation in L for details. + +=head2 Table Methods imported from SNMP::Info::LLDP + +See documentation in L for details. + +=cut