SNMP::Info::Layer3::F5 - Update the module to correctly retrieve interfaces (#492)
We have an issue with the current usage of the F5 MIB: the indexes for the interfaces are not an interger but a string (incompatible with the schema of Netdisco). So, I have updated the F5 module with: - usage of the IF-MIB entry anytime where is it possible - creation of a function to map the F5 ID for interfaces with the IF-MIB ID It could solve this issue on Netdisco: https://github.com/netdisco/netdisco/issues/1029
This commit is contained in:
@@ -54,9 +54,9 @@ $VERSION = '3.94';
|
||||
'ps2_status' => 'sysChassisPowerSupplyStatus.2',
|
||||
|
||||
# Named serial1 to override serial1 in L3 serial method
|
||||
'serial1' => 'sysGeneralChassisSerialNum',
|
||||
'qb_vlans' => 'sysVlanNumber',
|
||||
'ports' => 'sysInterfaceNumber',
|
||||
'serial1' => 'sysGeneralChassisSerialNum',
|
||||
'qb_vlans' => 'sysVlanNumber',
|
||||
'ports' => 'sysInterfaceNumber',
|
||||
|
||||
);
|
||||
|
||||
@@ -64,39 +64,19 @@ $VERSION = '3.94';
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
|
||||
# sysInterfaceTable
|
||||
'i_index' => 'sysInterfaceName',
|
||||
'i_description' => 'sysInterfaceName',
|
||||
'i_mtu' => 'sysInterfaceMtu',
|
||||
'i_speed' => 'sysInterfaceMediaActiveSpeed',
|
||||
'i_mac' => 'sysInterfaceMacAddr',
|
||||
'i_up_admin' => 'sysInterfaceEnabled',
|
||||
'i_up' => 'sysInterfaceStatus',
|
||||
|
||||
# sysIfxStatTable
|
||||
'i_octet_in64' => 'sysIfxStatHcInOctets',
|
||||
'i_octet_out64' => 'sysIfxStatHcOutOctets',
|
||||
'i_pkts_ucast_in64' => 'sysIfxStatHcInUcastPkts',
|
||||
'i_pkts_ucast_out64' => 'sysIfxStatHcOutUcastPkts',
|
||||
'i_pkts_mutli_in64' => 'sysIfxStatInMulticastPkts',
|
||||
'i_pkts_multi_out64' => 'sysIfxStatOutMulticastPkts',
|
||||
'i_pkts_bcast_in64' => 'sysIfxStatInBroadcastPkts',
|
||||
'i_pkts_bcast_out64' => 'sysIfxStatOutBroadcastPkts',
|
||||
|
||||
# sysInterfaceStatTable
|
||||
'i_discards_in' => 'sysInterfaceStatDropsIn',
|
||||
'i_discards_out' => 'sysInterfaceStatDropsOut',
|
||||
'i_errors_in' => 'sysInterfaceStatErrorsIn',
|
||||
'i_errors_out' => 'sysInterfaceStatErrorsOut',
|
||||
|
||||
# sysInterfaceTable
|
||||
'sys_i_duplex' => 'sysInterfaceMediaActiveDuplex',
|
||||
'sys_i_description' => 'sysInterfaceName',
|
||||
'sys_i_mtu' => 'sysInterfaceMtu',
|
||||
'sys_i_speed' => 'sysInterfaceMediaActiveSpeed',
|
||||
'sys_i_up_admin' => 'sysInterfaceEnabled',
|
||||
'sys_i_up' => 'sysInterfaceStatus',
|
||||
'sys_i_duplex' => 'sysInterfaceMediaActiveDuplex',
|
||||
|
||||
# sysChassisFanTable
|
||||
'fan_state' => 'sysChassisFanStatus',
|
||||
|
||||
# sysVlanTable
|
||||
'sys_v_id' => 'sysVlanId',
|
||||
'v_name' => 'sysVlanVname',
|
||||
'sys_v_name' => 'sysVlanVname',
|
||||
|
||||
# sysVlanMemberTable
|
||||
'sys_vm_tagged' => 'sysVlanMemberTagged',
|
||||
@@ -106,6 +86,22 @@ $VERSION = '3.94';
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub convert_f5id_stdid {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
my $id = shift;
|
||||
my $sys_i_description = $f5->sys_i_description($partial) || {};
|
||||
my $i_name = $f5->i_name($partial) || {};
|
||||
|
||||
if (exists($sys_i_description->{$id})) {
|
||||
my @result = grep { $i_name->{$_} eq $sys_i_description->{$id} } keys %$i_name;
|
||||
if (scalar @result eq 1) {
|
||||
return $result[0];
|
||||
}
|
||||
}
|
||||
return $id;
|
||||
};
|
||||
|
||||
sub vendor {
|
||||
return 'f5';
|
||||
}
|
||||
@@ -141,36 +137,18 @@ sub model {
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Override L3 interfaces
|
||||
sub interfaces {
|
||||
# Override L3 i_mtu
|
||||
sub i_mtu {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $f5->i_index($partial);
|
||||
}
|
||||
|
||||
# Override L3 i_name
|
||||
sub i_name {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $f5->i_index($partial);
|
||||
}
|
||||
|
||||
# We don't have this, so fake it
|
||||
sub i_type {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $idx = $f5->i_index($partial);
|
||||
|
||||
my %i_type;
|
||||
foreach my $if ( keys %$idx ) {
|
||||
$i_type{$if} =
|
||||
((exists $f5->{sess}->{UseEnums} and $f5->{sess}->{UseEnums})
|
||||
? 'ethernetCsmacd' : 6 );
|
||||
my $mtu = $f5->sys_i_mtu($partial) || {};
|
||||
my $i_mtu = {};
|
||||
while (my ($iid,$value) = each( %$mtu )) {
|
||||
$i_mtu->{$f5->convert_f5id_stdid($partial,$iid)} = $value;
|
||||
}
|
||||
return \%i_type;
|
||||
|
||||
return $i_mtu;
|
||||
}
|
||||
|
||||
# Override L3 i_duplex
|
||||
@@ -180,15 +158,14 @@ sub i_duplex {
|
||||
|
||||
my $duplexes = $f5->sys_i_duplex() || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if ( keys %$duplexes ) {
|
||||
my $duplex = $duplexes->{$if};
|
||||
my $i_duplex = {};
|
||||
while (my ($iid,$duplex) = each( %$duplexes )) {
|
||||
next unless defined $duplex;
|
||||
next if ( $duplex eq 'none' );
|
||||
|
||||
$i_duplex{$if} = $duplex;
|
||||
$i_duplex->{$f5->convert_f5id_stdid($partial,$iid)} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
return $i_duplex;
|
||||
}
|
||||
|
||||
# Override Bridge v_index
|
||||
@@ -196,14 +173,34 @@ sub v_index {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $f5->sys_v_id($partial);
|
||||
my $v_idx = $f5->sys_v_id($partial);
|
||||
my $v_index = {};
|
||||
while (my ($vid,$value) = each( %$v_idx )) {
|
||||
$v_index->{$vid =~ s/\.//gr} = $value;
|
||||
}
|
||||
|
||||
return $v_index;
|
||||
}
|
||||
|
||||
# Override Bridge v_name
|
||||
sub v_name {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlan_names = $f5->sys_v_name($partial) || {};
|
||||
my $v_name = {};
|
||||
while (my ($vid,$value) = each( %$vlan_names )) {
|
||||
$v_name->{$vid =~ s/\.//gr} = $value;
|
||||
}
|
||||
|
||||
return $v_name;
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $f5->i_index($partial) || {};
|
||||
my $index = $f5->interfaces($partial) || {};
|
||||
my $tagged = $f5->sys_vm_tagged() || {};
|
||||
my $vlans = $f5->v_index() || {};
|
||||
|
||||
@@ -214,10 +211,10 @@ sub i_vlan {
|
||||
|
||||
# IID is length.vlan name index.length.interface index
|
||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
||||
my @iid_array = split /\./, $iid;
|
||||
my @iid_array = split(/\./, $iid);
|
||||
my $len = $iid_array[0];
|
||||
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
|
||||
my $idx = join '.', @iid_array;
|
||||
my $v_idx = join('', ( splice @iid_array, 0, $len + 1 ));
|
||||
my $idx = $f5->convert_f5id_stdid($partial,join('.', @iid_array));
|
||||
|
||||
# Check to make sure we can map to a port
|
||||
my $p_idx = $index->{$idx};
|
||||
@@ -235,7 +232,7 @@ sub i_vlan_membership {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $f5->i_index($partial) || {};
|
||||
my $index = $f5->interfaces($partial) || {};
|
||||
my $tagged = $f5->sys_vm_tagged() || {};
|
||||
my $vlans = $f5->v_index() || {};
|
||||
|
||||
@@ -244,10 +241,10 @@ sub i_vlan_membership {
|
||||
|
||||
# IID is length.vlan name index.length.interface index
|
||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
||||
my @iid_array = split /\./, $iid;
|
||||
my @iid_array = split (/\./, $iid);
|
||||
my $len = $iid_array[0];
|
||||
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
|
||||
my $idx = join '.', @iid_array;
|
||||
my $v_idx = join ('.', ( splice @iid_array, 0, $len + 1 ));
|
||||
my $idx = $f5->convert_f5id_stdid($partial,join ('.', @iid_array));
|
||||
|
||||
# Check to make sure we can map to a port
|
||||
my $p_idx = $index->{$idx};
|
||||
@@ -265,7 +262,7 @@ sub i_vlan_membership_untagged {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $f5->i_index($partial) || {};
|
||||
my $index = $f5->interfaces($partial) || {};
|
||||
my $tagged = $f5->sys_vm_tagged() || {};
|
||||
my $vlans = $f5->v_index() || {};
|
||||
|
||||
@@ -275,10 +272,10 @@ sub i_vlan_membership_untagged {
|
||||
next unless $tagged->{$iid} eq 'false';
|
||||
# IID is length.vlan name index.length.interface index
|
||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
||||
my @iid_array = split /\./, $iid;
|
||||
my @iid_array = split (/\./, $iid);
|
||||
my $len = $iid_array[0];
|
||||
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
|
||||
my $idx = join '.', @iid_array;
|
||||
my $v_idx = join ('.', ( splice @iid_array, 0, $len + 1 ));
|
||||
my $idx = $f5->convert_f5id_stdid($partial,join ('.', @iid_array));
|
||||
|
||||
# Check to make sure we can map to a port
|
||||
my $p_idx = $index->{$idx};
|
||||
@@ -394,16 +391,18 @@ reference to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $f5->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical port.
|
||||
|
||||
(C<sysInterfaceName>).
|
||||
|
||||
=item $f5->i_duplex()
|
||||
|
||||
Returns reference to hash. Maps port operational duplexes to IIDs.
|
||||
|
||||
(C<sysInterfaceMediaActiveDuplex>).
|
||||
|
||||
=item $f5->i_mtu()
|
||||
|
||||
Returns reference to hash. Maps port operational MTU to IIDs
|
||||
|
||||
(C<sysInterfaceMtu>).
|
||||
|
||||
=item $f5->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the default VLAN.
|
||||
@@ -437,14 +436,6 @@ Returns VLAN IDs
|
||||
|
||||
Human-entered name for vlans.
|
||||
|
||||
=item $f5->i_name()
|
||||
|
||||
Returns the human set port name if exists.
|
||||
|
||||
=item $f5->i_type()
|
||||
|
||||
Returns C<'ethernetCsmacd'> for each C<ifIndex>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
@@ -452,3 +443,5 @@ Returns C<'ethernetCsmacd'> for each C<ifIndex>.
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
# vim: expandtab tabstop=4 shiftwidth=4
|
||||
|
||||
Reference in New Issue
Block a user