diff --git a/ChangeLog b/ChangeLog index b2ab1fef..53c2be8d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ SNMP::Info - Friendly OO-style interface to Network devices using SNMP. +version 3.18 + + [ENHANCEMENTS] + + * Pseudo ENTITY-MIB methods added to L3::Tasman for hardware information + version 3.17 (2014-06-23) [ENHANCEMENTS] diff --git a/Info/Layer3/Tasman.pm b/Info/Layer3/Tasman.pm index fb95cad4..be4f4258 100644 --- a/Info/Layer3/Tasman.pm +++ b/Info/Layer3/Tasman.pm @@ -30,6 +30,7 @@ package SNMP::Info::Layer3::Tasman; use strict; +use warnings; use Exporter; use SNMP::Info::Layer3; @@ -65,15 +66,9 @@ $VERSION = '3.17'; 'nn_ch_serial' => 'nnchassisSerialNumber', ); -%FUNCS = ( - %SNMP::Info::Layer3::FUNCS, - %SNMP::Info::MAU::FUNCS, -); +%FUNCS = ( %SNMP::Info::Layer3::FUNCS, %SNMP::Info::MAU::FUNCS, ); -%MUNGE = ( - %SNMP::Info::Layer3::MUNGE, - %SNMP::Info::MAU::MUNGE, -); +%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE, ); # use MAU-MIB for admin. duplex and admin. speed *SNMP::Info::Layer3::Tasman::i_duplex_admin @@ -81,6 +76,35 @@ $VERSION = '3.17'; *SNMP::Info::Layer3::Tasman::i_speed_admin = \&SNMP::Info::MAU::mau_i_speed_admin; +my $module_map = { + ADSL_ANX_A => '1-port ADSL2+ Annex A', + ADSL_ANX_B => '1-port ADSL2+ Annex B', + BRI_2ST => '2-port ST-interface ISDN BRI for both TDM and Packet', + FXO_2M => 'Voice Interface card - 2 port FXO', + FXO_4M => 'Voice Interface card - 4 port FXO', + FXS_2M => 'Voice Interface card - 2 port FXS', + FXS_4M => 'Voice Interface card - 4 port FXS', + HSSI_1 => '1-port High Speed Serial', + LMF_24 => '24-port 10/100 Fast Ethernet Layer2/3 switch', + LMG_10 => + '10-port non-blocking 10/100/1000 Gigabit Ethernet Layer2/3 switch', + LMG_44 => '44-port 10/100/1000 Gigabit Ethernet Layer 2/3 switch', + LMP_24 => '24-port 10/100 fast Ethernet Layer2/3 PoE switch', + PVIM_A => 'Packetized Voice Module (PVIM)', + SCIM_A => 'Ipsec VPN Encryption Module', + SERV_MOD => 'Secure Router 4134 Server Module', + VCM_A => + 'Medium Carrier module supports up to 4 FXO or FXS Small Modules', + VOIP_A => 'Packetized Voice Module (PVM)', + VPN_A => 'High Performance IPsec VPN Encryption Module', + WDS3_1C => '1-port Clear Channel DS3', + WT3_1C => '1-port Channelized T3', + DS3_1C => '1-port Channelized T3', + WTE_1 => '1-port T1/E1 w DS0 and DS1 support for both TDM and Packet', + WTE_2S => '2-port Sync and Async Serial', + WTE_8 => '8-port T1/E1' +}; + sub vendor { return 'avaya'; } @@ -92,12 +116,14 @@ sub os { sub os_ver { my $tasman = shift; my $version = $tasman->nn_sys_ver() || ""; - my $descr = $tasman->description() || ""; + my $descr = $tasman->description() || ""; # Newer versions return $1 if ( $version =~ /^SW:\s+(.+?)\s+/ ); + # Older versions - return $1 if ( $descr =~ /Software Version\s+=\s+[r]*(.+),/); + return $1 if ( $descr =~ /Software Version\s+=\s+[r]*(.+),/ ); + # Can't find return; } @@ -105,9 +131,9 @@ sub os_ver { sub model { my $tasman = shift; - my $id = $tasman->id(); + my $id = $tasman->id(); my $ch_model = $tasman->nn_ch_model(); - + return $ch_model if $ch_model; my $model = &SNMP::translateObj($id); @@ -123,13 +149,184 @@ sub serial { # Newer versions of the software redefined the MIB in a non-backwards # compatible manner. Try the old OID first. my $serial = $tasman->nn_ch_op_stat(); - # Newer versions populate status, serial should contain some numbers - return $serial if ($serial !~ /^\D+$/); + + # Newer versions populate status, serial should contain some letters + # while a status is an integer + return $serial if ( $serial !~ /^\D+$/ ); # Unfortunately newer versions don't seem to populate the newer OID. + # so check modules for a chassis + my $e_parent = $tasman->e_parent(); + + foreach my $iid ( keys %$e_parent ) { + my $parent = $e_parent->{$iid}; + if ( $parent eq '0' ) { + my $ser = $tasman->e_serial($iid); + return $ser->{$iid}; + } + } + + # If everything else failed just return what is supposed to hold the + # serial although it probably doesn't return $tasman->nn_ch_serial(); } +# Slots 1–4 are Small Module slots. Slots 5–7 are Medium Module slots. +# A Large Module spans slots 6 and 7. It will be identified as slot 6. + +sub e_index { + my $tasman = shift; + + my $index = $tasman->nnchassisInfoSlotSubSlotString() || {}; + + # In some cases the modules are duplicated, remove duplicates + my %seen; + my %e_index; + foreach my $key ( keys %$index ) { + my $string = $index->{$key}; + $string =~ s/\D//; + unless ( $seen{$string} ) { + $seen{$string}++; + $e_index{$key} = $string + 1; + } + } + + return \%e_index; +} + +sub e_class { + my $tasman = shift; + + my $e_index = $tasman->e_index() || {}; + + my %e_class; + foreach my $iid ( keys %$e_index ) { + + my $index = $e_index->{$iid}; + + if ( $index == 1 ) { + $e_class{$iid} = 'chassis'; + } + else { + $e_class{$iid} = 'module'; + } + } + return \%e_class; +} + +sub e_descr { + my $tasman = shift; + + my $e_index = $tasman->e_index() || {}; + my $types = $tasman->nnchassisInfoCardType || {}; + + my %e_descr; + foreach my $iid ( keys %$e_index ) { + my $type = $types->{$iid}; + next unless $type; + + if ( $type =~ /^MPU/ ) { + $e_descr{$iid} = $tasman->model(); + } + elsif ( defined $module_map->{$type} ) { + $e_descr{$iid} = $module_map->{$type}; + } + else { + next; + } + } + return \%e_descr; +} + +sub e_serial { + my $tasman = shift; + + my $e_index = $tasman->e_index() || {}; + my $serials = $tasman->nnchassisInfoSerialNumber() || {}; + + my %e_serial; + foreach my $iid ( keys %$e_index ) { + $e_serial{$iid} = $serials->{$iid} || ''; + } + return \%e_serial; +} + +sub e_fru { + my $tasman = shift; + + my $e_index = $tasman->e_index() || {}; + + my %e_fru; + foreach my $iid ( keys %$e_index ) { + $e_fru{$iid} = "true"; + } + return \%e_fru; +} + +sub e_type { + my $tasman = shift; + + my $e_index = $tasman->e_index() || {}; + my $types = $tasman->nnchassisInfoCardType || {}; + + my %e_type; + foreach my $iid ( keys %$e_index ) { + $e_type{$iid} = $types->{$iid} || ''; + } + + return \%e_type; +} + +sub e_vendor { + my $tasman = shift; + + my $e_idx = $tasman->e_index() || {}; + + my %e_vendor; + foreach my $iid ( keys %$e_idx ) { + $e_vendor{$iid} = 'avaya'; + } + return \%e_vendor; +} + +sub e_pos { + my $tasman = shift; + + return $tasman->e_index(); +} + +sub e_parent { + my $tasman = shift; + + my $e_idx = $tasman->e_index() || {}; + my $e_classes = $tasman->e_class() || {}; + + my $cha_idx = 0; + foreach my $i ( keys %$e_classes ) { + my $class = $e_classes->{$i}; + my $pos = $e_idx->{$i}; + if ( $class && $class eq 'chassis' ) { + $cha_idx = $pos; + } + } + + my %e_parent; + foreach my $iid ( keys %$e_idx ) { + my $idx = $e_idx->{$iid}; + + if ( $idx == 1 ) { + $e_parent{$iid} = 0; + } + elsif ( $idx =~ /^(\d)\d$/ ) { + $e_parent{$iid} = $1; + } + else { + $e_parent{$iid} = $cha_idx; + } + } + return \%e_parent; +} + 1; __END__ @@ -229,7 +426,7 @@ Grabs the os version from C (C) =item $tasman->ps2_status() - + (C) =item $tasman->nn_sys_ver() @@ -270,7 +467,7 @@ to a hash. =over 4 -=item $stack->i_duplex_admin() +=item $tasman->i_duplex_admin() Returns reference to hash of iid to administrative duplex setting. @@ -279,7 +476,7 @@ the port administrative speed (C) which if set to autonegotiate then the duplex will also autonegotiate, otherwise it uses the reported port duplex (C). -=item $stack->i_speed_admin() +=item $tasman->i_speed_admin() Returns reference to hash of iid to administrative speed setting. @@ -287,6 +484,54 @@ C =back +=head2 Pseudo F information + +These methods emulate F Physical Table methods using +F. + +=over + +=item $tasman->e_index() + +Returns reference to hash. Key: IID, Value: Integer. + +=item $tasman->e_class() + +Returns reference to hash. Key: IID, Value: General hardware type. + +=item $tasman->e_descr() + +Returns reference to hash. Key: IID, Value: Human friendly name + +=item $tasman->e_vendor() + +Returns reference to hash. Key: IID, Value: avaya + +=item $tasman->e_serial() + +Returns reference to hash. Key: IID, Value: Serial number + +=item $tasman->e_pos() + +Returns reference to hash. Key: IID, Value: The relative position among all +entities sharing the same parent. + +=item $tasman->e_type() + +Returns reference to hash. Key: IID, Value: Type of component/sub-component. + +=item $tasman->e_parent() + +Returns reference to hash. Key: IID, Value: The value of e_index() for the +entity which 'contains' this entity. A value of zero indicates this entity +is not contained in any other entity. + +=item $entity->e_fru() + +BOOLEAN. Is a Field Replaceable unit? + +=back + =head2 Table Methods imported from SNMP::Info::Layer3 See documentation in L for details.