Pseudo ENTITY-MIB methods added to L3::Tasman for hardware information

This commit is contained in:
Eric A. Miller
2014-06-24 21:00:02 -04:00
parent 1ae7f8c8a2
commit 0e28436086
2 changed files with 268 additions and 17 deletions

View File

@@ -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]

View File

@@ -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,7 +131,7 @@ 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;
@@ -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 14 are Small Module slots. Slots 57 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__
@@ -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<portAdminSpeed>) which if set to
autonegotiate then the duplex will also autonegotiate, otherwise it uses the
reported port duplex (C<portDuplex>).
=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<portAdminSpeed>
=back
=head2 Pseudo F<ENTITY-MIB> information
These methods emulate F<ENTITY-MIB> Physical Table methods using
F<CHASSIS-MIB>.
=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<SNMP::Info::Layer3/"TABLE METHODS"> for details.