Compare commits

...

29 Commits

Author SHA1 Message Date
Oliver Gorwits
893def7910 release 3.20 2014-09-08 13:50:56 +01:00
Eric A. Miller
f875639435 Override layers in Juniper for routers with switch modules not reporting L2 capability 2014-09-03 23:22:33 -04:00
Oliver Gorwits
70bb263d79 release 3.19 2014-08-01 07:53:34 +01:00
Eric A. Miller
536d7d6901 Only use L2::ZyXEL_DSLAM for ZyXEL DSL modules 2014-07-30 23:07:22 -04:00
Eric A. Miller
6ea34316b0 POD updates and update change log for begemot's merges 2014-07-30 23:04:12 -04:00
Eric A. Miller
aeebe5c95c POD updates 2014-07-30 23:02:31 -04:00
Eric A. Miller
eb62f95636 POD fix 2014-07-30 22:56:14 -04:00
Eric A. Miller
c7ee746fe6 Merge commit '3b6088f454b5211ea00267fddd45b9a6b3563312' 2014-07-30 22:49:54 -04:00
Eric A. Miller
9a062499b3 Merge commit '719f14984b5d614b7ee52493bf07d6ced99adad4' 2014-07-30 22:33:23 -04:00
Eric A. Miller
0c876452d8 Merge commit '2e480dbec54e3b31586f7660f7f88d8797ac2446' 2014-07-30 22:32:36 -04:00
Max Kosmach
3b6088f454 add L2:3Com.pm 2014-07-28 17:46:09 +04:00
Max Kosmach
719f14984b Add Ubiquiti UniFi AP support 2014-07-28 15:47:01 +04:00
Max Kosmach
2e480dbec5 Small H3C fixes 2014-07-28 15:41:46 +04:00
Max Kosmach
66910c7827 Add L2:3Com support 2014-07-28 15:32:04 +04:00
Eric A. Miller
0f5319bc52 Silence uninitialized value warning in L3::Cisco 2014-07-08 21:48:50 -04:00
Eric A. Miller
cd54b07e09 Fix Avaya detection in lldp_port() 2014-07-08 21:33:18 -04:00
Oliver Gorwits
b197e9739b release 3.18 2014-07-02 09:12:57 +01:00
Eric A. Miller
8dd32c0dd7 [#54] Possible bad values returned for lldp_port with some HP gear 2014-07-01 23:06:25 -04:00
Eric A. Miller
08e049eb31 [#54] Possible bad values returned for cdp_id with some HP gear (Joel Leonhardt) 2014-07-01 23:01:24 -04:00
Eric A. Miller
d09e4a125c L2::Netgear inheritance clean up and removal of unnecessary c_* methods defined in Info base class 2014-07-01 22:30:37 -04:00
Eric A. Miller
8353db2bc4 [#71] Don't try to match on a false port description in lldp_if 2014-07-01 22:26:07 -04:00
Eric A. Miller
250d2a0c0a Update change log for L3::Nexus capture of VPC Keepalive IP addresses 2014-07-01 20:07:37 -04:00
Eric A. Miller
46b3127bb5 [#58] Fix inheritance in L3::FWSM and L3::CiscoASA 2014-07-01 20:05:46 -04:00
Eric A. Miller
f1e9e3423d Merge branch 'jvi_nexus' 2014-07-01 19:56:26 -04:00
Eric A. Miller
158ee40f1b Correctly identify device type (class) for instantiated objects which have overridden layers. 2014-06-24 21:14:14 -04:00
Eric A. Miller
713d052b64 POD update 2014-06-24 21:00:29 -04:00
Eric A. Miller
0e28436086 Pseudo ENTITY-MIB methods added to L3::Tasman for hardware information 2014-06-24 21:00:02 -04:00
Jeroen van Ingen
3f7229f4e7 Cisco Nexus workaround: add probable VPC IP address to device IP address table, determined by checking listening UDP sockets 2014-06-24 17:50:03 +02:00
Oliver Gorwits
1ae7f8c8a2 release 3.17
POD tests are not required for distribution
2014-06-23 19:31:14 +01:00
112 changed files with 992 additions and 364 deletions

View File

@@ -1,5 +1,53 @@
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
version 3.20 (2014-09-08)
[NEW FEATURES]
* Override layers in Juniper for routers with switch modules
[BUG FIXES]
* Update MANIFEST to include Ubiquiti files
version 3.19 (2014-08-01)
[NEW FEATURES]
* Support for Ubiquiti Access Points in new class L2::Ubiquiti (begemot)
* Preliminary support for 3Com switches in new class L2::3Com (begemot)
[BUG FIXES]
* Fix Avaya detection lldp_port()
* Silence uninitialized value warning in L3::Cisco
* H3C fixes (begemot)
* Only use L2::ZyXEL_DSLAM for ZyXEL DSL modules
version 3.18 (2014-07-02)
[ENHANCEMENTS]
* Pseudo ENTITY-MIB methods added to L3::Tasman for hardware information
* Capture VPC Keepalive IP addresses in L3::Nexus (jeroenvi)
* L2::Netgear inheritance clean up and removal of unnecessary c_* methods
defined in Info base class
[BUG FIXES]
* Correctly identify device type (class) for instantiated objects which
have overridden layers.
* [#58] Fix inheritance in L3::FWSM and L3::CiscoASA
* [#71] Don't try to match on a false port description in lldp_if
* [#54] Possible bad values returned for cdp_id and lldp_port with some HP
gear (Joel Leonhardt)
version 3.17 (2014-06-23)
[ENHANCEMENTS]
* POD tests are not required for distribution.
version 3.16 (2014-06-23)
[ENHANCEMENTS]
@@ -10,7 +58,7 @@ version 3.16 (2014-06-23)
all applicable classes now inherit CiscoAgg, CiscoStpExtensions,
CiscoPortSecurity, CiscoPower, and LLDP classes.
* Remove inheritance of classes the devices do not support in L3::FWSM
andL3::CiscoASA
and L3::CiscoASA
[BUG FIXES]

71
Info.pm
View File

@@ -24,7 +24,7 @@ use vars
qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG %SPEED_MAP
$NOSUCH $BIGINT $REPEATERS/;
$VERSION = '3.16';
$VERSION = '3.20';
=head1 NAME
@@ -32,7 +32,7 @@ SNMP::Info - OO Interface to Network devices and MIBs through SNMP
=head1 VERSION
SNMP::Info - Version 3.16
SNMP::Info - Version 3.20
=head1 AUTHOR
@@ -487,6 +487,12 @@ See documentation in L<SNMP::Info::Layer2> for details.
=over
=item SNMP::Info::Layer2::3Com
SNMP::Info::Layer2::3Com - SNMP Interface to L2 3Com Switches
See documentation in L<SNMP::Info::Layer2::3Com> for details.
=item SNMP::Info::Layer2::Airespace
Subclass for Cisco (Airespace) wireless controllers.
@@ -618,6 +624,12 @@ SNMP Interface to Juniper (Trapeze) Wireless Controllers
See documentation in L<SNMP::Info::Layer2::Trapeze> for details.
=item SNMP::Info::Layer2::Ubiquiti
SNMP Interface to Ubiquiti Access Points
See documentation in L<SNMP::Info::Layer2::Ubiquiti> for details.
=item SNMP::Info::Layer2::ZyXEL_DSLAM
Zyxel DSLAMs. Need I say more?
@@ -1472,6 +1484,7 @@ sub device_type {
11 => 'SNMP::Info::Layer2::HP',
18 => 'SNMP::Info::Layer3::BayRS',
42 => 'SNMP::Info::Layer3::Sun',
43 => 'SNMP::Info::Layer2::3Com',
45 => 'SNMP::Info::Layer2::Baystack',
171 => 'SNMP::Info::Layer3::Dell',
244 => 'SNMP::Info::Layer3::Lantronix',
@@ -1495,8 +1508,11 @@ sub device_type {
6527 => 'SNMP::Info::Layer3::Timetra',
8072 => 'SNMP::Info::Layer3::NetSNMP',
9303 => 'SNMP::Info::Layer3::PacketFront',
10002 => 'SNMP::Info::Layer2::Ubiquiti',
12325 => 'SNMP::Info::Layer3::Pf',
14179 => 'SNMP::Info::Layer2::Airespace',
14525 => 'SNMP::Info::Layer2::Trapeze',
14823 => 'SNMP::Info::Layer3::Aruba',
14988 => 'SNMP::Info::Layer3::Mikrotik',
17163 => 'SNMP::Info::Layer3::Steelhead',
25506 => 'SNMP::Info::Layer3::H3C',
@@ -1508,6 +1524,7 @@ sub device_type {
my %l2sysoidmap = (
9 => 'SNMP::Info::Layer2::Cisco',
11 => 'SNMP::Info::Layer2::HP',
43 => 'SNMP::Info::Layer2::3Com',
45 => 'SNMP::Info::Layer2::Baystack',
171 => 'SNMP::Info::Layer3::Dell',
207 => 'SNMP::Info::Layer2::Allied',
@@ -1530,6 +1547,10 @@ sub device_type {
26543 => 'SNMP::Info::Layer3::IBMGbTor',
);
my %l1sysoidmap = (
2925 => 'SNMP::Info::Layer1::Cyclades',
);
my %l7sysoidmap = (
318 => 'SNMP::Info::Layer7::APC',
5951 => 'SNMP::Info::Layer7::Netscaler',
@@ -1647,6 +1668,20 @@ sub device_type {
if ($desc =~ /\b(C1100|C1130|C1140|AP1200|C350|C1200|C1240|C1250)\b/
and $desc =~ /\bIOS\b/ );
# Airespace (WLC) Module
$objtype = 'SNMP::Info::Layer2::Airespace'
if ( $desc =~ /^Cisco Controller$/ );
#Nortel 2270
$objtype = 'SNMP::Info::Layer2::N2270'
if (
$desc =~ /Nortel\s+(Networks\s+)??WLAN\s+-\s+Security\s+Switch/ );
# Nortel (Trapeze) WSS 2300 Series
$objtype = 'SNMP::Info::Layer2::NWSS2300'
if (
$desc =~ /^(Nortel\s)??Wireless\sSecurity\sSwitch\s23[568][012]\b/);
# Generic device classification based upon sysObjectID
if ( ( $objtype eq 'SNMP::Info::Layer3' )
and ( defined($id) )
@@ -1664,6 +1699,18 @@ sub device_type {
# Device Type Overrides
# Bay Hub (Needed here for layers override)
$objtype = 'SNMP::Info::Layer1::Bayhub'
if ( $desc =~ /\bNMM.*Agent/ );
$objtype = 'SNMP::Info::Layer1::Bayhub'
if ( $desc =~ /\bBay\s*Stack.*Hub/i );
# Synoptics Hub (Needed here for layers override)
# This will override Bay Hub only for specific devices supported
# by this class
$objtype = 'SNMP::Info::Layer1::S3000'
if ( $desc =~ /\bNMM\s+(281|3000|3030)/i );
# Catalyst 1900 series override
$objtype = 'SNMP::Info::Layer2::C1900'
if ( $desc =~ /catalyst/i and $desc =~ /\D19\d{2}/ );
@@ -1750,7 +1797,7 @@ sub device_type {
# Airespace (WLC) Module
$objtype = 'SNMP::Info::Layer2::Airespace'
if ( $desc =~ /Cisco Controller/ );
if ( $desc =~ /^Cisco Controller$/ );
#Nortel 2270
$objtype = 'SNMP::Info::Layer2::N2270'
@@ -1761,6 +1808,9 @@ sub device_type {
$objtype = 'SNMP::Info::Layer2::HPVC'
if ( $desc =~ /HP\sVC\s/ );
$objtype = 'SNMP::Info::Layer2::ZyXEL_DSLAM'
if ( $desc =~ /8-port .DSL Module\(Annex .\)/i );
# Generic device classification based upon sysObjectID
if ( ( $objtype eq 'SNMP::Info::Layer2' )
and ( defined($id) )
@@ -1784,12 +1834,20 @@ sub device_type {
if ( $desc =~ /\bBay\s*Stack.*Hub/i );
# Synoptics Hub
# This will override Bay Hub only for specific devices supported by this class
# This will override Bay Hub only for specific devices supported
# by this class
$objtype = 'SNMP::Info::Layer1::S3000'
if ( $desc =~ /\bNMM\s+(281|3000|3030)/i );
# These devices don't claim to have Layer1-3 but we like em anyways.
# Generic device classification based upon sysObjectID
if ( ( $objtype eq 'SNMP::Info::Layer1' )
and ( defined($id) )
and ( exists( $l1sysoidmap{$id} ) ) )
{
$objtype = $l1sysoidmap{$id};
}
}
# These devices don't claim to have Layer1-3 but we like em anyways.
else {
$objtype = 'SNMP::Info::Layer2::ZyXEL_DSLAM'
if ( $desc =~ /8-port .DSL Module\(Annex .\)/i );
@@ -1816,7 +1874,8 @@ sub device_type {
# Nortel (Trapeze) WSS 2300 Series
$objtype = 'SNMP::Info::Layer2::NWSS2300'
if ( $desc =~ /\bWireless\sSecurity\sSwitch\s23[568][012]\b/);
if (
$desc =~ /^(Nortel\s)??Wireless\sSecurity\sSwitch\s23[568][012]\b/);
# Generic device classification based upon sysObjectID
if ( defined($id) and $objtype eq 'SNMP::Info') {

View File

@@ -38,7 +38,7 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS
= ( 'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', );

View File

@@ -38,7 +38,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' );

View File

@@ -38,7 +38,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (); # IF-MIB

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS,

View File

@@ -42,7 +42,7 @@ use SNMP::Info;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
'BRIDGE-MIB' => 'dot1dBaseBridgeAddress',

View File

@@ -43,7 +43,7 @@ use SNMP::Info;
use vars
qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT %CDP_CAPABILITIES/;
$VERSION = '3.16';
$VERSION = '3.20';
# Five data structures required by SNMP::Info
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
@@ -62,7 +62,7 @@ $VERSION = '3.16';
'cdp_proto' => 'cdpCacheAddressType',
'cdp_addr' => 'cdpCacheAddress',
'cdp_ver' => 'cdpCacheVersion',
'cdp_id' => 'cdpCacheDeviceId',
'cdp_dev_id' => 'cdpCacheDeviceId',
'cdp_port' => 'cdpCacheDevicePort',
'cdp_platform' => 'cdpCachePlatform',
'cdp_capabilities' => 'cdpCacheCapabilities',
@@ -81,7 +81,6 @@ $VERSION = '3.16';
'cdp_platform' => \&SNMP::Info::munge_null,
'cdp_domain' => \&SNMP::Info::munge_null,
'cdp_port' => \&SNMP::Info::munge_null,
'cdp_id' => \&SNMP::Info::munge_null,
'cdp_ver' => \&SNMP::Info::munge_null,
'cdp_ip' => \&SNMP::Info::munge_ip,
'cdp_power' => \&munge_power,
@@ -210,6 +209,22 @@ sub cdp_cap {
return \%cdp_cap;
}
sub cdp_id {
my $cdp = shift;
my $partial = shift;
my $ch = $cdp->cdp_dev_id($partial) || {};
my %cdp_id;
foreach my $key ( sort keys %$ch ) {
my $id = $ch->{$key};
next unless $id;
$id = SNMP::Info::munge_mac($id) || SNMP::Info::munge_null($id);
$cdp_id{$key} = $id;
}
return \%cdp_id;
}
1;
__END__

View File

@@ -43,7 +43,7 @@ use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::IEEE802dot3ad::MIBS,

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',

View File

@@ -38,7 +38,7 @@ use Exporter;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' );

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', );

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );

View File

@@ -38,7 +38,7 @@ use Exporter;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );

View File

@@ -42,7 +42,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
'SNMPv2-MIB' => 'sysDescr',

View File

@@ -36,7 +36,7 @@ use SNMP::Info::Bridge;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
$VERSION = '3.16';
$VERSION = '3.20';
@SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/;
@SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//;

View File

@@ -41,7 +41,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
'CISCO-VTP-MIB' => 'vtpVlanName',

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
'EXTREME-EDP-MIB' => 'extremeEdpPortIfIndex',

View File

@@ -41,7 +41,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );

View File

@@ -41,7 +41,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );

View File

@@ -42,7 +42,7 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );

View File

@@ -38,7 +38,7 @@ use Exporter;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );

View File

@@ -43,7 +43,7 @@ use SNMP::Info::Aggregate;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Aggregate::MIBS,

View File

@@ -44,7 +44,7 @@ use constant {
IPV6MIB => 3,
};
$VERSION = '3.16';
$VERSION = '3.20';

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
'LLDP-MIB' => 'lldpLocSysCapEnabled',
@@ -95,7 +95,7 @@ sub hasLLDP {
# If the device doesn't return local system capabilities, fallback by checking if it would report neighbors
my $lldp_rem = $lldp->lldp_rem_id() || {};
return 1 if scalar keys %$lldp_rem;
return;
}
@@ -104,11 +104,11 @@ sub lldp_if {
my $partial = shift;
my $addr = $lldp->lldp_rem_pid($partial) || {};
my $i_descr = $lldp->i_description() || {};
my $i_alias = $lldp->i_alias() || {};
my $i_descr = $lldp->i_description() || {};
my $i_alias = $lldp->i_alias() || {};
my %r_i_descr = reverse %$i_descr;
my %r_i_alias = reverse %$i_alias;
my %lldp_if;
foreach my $key ( keys %$addr ) {
my @aOID = split( '\.', $key );
@@ -119,14 +119,15 @@ sub lldp_if {
# prefer ifDescr over ifAlias because using cross ref with description is correct behavior
# according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though.
my $lldp_desc = $lldp->lldpLocPortDesc($port);
my $desc = $lldp_desc->{$port};
my $desc = $lldp_desc->{$port};
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
if ( exists $r_i_descr{$desc} ) {
if ( $desc && exists $r_i_descr{$desc} ) {
$port = $r_i_descr{$desc};
} elsif ( exists $r_i_alias{$desc} ) {
}
elsif ( $desc && exists $r_i_alias{$desc} ) {
$port = $r_i_alias{$desc};
}
$lldp_if{$key} = $port;
}
return \%lldp_if;
@@ -170,12 +171,14 @@ sub lldp_port {
my $pdesc = $lldp->lldp_rem_desc($partial) || {};
my $pid = $lldp->lldp_rem_pid($partial) || {};
my $ptype = $lldp->lldp_rem_pid_type($partial) || {};
my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
my %lldp_port;
foreach my $key ( sort keys %$pid ) {
my $port = $pdesc->{$key};
my $type = $ptype->{$key};
if ( $type and $type eq 'interfaceName' ) {
# If the pid claims to be an interface name,
# believe it.
$port = $pid->{$key};
@@ -194,8 +197,12 @@ sub lldp_port {
# Avaya/Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
# figure out slot.port based upon lldpRemPortDesc
if ( $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ ) {
$port = defined $1 ? "$2.$3" : "$3";
if ( defined $desc->{$key}
&& $desc->{$key}
=~ /^Ethernet\s(?:Routing\s)?Switch\s\d|^Virtual\sServices\sPlatform\s\d/
&& $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ )
{
$port = defined $1 ? "$2.$3" : "1.$3";
}
$lldp_port{$key} = $port;
@@ -221,10 +228,13 @@ sub lldp_id {
if ( $type =~ /mac/ ) {
$id = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) );
}
elsif ($type eq 'networkAddress') {
if ( length(unpack('H*', $id)) == 10 ) {
elsif ( $type eq 'networkAddress' ) {
if ( length( unpack( 'H*', $id ) ) == 10 ) {
# IP address (first octet is sign, I guess)
my @octets = (map { sprintf "%02x",$_ } unpack('C*', $id))[1..4];
my @octets
= ( map { sprintf "%02x", $_ } unpack( 'C*', $id ) )
[ 1 .. 4 ];
$id = join '.', map { hex($_) } @octets;
}
}
@@ -237,39 +247,43 @@ sub lldp_platform {
my $lldp = shift;
my $partial = shift;
my $rid = $lldp->lldp_rem_id($partial) || {};
my $rid = $lldp->lldp_rem_id($partial) || {};
my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
my $name = $lldp->lldp_rem_sysname($partial) || {};
my %lldp_platform;
foreach my $key (keys %$rid) {
foreach my $key ( keys %$rid ) {
$lldp_platform{$key} = $desc->{$key} || $name->{$key};
}
return \%lldp_platform;
}
sub lldp_cap {
my $lldp = shift;
my $lldp = shift;
my $partial = shift;
my $lldp_caps = $lldp->lldp_rem_cap_spt($partial) || {};
my $lldp_caps = $lldp->lldp_rem_cap_spt($partial) || {};
# Encoded as BITS which Perl Net-SNMP implementation doesn't seem to
# be able to enumerate for us, so we have to get it from the MIB
# and enumerate ourselves
my $oid = SNMP::translateObj('lldpRemSysCapEnabled',0,1) || '';
my $enums = ((ref {} eq ref $SNMP::MIB{$oid}{'enums'}) ? $SNMP::MIB{$oid}{'enums'} : {});
my $oid = SNMP::translateObj( 'lldpRemSysCapEnabled', 0, 1 ) || '';
my $enums = (
( ref {} eq ref $SNMP::MIB{$oid}{'enums'} )
? $SNMP::MIB{$oid}{'enums'}
: {}
);
my %r_enums = reverse %$enums;
my %lldp_cap;
foreach my $key ( keys %$lldp_caps ) {
my $cap_bits = $lldp_caps->{$key};
next unless $cap_bits;
my $count = 0;
foreach my $bit (split //,$cap_bits) {
if ( $bit ) {
push ( @{$lldp_cap{$key}}, $r_enums{$count});
foreach my $bit ( split //, $cap_bits ) {
if ($bit) {
push( @{ $lldp_cap{$key} }, $r_enums{$count} );
}
$count++;
}

View File

@@ -41,7 +41,7 @@ use SNMP::Info;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );

View File

@@ -41,7 +41,7 @@ use SNMP::Info::Layer1;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
# Set for No CDP
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );

View File

@@ -41,7 +41,7 @@ use SNMP::Info::Layer1;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
# Set for No CDP
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );

View File

@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::MIBS,

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer1;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer1::MIBS,

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::MIBS,

View File

@@ -45,7 +45,7 @@ use SNMP::Info::PowerEthernet;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,

170
Info/Layer2/3Com.pm Normal file
View File

@@ -0,0 +1,170 @@
package SNMP::Info::Layer2::3Com;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::LLDP;
use SNMP::Info::CDP;
@SNMP::Info::Layer2::3Com::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::3Com::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::Layer2::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::LLDP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::LLDP::MUNGE,
);
sub os {
return '3Com';
}
sub serial {
my $dev = shift;
my $e_serial = $dev->e_serial();
# Find entity table entry for this unit
foreach my $e ( sort keys %$e_serial ) {
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
return $e_serial->{$e};
}
}
}
sub os_ver {
my $dev = shift;
my $e_swver = $dev->e_swver();
# Find entity table entry for this unit
foreach my $e ( sort keys %$e_swver ) {
if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
return $e_swver->{$e};
}
}
}
sub vendor {
return '3Com';
}
sub model {
my $dsmodel = shift;
my $descr = $dsmodel->description();
if ( $descr =~ /^([\S ]+) Software.*/){
return $1;
}
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::3Com - SNMP Interface to L2 3Com Switches
=head1 AUTHOR
Max Kosmach
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $router = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $router->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for 3Com L2 devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=head2 Overrides
=over
=item $device->vendor()
Returns '3Com'
=item $device->os()
Returns '3Com'
=item $device->os_ver()
Return os version
=item $device->model()
Returns device model extracted from description
=item $device->serial()
Returns serial number
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -40,7 +40,7 @@ use SNMP::Info::Airespace;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,

View File

@@ -49,7 +49,7 @@ use SNMP::Info::IEEE802dot11;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%GLOBALS = (
%SNMP::Info::IEEE802dot11::GLOBALS,

View File

@@ -40,7 +40,7 @@ use SNMP::Info::Layer1;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );

View File

@@ -46,7 +46,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::LLDP::MIBS,

View File

@@ -48,7 +48,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,

View File

@@ -41,7 +41,7 @@ use SNMP::Info::Layer2::Cisco;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%GLOBALS = (
%SNMP::Info::Layer2::Cisco::GLOBALS,

View File

@@ -42,7 +42,7 @@ use SNMP::Info::Layer2::Cisco;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::Cisco::MIBS,

View File

@@ -43,7 +43,7 @@ use SNMP::Info::SONMP;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS,
@@ -385,11 +385,6 @@ Returns 'Centillion'
=over
=item $centillion->layers()
Returns 00000011. Class emulates Layer 2 functionality through proprietary
MIBs.
=item $centillion->index_factor()
Required by SNMP::Info::SONMP. Number representing the number of ports

View File

@@ -52,7 +52,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::MIBS,

View File

@@ -50,7 +50,7 @@ use SNMP::Info::CDP;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
# This will be filled in with the device's index into the EntPhysicalEntry
# table by the serial() function.

View File

@@ -52,7 +52,7 @@ use SNMP::Info::Aggregate;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -44,7 +44,7 @@ use SNMP::Info::CDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -41,7 +41,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::MIBS,

View File

@@ -36,7 +36,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::MIBS,

View File

@@ -43,7 +43,7 @@ use SNMP::Info::Airespace;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,

View File

@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Bridge;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS,

View File

@@ -33,32 +33,31 @@ package SNMP::Info::Layer2::Netgear;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::Entity;
use SNMP::Info::LLDP;
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Entity SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
# 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::Entity::MIBS, %SNMP::Info::LLDP::MIBS, );
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::LLDP::MIBS, );
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Entity::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
ng_fsosver => '.1.3.6.1.4.1.4526.11.11.1.0',
ng_gsmserial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
ng_gsmosver => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
);
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Entity::FUNCS, %SNMP::Info::LLDP::FUNCS, );
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::LLDP::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Entity::MUNGE, %SNMP::Info::LLDP::MUNGE, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, );
sub vendor {
return 'netgear';
@@ -153,133 +152,6 @@ sub os_ver {
return $netgear->ng_fsosver() if defined $netgear->model and $netgear->model =~ m/FS\d/i;
}
# Use LLDP
sub hasCDP {
my $netgear = shift;
return $netgear->hasLLDP() || $netgear->SUPER::hasCDP();
}
sub c_ip {
my $netgear = shift;
my $partial = shift;
my $cdp = $netgear->SUPER::c_ip($partial) || {};
my $lldp = $netgear->lldp_ip($partial) || {};
my %c_ip;
foreach my $iid ( keys %$cdp ) {
my $ip = $cdp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
foreach my $iid ( keys %$lldp ) {
my $ip = $lldp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
return \%c_ip;
}
sub c_if {
my $netgear = shift;
my $partial = shift;
my $lldp = $netgear->lldp_if($partial) || {};
my $cdp = $netgear->SUPER::c_if($partial) || {};
my %c_if;
foreach my $iid ( keys %$cdp ) {
my $if = $cdp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
foreach my $iid ( keys %$lldp ) {
my $if = $lldp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
return \%c_if;
}
sub c_port {
my $netgear = shift;
my $partial = shift;
my $lldp = $netgear->lldp_port($partial) || {};
my $cdp = $netgear->SUPER::c_port($partial) || {};
my %c_port;
foreach my $iid ( keys %$cdp ) {
my $port = $cdp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
foreach my $iid ( keys %$lldp ) {
my $port = $lldp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
return \%c_port;
}
sub c_id {
my $netgear = shift;
my $partial = shift;
my $lldp = $netgear->lldp_id($partial) || {};
my $cdp = $netgear->SUPER::c_id($partial) || {};
my %c_id;
foreach my $iid ( keys %$cdp ) {
my $id = $cdp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
foreach my $iid ( keys %$lldp ) {
my $id = $lldp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
return \%c_id;
}
sub c_platform {
my $netgear = shift;
my $partial = shift;
my $lldp = $netgear->lldp_rem_sysdesc($partial) || {};
my $cdp = $netgear->SUPER::c_platform($partial) || {};
my %c_platform;
foreach my $iid ( keys %$cdp ) {
my $platform = $cdp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
foreach my $iid ( keys %$lldp ) {
my $platform = $lldp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
return \%c_platform;
}
1;
__END__
@@ -399,49 +271,6 @@ Uses the i_name() field.
=back
=head2 Topology information
Based upon the software version devices may support Link Layer Discovery
Protocol (LLDP).
=over
=item $netgear->hasCDP()
Returns true if the device is running LLDP.
=item $netgear->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $netgear->c_ip()
Returns reference to hash. Key: iid Value: remote IPv4 address
If multiple entries exist with the same local port, c_if(), with the same IPv4
address, c_ip(), it may be a duplicate entry.
If multiple entries exist with the same local port, c_if(), with different
IPv4 addresses, c_ip(), there is either a non-LLDP device in between two or
more devices or multiple devices which are not directly connected.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $netgear->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $netgear->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $netgear->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.

View File

@@ -41,7 +41,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::MIBS,

View File

@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS,

177
Info/Layer2/Ubiquiti.pm Normal file
View File

@@ -0,0 +1,177 @@
# SNMP::Info::Layer2::Ubiquiti
# $Id$
#
package SNMP::Info::Layer2::Ubiquiti;
use strict;
use Exporter;
use SNMP::Info::IEEE802dot11;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Ubiquiti::ISA
= qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Ubiquiti::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::IEEE802dot11::MIBS,
);
%GLOBALS
= ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, );
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::IEEE802dot11::FUNCS,
);
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, );
sub os {
return 'Ubiquiti';
}
sub os_ver {
my $dot11 = shift;
my $versions = $dot11->dot11_prod_ver();
foreach my $iid ( keys %$versions ) {
my $ver = $versions->{$iid};
next unless defined $ver;
return $ver;
if ( $ver =~ /([\d\.]+)/ ) {
return $1;
}
}
return;
}
sub vendor {
return 'Ubiquiti Networks, Inc.';
}
sub model {
my $dot11 = shift;
my $names = $dot11->dot11_prod_name();
foreach my $iid ( keys %$names ) {
my $prod = $names->{$iid};
next unless defined $prod;
return $prod;
}
return;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Ubiquiti - SNMP Interface to Ubiquiti Access Points
=head1 AUTHOR
Max Kosmach
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $ubnt = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $ubnt->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from
Ubiquiti Access Point through SNMP.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $ubnt = new SNMP::Info::Layer2::Ubiquiti(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=item SNMP::Info::IEEE802dot11
=back
=head2 Required MIBs
None.
=head2 Inherited MIBs
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $ubnt->vendor()
Returns 'Ubiquiti Networks, Inc.'
=item $ubnt->model()
Returns the model extracted from C<dot11manufacturerProductName>.
=item $ubnt->os()
Returns 'Ubiquiti'
=item $ubnt->os_ver()
Returns the software version extracted from C<dot11manufacturerProductVersion>.
=back
=head2 Global Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Table Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
=cut

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
# Set for No CDP
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );

View File

@@ -51,7 +51,7 @@ use SNMP::Info::AdslLine;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS,

View File

@@ -41,7 +41,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -49,7 +49,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -40,7 +40,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE
$int_include_vpn $fake_idx $type_class/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -48,7 +48,7 @@ use SNMP::Info::Aggregate;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -43,7 +43,7 @@ use SNMP::Info::Bridge;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE %MODEL_MAP
%MODID_MAP %PROCID_MAP/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS,

View File

@@ -36,7 +36,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,

View File

@@ -47,7 +47,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
$VERSION = '3.16';
$VERSION = '3.20';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm

View File

@@ -44,7 +44,7 @@ use SNMP::Info::MAU;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MAU::MIBS,

View File

@@ -51,7 +51,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm

View File

@@ -55,7 +55,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -124,6 +124,7 @@ sub i_vlan {
my $i_vlan = $cisco->SUPER::i_vlan($partial);
foreach my $idx ( keys %$i_descr ) {
next unless $i_type->{$idx};
if ( $i_type->{$idx} eq 'l2vlan'
|| $i_type->{$idx} eq '135' && !defined $i_vlan->{$idx} )
{

View File

@@ -34,7 +34,7 @@ package SNMP::Info::Layer3::CiscoASA;
use strict;
use warnings;
use Exporter;
use SNMP::Info::CiscoStack;
use SNMP::Info::CiscoStats;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::CiscoASA::ISA = qw/
@@ -45,22 +45,22 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStack::MIBS, );
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, );
%GLOBALS
= ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStack::GLOBALS, );
= ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS, );
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoStack::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
'mac_table' => 'ifPhysAddress',
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::CiscoStack::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
'mac_table' => \&SNMP::Info::munge_mac,
);
@@ -134,7 +134,7 @@ Subclass for Cisco ASA Devices
=over
=item SNMP::Info::CiscoStack
=item SNMP::Info::CiscoStats
=item SNMP::Info::Layer3
@@ -146,7 +146,7 @@ Subclass for Cisco ASA Devices
=item Inherited Classes' MIBs
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
@@ -171,9 +171,9 @@ configured interface name instead of "Adaptive Security Appliance
=back
=head2 Globals imported from SNMP::Info::CiscoStack
=head2 Globals imported from SNMP::Info::CiscoStats
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::Layer3
@@ -184,9 +184,9 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
These are methods that return tables of information in the form of a
reference to a hash.
=head2 Table Methods imported from SNMP::Info::CiscoStack
=head2 Table Methods imported from SNMP::Info::CiscoStats
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer3

View File

@@ -33,29 +33,29 @@ package SNMP::Info::Layer3::CiscoFWSM;
use strict;
use warnings;
use Exporter;
use SNMP::Info::CiscoStack;
use SNMP::Info::CiscoStats;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::CiscoStack
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::CiscoStats
SNMP::Info::Layer3
Exporter/;
@SNMP::Info::Layer3::CiscoFWSM::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStack::MIBS, );
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, );
%GLOBALS
= ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStack::GLOBALS, );
= ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS, );
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoStack::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoStack::MUNGE, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoStats::MUNGE, );
# For FWSMs, the ipNetToPhysicalPhysAddress table appears to be of the form:
# $ifindex.$inetaddresstype.$proto.$ip_address -> $mac_address
@@ -163,7 +163,7 @@ Subclass for Cisco Firewall Services Modules
=over
=item SNMP::Info::CiscoStack
=item SNMP::Info::CiscoStats
=item SNMP::Info::Layer3
@@ -175,7 +175,7 @@ Subclass for Cisco Firewall Services Modules
=item Inherited Classes' MIBs
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
@@ -183,9 +183,9 @@ See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=head1 GLOBALS
=head2 Globals imported from SNMP::Info::CiscoStack
=head2 Globals imported from SNMP::Info::CiscoStats
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::Layer3
@@ -221,9 +221,9 @@ the MIB to provide that information isn't supported on FWSM.
=back
=head2 Table Methods imported from SNMP::Info::CiscoStack
=head2 Table Methods imported from SNMP::Info::CiscoStats
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer3

View File

@@ -50,7 +50,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::Cisco::MIBS,

View File

@@ -42,7 +42,7 @@ use SNMP::Info::Entity;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS,

View File

@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -44,7 +44,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS,

View File

@@ -46,7 +46,7 @@ use SNMP::Info::EDP;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -38,7 +38,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -43,7 +43,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -48,7 +48,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -47,7 +47,7 @@ use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -82,7 +82,7 @@ $VERSION = '3.16';
sub vendor {
my $h3c = shift;
my $mfg = $h3c->entPhysicalMfgName(1) || {};
return $mfg->{1};
return $mfg->{1} || "H3C";
}
sub os {
@@ -90,7 +90,7 @@ sub os {
my $descr = $h3c->description();
return $1 if ( $descr =~ /(\S+)\s+Platform Software/ );
return;
return "H3C";
}
sub os_ver {
@@ -101,6 +101,7 @@ sub os_ver {
my $os_ver = undef;
$os_ver = "$1 $2" if ( $descr =~ /Software Version ([^,]+),.*(Release\s\S+)/i );
$os_ver = "$1" if ( $descr =~ /Product Version ([0-9.]+)/i );
return $ver_release->{2} || $os_ver;
}

View File

@@ -42,7 +42,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -41,7 +41,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -89,6 +89,20 @@ sub os {
return 'junos';
}
sub layers {
my $juniper = shift;
my $layers = $juniper->SUPER::layers();
# Some models don't report L2 properly
my $macs = $juniper->fw_mac();
if (keys %$macs) {
my $l = substr $layers, 6, 1, "1";
}
return $layers;
}
sub os_ver {
my $juniper = shift;
@@ -590,6 +604,11 @@ Returns 'juniper'
Returns 'junos'
=item $juniper->layers()
Checks forwarding table for Layer 2 support since some routers with switches
do not report layers properly.
=item $juniper->os_ver()
Returns the software version extracted first from C<sysDescr> or

View File

@@ -41,7 +41,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( %SNMP::Info::Layer3::MIBS, );

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -41,7 +41,7 @@ use SNMP::Info::SONMP;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -40,7 +40,7 @@ use SNMP::Info::IEEE802dot11;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -46,7 +46,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
@@ -129,6 +129,12 @@ sub ip_table {
$ip_table{$ip} = $ip;
}
my $local_addrs = $nexus->_local_addr();
foreach my $addr (keys %$local_addrs) {
$ip_table{$addr} = $addr unless exists $ip_table{$addr};
}
return \%ip_table;
}
@@ -146,6 +152,12 @@ sub ip_index {
$ip_index{$ip} = $index;
}
my $local_addrs = $nexus->_local_addr();
foreach my $addr (keys %$local_addrs) {
$ip_index{$addr} = 0 unless exists $ip_index{$addr};
}
return \%ip_index;
}
@@ -163,6 +175,12 @@ sub ip_netmask {
$ip_netmask{$ip} = $netmask;
}
my $local_addrs = $nexus->_local_addr();
foreach my $addr (keys %$local_addrs) {
$ip_netmask{$addr} = $local_addrs->{$addr} unless exists $ip_netmask{$addr};
}
return \%ip_netmask;
}
@@ -180,9 +198,29 @@ sub ip_broadcast {
$ip_broadcast{$ip} = $broadcast;
}
my $local_addrs = $nexus->_local_addr();
foreach my $addr (keys %$local_addrs) {
$ip_broadcast{$addr} = $addr unless exists $ip_broadcast{$addr};
}
return \%ip_broadcast;
}
sub _local_addr {
my $nexus = shift;
my $listen_addr = $nexus->udpLocalAddress() || {};
my %local_addr;
foreach my $sock (keys %$listen_addr) {
my $addr = $listen_addr->{$sock};
next if ($addr =~ /^127\./); # localhost
next if ($addr eq '0.0.0.0'); # "any"
next if ($addr =~ /^(\d+)\./ and $1 ge 224); # Class D or E space: Multicast or Experimental
$local_addr{$addr} = '255.255.255.255'; # Fictional netmask
}
return \%local_addr;
}
1;
__END__
@@ -283,6 +321,13 @@ Each entry in this table is an IP address in use on this device. Some
versions do not index the table with the IPv4 address in accordance with
the MIB definition, these overrides correct that behavior.
Also, the table is augmented with IP addresses in use by UDP sockets on the
device, as determined by checking F<RFC1213-MIB::udpLocalAddress>. Valid
addresses from this table (any IPv4 that is not localhost, 0.0.0.0, Class D
(multicast) or Class E (experimental) are added as a /32 on interface ID 0.
This is a workaround to determine possible VPC Keepalive IP addresses on the
device, which are probably advertised by CDP/LLDP to neighbors.
=over
=item $nexus->ip_index()

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -43,7 +43,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::RapidCity::MIBS,

View File

@@ -41,7 +41,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -39,7 +39,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -36,7 +36,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( %SNMP::Info::Layer3::MIBS, );

View File

@@ -30,6 +30,7 @@
package SNMP::Info::Layer3::Tasman;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer3;
@@ -41,7 +42,7 @@ use SNMP::Info::MAU;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -65,15 +66,9 @@ $VERSION = '3.16';
'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.16';
*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 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__
@@ -229,7 +426,7 @@ Grabs the os version from C<nnsysVersion>
(C<nnenvPwrsupType.2>)
=item $tasman->ps2_status()
(C<nnenvPwrsupStatus.2>)
=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<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.

View File

@@ -40,7 +40,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = ( %SNMP::Info::Layer3::MIBS, 'TIMETRA-GLOBAL-MIB' => 'timetraReg', );

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
$VERSION = '3.20';
%MIBS = (
%SNMP::Info::MIBS,

Some files were not shown because too many files have changed in this diff Show More