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:
@@ -64,31 +64,11 @@ $VERSION = '3.94';
|
|||||||
%SNMP::Info::Layer3::FUNCS,
|
%SNMP::Info::Layer3::FUNCS,
|
||||||
|
|
||||||
# sysInterfaceTable
|
# sysInterfaceTable
|
||||||
'i_index' => 'sysInterfaceName',
|
'sys_i_description' => 'sysInterfaceName',
|
||||||
'i_description' => 'sysInterfaceName',
|
'sys_i_mtu' => 'sysInterfaceMtu',
|
||||||
'i_mtu' => 'sysInterfaceMtu',
|
'sys_i_speed' => 'sysInterfaceMediaActiveSpeed',
|
||||||
'i_speed' => 'sysInterfaceMediaActiveSpeed',
|
'sys_i_up_admin' => 'sysInterfaceEnabled',
|
||||||
'i_mac' => 'sysInterfaceMacAddr',
|
'sys_i_up' => 'sysInterfaceStatus',
|
||||||
'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_duplex' => 'sysInterfaceMediaActiveDuplex',
|
||||||
|
|
||||||
# sysChassisFanTable
|
# sysChassisFanTable
|
||||||
@@ -96,7 +76,7 @@ $VERSION = '3.94';
|
|||||||
|
|
||||||
# sysVlanTable
|
# sysVlanTable
|
||||||
'sys_v_id' => 'sysVlanId',
|
'sys_v_id' => 'sysVlanId',
|
||||||
'v_name' => 'sysVlanVname',
|
'sys_v_name' => 'sysVlanVname',
|
||||||
|
|
||||||
# sysVlanMemberTable
|
# sysVlanMemberTable
|
||||||
'sys_vm_tagged' => 'sysVlanMemberTagged',
|
'sys_vm_tagged' => 'sysVlanMemberTagged',
|
||||||
@@ -106,6 +86,22 @@ $VERSION = '3.94';
|
|||||||
|
|
||||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
%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 {
|
sub vendor {
|
||||||
return 'f5';
|
return 'f5';
|
||||||
}
|
}
|
||||||
@@ -141,36 +137,18 @@ sub model {
|
|||||||
return $model;
|
return $model;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Override L3 interfaces
|
# Override L3 i_mtu
|
||||||
sub interfaces {
|
sub i_mtu {
|
||||||
my $f5 = shift;
|
my $f5 = shift;
|
||||||
my $partial = shift;
|
my $partial = shift;
|
||||||
|
|
||||||
return $f5->i_index($partial);
|
my $mtu = $f5->sys_i_mtu($partial) || {};
|
||||||
}
|
my $i_mtu = {};
|
||||||
|
while (my ($iid,$value) = each( %$mtu )) {
|
||||||
# Override L3 i_name
|
$i_mtu->{$f5->convert_f5id_stdid($partial,$iid)} = $value;
|
||||||
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 );
|
|
||||||
}
|
}
|
||||||
return \%i_type;
|
|
||||||
|
return $i_mtu;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Override L3 i_duplex
|
# Override L3 i_duplex
|
||||||
@@ -180,15 +158,14 @@ sub i_duplex {
|
|||||||
|
|
||||||
my $duplexes = $f5->sys_i_duplex() || {};
|
my $duplexes = $f5->sys_i_duplex() || {};
|
||||||
|
|
||||||
my %i_duplex;
|
my $i_duplex = {};
|
||||||
foreach my $if ( keys %$duplexes ) {
|
while (my ($iid,$duplex) = each( %$duplexes )) {
|
||||||
my $duplex = $duplexes->{$if};
|
|
||||||
next unless defined $duplex;
|
next unless defined $duplex;
|
||||||
next if ( $duplex eq 'none' );
|
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
|
# Override Bridge v_index
|
||||||
@@ -196,14 +173,34 @@ sub v_index {
|
|||||||
my $f5 = shift;
|
my $f5 = shift;
|
||||||
my $partial = 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 {
|
sub i_vlan {
|
||||||
my $f5 = shift;
|
my $f5 = shift;
|
||||||
my $partial = shift;
|
my $partial = shift;
|
||||||
|
|
||||||
my $index = $f5->i_index($partial) || {};
|
my $index = $f5->interfaces($partial) || {};
|
||||||
my $tagged = $f5->sys_vm_tagged() || {};
|
my $tagged = $f5->sys_vm_tagged() || {};
|
||||||
my $vlans = $f5->v_index() || {};
|
my $vlans = $f5->v_index() || {};
|
||||||
|
|
||||||
@@ -214,10 +211,10 @@ sub i_vlan {
|
|||||||
|
|
||||||
# IID is length.vlan name index.length.interface index
|
# IID is length.vlan name index.length.interface index
|
||||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
# 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 $len = $iid_array[0];
|
||||||
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
|
my $v_idx = join('', ( splice @iid_array, 0, $len + 1 ));
|
||||||
my $idx = join '.', @iid_array;
|
my $idx = $f5->convert_f5id_stdid($partial,join('.', @iid_array));
|
||||||
|
|
||||||
# Check to make sure we can map to a port
|
# Check to make sure we can map to a port
|
||||||
my $p_idx = $index->{$idx};
|
my $p_idx = $index->{$idx};
|
||||||
@@ -235,7 +232,7 @@ sub i_vlan_membership {
|
|||||||
my $f5 = shift;
|
my $f5 = shift;
|
||||||
my $partial = shift;
|
my $partial = shift;
|
||||||
|
|
||||||
my $index = $f5->i_index($partial) || {};
|
my $index = $f5->interfaces($partial) || {};
|
||||||
my $tagged = $f5->sys_vm_tagged() || {};
|
my $tagged = $f5->sys_vm_tagged() || {};
|
||||||
my $vlans = $f5->v_index() || {};
|
my $vlans = $f5->v_index() || {};
|
||||||
|
|
||||||
@@ -244,10 +241,10 @@ sub i_vlan_membership {
|
|||||||
|
|
||||||
# IID is length.vlan name index.length.interface index
|
# IID is length.vlan name index.length.interface index
|
||||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
# 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 $len = $iid_array[0];
|
||||||
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
|
my $v_idx = join ('.', ( splice @iid_array, 0, $len + 1 ));
|
||||||
my $idx = join '.', @iid_array;
|
my $idx = $f5->convert_f5id_stdid($partial,join ('.', @iid_array));
|
||||||
|
|
||||||
# Check to make sure we can map to a port
|
# Check to make sure we can map to a port
|
||||||
my $p_idx = $index->{$idx};
|
my $p_idx = $index->{$idx};
|
||||||
@@ -265,7 +262,7 @@ sub i_vlan_membership_untagged {
|
|||||||
my $f5 = shift;
|
my $f5 = shift;
|
||||||
my $partial = shift;
|
my $partial = shift;
|
||||||
|
|
||||||
my $index = $f5->i_index($partial) || {};
|
my $index = $f5->interfaces($partial) || {};
|
||||||
my $tagged = $f5->sys_vm_tagged() || {};
|
my $tagged = $f5->sys_vm_tagged() || {};
|
||||||
my $vlans = $f5->v_index() || {};
|
my $vlans = $f5->v_index() || {};
|
||||||
|
|
||||||
@@ -275,10 +272,10 @@ sub i_vlan_membership_untagged {
|
|||||||
next unless $tagged->{$iid} eq 'false';
|
next unless $tagged->{$iid} eq 'false';
|
||||||
# IID is length.vlan name index.length.interface index
|
# IID is length.vlan name index.length.interface index
|
||||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
# 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 $len = $iid_array[0];
|
||||||
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
|
my $v_idx = join ('.', ( splice @iid_array, 0, $len + 1 ));
|
||||||
my $idx = join '.', @iid_array;
|
my $idx = $f5->convert_f5id_stdid($partial,join ('.', @iid_array));
|
||||||
|
|
||||||
# Check to make sure we can map to a port
|
# Check to make sure we can map to a port
|
||||||
my $p_idx = $index->{$idx};
|
my $p_idx = $index->{$idx};
|
||||||
@@ -394,16 +391,18 @@ reference to a hash.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item $f5->interfaces()
|
|
||||||
|
|
||||||
Returns reference to the map between IID and physical port.
|
|
||||||
|
|
||||||
(C<sysInterfaceName>).
|
|
||||||
|
|
||||||
=item $f5->i_duplex()
|
=item $f5->i_duplex()
|
||||||
|
|
||||||
Returns reference to hash. Maps port operational duplexes to IIDs.
|
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()
|
=item $f5->i_vlan()
|
||||||
|
|
||||||
Returns a mapping between C<ifIndex> and the default VLAN.
|
Returns a mapping between C<ifIndex> and the default VLAN.
|
||||||
@@ -437,14 +436,6 @@ Returns VLAN IDs
|
|||||||
|
|
||||||
Human-entered name for vlans.
|
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
|
=back
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
=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.
|
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
# vim: expandtab tabstop=4 shiftwidth=4
|
||||||
|
|||||||
Reference in New Issue
Block a user