1
									
								
								MANIFEST
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								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 | ||||
|   | ||||
| @@ -774,6 +774,12 @@ Subclass for CheckPoint devices. | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3::CheckPoint> for details. | ||||
|  | ||||
| =item SNMP::Info::Layer3::Ciena | ||||
|  | ||||
| Subclass for Ciena devices. | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3::Ciena> 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', | ||||
|   | ||||
							
								
								
									
										325
									
								
								lib/SNMP/Info/Layer3/Ciena.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										325
									
								
								lib/SNMP/Info/Layer3/Ciena.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -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<WWP-LEOS-SW-XGRADE-MIB> | ||||
|  | ||||
| =item F<WWP-LEOS-BLADE-MIB> | ||||
|  | ||||
| =item F<WWP-LEOS-CHASSIS-MIB> | ||||
|  | ||||
| =item F<WWP-LEOS-FLOW-MIB> | ||||
|  | ||||
| =item F<WWP-LEOS-PORT-MIB> | ||||
|  | ||||
| =item F<WWP-LEOS-VLAN-TAG-MIB> | ||||
|  | ||||
| =item F<WWP-PRODUCTS-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> 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<wwpLeosBladeRunPackageVer> | ||||
|  | ||||
| =item $ciena->serial() | ||||
|  | ||||
| Returns serial number | ||||
| (C<wwpLeosSystemSerialNumber>) | ||||
|  | ||||
| =item $ciena->mac() | ||||
|  | ||||
| Returns the MAC address used by this bridge when it must be referred | ||||
| to in a unique fashion. | ||||
|  | ||||
| (C<dot1dBaseBridgeAddress>) | ||||
|  | ||||
| =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<SNMP::Info::Layer3/"GLOBALS"> 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<ifIndex> and the PVID or default VLAN. | ||||
|  | ||||
| =item $ciena->i_vlan_membership() | ||||
|  | ||||
| Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN | ||||
| IDs. | ||||
|  | ||||
| =item $ciena->qb_fw_vlan() | ||||
|  | ||||
| Returns reference to hash of forwarding table entries VLAN ID, using C<wwpLeosFlowLearnType> | ||||
|  | ||||
| =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 | ||||
		Reference in New Issue
	
	Block a user