From 800758815c8ed8476e17d34ce874d693fb891941 Mon Sep 17 00:00:00 2001 From: Ryan Gasik Date: Fri, 12 Jan 2018 19:21:37 -0800 Subject: [PATCH 1/2] Add Adtran, improve Juniper --- lib/SNMP/Info.pm | 2 + lib/SNMP/Info/Layer2/Adtran.pm | 166 ++++++++++++++++++++++++++++++++ lib/SNMP/Info/Layer3/Juniper.pm | 29 +++++- 3 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 lib/SNMP/Info/Layer2/Adtran.pm diff --git a/lib/SNMP/Info.pm b/lib/SNMP/Info.pm index 75cfb7dc..a6af97ec 100644 --- a/lib/SNMP/Info.pm +++ b/lib/SNMP/Info.pm @@ -1515,6 +1515,7 @@ sub device_type { 171 => 'SNMP::Info::Layer3::DLink', 244 => 'SNMP::Info::Layer3::Lantronix', 311 => 'SNMP::Info::Layer3::Microsoft', + 664 => 'SNMP::Info::Layer2::Adtran', 674 => 'SNMP::Info::Layer3::Dell', 1872 => 'SNMP::Info::Layer3::AlteonAD', 1916 => 'SNMP::Info::Layer3::Extreme', @@ -1560,6 +1561,7 @@ sub device_type { 45 => 'SNMP::Info::Layer2::Baystack', 171 => 'SNMP::Info::Layer3::DLink', 207 => 'SNMP::Info::Layer2::Allied', + 664 => 'SNMP::Info::Layer2::Adtran', 674 => 'SNMP::Info::Layer3::Dell', 1872 => 'SNMP::Info::Layer3::AlteonAD', 1916 => 'SNMP::Info::Layer3::Extreme', diff --git a/lib/SNMP/Info/Layer2/Adtran.pm b/lib/SNMP/Info/Layer2/Adtran.pm new file mode 100644 index 00000000..7c31b32f --- /dev/null +++ b/lib/SNMP/Info/Layer2/Adtran.pm @@ -0,0 +1,166 @@ +package SNMP::Info::Layer2::Adtran; + +use strict; +use Exporter; +use SNMP::Info::LLDP; +use SNMP::Info::Layer2; +use SNMP::Info::Layer3; + +@SNMP::Info::Layer2::Adtran::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/; +@SNMP::Info::Layer2::Adtran::EXPORT_OK = qw//; + +use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; + +$VERSION = '3.34'; + +# This will be filled in with the device's index into the EntPhysicalEntry +# table by the serial() function. +our $index = undef; + +%MIBS = ( + %SNMP::Info::Layer2::MIBS, + %SNMP::Info::Layer3::MIBS, + 'ADTRAN-GENEVC-MIB' => 'adGenEVCMIB', + 'ADTRAN-GENMEF-MIB' => 'adGenMEFMIB', + 'ADTRAN-GENPORT-MIB' => 'adGenPort', + 'ADTRAN-MIB' => 'adtran', + 'ADTRAN-AOSUNIT' => 'adGenAOSUnitMib', + ); + +%GLOBALS = ( + %SNMP::Info::Layer2::GLOBALS, + %SNMP::Info::Layer3::GLOBALS, + %SNMP::Info::LLDP::GLOBALS, + 'serial' => 'adProdSerialNumber', + 'ad_mgmtevcvid' => 'adGenEVCSysMgmtEVCSTagVID', +); + +%FUNCS = ( %SNMP::Info::Layer2::FUNCS, + %SNMP::Info::Layer3::FUNCS, + %SNMP::Info::LLDP::FUNCS, + 'ad_evcstag' => 'adGenEVCLookupName', + 'ad_menport' => 'adGenMenPortRowStatus', + 'ad_evcnamevid' => 'adGenEVCSTagVID', + 'ad_mgmtevcports' => 'adGenSysMgmtEVCInterfaceConnectionType', + 'ad_evcmapuniport' => 'adGenMEFMapUNIPort', + 'ad_evcmapevc' => 'adGenMEFMapAssociatedEVCAlias', + 'ad_genportcustuse' => 'adGenPortCustomerUse', +); + +%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, %SNMP::Info::Layer3::MUNGE ); + +sub vendor { + return 'adtran'; +} +sub os { + return 'aos'; +} + +sub layers { + my $adtran = shift; + + my $layers = $adtran->SUPER::layers(); + # Some netvantas don't report L2 properly + my $macs = $adtran->fw_mac(); + + if (keys %$macs) { + my $l = substr $layers, 6, 1, "1"; + } + + return $layers; +} + +sub os_ver { + my $adtran = shift; + my $ver = $adtran->adProdSwVersion() || undef; + return $ver if (defined $ver); + my $aos_ver = $adtran->adAOSDeviceVersion(); + return $aos_ver; +} +sub model { + my $adtran = shift; + my $id = $adtran->id(); + my $mod = $adtran->adProdName() || undef; + return $mod if (defined $mod); + my $model = $adtran->adAOSDeviceProductName() || undef; + return $model; +} +sub serial { + my $adtran = shift; + my $e_serial = $adtran->e_serial() || {}; + my $serial2 = $e_serial->{1} || undef; + return $serial2 if ( defined $serial2 ); + return $adtran->orig_serial(); +} + +sub i_name { + my $adtran = shift; + my $partial = shift; + my $i_name = $adtran->SUPER::i_alias() || undef; + return $i_name if (defined $i_name); + $i_name = {}; + my $adname = $adtran->ad_genportcustuse() || undef; + if (defined $adname) { + foreach my $port (keys %$adname) { + my @split = split(/\./,$port); + $i_name->{@split[1]} = $adname->{$port}; + } + } + return $i_name; +} +sub i_vlan { + my $adtran = shift; + my $partial = shift; + my $uniports = $adtran->ad_evcmapuniport() || undef; + my $evcmaps = $adtran->ad_evcmapevc() || undef; + my $v_names = $adtran->ad_evcnamevid() || undef; + if (defined $uniports) { + my $vlans = {}; + foreach my $oid (keys %$v_names) { + my $name = pack("C*", split(/\./,$oid)); + $vlans->{$name} = $v_names->{$oid}; + } + my $i_vlan = {}; + foreach my $evcmap (keys %$evcmaps) { + $i_vlan->{$uniports->{$evcmap}} = $vlans->{$evcmaps->{$evcmap}}; + } + return $i_vlan; + } + return {}; + +} + +sub i_vlan_membership { + my $adtran = shift; + my $partial = shift; + my $i_vlan = $adtran->ad_menport(); + if (defined $i_vlan) { + my $vlans = {}; + my $v_name = $adtran->v_name(); + foreach my $vid (keys %$v_name) { + $vlans->{$v_name->{$vid}} = $vid; + } + my $if_vlans = {}; + foreach my $entry (keys %$i_vlan) { + my @split = split(/(\.0)+\./,$entry); + my $name = pack("C*", split(/\./,@split[0])); + push @{$if_vlans->{@split[2]}}, $vlans->{$name}; + } + my $mgmtevcports = $adtran->ad_mgmtevcports(); + my $mgmtevcid = $adtran->ad_mgmtevcvid(); + foreach my $port (keys %$mgmtevcports) { + push @{$if_vlans->{$port}}, $mgmtevcid; + } + return $if_vlans; + } + return {}; +} + +sub v_name { + my $adtran = shift; + my $partial = shift; + my $v_index = $adtran->ad_evcstag(); + return {} unless defined $v_index; + $v_index->{$adtran->ad_mgmtevcvid()} = 'system-management-evc'; + return $v_index; +} diff --git a/lib/SNMP/Info/Layer3/Juniper.pm b/lib/SNMP/Info/Layer3/Juniper.pm index 8a255ba3..1d7c3f71 100644 --- a/lib/SNMP/Info/Layer3/Juniper.pm +++ b/lib/SNMP/Info/Layer3/Juniper.pm @@ -56,7 +56,9 @@ $VERSION = '3.39'; %SNMP::Info::LLDP::GLOBALS, 'serial' => 'jnxBoxSerialNo.0', 'mac' => 'dot1dBaseBridgeAddress', - 'box_descr' => 'jnxBoxDescr' + 'box_descr' => 'jnxBoxDescr', + 'version' => 'jnxVirtualChassisMemberSWVersion.0', + 'vc_model' => 'jnxVirtualChassisMemberModel.0', ); %FUNCS = ( %SNMP::Info::Layer3::FUNCS, @@ -65,7 +67,7 @@ $VERSION = '3.39'; # JUNIPER-VLAN-MIB::jnxExVlanTable 'v_index' => 'jnxExVlanTag', 'v_type' => 'jnxExVlanType', - 'v_name' => 'jnxExVlanName', + 'vlan_name' => 'jnxExVlanName', # JUNIPER-VLAN-MIB::jnxExVlanPortGroupTable 'i_trunk' => 'jnxExVlanPortAccessMode', @@ -77,6 +79,7 @@ $VERSION = '3.39'; 'v_fdb_id' => 'jnxL2aldVlanFdbId', 'v_vlan_tag' => 'jnxL2aldVlanTag', + 'v_vlan_name' => 'jnxL2aldVlanName', ); %MUNGE = ( %SNMP::Info::Layer3::MUNGE, @@ -113,6 +116,10 @@ sub os_ver { my $sys_descr = $juniper->description() || ''; my $lldp_descr = $juniper->lldp_sysdesc() || ''; + my $ver = $juniper->version() || ''; + if (not $ver eq '') { + return $ver; + } foreach my $descr ($sys_descr, $lldp_descr) { if ( $descr =~ m/kernel JUNOS ([^,\s]+)/ ) { return $1; @@ -121,14 +128,19 @@ sub os_ver { return $1; } } - return; } sub model { my $l3 = shift; my $id = $l3->id(); + # Query the junos device model. + my $mod = uc $l3->vc_model() || ''; + if (not $mod eq '') { + return $mod; + } + # Fallback to old method unless ( defined $id ) { print " SNMP::Info::Layer3::Juniper::model() - Device does not support sysObjectID\n" @@ -193,8 +205,10 @@ sub v_index { my ($partial) = shift; my ($v_index) = $juniper->jnxExVlanTag($partial); + my ($v_vlan_index) = $juniper->v_vlan_tag($partial); - return $v_index; + return $v_index unless $v_vlan_index; + return $v_vlan_index; } sub i_vlan { @@ -224,9 +238,14 @@ sub i_vlan { } $i_vlan->{$ifindex} = $vlan; } - return $i_vlan; } +sub v_name { + my $juniper = shift; + my $name = $juniper->v_vlan_name(); + return $juniper->vlan_name() unless $name; + return $name; +} # Index doesn't use VLAN ID, so override the HOA private method here to # correct the mapping From ed14b095672099d84168c670c6b22ee12a3bb16e Mon Sep 17 00:00:00 2001 From: Ryan Gasik Date: Fri, 12 Jan 2018 19:28:30 -0800 Subject: [PATCH 2/2] Fix version number in Adtran --- lib/SNMP/Info/Layer2/Adtran.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/SNMP/Info/Layer2/Adtran.pm b/lib/SNMP/Info/Layer2/Adtran.pm index 7c31b32f..29d4fbc0 100644 --- a/lib/SNMP/Info/Layer2/Adtran.pm +++ b/lib/SNMP/Info/Layer2/Adtran.pm @@ -11,7 +11,7 @@ use SNMP::Info::Layer3; use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; -$VERSION = '3.34'; +$VERSION = '3.39'; # This will be filled in with the device's index into the EntPhysicalEntry # table by the serial() function.