diff --git a/MANIFEST b/MANIFEST index c08cd28a..bdf711e3 100644 --- a/MANIFEST +++ b/MANIFEST @@ -83,6 +83,7 @@ lib/SNMP/Info/Layer3/C3550.pm lib/SNMP/Info/Layer3/C4000.pm lib/SNMP/Info/Layer3/C6500.pm lib/SNMP/Info/Layer3/CheckPoint.pm +lib/SNMP/Info/Layer3/Ciena.pm lib/SNMP/Info/Layer3/Cisco.pm lib/SNMP/Info/Layer3/CiscoASA.pm lib/SNMP/Info/Layer3/CiscoFWSM.pm diff --git a/lib/SNMP/Info.pm b/lib/SNMP/Info.pm index 569f5291..500c9b60 100644 --- a/lib/SNMP/Info.pm +++ b/lib/SNMP/Info.pm @@ -774,6 +774,12 @@ Subclass for CheckPoint devices. See documentation in L for details. +=item SNMP::Info::Layer3::Ciena + +Subclass for Ciena devices. + +See documentation in L for details. + =item SNMP::Info::Layer3::Cisco This is a simple wrapper around layer 3 for IOS devices and the base layer 3 @@ -1677,6 +1683,7 @@ sub device_type { 4874 => 'SNMP::Info::Layer3::ERX', 5624 => 'SNMP::Info::Layer3::Enterasys', 6027 => 'SNMP::Info::Layer3::Force10', + 6141 => 'SNMP::Info::Layer3::Ciena', 6486 => 'SNMP::Info::Layer3::AlcatelLucent', 6527 => 'SNMP::Info::Layer3::Timetra', 6876 => 'SNMP::Info::Layer3::VMware', @@ -1727,6 +1734,7 @@ sub device_type { 3375 => 'SNMP::Info::Layer3::F5', 4526 => 'SNMP::Info::Layer2::Netgear', 5624 => 'SNMP::Info::Layer3::Enterasys', + 6141 => 'SNMP::Info::Layer3::Ciena', 6486 => 'SNMP::Info::Layer3::AlcatelLucent', 9303 => 'SNMP::Info::Layer3::PacketFront', 10418 => 'SNMP::Info::Layer1::Cyclades', diff --git a/lib/SNMP/Info/Layer3/Ciena.pm b/lib/SNMP/Info/Layer3/Ciena.pm new file mode 100644 index 00000000..f2f8a6cb --- /dev/null +++ b/lib/SNMP/Info/Layer3/Ciena.pm @@ -0,0 +1,325 @@ +# SNMP::Info::Layer3::Ciena - SNMP Interface to Ciena Devices +# +# Copyright (c) 2019 by The Netdisco Developer Team. +# +# 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::Ciena; + +use strict; +use warnings; +use Exporter; +use SNMP::Info::Layer3; + +@SNMP::Info::Layer3::Ciena::ISA = qw/SNMP::Info::Layer3 Exporter/; +@SNMP::Info::Layer3::Ciena::EXPORT_OK = qw//; + +our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); + +$VERSION = '3.68'; + +%MIBS = ( + %SNMP::Info::Layer3::MIBS, + 'WWP-LEOS-SW-XGRADE-MIB' => 'wwpLeosBladeRunPackageVer', + 'WWP-LEOS-BLADE-MIB' => 'wwpLeosBladeId', + 'WWP-LEOS-CHASSIS-MIB' => 'wwpLeosChassisDeviceId', + 'WWP-LEOS-FLOW-MIB' => 'wwpLeosFlowLearnType', + 'WWP-LEOS-PORT-MIB' => 'wwpLeosEtherIngressPvid', + 'WWP-LEOS-VLAN-TAG-MIB' => 'wwpLeosNumVlans', + 'WWP-PRODUCTS-MIB' => 'wwpProductsMIB' +); + +%GLOBALS = ( + %SNMP::Info::Layer3::GLOBALS, + 'ciena_serial' => 'wwpLeosSystemSerialNumber', + 'mac' => 'dot1dBaseBridgeAddress' +); + +%FUNCS = ( + %SNMP::Info::Layer3::FUNCS, + 'v_name' => 'wwpLeosVlanName', + 'ps_type' => 'wwpLeosChassisPowerSupplyType', + 'ps_status' => 'wwpLeosChassisPowerSupplyState', + 'ps_name' => 'wwpLeosChassisPowerSupplyModuleLabel', + 'fan_type' => 'wwpLeosChassisFanModuleType', + 'fan_status' => 'wwpLeosChassisFanModuleStatus', + 'fan_name' => 'wwpLeosChassisFanModuleNum' +); + +%MUNGE = ( + %SNMP::Info::Layer3::MUNGE +); + +sub vendor { + return 'ciena'; +} + +sub os { + return 'saos'; +} + +sub os_ver { + my $ciena = shift; + my $version = $ciena->wwpLeosBladeRunPackageVer || {}; + return values(%$version); +} + +sub serial { + my $ciena = shift; + return $ciena->ciena_serial(); +} + +# Override lldp_if function to translate the port with bp_index +sub lldp_if { + my $ciena = shift; + my $lldp = $ciena->SUPER::lldp_if; + my $bp_index = $ciena->bp_index; + foreach my $iface (keys %$lldp) { + my $orig_iface = $lldp->{$iface}; + $lldp->{$iface} = $bp_index->{$orig_iface}; + } + return $lldp; +} + +sub i_vlan { + my $ciena = shift; + my $i_vlan = {}; + my $pvid = $ciena->wwpLeosEtherIngressPvid() || undef; + + # bp_index needed to resolve correct port id + my $bp_index = $ciena->bp_index; + if (defined $pvid) { + foreach my $i (keys %$pvid) { + $i_vlan->{$bp_index->{$i}} = $pvid->{$i}; + } + } + return $i_vlan; +} + +sub i_vlan_membership { + my $ciena = shift; + my $i_vlan_membership = {}; + + my $vlans = $ciena->wwpLeosVlanMemberPortId(); + # bp_index needed to resolve correct port id + my $bp_index = $ciena->bp_index; + foreach my $vlan (keys %$vlans) { + push @{$i_vlan_membership->{$bp_index->{$vlans->{$vlan}}}} , (split(/\./,$vlan))[0]; + } + return $i_vlan_membership; +} + +sub qb_fw_vlan { + my $ciena = shift; + my $qb_fw_vlan = {}; + my $learn_entries = $ciena->wwpLeosFlowLearnType(); + foreach my $entry (keys %$learn_entries) { + my @params = (split(/\./, $entry)); + $qb_fw_vlan->{join('.', @params[1..6])} = $params[8]; + } + return $qb_fw_vlan; +} + +sub fan { + my $ciena = shift; + + my $fan_status = $ciena->fan_status || {}; + my $fan_type = $ciena->fan_type; + my $fan_name = $ciena->fan_name; + my @messages; + + foreach my $fan (keys %$fan_status) { + if ($fan_status->{$fan} ne "ok") { + push @messages, sprintf("%s fan %s failed.", $fan_type->{$fan}, $fan_name->{$fan}); + } + } + return sprintf("%s fans OK", scalar keys %$fan_status) if scalar @messages == 0; + + return join(", ", @messages); +} +sub ps1_type { + my $ciena = shift; + my $ps_type = $ciena->ps_type; + return $ps_type->{'1'} if defined $ps_type->{'1'}; +} + +sub ps1_status { + my $ciena = shift; + my $ps_status = $ciena->ps_status; + return $ps_status->{'1'} if defined $ps_status->{'1'}; +} +sub ps2_type { + my $ciena = shift; + my $ps_type = $ciena->ps_type; + return $ps_type->{'2'} if defined $ps_type->{'2'}; +} + +sub ps2_status { + my $ciena = shift; + my $ps_status = $ciena->ps_status; + return $ps_status->{'2'} if defined $ps_status->{'2'}; +} +=head1 DESCRIPTION +Subclass for Ciena Devices running SAOS + +=head2 Inherited Classes + +=over + +=item SNMP::Info::Layer3 + +=back + +=head2 Required MIBs + +=over + +=item F + +=item F + +=item F + +=item F + +=item F + +=item F + +=item F + +=back + +=head2 Inherited Classes' MIBs + +See L for its own MIB requirements. + +=head1 GLOBALS + +These are methods that return scalar value from SNMP + +=over + +=item $ciena->vendor() + +Returns 'ciena' + +=item $ciena->os() + +Returns 'saos' + +=item $ciena->os_ver() + +Returns the running software package extracted with C + +=item $ciena->serial() + +Returns serial number +(C) + +=item $ciena->mac() + +Returns the MAC address used by this bridge when it must be referred +to in a unique fashion. + +(C) + +=item $huawei->fan() + +Return the status of all fans. Returns a string indicating the number of fans 'OK' or +identification of any fan without a 'normal' operating status. + +=item $ciena->ps1_status() + +Return the status of the first power supply + +=item $ciena->ps1_type() + +Return the type of the first power supply + +=item $ciena->ps2_status() + +Return the status of the second power supply + +=item $ciena->ps2_type() + +Return the type of the second power supply + +=back + +=head2 Globals 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 $ciena->lldp_if() + +Returns the mapping to the SNMP Interface Table. Overridden to translate to correct ethernet port with bp_index + +=item $ciena->i_vlan() + +Returns a mapping between C and the PVID or default VLAN. + +=item $ciena->i_vlan_membership() + +Returns reference to hash of arrays: key = C, value = array of VLAN +IDs. + +=item $ciena->qb_fw_vlan() + +Returns reference to hash of forwarding table entries VLAN ID, using C + +=item $ciena->ps_name() + +Returns reference to hash of the power supplies and their names. + +=item $ciena->ps_type() + +Returns reference to hash of the power supplies and their type (ex. AC, DC, etc.) + +=item $ciena->ps_status() + +Returns reference to hash of the power supplies and their status. + +=item $ciena->fan_name() + +Returns reference to hash of fans and their names. In this case, it is simply a number. + +=item $ciena->fan_type() + +Returns reference to hash of fans and their types (ex. fixed, modular, etc.) + +=item $ciena->fan_status) + +Returns reference to hash of fans and their status + +=back