Compare commits

...

312 Commits

Author SHA1 Message Date
Oliver Gorwits
8b8ee8693e release 3.12 2014-02-10 21:08:24 +00:00
Oliver Gorwits
fe89001166 Foundry/Brocade aggreate port master ifIndex resolved properly 2014-02-09 12:41:46 +00:00
Eric A. Miller
416a18377c Modify L3::Passport to obtain forwarding table information from RAPID-CITY if information is not available in either Q-BRIDGE-MIB or BRIDGE-MIB. Needed for VSP 9000 prior to version 4.x (Tobias Gerlach) 2014-01-29 20:40:19 -05:00
Eric A. Miller
8fda38184c [#52] NETSCREEN-IP-ARP-MIB considered harmful 2014-01-28 23:06:53 -05:00
Oliver Gorwits
280e9260f7 release 3.11 2014-01-26 13:47:38 +00:00
Eric A. Miller
22642c1095 Skip default CPU management addresses on VSP and 8800/8600 series in L3::Passport to prevent erroneous duplicate addresses 2014-01-20 21:59:53 -05:00
Oliver Gorwits
d68b2047b0 rename IEEE802dot3ag to IEEE802dot3ad 2014-01-19 17:11:42 +00:00
Eric A. Miller
7240f034e5 Regex cleanup for additional support of Avaya 8800 series in L3::Passport 2014-01-19 12:03:50 -05:00
Eric A. Miller
97ce41e363 Additional documentation for new LAG support 2014-01-19 11:00:50 -05:00
Eric A. Miller
31a8abc3b8 Squashed commit of the following:
commit 9be20cd3e24b401d5bfeb2bcb40d61a7b33ffe2c
Author: Eric A. Miller <emiller@cpan.org>
Date:   Sun Jan 19 10:13:41 2014 -0500

    Re-organize part 2

commit 058fc6e000a27b8ffadf5857078e0ab1569d3fa2
Author: Eric A. Miller <emiller@cpan.org>
Date:   Sun Jan 19 10:08:31 2014 -0500

    Re-organize

commit 04f4602d6cf06f917bd4f19db737f877a46fd28e
Author: Eric A. Miller <emiller@cpan.org>
Date:   Sun Jan 19 10:04:09 2014 -0500

    Add MLT agg_ports() support for Avaya

commit 2cdc3aed77f551e3c6d04f4cfe390a876010ebcb
Author: Oliver Gorwits <oliver@cpan.org>
Date:   Sun Jan 12 14:24:38 2014 +0000

    implement LAG support for Foundry

commit 7465816b53981f3211bdeb5a7a414d5a4e65c79f
Author: Oliver Gorwits <oliver@cpan.org>
Date:   Sun Jan 12 13:15:13 2014 +0000

    implement LAG support for Arista

commit 67e8f13f635f4fb450ab5df6e9145830ef72cf7b
Author: Oliver Gorwits <oliver@cpan.org>
Date:   Sun Jan 12 12:59:09 2014 +0000

    update gitignore to ignore SNMP dir

commit df4ca0eb44a4f0e5aa114630f0d22b5c9d7861f3
Author: Oliver Gorwits <oliver@cpan.org>
Date:   Sun Jan 12 12:49:53 2014 +0000

    implement LAG support for Cisco
2014-01-19 10:25:41 -05:00
Eric A. Miller
6b49bfd4c4 methods take precedence over globals, make sure that all classes have methods defined if needed to override new fw_mac and fw_port methods in Bridge class 2014-01-13 20:41:28 -05:00
Eric A. Miller
985b4aab3f Use Q-BRIDGE-MIB as default with fallback to BRIDGE-MIB across all classes for the fw_mac, fw_port, and fw_status methods 2014-01-10 19:26:38 -05:00
Eric A. Miller
a4e7c3a61a Fix Extreme XOS i_vlan_membership - Revert [28bbe0], fix bug with untagged being added to @ret twice (Robert Kerr) 2014-01-09 21:31:58 -05:00
Eric A. Miller
d82d8781c4 [#51] Collect nsIfMngIp when getting IP interfaces in L3::Netscreen 2014-01-04 18:33:20 -05:00
Eric A. Miller
b4c3f92ba3 Modify cdp_cap() to handle devices which return space delimited strings for cdpCacheCapabilities rather than hex strings 2013-12-17 19:18:52 -05:00
Oliver Gorwits
1c57d2eab8 release 3.10 2013-12-16 08:19:41 +00:00
Eric A. Miller
409de77b2c Merge branch 'master' of ssh://git.code.sf.net/p/snmp-info/code
Conflicts:
	ChangeLog
2013-12-15 20:25:31 -05:00
Eric A. Miller
3e22e24dc9 Data values of zero are now sent to munge method instead of skipped 2013-12-15 20:19:08 -05:00
Oliver Gorwits
17b1bdacfe release 3.09 2013-12-16 00:02:39 +00:00
Eric A. Miller
b570fdbc89 Enable new *_cap methods in _get_topo_data() 2013-12-15 18:07:26 -05:00
Eric A. Miller
cceb0f4e5e Update change log 2013-12-15 11:05:29 -05:00
Eric A. Miller
04f8c7f7e2 Add c_cap() method which return a hash of arrays with each array containing the system capabilities reported as supported by the remote system via CDP or LLDP. 2013-12-15 11:04:14 -05:00
Eric A. Miller
37aca89af7 munge_caps() is no longer in use, so remove 2013-12-15 10:24:45 -05:00
Eric A. Miller
5445a496db Munge fdp_capabilities the same as cdp_capabilities, retain all the bits during munge 2013-12-15 10:21:50 -05:00
Eric A. Miller
0ab93b142c Correctly unpack bits in munge_bits() 2013-12-15 10:15:55 -05:00
Eric A. Miller
d39dc76949 [RT: #78232] Extend cdpCacheCapabilities to show more CDP bits
Add cdp_cap() which returns hash of arrays with each array containing the system capabilities supported by the remote system.
2013-12-15 10:11:34 -05:00
Eric A. Miller
c6abd7b62b Add lldp_cap() which returns hash of arrays with each array containing the system capabilities supported by the remote system. 2013-12-15 08:56:27 -05:00
Eric A. Miller
0e572db832 lldp_platform() now tries to return something useful from either lldp_rem_sysdesc() or lldp_rem_sysname(). 2013-12-15 08:34:27 -05:00
Eric A. Miller
602bb15b47 Alias lldp_rem_sysdesc() as lldp_platform() to provide a clue to type of remote LLDP device. 2013-12-08 21:55:24 -05:00
Eric A. Miller
b4882285c4 Fix power module indexing 2013-11-21 20:36:34 -05:00
Eric A. Miller
834b27bdad Fix for single instance table leafs in test_class_mocked.pl 2013-11-19 21:05:07 -05:00
Eric A. Miller
7db148a5a1 Aruba POE Support
Aruba utilizes Q-BRIDGE-MIB when available for VLAN information to better support wired switches
Capture serial number on newer Aruba devices
2013-11-19 21:03:37 -05:00
Eric A. Miller
9e332095a2 Attempt to fill in missing bp_index mappings on wired Aruba switches. 2013-11-18 21:33:17 -05:00
Eric A. Miller
7bf950026b POD spelling corrections 2013-11-17 20:35:12 -05:00
Eric A. Miller
f246444d89 [#41] Riverbed Steelhead support added in new class L3::Steelhead 2013-11-17 20:28:49 -05:00
Eric A. Miller
8e84aea1bf Add identification of IOS XR and version in CiscoStats 2013-11-17 14:53:41 -05:00
Eric A. Miller
d6a7a944cc Don't assume entity index 1 is the chassis and has serial in Layer3. 2013-11-17 14:50:21 -05:00
Eric A. Miller
fb478d3c7b When determining the BSSID in Airespace there is only one hexadecimal digit available so skip if outside the range of 1-16, 17 is reserved for 3rd party AP's. 2013-11-08 19:42:40 -05:00
Eric A. Miller
24f8a8fdba Remove "Switch" from model name in L3::Foundry 2013-11-08 19:16:42 -05:00
Eric A. Miller
28bbe0ee19 Modify _xos_i_vlan_membership() in L3::Extreme to only include tagged ports 2013-11-07 23:28:13 -05:00
Oliver Gorwits
c21ca2062e support *i_untagged in Bridge.pm to work on other platforms (falls back to *i_vlan) 2013-11-03 00:36:54 +00:00
Oliver Gorwits
e3e289a27c set_i_untagged combines both set_i_vlan and set_i_pvid in one method 2013-11-02 19:19:26 +00:00
Eric A. Miller
9540f6b9d3 L3::IBMGbTor defaults to lldpInfoRemoteDevicesLocalPort in lldp_if() unless there is a cross reference to either ifAlias or ifDescr
L3::IBMGbTor lldp_id() now uses lldpInfoRemoteDevicesSystemName
Add lldp_platform() support in L3::IBMGbTor
L3::IBMGbTor POD updates
2013-11-02 11:02:03 -04:00
Eric A. Miller
539943fb0f Correct LLDP address type detection in L3::IBMGbTor 2013-10-25 20:15:01 -04:00
Eric A. Miller
7a8ebffd40 Merge branch 'master' of ssh://git.code.sf.net/p/snmp-info/code
Conflicts:
	ChangeLog
2013-10-23 23:27:51 -04:00
Eric A. Miller
3d48f4e210 [#45] IBM (Blade Network Technologies) Rackswitch support in new class L3::IBMGbTor 2013-10-23 23:18:26 -04:00
Oliver Gorwits
667cdbea13 release 3.08 2013-10-22 09:54:57 +01:00
Eric A. Miller
f5fb4dd3b0 Silence warning from uninitialized variable in L3::Passport e_descr() 2013-10-18 19:19:46 -04:00
Eric A. Miller
5a2722d049 Clean up more model names in L2::Baystack 2013-10-18 19:13:04 -04:00
Eric A. Miller
f3b6cfbd01 [#49] Perl 5.18 UNIVERSAL::can change could cause infinite loop 2013-10-18 19:02:46 -04:00
Oliver Gorwits
e239a6057c release 3.07_001 2013-10-17 19:05:15 +01:00
Bill Fenner
9b1c439e15 Use LLDP in Layer3::Aruba, for switches. 2013-10-17 07:35:13 -07:00
Eric A. Miller
074f2e7c8f Fix ignore Net-SNMP configuration file snmp.conf option in t/test_class.pl and t/util/test_class_mocked.pl 2013-10-15 22:26:51 -04:00
Eric A. Miller
4b1533e925 Don't try to munge undef values 2013-10-15 21:52:18 -04:00
Eric A. Miller
6812a60668 Support peth_port_power() power supplied by PoE ports in L2::Baystack 2013-10-15 21:50:49 -04:00
Eric A. Miller
6f0cb846f0 Get AP MAC->IP mappings arp cache table augmentation methods 2013-10-15 20:30:12 -04:00
Eric A. Miller
c79307692b [#46] Brocade (Foundry) Module Support
Brocade (Foundry) POE Support
2013-10-15 20:27:09 -04:00
Bill Fenner
08b2f50ac7 On EOS, the LLDP port ID is a dot1d port.
Don't bother trying the reverse-mapping through ifAlias trick, since
ifAlias is of course non-unique, if the user configures the same
description for multiple ports (e.g., "open port").
2013-10-11 11:22:20 -07:00
Eric A. Miller
3577fa1e42 update test_class.pl utility to allow ignore of snmp.conf and test summarize more standard class methods 2013-10-07 23:24:38 -04:00
Oliver Gorwits
cb6630582a Add docs note about make_snmpdata.pl under EXTENDING SNMP::Info 2013-10-07 20:59:11 +01:00
Bill Fenner
ca5fff31a7 Added missing ChangeLog entries for my two recent commits
4e2b642ed1: LLDP lldp_port()
cfce6296fb: Aironet IOS15
2013-10-07 09:49:19 -07:00
Bill Fenner
69b1f1e29e Merge branch 'master' of ssh://git.code.sf.net/p/snmp-info/code 2013-10-07 09:36:57 -07:00
Bill Fenner
4e2b642ed1 If the port ID claims to be interfaceName, use it for lldp_port
The LLDP spec says that if lldpRemPortIdSubtype is
"interface name", then lldpRemPortId should contain
ifName.  It doesn't say much about lldpRemPortDesc;
some vendors seem to always leave it empty, some use
the interface description / ifAlias.  Our algorithm
for lldp_port is now basically: If we find that
lldpRemPortIdSubtype is "interface name", then use
the lldpRemPortId, else use lldpRemPortDesc if set,
else use lldpRemPortId.
2013-10-07 09:32:18 -07:00
Eric A. Miller
3c26ce2a55 [#67] Add the possibility to set speed for Layer3::C4000 2013-10-04 21:28:37 -04:00
Eric A. Miller
7d2cf97c06 [#68] Fix device_port entries for switches with non-unique ifDesc 2013-10-04 21:22:29 -04:00
Bill Fenner
cfce6296fb Identify Layer2::Aironet running IOS15 2013-10-04 12:46:43 -07:00
Eric A. Miller
1601703ff2 [#69] set speed and duplex on Cisco VSS system (psychiatric) 2013-10-03 22:01:27 -04:00
Eric A. Miller
905ad3e2b7 miscellaneous POD updates 2013-10-03 20:26:11 -04:00
Eric A. Miller
15b7e95545 Rewrite of L3::Aruba, now supports pseudo ENTITY-MIB methods to gather module information, more interface information for APs, more wireless information to include client stats, and arpnip information from wireless clients. WARNING: AP device interfaces are now based on AP MAC and radio versus BSSID to align with other wireless classes. 2013-10-03 20:07:27 -04:00
Eric A. Miller
247f6f038d modify munge_null to remove all control characters 2013-10-02 23:39:52 -04:00
Eric A. Miller
7c6df7cce3 [#64] Add i_speed_admin() to L2::2900 (psychiatric) 2013-10-01 21:42:09 -04:00
Eric A. Miller
1a92306d51 [#66] Support for VSS via CISCO-VIRTUAL-SWITCH-MIB in L3::6500 2013-10-01 21:31:51 -04:00
Oliver Gorwits
59e9fae1d5 release 3.07 2013-10-01 20:21:29 +01:00
Eric A. Miller
998094241d update changelog with Nexus bug fixes 2013-09-29 23:35:24 -04:00
Eric A. Miller
d6c3313138 fix for device serial, just use entry with no parent since class could be stack rather than chassis 2013-09-29 23:17:32 -04:00
Eric A. Miller
b7e252b91a Overrides ipAddrTable methods, some versions do not index the table with the IPv4 address in accordance with the MIB definition.
Fix for device serial number to use the fabric serial number.
2013-09-29 22:27:39 -04:00
Jeroen van Ingen
6071beb15d Basic support for Pica8 switches in L3::Pica8 2013-09-20 14:55:48 +02:00
Oliver Gorwits
cda830686d [#48] Switch duplicate J9624A for J9626A in Layer2/HP (R. Kerr) 2013-08-24 16:57:24 +01:00
Oliver Gorwits
a29b888620 new release - 3.05 2013-08-16 17:54:08 +01:00
Oliver Gorwits
ae5a4d413d new release - 3.04_001 2013-08-16 09:27:04 +01:00
Nic Bernstein
03c4d1e81f Merge commit 'c3a727'
Updated ChangeLog to resolve conflicts
Conflicts:
	ChangeLog
2013-08-14 08:32:01 -05:00
Nic Bernstein
4efa0fd509 ENHANCEMENT ADD CISCO SMALL BUSINESS SUPPORT
Updated new package Info::Layer2::CiscoSB to remove hackish
index with index derived from EntPhysicalEntry table search.
2013-08-09 12:21:10 -05:00
Nic Bernstein
c3a727ce10 ENHANCEMENT TO INFO::LAYER2::NETGEAR
Clean up recent code, fix POD details, remove unnecessary hacks.
2013-08-09 10:39:45 -05:00
Nic Bernstein
afa97d845b ENHANCEMENT TO INFO::LAYER2::NETGEAR
* Add LLDP support for Netgear devices which provide it.
	* Change $netgear->interfaces() to use ifName rather than ifDescr
	  as the former is unique per interface while the latter is not.
	  If ifName is not present, concatenate ifDescr and ifIndex
	  to achieve a unique value.
	* Properly report hardware version, Serial No. and OS Version
2013-08-08 18:15:21 -05:00
Nic Bernstein
8671f65bfd ENHANCEMENT TO NETGEAR SUPPORT
Added LLDP support for Netgear devices which provide it.
Changed $netgear->interfaces() to use ifName rather than ifDescr
as the former is unique per interface while the latter is not.
2013-08-08 14:15:28 -05:00
Nic Bernstein
37737a6494 UPDATE CHANGELOG FOR CISCOSB ADDITION 2013-08-02 10:57:03 -05:00
Nic Bernstein
0ce8a55b88 ADD SUPPORT FOR CISCO SMALL BUSINESS DEVICES
New Feature: Support for the Cisco Small Business product line.  These
switches, currently the Sx300 and Sx500, were inherited from Linksys
and do not run IOS.

This has been tested with the following Cisco products:
 - SRW2024P-K9 V02i   (SG 300-28P)
 - SRW208P-K9 V02     (SF 300-8P)
 - SRW224G4P-K9 V02   (SF 300-24P)

We welcome reports from others, either success or failure.
2013-08-02 10:44:58 -05:00
Jeroen van Ingen
22dd49c1dc Add HP 2530 and 2920 models to Layer2::HP MODEL_MAP & re-sort the list 2013-08-02 15:34:54 +02:00
Oliver Gorwits
fd5812aefc version bump - 3.03 2013-07-11 12:36:58 +01:00
Oliver Gorwits
f4e37cdabe Add missing =back to POD (A. Hartmaier) 2013-07-11 12:34:51 +01:00
Oliver Gorwits
5324760463 version bump - 3.02 2013-07-08 21:25:14 +01:00
Oliver Gorwits
27120045d2 [RT#86725] - Identify Cisco Catalyst 3850 as Layer3::C6500 (C. Causer) 2013-07-08 21:19:32 +01:00
Oliver Gorwits
abfd93ea1b remove evil tabs 2013-07-08 21:15:06 +01:00
Jeroen van Ingen
070d911c60 Add support for Aruba LAN switches.
Known issue with Aruba AOS 7.2.0.0: nodes on "trusted" LAN ports in "access"
mode point to non-existing bp_index values; they will be mapped to the wrong
interface or not be mapped to an interface at all.
2013-06-24 10:42:58 +02:00
Jeroen van Ingen
8b14776c9a Add release date to headings for version 3.01 and 3.02 2013-06-24 10:35:30 +02:00
Oliver Gorwits
2d62372c7f Identify Cisco Aironet 1140 APs as Layer2::Aironet 2013-05-25 01:25:59 +01:00
Oliver Gorwits
3eae0b9d5c Support Alcatel devices with layer3 features. 2013-05-21 09:35:38 +01:00
Nic Bernstein
9a722bb2f8 Properly pull os_ver from Netgear GS series switches. 2013-04-15 16:30:32 -05:00
Oliver Gorwits
d3e39a4132 bump version for stable release 2013-04-13 11:05:26 +01:00
Oliver Gorwits
d82d495dcf final patch from Nic to fix arrayism 2013-04-11 17:07:47 +01:00
Oliver Gorwits
198df7cee4 update changelog 2013-04-11 17:06:52 +01:00
Oliver Gorwits
46cdb4c166 update manifest 2013-04-11 17:01:37 +01:00
Oliver Gorwits
62005c52d2 update VERSION 2013-04-11 17:00:28 +01:00
Oliver Gorwits
ca7651628d bug fix for Class name typos 2013-04-11 16:59:02 +01:00
Alexander Hartmaier
6358b7ad70 override i_description for Cisco ASA firewalls to return the configured interface name 2013-04-10 18:46:39 +02:00
Alexander Hartmaier
8aca1d97c0 fixed Cisco ASA detection for newer versions that return has_layer(3) 2013-04-10 18:27:08 +02:00
Moe Kraus
275a533843 added subclass for Cisco ASA firewalls which filters bad mac addresses in b_mac method 2013-04-10 18:26:31 +02:00
Oliver Gorwits
21bd4c662d bump version again for dev release 2013-02-11 13:43:19 +00:00
Oliver Gorwits
47d9d091d1 fix code in L3/Extreme to pass tests and be more correct 2013-02-11 13:41:49 +00:00
Eric A. Miller
da2ea09e84 Bump version 2013-02-10 22:52:51 -05:00
Eric A. Miller
9c71bdbcef [3598896] - Lantronix device support (J R Binks) and [3598337] - Lantronix SLC support 2013-02-10 22:40:03 -05:00
Eric A. Miller
318f9518b1 Support Juniper (Trapeze) Wireless Controllers in new class L2::Trapeze 2013-02-10 22:16:43 -05:00
Eric A. Miller
19e9fb5f67 Add more default topology methods to test_class_mocked.pl 2013-02-10 21:31:05 -05:00
Eric A. Miller
41833c1f29 Add new classes to MANIFEST 2013-02-10 21:28:40 -05:00
Eric A. Miller
4e2f950e41 [3033731] - Alcatel-Lucent OmniSwich AMAP Support 2013-02-10 21:27:52 -05:00
Eric A. Miller
ebe3f39ea1 Update README 2013-02-10 13:12:34 -05:00
Eric A. Miller
c6521d0b48 Use default Perl Critic policy as the older Conway PBP policy is outdated and includes depreciated modules, set severity to 5 2013-02-10 13:06:29 -05:00
Eric A. Miller
74b5c9f0e3 Use default Perl Critic policy as the older Conway PBP policy is outdated and includes depreciated modules 2013-02-10 13:05:46 -05:00
Eric A. Miller
4bfebe1563 Topology c_* methods should no longer be defined / overridden in device classes 2013-02-10 13:00:51 -05:00
Eric A. Miller
2ac4e65827 Mark extremeware_i_vlan(), extremeware_i_vlan_membership(), xos_i_vlan(), and xos_i_vlan_membership() as private, external API is i_vlan() and i_vlan_membership(). POD updates. 2013-02-10 12:58:22 -05:00
Eric A. Miller
b7a135db10 POD typo 2013-02-10 12:40:10 -05:00
Eric A. Miller
d4c460fd3d Fix for Perl::Critic flagged warning 2013-02-10 12:38:16 -05:00
Eric A. Miller
8f0ac35381 POD updates - spell check 2013-02-10 12:34:45 -05:00
Eric A. Miller
a9a3229c22 Bump version for first 3.0 beta release 2013-02-10 10:23:35 -05:00
Eric A. Miller
5da622ff88 POD update for Pod::Coverage 2013-02-10 10:03:54 -05:00
Eric A. Miller
32f33f5150 Update for removal of L2::Bay and L2::Foundry 2013-02-10 09:56:03 -05:00
Eric A. Miller
242013f3b0 - Corrections to mappings of interface attributes previously inherited from base class
- Simplify nsIfIndex to ifIndex mapping in _nsif_if_map()
- Fallback for interface attributes not support on versions prior to 5.4
- Change vendor to juniper
- Mark internal mapping methods private
- Documentation updates
2013-02-10 09:50:37 -05:00
Eric A. Miller
e46deb505f Fix for i_speed_admin() issue reported by Jiri Dvorak 2013-02-09 20:39:45 -05:00
Eric A. Miller
5d443fd1be fix for mocked getnext method when first IID is zero 2013-02-08 22:19:46 -05:00
Eric A. Miller
d53152858c [3323814] - Arp support for Netscreen (David Baldwin)
[3323821] - Add support for Netscreen w/ WLAN (eg SSG5) (David Baldwin)
2013-02-04 23:24:06 -05:00
Eric A. Miller
aefb31fb58 Updates to device matrix for Airespace, APC, Avaya, Bluecoat, Cisco, Kentrox, Mikrotik, and PacketFront. Change cdp attribute to topo. 2013-02-04 19:15:36 -05:00
Eric A. Miller
0be8219b9c Update device matrix for Extreme support 2013-02-04 18:22:35 -05:00
Eric A. Miller
cbb8bc5d77 Update device matrix for Citrix support 2013-02-04 18:17:16 -05:00
Eric A. Miller
6969dcbfec Remove depreciated L2::Bay and L2::Foundry for 3.0 release. Functionality is available through L2::Baystack and L3::Foundry respectively and they are no longer referenced by other classes. 2013-02-04 18:04:14 -05:00
Eric A. Miller
9e463ddddf Updates to documentation for Brocade acquisition of Foundry. Update of device support matrix for Foundry 2013-02-03 17:10:43 -05:00
Eric A. Miller
5ec034c475 Update Radware (Alteon) support in device matrix 2013-02-03 15:49:44 -05:00
Eric A. Miller
1694e648fc Update Juniper support device matrix 2013-02-03 15:13:22 -05:00
Eric A. Miller
16aa96ebf4 Updates to documentation for Avaya acquisition of Nortel. Update of device support matrix for recent Avaya additions 2013-02-03 14:35:51 -05:00
Eric A. Miller
43d06e184d Two new utilities added in t/util to assist in developing device support from snmpwalk output 2013-01-28 22:06:28 -05:00
Eric A. Miller
3ff432034a Fix typos in i_vlan(), ignore VirtualRouter interfaces 2013-01-28 20:15:36 -05:00
Eric A. Miller
0325bb1f25 Use fully qualified name when adding dynamically generated method to symbol table 2013-01-16 22:59:57 -05:00
Eric A. Miller
b9aebf7e9e - Move AIRESPACE-*-MIB methods to base Airespace class
- Add cd11_ssid() to support Nedisco feature request [3598089] Collect SSID in macsuck
2013-01-03 23:05:09 -05:00
Eric A. Miller
e1e693a7c8 [3599277] - Q-BRIDGE Support to collect VLAN in macsuck 2013-01-02 22:42:56 -05:00
Jeroen van Ingen
c8c548fe97 Add 'san-os' to CiscoStats os() method for Cisco devices running SAN-OS 2012-12-21 16:49:02 +01:00
Jeroen van Ingen
ddf971ed54 H3C class: use Q-BRIDGE-MIB, minor POD updates 2012-12-21 16:44:14 +01:00
Eric A. Miller
61e8f47986 [3185391] - Add support for F5 load balancers 2012-12-20 23:50:10 -05:00
Jeroen van Ingen
3ce9f403e6 Fix typo in LLDP.pm, noticed on previous commit... 2012-12-17 16:17:29 +01:00
Jeroen van Ingen
3741010044 Add extra check in LLDP local interface determination to improve H3C support 2012-12-17 16:15:32 +01:00
Eric A. Miller
badfb12243 Improved support of XOS based Extreme devices 2012-12-16 00:04:16 -05:00
Eric A. Miller
0713a6457c L2::Airespace now reports AP Ethernet MAC as port MAC for radio ports 2012-12-14 23:28:04 -05:00
Jeroen van Ingen
9abe744dac Clearly note that CiscoStats will now report IOS XE as 'ios-xe' and not as 'ios' anymore 2012-12-14 16:14:34 +01:00
Jeroen van Ingen
b4974aeacd Fix regex mistake in previous CiscoStats.pm update 2012-12-14 14:41:54 +01:00
Jeroen van Ingen
688a0de498 Add fallback method to determine IOS & IOS-XE versions when parsing description() failed 2012-12-13 17:10:35 +01:00
Jeroen van Ingen
7cef8465fa Load extra MIBs in H3C class to improve object type resolving 2012-12-13 14:40:03 +01:00
Eric A. Miller
532279d2b8 [rt.cpan.org #81781] [PATCH] Fix spelling error in Info/Layer7/APC.pm 2012-12-11 20:51:40 -05:00
Eric A. Miller
d67ffc3a6c Merge branch 'og-2-10-force10'
Conflicts:
	ChangeLog
	Info.pm
	Info/CiscoStpExtensions.pm
2012-12-11 20:22:17 -05:00
Eric A. Miller
c6776b1755 Multiple bug fixes for AUTOLOAD generated set_ methods 2012-12-10 20:06:42 -05:00
Oliver Gorwits
49566977ad update README 2012-12-08 23:35:40 +00:00
Oliver Gorwits
daf512e33e bump version 2012-12-08 23:35:25 +00:00
Oliver Gorwits
74816fc043 Add fall-back for sysDescr on Force10 2012-12-08 23:33:27 +00:00
Oliver Gorwits
c88e37e9b5 update MANIFEST and README 2012-12-08 20:08:39 +00:00
Oliver Gorwits
c1c448f3df update version 2012-12-08 20:06:51 +00:00
Oliver Gorwits
4f168a538b add W. Bulley's patch for Force10 support 2012-12-08 19:47:22 +00:00
Eric A. Miller
d94630af35 Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-12-07 21:36:37 -05:00
Eric A. Miller
999dd1f468 Remove debug comment 2012-12-07 21:28:48 -05:00
Eric A. Miller
c3d5631c3c Doc update 2012-12-07 21:26:54 -05:00
Eric A. Miller
9dae6b20d7 Add support for 802.11n client tx rates 2012-12-07 21:26:00 -05:00
Carlos Vicente
4005640a2b Check if \$stp_ver is defined (Wim Vandersmissen) 2012-12-07 09:23:52 -05:00
Eric A. Miller
ca446faacf Support for Citrix Netscaler appliances in new class L7::Netscaler 2012-12-05 19:56:29 -05:00
Eric A. Miller
240539bd24 [3564920] LLDP-MIB::lldpLocPortDesc isn't always unique part 2 - use ifName() instead of i_name() 2012-12-04 23:15:43 -05:00
Eric A. Miller
08e335f39c Typo in IPV6-MIB i6_n2p_phys_addr definition 2012-12-04 21:48:33 -05:00
Eric A. Miller
a9cc14b265 reverse accidental deletion during last commit 2012-12-04 20:38:36 -05:00
Eric A. Miller
9505f119b3 New configuration option 'IgnoreNetSNMPConf' will ignore Net-SNMP configuration files on object initialization 2012-12-04 20:13:44 -05:00
Jeroen van Ingen
683edf1668 Initial version for L3::H3C class. Work in progress, needs a lot of testing. LLDP doesn't map neighbors to correct ports yet. 2012-12-03 19:42:09 +01:00
Eric A. Miller
d9c52c1a88 Update internal comments 2012-11-30 20:20:47 -05:00
Eric A. Miller
0f1a76a564 AUTOLOAD once again tries to determine if a MIB leaf is a single instance returning a scalar or part of a table returning a reference to a hash. 2012-11-30 20:08:32 -05:00
Eric A. Miller
15cd354bae [3564920] LLDP-MIB::lldpLocPortDesc isn't always unique, use LLDP-MIB::lldpLocPortId this cross references to ifName 2012-11-29 22:48:24 -05:00
Eric A. Miller
91d67ed0ae Support for newer Radware Alteon ADC switches 4408/4416/5412/5224 and older AWS 2000/3000 series in existing L3::AlteonAD 2012-11-29 22:45:09 -05:00
Eric A. Miller
0740a7bd5e Correct an issue in _load_attr() when specifying the Module (MIB) as a prefix to resolve leaf name conflicts between private MIBs. Add even more verbose debugging output for _global and _load_attr() - now reports Module qualified leaf name and full OID to include any partial passed. 2012-11-29 21:35:38 -05:00
Eric A. Miller
84493a99b4 Merge branch 'em-autoload-topo'
Conflicts:
	ChangeLog
2012-11-28 23:18:39 -05:00
Eric A. Miller
f730fa3325 update changelog 2012-11-28 22:52:47 -05:00
Eric A. Miller
4b1007cb66 Support Avaya (Trapeze) Wireless Controllers in new class L2::NWSS2300 2012-11-28 22:48:24 -05:00
Eric A. Miller
436f7442b6 Add support for Avaya VSP 7000 series 2012-11-28 19:49:25 -05:00
Eric A. Miller
3af05ebba5 correction for passing partial on initial AUTOLOAD 2012-11-28 19:38:04 -05:00
Oliver Gorwits
c7db0371aa fixes to pas critic tests 2012-11-28 22:02:29 +00:00
Oliver Gorwits
53860aaa46 update README with new docs 2012-11-28 19:15:00 +00:00
Oliver Gorwits
829a4bf16a update version for release 2012-11-28 19:13:38 +00:00
Eric A. Miller
a83bc1bcb2 New global 2012-11-27 23:05:23 -05:00
Eric A. Miller
af65bb3a2b Add support for Avaya VSP 9000 2012-11-27 22:41:06 -05:00
Eric A. Miller
f2d9f6be27 New global 2012-11-27 22:39:25 -05:00
Eric A. Miller
ecea4ef4a4 Correct naming of global id method 2012-11-26 23:03:55 -05:00
Eric A. Miller
e4e099510a Documentation updates 2012-11-26 23:03:01 -05:00
Eric A. Miller
de28ff96c2 Strip orig_ from method name in _global() and _load_attr() 2012-11-26 20:46:26 -05:00
Eric A. Miller
6692ddcf1f Override peth_power_watts() with Extreme specific MIB 2012-11-26 19:51:05 -05:00
Eric A. Miller
ba7a105eb1 Additional documentation 2012-11-26 19:36:11 -05:00
Eric A. Miller
b9fb232859 New globals 2012-11-26 19:29:10 -05:00
Eric A. Miller
6f54cb429e New global box_descr() 2012-11-26 19:22:40 -05:00
Eric A. Miller
ae3398b11a Replace map function with hash iteration for munge handling in _load_attr() and _show_attr 2012-11-25 22:42:49 -05:00
Eric A. Miller
e97693d12d Rename c_* methods to cdp_* since c_* methods now report all topology. 2012-11-25 21:46:54 -05:00
Eric A. Miller
435bb7dbe2 No longer emulate CDP methods in other discovery protocol classes, use the class name as base (sonmp, fdp) rather than cdp. 2012-11-25 21:45:56 -05:00
Eric A. Miller
70bc5e78e9 Remove c_* methods from device classes as top level methods now handle. 2012-11-25 21:43:31 -05:00
Eric A. Miller
a163e5b82c Remove c_* methods from device classes as top level methods will now handle. 2012-11-25 21:39:32 -05:00
Eric A. Miller
5eb66fe442 Create new top level c_* topology methods and has_topo() method. 2012-11-25 20:38:55 -05:00
Eric A. Miller
b6cf462b16 Top level changes to Info.pm
1 - Simplify AUTOLOAD()
2 - Add dynamically generated methods to symbol table to avoid AUTOLOAD on subsequent calls
3 - Override UNIVERSAL::can() to work with dynamic methods
4 - [3160037] - Support _raw suffix on methods to skip munging
5 - Add default bulkwalk_no()
2012-11-23 22:58:46 -05:00
Oliver Gorwits
ead15a1cde revert part of 13478343cd which used $partial zero if not provided 2012-11-01 19:26:24 +00:00
Oliver Gorwits
9c19c70029 revert cac2224fa1 LLDP bug fixes 2012-11-01 19:22:43 +00:00
Jeroen van Ingen
0862047241 Classify Linksys 2024 as L3::Dell 2012-10-29 14:58:33 +01:00
Jeroen van Ingen
6cfce1916d Workaround for IPv6 neighbor cache on Cisco Nexus, check data before returning. Also minor PoD fix in CiscoConfig.pm. 2012-10-29 13:34:47 +01:00
Jeroen van Ingen
1e37bfa8ce Fix typo in PoD for Bridge.pm, reported by William Bulley 2012-10-18 11:17:57 +02:00
Carlos Vicente
87197067a0 Minor POD fix 2012-10-03 15:15:48 -04:00
Eric A. Miller
8264f68f6c Add i_ssidmac() method to get BSSID's from AP's 2012-08-02 23:27:48 -04:00
Eric A. Miller
3e21357e8d Add i_ssidmac() to get BSSID's, grab radio base MAC as port MAC for AP's 2012-08-02 23:23:04 -04:00
Eric A. Miller
ee5953d743 [3017571] Add LLDP support for NetSNMP device class (begemot) 2012-07-31 21:09:28 -04:00
Eric A. Miller
46f941b416 Typo in POD 2012-07-31 20:19:28 -04:00
Eric A. Miller
225e12e979 Add support for Juniper SSL VPN appliances in L7::Neoteris 2012-07-31 19:44:24 -04:00
Eric A. Miller
912ba274a6 Ignore loopback, other, and cpu interfaces. Use IfDescr for interface since we don't have SNMP-REPEATER-MIB loaded and methods defined. 2012-07-31 16:26:30 -04:00
Eric A. Miller
18f59db2b9 Add support for Avaya Secure Routers in L3::Tasman 2012-07-31 14:43:58 -04:00
Eric A. Miller
f0ca1a5fa3 Cisco Nexus support 2012-07-31 14:40:54 -04:00
Eric A. Miller
446e5a13f7 Cisco Nexus support - new class L3::Nexus 2012-07-30 23:14:44 -04:00
Eric A. Miller
e8a9d18445 Fix to return cached data for table methods (funcs) if available and not a partial request. Partial argument could be undef, but existed in methods supporting partial fetches. Changed check to see if there is a value in the partial argument rather than existence. 2012-07-25 20:41:33 -04:00
Eric A. Miller
6256f33079 [2809045] Strip preceding netscreen from model name in L3::Netscreen 2012-07-15 23:00:30 -04:00
Eric A. Miller
b5c4bd99bf hasCDP() wasn't calling proper method for FDP check. 2012-07-15 22:55:17 -04:00
Eric A. Miller
56dae91c8a Add new EDP class to top level documentation and MANIFEST 2012-07-15 22:50:43 -04:00
Eric A. Miller
0661b1307a [1424336] Support for Extreme Discovery Protocol (EDP) and add EDP and LLDP L2 Topology to L3::Extreme 2012-07-15 22:38:24 -04:00
Eric A. Miller
cd112f4925 [3418918] Report actual OS not vendor for extreme devices 2012-07-15 22:00:28 -04:00
Oliver Gorwits
14bf6b84d3 bump version for release 2012-07-15 17:27:42 +01:00
Eric A. Miller
5c22a29e40 Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-07-14 08:01:09 -04:00
Eric A. Miller
f1806f227b Add check required due to default partial 2012-07-14 07:56:24 -04:00
Oliver Gorwits
025e7b72b5 bump version for release; push_ver deletes .orig files 2012-07-10 17:54:54 +01:00
Jeroen van Ingen
97b398051f Fix BlueCoat serial 2012-07-09 13:53:26 +02:00
Eric A. Miller
e21d8516fb Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-07-08 21:48:29 -04:00
Eric A. Miller
2972c70177 [3541442] Change L2::Catalyst port names to what is reported in CDP 2012-07-08 21:45:13 -04:00
Eric A. Miller
50b4274f68 [2132349] Add an additional check to get Foundry OS version 2012-07-08 21:29:56 -04:00
Oliver Gorwits
75dc93f2c0 update MANIFEST for Kentrox, BlueCoatSG, SonicWall, APC 2012-07-07 19:34:45 +01:00
Oliver Gorwits
73fd627815 bump version for release; fixes for POD and Perl::Critic 2012-07-07 19:32:13 +01:00
Eric A. Miller
9e84141983 Fix reporting of base MAC and get OS version of more devices in Juniper 2012-07-04 09:37:21 -04:00
Eric A. Miller
bd6591db7b Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-07-04 08:23:48 -04:00
Eric A. Miller
515e876491 POD fix 2012-07-03 21:10:58 -04:00
Eric A. Miller
6105046ae9 Add pseudo ENTITY-MIB methods for hardware information 2012-07-03 21:09:12 -04:00
Jeroen van Ingen
f0eb0a9ded Updated MODEL_MAP in L2::HP, added 2620 and 3800 series 2012-07-02 17:06:14 +02:00
Jeroen van Ingen
a227db586b Added Cat6k/Sup2T to L3::C6500 class, bit more comments around the checks that result in L3::C6500 classification 2012-06-29 15:17:59 +02:00
Jeroen van Ingen
04eafd3e61 Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-06-28 13:07:44 +02:00
Eric A. Miller
3b25711e1f * Add method to report current transmit power of the radio
interface, dot11_cur_tx_pwr_mw(), in Airespace class
* Correct reporting of SSID broadcast status in Airespace class
2012-06-27 20:48:26 -04:00
Eric A. Miller
63687b5f8f [3323842] Juniper EX/SRX correct VLAN tag support - i_vlan() fix 2012-06-27 00:23:16 -04:00
Eric A. Miller
cac2224fa1 LLDP bug fixes 2012-06-27 00:19:05 -04:00
Jeroen van Ingen
44da7544b7 Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-06-25 09:54:38 +02:00
Eric A. Miller
13478343cd Don't assume that lldpRemLocalPortNum is the same as ifIndex, try to cross reference lldpLocPortDesc with ifDescr to get ifIndex first. Revert commit eb5a492, patch request 3297786, and deal with timeMark by setting partial fetch to zero by default which should be a valid value according to RFC 2021. 2012-06-24 23:19:53 -04:00
Jeroen van Ingen
a7aeae0aa2 Add very basic support for Blue Coat SG series devices. Not tested yet. 2012-06-15 15:02:38 +02:00
Carlos Vicente
876fb9946b Bump version number in Juniper.pm 2012-06-05 14:57:01 -04:00
Carlos Vicente
e5853962b5 Wrong section of the Changelog 2012-06-05 14:56:48 -04:00
Carlos Vicente
3eaa2ae230 Updated Changelog 2012-06-05 14:08:59 -04:00
Carlos Vicente
cd1acd023e Include LLDP information in output from cdp methods in C6500.pm. Same strategy as in HP.pm 2012-06-05 13:11:55 -04:00
Carlos Vicente
e2a314b553 Added patch #3523320 (New vlan methods for Layer3/Juniper.pm) 2012-05-22 15:02:08 -04:00
Jeroen van Ingen
102a2a03e8 Reverting commit b3fb18e (SF #3076592) since it seems to break retrieving tables using v2 & bulkwalk 2012-04-19 17:57:42 +02:00
Brian De Wolf
8be0f9e06f Merge branch 'bldewolf-L3-root_ip'
This commit makes the Layer3 root_ip determination a little more picky about
the OSPF ID.  My initial patch that Oliver committed would blindly accept the
OSPF ID if it was set.  Instead, we check if it's actually a route advertised
by the device (in case someone uses OSPF IDs that aren't actually related to
the device), otherwise we fall back to picking the first /32 in the routing
table.
2012-04-13 10:44:20 -07:00
Jeroen van Ingen
40239ea078 [3497004] AutoSpecify defaults to "off", reflect that in POD (a2w)
and update README to be in line with Info.PM POD clarifications
2012-04-13 10:20:29 +02:00
Oliver Gorwits
47032cbb4a [3502533] Layer2/Baystack interface indexes > 513 (Robert Nyqvist) 2012-04-12 15:47:23 +01:00
Oliver Gorwits
11dbeb2741 [3497004] Clarify POD description of default values (a2w) 2012-04-12 15:44:02 +01:00
Oliver Gorwits
5242d16e02 [3472052] moduleSerialNumber support for Cisco Stack (Slava) 2012-04-12 15:38:25 +01:00
Oliver Gorwits
428c007543 [3268104] CiscoVTP.pm i_vlan_membership() array bounds (Michael Sanderson) 2012-04-12 15:29:08 +01:00
Oliver Gorwits
d0fbfdea86 [3136084] Rename Allied Telesyn to Allied Telesis (Oliver Gorwits) 2012-04-12 15:25:16 +01:00
Oliver Gorwits
b3fb18eee6 [3076592] Not an ARRAY reference in Info.pm (Oliver Gorwits) 2012-04-12 15:19:59 +01:00
Oliver Gorwits
7d470fd0e8 [2986858] Fix the patch from this ticket (Oliver Gorwits) 2012-04-12 15:02:31 +01:00
Oliver Gorwits
295e6fb283 [2980789] Fix root_ip to try OSPF RouterID first (Brian De Wolf) 2012-04-12 14:50:38 +01:00
Oliver Gorwits
9e545e8cf8 fix overly liberal Version parsing - thanks LT 2012-04-12 14:24:46 +01:00
Oliver Gorwits
182589745f [2037444] os_ver fails on some Extreme versions (Robert Kerr) 2012-04-12 14:14:09 +01:00
Oliver Gorwits
bdfc430564 [3469527] Netgear LLDP Support (Nic Bernstein) 2012-04-12 10:56:53 +01:00
Oliver Gorwits
2da37f06ea [3317739] Fix for Baystack without POE on stack member 1 (David Baldwin) 2012-04-12 10:27:55 +01:00
Oliver Gorwits
eb5a492eb9 [3297786] LLDP INDEX munged to ignore TimeMark component (David Baldwin) 2012-04-12 10:10:51 +01:00
Oliver Gorwits
e79f031cb7 [3286549] Dell LLDP Support (Nico Giefing) 2012-04-12 09:52:26 +01:00
Oliver Gorwits
86909ae236 [3085413] SNMP OIDs for Netgear Serial and OS Ver (phishphreek) 2012-04-12 09:26:34 +01:00
Oliver Gorwits
69861e7660 [3085411] Activate L3 properties for Netgear GSM7224v2 (phishphreek) 2012-04-12 08:32:43 +01:00
Oliver Gorwits
5054b1b5b5 update DeviceMatrix for Kentrox 2012-04-12 08:32:29 +01:00
Oliver Gorwits
a2496a536d [2996795] Support for Kentrox devices in new class L2::Kentrox (phishphreek) 2012-04-12 08:24:03 +01:00
Oliver Gorwits
f4ebe6a102 forgot to git-add SonicWALL.pm 2012-04-11 14:55:44 +01:00
Oliver Gorwits
b10b922aa0 [2993691] Support for SonicWALL devices in new class L3::SonicWALL (phishphreek) 2012-04-11 14:47:35 +01:00
Jeroen van Ingen
a8673cc076 Small fix to L7::APC to silence Netdisco error that POWERNET-MIB couldn't be found 2011-11-11 13:18:21 +01:00
Jeroen van Ingen
2dd1cdc281 Add vendor-based & layer-based fallback classification for Layer7 2011-11-11 10:44:16 +01:00
Jeroen van Ingen
ccd03ae6d2 Add Layer7::APC class for basic APC UPS device support 2011-11-11 10:39:45 +01:00
Jeroen van Ingen
7e0771e065 Add Layer7 base class 2011-11-11 10:38:02 +01:00
Oliver Gorwits
e9fd3731a9 [2988163] Detect Juniper SSG firewalls as Layer3::Netscreen (R. Kerr) 2011-10-05 10:43:57 +01:00
Oliver Gorwits
a5f242c28f new ChangeLog stub entry 2011-09-28 11:19:45 +01:00
Oliver Gorwits
43d1718618 bump ver for release, remove VERSION_CVS variable
update MANIFEST
2011-09-28 11:17:26 +01:00
Oliver Gorwits
d64f0d4a5e added doc stubs for two new classes HPVC and AdslLine 2011-09-28 11:08:18 +01:00
Alexander Hartmaier
4a13ee8991 switched ChangeLog format to Moose style 2011-09-27 11:05:06 +02:00
Alexander Hartmaier
8764916086 Support for ADSL-LINE-MIB in new class AdslLine 2011-09-27 10:19:17 +02:00
Alexander Hartmaier
78b0b77e38 Added i_stack_status method that can be used for finding the parent interface for e.g. ADSL interface speed determination 2011-09-27 10:11:26 +02:00
Jeroen van Ingen
8a7376f6df Update ChangeLog wrt patch SF #3408506 2011-09-23 11:54:07 +02:00
Michael Borgelt
c9a36f12e6 Fix Use of uninitialized value in substr at /usr/share/perl5/SNMP/Info/IPv6.pm line 113. It is caused by an empty mac in local loopback interface on cisco devices.
Signed-off-by: Jeroen van Ingen <jeroen@utwente.nl>
2011-09-23 11:41:53 +02:00
Michael Borgelt
8199e2a973 Fix failure in POD.
Signed-off-by: Jeroen van Ingen <jeroen@utwente.nl>
2011-09-22 17:21:50 +02:00
Jeroen van Ingen
e1f3fb3a44 Fix generic device classification bug for devices w/o L1-L3 support
Commit 52275e92 made a small change in generic device classification
based on sysObjectID for devices that don't report Layer1 - Layer3
capabilities, in order to skip generic assignment if a more specific
class had already been determined. However this change contained an
error causing generic classification to fail.
Nex fix explicitly checks if class isn't more specific than SNMP::Info
before attempting to classify based on sysObjectID.
2011-09-21 17:04:48 +02:00
Jeroen van Ingen
52275e92af New class L2::HPVC for VirtualConnect blade switches
HP VirtualConnect product family includes ethernet-switch-like products
with their own MIBs. This new class adds basic support for these devices.
2011-09-09 17:49:52 +02:00
Jeroen van Ingen
5d9eec0992 New Layer3::Mikrotik class added to MANIFEST
The Layer3/Mikrotik.pm file should be in MANIFEST for the next release.
2011-09-09 17:42:54 +02:00
Jeroen van Ingen
cd9c637ba5 test_class.pl script: also test devices without layers / sysServices
The test_class.pl script refused to test devices that don't implement
sysServices. Since SNMP::Info has been modified to check connectivity
by testing sysDescr as well, test_class.pl should follow that behaviour.
2011-09-09 17:14:01 +02:00
Jeroen van Ingen
0bc405792a Updated changelog to reflect previous 2 commits 2011-09-05 12:43:14 +02:00
Jeroen van Ingen
8fb36625bc Add proper classing for Cisco blade switches to Layer2 section as well, for CBS devices reporting L2 capability only 2011-09-05 11:35:32 +02:00
Jeroen van Ingen
674eca23b9 POD clarification on how i_speed() is munged to human friendly values 2011-09-05 10:06:31 +02:00
Jeroen van Ingen
cfc1ead848 New L3::Mikrotik class for Mikrotik devices running RouterOS. Initial, very basic version. 2011-08-31 15:11:13 +02:00
Jeroen van Ingen
c41ffdfd2d Documentation fix: add reference to Layer3::PacketFront class in POD 2011-08-30 13:17:35 +02:00
Jeroen van Ingen
df4708383b Updated ChangeLog to reflect chages from commits 2c2f4a9e and 497c81a0 2011-08-15 17:16:16 +02:00
Jeroen van Ingen
497c81a0c6 Updates to Layer2::HP class to get os_ver & serial from web managed
HP ProCurve switches. Based on patch & bug report from J R Binks,
SF #3344843.
2011-08-11 14:37:42 +02:00
Jeroen van Ingen
2c2f4a9ea1 Add Layer3::PacketFront device class to support PacketFront DRG devices 2011-08-05 12:26:34 +02:00
Brian De Wolf
feffa6d47e Fix grep statement in L3 root_ip
The grep statement was comparing the router_ip with the SNMP OID-looking keys
instead of the values which were just the IPs.
2011-07-07 10:42:00 -07:00
Brian De Wolf
3bb33fa8d4 Fix syntax errors in L3 changes
Fix some syntax errors in my improvement code for L3 so that it actually runs.
2011-06-27 16:06:56 -07:00
Brian De Wolf
30a73c035a Prefer OSPF router ID in L3 root_ip
The previous behavior of root_ip meant that whatever /32 hosted by the device
that got listed first would be chosen as the root_ip.  If the device only
serves one /32 this works fine, but if there are multiple /32s we could easily
pick the one that is not the intended address meant for management.

Instead, before we pick whatever /32 may exist, we now try to pick the /32 that
is also the OSPF router ID (the router ID is a 32-bit unique identifier which,
while not guaranteed, tends to be an IPv4 address unique to the device).
Otherwise we fall back to the previous method of finding the root_ip.
2011-06-24 01:44:20 -07:00
Brian De Wolf
5c44fc0b28 Fix ordering in Info::CiscoStats POD
The header for a section got moved away from its content.
2011-06-23 13:57:25 -07:00
Brian De Wolf
a54b446dae Avoid Perl warnings in Info::CiscoStack
These two points in CiscoStack use a value from a hash in a numerical
comparison without verifying they exist.  If they don't, Perl warnings get
emitted.  Instead, we check for existence first, then compare the value.
2011-06-23 13:51:43 -07:00
Oliver Gorwits
631010ed3f prep for 2.05 CPAN release 2011-06-23 21:12:27 +01:00
Brian De Wolf
8506638e5c Promote L2::Aruba to L3::Aruba
Aruba controllers can act as L3 devices and provide L3 information through the
standard MIBs.  This change makes Aruba devices get recognized as such.
Layer2.pm and Layer3.pm provide roughly the same functionality so there should
be little to no impact for Aruba devices only acting as L2 entities.
2011-06-23 12:40:36 -07:00
Brian De Wolf
c0f3a8eb2b Fix call in L2::Aironet
A call to a function in Aironet was wrong and has been corrected.
2011-06-22 13:35:26 -07:00
Oliver Gorwits
662d870ad7 added Oliver to the AUTHORS list 2011-04-25 07:44:03 +00:00
Jeroen van Ingen
08746d6b10 Fixed i_speed_raw not returning raw values (Alexander Hartmaier)
(forgot to commit the updated Changelog when committing the patch to Info.pm)
2011-03-31 15:44:56 +00:00
122 changed files with 18875 additions and 4892 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*.db
SNMP

334
ChangeLog
View File

@@ -1,5 +1,334 @@
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
ChangeLog $Id$
version 3.12 (2014-02-10)
[ENHANCEMENTS]
* Modify L3::Passport to obtain forwarding table information from
RAPID-CITY if information is not available in either Q-BRIDGE-MIB or
BRIDGE-MIB. Needed for VSP 9000 prior to version 4.x (Tobias Gerlach)
[BUG FIXES]
* [#52] NETSCREEN-IP-ARP-MIB considered harmful
* Foundry/Brocade aggreate port master ifIndex resolved properly
version 3.11 (2014-01-26)
[NEW FEATURES]
* [#31] port-channel (aggregate) support. Aggregate support added in new
agg_ports() method. Inital support added for Arista (ifStack),
Avaya (MLT), Brocade (MST), and Cisco (802.3ad).
[ENHANCEMENTS]
* Use Q-BRIDGE-MIB as default with fallback to BRIDGE-MIB across all
classes for the fw_mac, fw_port, and fw_status methods
* Additional support for Avaya 8800 series in L3::Passport
[BUG FIXES]
* Modify cdp_cap() to handle devices which return space delimited strings
for cdpCacheCapabilities rather than hex strings
* [#51] Netdisco shows broken topology for devices with no alias entry
for primary IP - Collect nsIfMngIp when getting IP interfaces in
L3::Netscreen
* Fix Extreme XOS i_vlan_membership - Revert [28bbe0], fix bug with
untagged being added to @ret twice (Robert Kerr)
* Skip default CPU management addresses on VSP and 8800/8600 series in
L3::Passport to prevent erroneous duplicate addresses
version 3.10 (2013-12-16)
[BUG FIXES]
* Data values of zero are now sent to munge method instead of skipped
version 3.09 (2013-12-15)
[NEW FEATURES]
* [#45] IBM (Blade Network Technologies) Rackswitch support in new class
L3::IBMGbTor
* [] set_i_untagged combines both set_i_vlan and set_i_pvid in one method
* [#41] Riverbed Steelhead support added in new class L3::Steelhead
* New c_cap(), cdp_cap(), and lldp_cap() methods which return a hash of
arrays with each array containing the system capabilities reported as
supported by the remote system via CDP or LLDP.
[ENHANCEMENTS]
* Remove "Switch" from model name in L3::Foundry
* [#49] IOS-XR support, add identification of IOS XR and version in
CiscoStats
* Aruba POE Support
* Aruba utilizes Q-BRIDGE-MIB when available for VLAN information to
better support wired switches
* Add lldp_platform() method which uses lldp_rem_sysdesc() or
lldp_rem_sysname() to provide a clue to type of remote LLDP capable
device.
* [RT#78232] Extend cdpCacheCapabilities to show more CDP bits
[BUG FIXES]
* Modify _xos_i_vlan_membership() in L3::Extreme to only include tagged
ports
* When determining the BSSID in Airespace there is only one hexadecimal
digit available so skip if outside the range of 1-16, 17 is reserved
for 3rd party AP's
* Don't assume entity index 1 is the chassis and has serial in Layer3
* Capture serial number on newer Aruba devices
* munge_bits() correctly unpacks BITS
* Fix for single instance table leafs in test_class_mocked.pl
* Fix power module indexing
version 3.08 (2013-10-22)
[ENHANCEMENTS]
* Rewrite of L3::Aruba, now supports pseudo ENTITY-MIB methods to gather
module information, more interface information for APs, more
wireless information to include client stats, and arpnip information
from wireless clients. WARNING: AP device interfaces are now based on
AP MAC and radio versus BSSID to align with other wireless classes.
* [#64] Add i_speed_admin() to L2::2900 (psychiatric)
* [#66] Support for VSS via CISCO-VIRTUAL-SWITCH-MIB in L3::6500
* [#67] Add the possibility to set speed for Layer3::C4000 (psychiatric)
* [#69] set speed and duplex on Cisco VSS system (psychiatric)
* munge_null() now removes all non-printable control characters
* Support Aironet standalone access points (Layer2::Aironet) running IOS15
* lldp_port() returns port ID instead of port description if the port ID
subtype is "interface name". This improves the ability to correlate
ports by name when a port description is also set.
* Add docs note about make_snmpdata.pl under EXTENDING SNMP::Info
* [#46] Brocade (Foundry) Module Support
* Brocade (Foundry) POE Support
* Support peth_port_power() power supplied by PoE ports in L2::Baystack
* Update test_class.pl utility to allow ignore of snmp.conf and test
summarize more standard class methods
* On EOS, the LLDP port ID is a dot1d port
* Use LLDP in Layer3::Aruba, for switches
* Clean up more model names in L2::Baystack
[BUG FIXES]
* [#68] Fix device_port entries for switches with non-unique
ifDesc (Nic Bernstein)
* Don't try to munge undef values
* [#49] Perl 5.18 UNIVERSAL::can change could cause infinite loop
* Silence warning from uninitialized variable in L3::Passport e_descr()
version 3.07 (2013-10-01)
[ENHANCEMENTS]
* Support for Pica8 switches in L3::Pica8
* Factor out cache/munge code from global/attr methods
[BUG FIXES]
* [#48] Switch duplicate J9624A for J9626A in Layer2/HP (R. Kerr)
* Correct device serial number reporting for Nexus devices
* Override ipAddrTable methods in L3::Nexus as some versions do not
index the table with the IPv4 address in accordance with the MIB
definition.
version 3.05 (2013-08-16)
[ENHANCEMENTS]
* [#47] Add model info on HP 2530 and HP 2920 series
* Add support for Cisco Small Business series
Layer2/CiscoSB class
* Add proper LLDP support to Netgear.pm
* Change $netgear->interfaces() to use ifName rather than ifDescr
as the former is unique per interface while the latter is not.
If ifName is not present, concatenate ifDescr and ifIndex
to achieve a unique value.
* Properly report hardware version, Serial No. and OS Version for
Netgear.
version 3.03 (2013-07-11)
[BUG FIXES]
* Add missing =back to POD (A. Hartmaier)
version 3.02 (2013-07-08)
[ENHANCEMENTS]
* Properly pull os_ver from Netgear GS series switches.
* Support Alcatel devices with layer3 features.
* Identify Cisco Aironet 1140 APs as Layer2::Aironet
* LAN switch support added to Layer3::Aruba class
* [RT#86725] - Identify Cisco Catalyst 3850 as Layer3::C6500 (C. Causer)
version 3.01 (2013-04-13)
[API Changes]
* The methods c_ip(), c_if(), c_port(), c_id(), and c_platform() now
represent common topology methods and will try to return a combined
hash of data from all L2 topology protocols either running on the
device or specified in the method call. The topology specific methods
have been been prefixed with the protocol name in lowercase so that
they can be called directly, sonmp_ip(), cdp_ip(), etc.
* L2::Bay and L2::Foundry have been removed from the distribution. Both
classes were depreciated and all functionality is available through
L2::Baystack and L3::Foundry.
[NEW FEATURES]
* [3160037] - Support _raw suffix on methods to skip munging
* [3185391] - Support for F5 devices in new class L3::F5
* [3323814] - Arp support for Netscreen (David Baldwin)
* [3323821] - Support for Netscreen w/ WLAN (eg SSG5) (David Baldwin)
* [3599277] - Q-BRIDGE Support to collect VLAN in macsuck
* [3033731] - Alcatel-Lucent OmniSwich AMAP Support in new AMAP class
* [3598896] - Lantronix device support (J R Binks)
* [3598337] - Lantronix SLC support
* Support for Cisco ASA in L3::CiscoASA (Kraus/Hartmaier/Bernstein)
* Support for Avaya VSP 9000 series in L3::Passport
* Support for Avaya VSP 7000 series in L2::Baystack
* Support Avaya (Trapeze) Wireless Controllers in new class L2::NWSS2300
* Support Juniper (Trapeze) Wireless Controllers in new class L2::Trapeze
* Support for newer Radware Alteon ADC switches 4408/4416/5412/5224 and
older AWS 2000/3000 series in existing L3::AlteonAD
* Support for H3C & HP A-series in new class L3::H3C
* Support for Citrix Netscaler appliances in new class L7::Netscaler
* New configuration option IgnoreNetSNMPConf will ignore Net-SNMP
configuration files on object initialization
* Two new utilities added in t/util to assist in developing device
support; make_snmpdata.pl gathers SNMP data (snmpwalk) in a format that
can be used with test_class_mocked.pl which mocks an SNMP agent to
enable testing with no network access to a device.
[ENHANCEMENTS]
* UNIVERSAL::can() now works with dynamic methods
* Dynamically generated methods are added to symbol table to avoid
AUTOLOAD on subsequent calls
* L2::Airespace now supports 802.11n client tx rates
* L2::Airespace now reports AP Ethernet MAC as port MAC for radio ports
* CiscoStats improvements to determine os versions, eg IOS XE ver on Sup7L-E
* CiscoStats now reports 'ios-xe' if the device runs IOS XE (used to be 'ios')
* Improved support of XOS based Extreme devices
[BUG FIXES]
* [3564920] - lldp_if gives wrong data for Enterasys
version 2.11 (2012-12-09)
[BUG FIXES]
* Add fall-back for sysDescr on Force10
version 2.10 (2012-12-08)
[NEW FEATURES]
* Support for Force10 devices (W. Bulley)
version 2.09 (2012-11-28)
[NEW FEATURES]
* New method i_ssidmac() to get BSSID's from AP's with initial support
in L2::Aironet and Airespace classes
* Support for Avaya Secure Routers in new class L3::Tasman
* Add EDP and LLDP L2 Topology to L3::Extreme
* [3185393] Support for Juniper SSL VPN in new class L7::Neoteris
* [3381027] Support for Cisco Nexus in new class L3::Nexus
* [1424336] Support for Extreme Discovery Protocol (EDP)
[ENHANCEMENTS]
* [3017571] Add LLDP support for NetSNMP device class (begemot)
* [3418918] Extreme devices now report OS as either extremeware or xos
* [2809045] Strip preceding netscreen from model name in L3::Netscreen
* [] Classify Linksys 2024 as L3::Dell (Rogier Krieger)
[BUG FIXES]
* Fixed logic to return cached data for table methods when available and
not a partial fetch
* Fix typo in PoD for Bridge.pm and CiscoConfig.pm (William Bulley)
* Fix/improve IPv6 neighbor cache handling, especially for Cisco Nexus
version 2.08 (2012-07-15)
[NEW FEATURES]
* Basic support for APC UPS devices
* [2993691] Support for SonicWALL devices in new class L3::SonicWALL (phishphreek)
* [2996795] Support for Kentrox devices in new class L2::Kentrox (phishphreek)
* [] Basic support for Blue Coat proxy devices in new class L3::BlueCoatSG (jeroenvi)
* [] Support Cisco 6500 / Sup2T in L3::C6500 class (jeroenvi)
[ENHANCEMENTS]
* Pseudo ENTITY-MIB methods added to L3::Juniper for hardware information
* Add method to report current transmit power of the radio interface,
dot11_cur_tx_pwr_mw(), in Airespace class
* [3085411] Activate L3 properties for Netgear GSM7224v2 (phishphreek)
* [3085413] SNMP OIDs for Netgear Serial and OS Ver (phishphreek)
* [3286549] Dell LLDP Support (Nico Giefing)
* [3469527] Netgear LLDP Support (Nic Bernstein)
* [3472052] moduleSerialNumber support for Cisco Stack (Slava)
* [3523320] Better VLAN support in Juniper class (Web Bulley)
* [3532261] LLDP support in C6500 and related (Carlos Vicente)
* [3538949] Updated switch models in L2::HP (jeroenvi)
[BUG FIXES]
* Get OS version for Juniper devices not reporting in sysDescr
* Correct base MAC reporting for Juniper devices
* Correct reporting of SSID broadcast status in Airespace class
* [3541442] Change L2::Catalyst port names to what is reported in CDP
* [2132349] Add an additional check to get Foundry OS version
* [2929883] [3413999] LLDP interface mapping issue
* [3297786] LLDP TimeMark component defaults to zero (David Baldwin)
* [2988163] Detect Juniper SSG firewalls as Layer3::Netscreen (R. Kerr)
* [3317739] Fix for Baystack without POE on stack member 1 (David Baldwin)
* [2037444] os_ver fails on some Extreme versions (Robert Kerr)
* [2980789] Fix root_ip to try OSPF RouterID first (Brian De Wolf)
* [2986858] Fix the patch from this ticket (Oliver Gorwits)
* [3136084] Rename Allied Telesyn to Allied Telesis (Oliver Gorwits)
* [3268104] CiscoVTP.pm i_vlan_membership() array bounds (Michael Sanderson)
* [3497004] Clarify POD description of default values (a2w)
* [3502533] Layer2/Baystack interface indexes > 513 (Robert Nyqvist)
version 2.06 (2011-09-28)
[NEW FEATURES]
* Support for PacketFront devices in new class L3::PacketFront
* Support for Mikrotik devices in new class L3::Mikrotik
* Support for HP VirtualConnect switches in new class L2::HPVC
* Support for ADSL-LINE-MIB in new class AdslLine
[ENHANCEMENTS]
* POD clarification on i_speed() munging by Info.pm
* Added i_stack_status method that can be used for finding the parent
interface for e.g. ADSL interface speed determination
[BUG FIXES]
* [3344843] Fix returning serial() and os_ver() for web-managable HP
switches, introduced by HP/HP4000 class split, reported by J R Binks
* [2809033] Put L2-only Cisco blade switches in L3::C6500
* [3408506] Fix uninitialized value in IPv6 when neighbor state is
incomplete (Michael Borgelt)
version 2.05 (2011-06-23)
+ Fix broken function call in L2::Aironet
+ Promote L2::Aruba to L3::Aruba, as Aruba devices can be L3 entities and
provide L3 information.
version 2.04 (2011-03-31)
+ Support for older HP switch models moved to new L2::HP4000 class
@@ -24,6 +353,7 @@ version 2.04 (2011-03-31)
+ Added support for IPv6 to physical address mapping
* Added ME340x to L3::C3550
* Added new ProCurve models to HP class
* Fixed i_speed_raw not returning raw values (Alexander Hartmaier)
version 2.01 (06/12/09)
+ Added CiscoStpExtensions Class (Carlos Vicente)
@@ -42,7 +372,7 @@ version 2.01 (06/12/09)
* Updated POD and DeviceMatrix quite a bit
* Added ENTITY-MIB to CiscoStats for better model handling above
* Fix networkaddress handling in LLDP-MIB
* Added CiscoConfig to L2::Aironet, L3::C3550 classes
* Added CiscoConfig to L2::Aironet, L3::C3550 classes
* Better SSID capabilities for L2::Aironet
* Fix CDP vs LLDP in c_id() for HP Class
* test_class.pl improvements

View File

@@ -4,26 +4,25 @@
# This file is meant to detail the cababilities
# of network devices to supply data via SNMP.
# $Id$
#
# Airespace (pre-Cisco)
#
device-vendor: Airespace
cdp:no
arpnip: no
macsuck: yes
portmac: yes
arpnip: yes
topo:no
duplex: both
vlan: yes
macsuck: yes
modules: yes
portmac: yes
vlan: yes
class: Layer2::Airespace
device-family: Airespace Wireless Controllers
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping.
note: Device will only communicate with SNMP version configured in the controller.
device: 3500, 4101, 4102
device: All
#
# Alcatel-Lucent
@@ -39,14 +38,14 @@ class: Layer3::Timetra
device: All
device-family: AOS
class: Layer2::Aruba
class: Layer3::Aruba
device: All
#
# Allied
#
device-vendor: Allied Telesyn
cdp:no
device-vendor: Allied Telesis
topo:no
class: Layer1::Allied
ver: 1
arpnip: no
@@ -63,13 +62,27 @@ ver: 2
macsuck: yes
device: All
#
# Alteon
#
device-vendor: Alteon
note: See Radware
#
# Altiga
#
device-vendor: Altiga
class: Layer3::Altiga
note: See Cisco/Altiga
#
# APC
#
device-vendor: APC
class: Layer7::APC
device-family: UPS
device: All
note: Must be SNMP management enabled.
#
# Arista
#
@@ -82,17 +95,22 @@ device: All
# Aruba
#
device-vendor: Aruba
arpnip: no
arpnip: yes
macsuck: yes
portmac: yes
duplex: no
class: Layer2::Aruba
class: Layer3::Aruba
device-family: Aruba Wireless Controllers
device-family: Aruba Wireless Controllers and LAN switches
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
note: On LAN switches, hosts connected to "trusted" switch ports in "access" mode may be mapped to incorrect ports.
device: 3500
device: 5000
device: 6000
#
# Asante
#
@@ -107,17 +125,242 @@ device-family: Asante Hubs
device: 1012
#
# Avaya
#
device-vendor: Avaya
macsuck: yes
topo: yes
device-family: BayStack Hub
duplex: both
ver: 1
modules: yes
class: Layer1::Bayhub
note: Uses proprietary MIBs to provide MAC to port mapping.
note: !Requires Advanced or Advanced Analyzer NMM
device: 102
device: System 5000
device-family: Ethernet Switch/Baystack Switch
macsuck: yes
duplex: both
vlan: write
modules: yes
class: Layer2::Baystack
device: 303, 304, 350, 380, 410, 420, 425, 460, 470
device: 450
note: !Some versions > 4.X in stacked configuration have SNMP timeout issues.
note: Labels full duplex as 20Mbit connection.
device: Business Policy Switch (BPS)
device-family: Ethernet Routing Switch
arpnip: yes
duplex: write
vlan: write
modules: yes
class: Layer2::Baystack
device: 2500, 3500, 4500, 4800, 5500, and 5600 series
device-family: Virtual Services Platform (VSP) 7000
arpnip: yes
duplex: write
vlan: write
modules: yes
class: Layer2::Baystack
device: 7024
device-family: Business Ethernet Switch
arpnip: yes
duplex: write
vlan: write
modules: yes
class: Layer2::Baystack
device: All
device-family: Centillion
duplex: both
vlan: yes
class: Layer2::Centillion
note: !Must be on version 4.x or 5.x (VLAN based) software.
device: C50, C100, 5000BH, and 5005BH
device-family: AP222x
duplex: both
modules: no
class: Layer2::NAP222x
note: !Upgrade to version 1.3 or higher.
note: Sends out topology packets if enabled but does not build neighbor table.
device: AP-2220, AP-2221
device-family: Multiprotocol Router/BayRS
arpnip: yes
portmac: yes
duplex: both
topo: no
vlan: yes
modules: yes
class: Layer3::BayRS
device: AN, ARN, ASN, BLN, BCN, 2430, and 5430
device-family: Secure Router
arpnip: yes
portmac: yes
duplex: no
topo: no
vlan: no
modules: no
class: Layer3::Tasman
device: 1001/1001S,1002,1004,2330,3120,4134
device-family: VPN Router/Contivity
arpnip: yes
macsuck: no
portmac: yes
duplex: no
topo: no
modules: yes
class: Layer3::Contivity
device: All
device-family: Ethernet Routing Switch/Passport/Accelar LAN
arpnip: yes
portmac: yes
duplex: write
vlan: write
modules: yes
class: Layer3::Passport
note: !8600 Code versions < 3.2 vlan based mac-suck and are unsupported. Upgrade code.
note: !8600 3.2 code versions < 3.2.2.2 have Bridge MIB loop. Upgrade code.
device: 8100, 8300, 8600, and 8800 series
device: Passport 1600 series
note: Software >= 2.1
device: Accelar 1050,1100,1150,1200
device-family: Virtual Services Platform (VSP) 9000
arpnip: yes
portmac: yes
duplex: write
vlan: write
modules: yes
class: Layer3::Passport
device: 9000
device-family: Ethernet Routing Switch/Passport 1600 (Software < 2.1)
arpnip: yes
portmac: yes
duplex: both
vlan: write
class: Layer3::N1600
device: 1612,1624,1648
device-family: Synoptics
duplex: both
ver: 1
class: Layer1::S3000
note: Uses proprietary MIBs to provide MAC to port mapping.
note: !Requires Advanced or Advanced Analyzer NMM
device: 281X
device: System 3000
device-family: Wireless Switch 2270
arpnip: yes
duplex: both
modules: yes
portmac: yes
vlan: yes
class: Layer2::N2270
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping.
device: 2270
device-family: Wireless Security Switches 2300 Series
arpnip: yes
portmac: yes
duplex: both
topo: no
modules: yes
class: Layer2::NWSS2300
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping.
device: All
#
# Bay
#
device-vendor: Bay
note: See Nortel
note: See Avaya
#
# Brocade
#
device-vendor: Brocade
arpnip: yes
topo: yes
duplex: link
macsuck: yes
modules: no
portmac: yes
vlan: yes
class: Layer3::Foundry
device-family: EdgeIron
device: EdgeIron 24G
note: Bug where spanning tree stuff loops forever when polled by SNMP.
device-family: FastIron
ver: 1
note: Support very limited
device: FastIron 4802
device-family: FastIron CX (ICX) series
device: 6430,6450,6610
device-family: FastIron LS (FLS) series
device: All
device-family: FastIron WorkGroup Switch (FWS) series
device: All
device-family: ServerIron GT series
device: All
#
# Bluecoat
#
device-vendor: Bluecoat
class: Layer3::Bluecoat
device-family: BlueCoat SG Series
device: All
#
# CISCO
#
device-vendor: Cisco
cdp: yes
topo: yes
ver: 2
modules: yes
@@ -141,6 +384,10 @@ class: Layer3::Altiga
device: VPN3000
note: The Cisco 3000 device can return duplicate interface names, while Netdisco expects unique interface names. To ensure unique device names I append numbers only when an interface name would not be unique without one. Interfaces with unique names keep their ifDescr name.
device: ASA
note: The Cisco ASA is the successor of the PIX which was bought from Altiga Networks.
Class: Layer3::CiscoASA
device-family: 1000
duplex: no
ver: 1
@@ -389,15 +636,16 @@ device: VG200
device-family: Wireless Controllers
class: Layer2::Airespace
cdp:no
arpnip: no
arpnip: yes
duplex: both
macsuck: yes
portmac: yes
duplex: both
vlan: yes
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping.
note: Device will only communicate with SNMP version configured in the controller.
device: 2006, 4112, 4124, 4136, 4402, 4404
device: 2000, 2100, 2500, 4100, 4400, and 5500 series
device-family: Firewall
class: Layer3::Cisco
@@ -409,6 +657,28 @@ note: !Arpnip only available for 4.x software releases.
class: Layer3::CiscoFWSM
arpnip: yes
device: Sx300, Sx500 series
device-family: Small Business switches
class: Layer2::CiscoSB
arpnip: no
macsuck: yes
#
# Citrix
#
device-vendor: Citrix
arpnip: no
topo: no
duplex: no
macsuck: no
modules: no
portmac: yes
vlan: no
class: Layer7::Netscaler
device-family: Netscaler
device: All
#
# Cyclades
#
@@ -425,7 +695,7 @@ arpnip: no
macsuck: yes
duplex: both
vlan: yes
cdp: no
topo: yes
modules: yes
class: Layer3::Dell
@@ -453,7 +723,7 @@ arpnip: yes
macsuck: yes
duplex: both
vlan: yes
cdp: yes
topo: yes
modules: yes
class: Layer3::Enterasys
@@ -470,62 +740,37 @@ device: Matrix N-Series DFE
#
device-vendor: Extreme Networks
arpnip: yes
macsuck: yes
topo: yes
duplex: both
vlan: yes
cdp: no
macsuck: yes
modules: yes
portmac: yes
vlan: yes
class: Layer3::Extreme
device-family: Alpine and Summit
device-family: ExtremeWare based devices
device: All
device: Alpine 3808
device: Summit 7i, 48si
device-family: XOS based devices
device: All
#
# FreeBSD
#
device-vendor: FreeBSD
device-famly: Pf
class: Layer3::Pf
arpnip: yes
cdp: no
topo: no
class: Layer3::Pf
note: LLDP support might be available. See note in Layer3::Pf
device-family: Pf
device: All
#
# Foundry
#
device-vendor: Foundry Networks
vlan: yes
modules: no
device-family: FastIron
class: Layer3::Foundry
ver: 1
note: Support very limited
device: FastIron 4802
device-family: EdgeIron
ver: 2
class: Layer3::Foundry
cdp: yes
duplex: yes
macsuck: yes
device: EdgeIron 24G
note: Bug where spanning tree stuff loops forever when polled by SNMP.
device-family: IronWare
class: Layer3::Foundry
ver: 2
cdp: yes
note: FDP enabled.
duplex: yes
macsuck: yes
arpnip: yes
device: FWSX424
device: ServerIronGT
device: FLS624, FLS648
note: See Brocade
#
# HP
@@ -540,7 +785,7 @@ class: Layer2::HP4000
duplex: both
macsuck: yes
arpnip: no
cdp: yes
topo: yes
vlan: write
note: devices in this class only have CDP support
note: VLAN info in HP-VLAN MIB
@@ -554,7 +799,7 @@ class: Layer2::HP
duplex: both
macsuck: yes
arpnip: no
cdp: yes
topo: yes
vlan: write
note: old firmware versions only have CDP support, more recent have LLDP
note: VLAN info in Q-BRIDGE-MIB
@@ -567,21 +812,74 @@ device: 3124,3324XL,3400cl,3500,3500yl
device: 4100GL,4200vl,5300XL,5400yy,5400zl
device: 6108,6200yl,6400cl,6410cl,6600,6600ml,8200zl
#
# Juniper
#
device-vendor: Juniper
arpnip: yes
topo: yes
duplex: link
macsuck: yes
modules: yes
portmac: yes
vlan: yes
class: Layer3::Juniper
device-family: EX-series switches
device: All
device-family: J-series router
device: All
device-family: M-series router
class: Layer3::Juniper
device: All
device-family: NetScreen
topo: no
duplex: no
modules: no
vlan: no
class: Layer3::Netscreen
device: All
device-family: SA-series SSL VPN appliances
arpnip: no
topo: no
duplex: no
modules: no
vlan: no
class: Layer7::Neoteris
device: All
device-family: SRX-series router
device: All
device-family: Wireless LAN Controllers (Trapeze)
duplex: both
class: Layer2::Trapeze
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping.
device: All
#
# Kentrox
#
device-vendor: Kentrox
class: Layer2::Kentrox
device-family: Kentrox DataSMART DSU/CSU
device: All
#
# Lantronix
#
device-vendor: Lantronix
class: Layer3::Lantronix
device-family: Terminal Servers
device: All
#
# Linksys
#
@@ -598,21 +896,31 @@ device-family: 2048
class: Layer3::Dell
device: All
#
# Microsoft
#
device-vendor: Microsoft
device-family: Windows
class: Layer3::Microsoft
device-family: Windows
device: Windows Router
#
# Mikrotik
#
device-vendor: Mikrotik
class: Layer3::Mikrotik
device-family: RouterOS
device: All
#
# Netgear
#
device-vendor: NetGear
device-family: Switches
class: Layer2::Netgear
device-family: Switches
device: All
#
@@ -621,6 +929,12 @@ device: All
device-vendor: NetScreen
note: See Juniper
#
# Neoteris
#
device-vendor: Neoteris
note: See Juniper
#
# Net-SNMP
#
@@ -639,186 +953,16 @@ device: BSD routers
# NORTEL
#
device-vendor: Nortel
macsuck: yes
cdp: proprietary
note: SONMP Discovery Protocol Supported
note: See Avaya
device-family: BayStack Hub
duplex: both
ver: 1
modules: yes
class: Layer1::Bayhub
note: Uses proprietary MIBs to provide MAC to port mapping.
note: !Requires Advanced or Advanced Analyzer NMM
#
# PacketFront
#
device-vendor: PacketFront
class: Layer3::PacketFront
device: 102
device: System 5000
device-family: Ethernet Switch/Baystack Switch
macsuck: yes
duplex: both
vlan: write
modules: yes
class: Layer2::Baystack
device: 303, 304, 350, 380, 410, 420, 425, 460, 470
device: 450
note: !Some versions > 4.X in stacked configuration have SNMP timeout issues.
note: Labels full duplex as 20Mbit connection.
device: Business Policy Switch (BPS)
device-family: Ethernet Routing Switch/Baystack Switch
arpnip: yes
duplex: write
vlan: write
modules: yes
class: Layer2::Baystack
device: 3510
device: 2526,2550
device: 4524,4526,4548,4550
device: 5510,5520,5530
device-family: Business Ethernet Switch
arpnip: yes
duplex: write
vlan: write
modules: yes
class: Layer2::Baystack
device: 50,110,120,210,220,1010,1020
device-family: Centillion
duplex: both
vlan: yes
class: Layer2::Centillion
note: !Must be on version 4.x or 5.x (VLAN based) software.
device: 5000BH, 5005BH
device: C50,C100
device-family: AP222x
duplex: both
modules: no
class: Layer2::NAP222x
note: !Upgrade to version 1.3 or higher.
note: Sends out topology packets if enabled but does not build neighbor table.
device: AP-2220, AP-2221
device-family: Alteon AD
arpnip: yes
duplex: both
cdp: no
vlan: yes
modules: no
class: Layer3::AlteonAD
note: !Some versions have issues with continuous SNMP polling. Upgrade to 10.0.30.7 or higher.
device: AD2,AD3,AD4
device: 180,183,184
device-family: Multiprotocol Router/BayRS
arpnip: yes
portmac: yes
duplex: both
cdp: no
vlan: yes
modules: yes
class: Layer3::BayRS
device: AN,ARN,ASN,BLN,BCN
device: 2430,5430
device-family: VPN Router/Contivity
arpnip: yes
macsuck: no
portmac: yes
duplex: no
cdp: no
modules: yes
class: Layer3::Contivity
device: 100,400,600
device: 1000,1010,1050
device: 1500,1600,1700,1740,1750
device: 2500,2600,2700
device: 4500,4600,5000
device-family: Ethernet Routing Switch/Passport/Accelar LAN
arpnip: yes
macsuck: yes
portmac: yes
duplex: write
cdp: proprietary
vlan: write
modules: yes
class: Layer3::Passport
note: !8600 Code versions < 3.2 vlan based mac-suck and are unsupported. Upgrade code.
note: !8600 3.2 code versions < 3.2.2.2 have Bridge MIB loop. Upgrade code.
device: 8603,8606,8610, 8610co, 8106, 8110
device: 1050,1100,1150,1200
device-family: Ethernet Routing Switch/Passport 1600 (Software < 2.1)
arpnip: yes
macsuck: yes
portmac: yes
duplex: both
cdp: proprietary
vlan: write
class: Layer3::N1600
device: 1612,1624,1648
device-family: Ethernet Routing Switch/Passport 1600 (Software >= 2.1)
arpnip: yes
macsuck: yes
portmac: yes
duplex: write
cdp: proprietary
vlan: write
class: Layer3::Passport
device: 1612,1624,1648
device-family: Synoptics
macsuck: yes
duplex: both
cdp: proprietary
ver: 1
class: Layer1::S3000
note: Uses proprietary MIBs to provide MAC to port mapping.
note: !Requires Advanced or Advanced Analyzer NMM
device: 281X
device: System 3000
device-family: Wireless Switch 2270
arpnip: no
macsuck: yes
portmac: yes
duplex: both
cdp: proprietary
modules: yes
class: Layer2::N2270
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
device: 2270
device-family: DRG
device: All
#
# Proxim
@@ -826,7 +970,7 @@ device: 2270
device-vendor: Proxim
macsuck: yes
duplex: no
cdp: no
topo: no
class: Layer2::Orinoco
device-family: Orinoco
@@ -835,6 +979,38 @@ device: AP-1000,AP-2000,AP-4000
device: WavePOINT-II
#
# Radware
#
device-vendor: Radware
arpnip: yes
topo: no
duplex: both
macsuck: yes
modules: no
portmac: yes
vlan: yes
class: Layer3::AlteonAD
device-family: Alteon AceDirector and AceSwitch series
note: !Some versions have issues with continuous SNMP polling. Upgrade to 10.0.30.7 or higher.
device: All
device-family: Web Switch Module for IBM L2/L3 BladeCenter
device: All
device-family: Radware Alteon Application switches (AWS 2000 and 3000 series)
device: All
device-family: Radware Alteon switches
device: 4408,4416,5412,5224
#
# SonicWALL
#
device-vendor: SonicWALL
class: Layer3::SonicWALL
#
# Sun
#
@@ -849,7 +1025,13 @@ device: Sun routers
# Synoptics
#
device-vendor: Synoptics
note: See Nortel
note: See Avaya
#
# Trapeze
#
device-vendor: Trapeze
note: See Juniper
#
# Zyxel

1744
Info.pm

File diff suppressed because it is too large Load Diff

341
Info/AMAP.pm Normal file
View File

@@ -0,0 +1,341 @@
# SNMP::Info::AMAP
#
# Copyright (c) 2013 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::AMAP;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::LLDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::LLDP::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.12';
%MIBS
= ( 'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', );
%GLOBALS = (
);
%FUNCS = (
# EXTREME-EDP-MIB::extremeEdpTable
'amap_rem_sysname' => 'aipAMAPRemHostname',
);
%MUNGE = ( 'amap_rem_sysname' => \&SNMP::Info::munge_null, );
sub hasAMAP {
my $amap = shift;
my $amap_ip = $amap->aipAMAPIpAddr() || {};
return 1 if ( scalar( keys %$amap_ip ) );
return;
}
# Break up the aipAMAPhostsTable INDEX into MAC and IP address.
sub _hosts_table_index {
my $idx = shift;
my @oids = split( /\./, $idx );
my $mac = join( '.', splice( @oids, 0, 6 ) );
return ( $mac, join( '.', @oids ) );
}
# Break up the aipAMAPportConnectionTable INDEX and return MAC
sub _conn_table_mac {
my $idx = shift;
my @oids = split( /\./, $idx );
my $local_idx = shift @oids;
my $mac = join( '.', splice( @oids, 0, 6 ) );
return ($mac);
}
# Since we need to get IP Addresses from the aipAMAPhostsTable which has
# a different index (MAC, IP) than the aipAMAPportConnectionTable which holds
# the remote device details we create a combined index and skip any
# IPs which have an address of 0.0.0.0. Would like to include only one
# address since they should all originate from the same device, but we don't
# know if they would all be reachable from the network management application.
#
# We don't inplement partials since this is private index function
sub _amap_index {
my $amap = shift;
my $amap_ip = $amap->aipAMAPIpAddr() || {};
my $amap_rport = $amap->aipAMAPLocalPort() || {};
my %amap_index;
foreach my $key ( keys %$amap_ip ) {
my ( $mac, $ip ) = _hosts_table_index($key);
next if ( $ip eq '0.0.0.0' );
next unless $ip;
foreach my $idx ( keys %$amap_rport ) {
my $c_mac = _conn_table_mac($idx);
if ( $mac eq $c_mac ) {
my $index = "$idx.$ip";
$amap_index{$index} = $index;
}
}
}
return \%amap_index;
}
# Break up _amap_index INDEX into local index, MAC, remote index, and
# IP address
sub _amap_index_parts {
my $idx = shift;
my @oids = split( /\./, $idx );
my $local_idx = shift @oids;
my $mac = join( '.', splice( @oids, 0, 6 ) );
my $rem_idx = shift @oids;
return ( $local_idx, $mac, $rem_idx, join( '.', @oids ) );
}
sub amap_if {
my $amap = shift;
my $index = $amap->_amap_index() || {};
my $if_idx = $amap->aipAMAPLocalIfindex() || {};
my %amap_if;
foreach my $key ( keys %$index ) {
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
my $if_key = "$local_idx.$mac.$rem_idx";
if ( $key =~ /^$if_key/ ) {
my $if = $if_idx->{$if_key};
$amap_if{$key} = $if;
}
}
return \%amap_if;
}
sub amap_ip {
my $amap = shift;
my $index = $amap->_amap_index() || {};
my %amap_ip;
foreach my $key ( keys %$index ) {
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
# MIB says should only be IPv4
next unless ( $ip =~ /\d+(\.\d+){3}/ );
$amap_ip{$key} = $ip;
}
return \%amap_ip;
}
sub amap_port {
my $amap = shift;
my $index = $amap->_amap_index() || {};
my $amap_rport = $amap->aipAMAPLocalPort() || {};
my $amap_rslot = $amap->aipAMAPLocalSlot() || {};
my %amap_port;
foreach my $key ( sort keys %$index ) {
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
my $p_key = "$local_idx.$mac.$rem_idx";
if ( $key =~ /^$p_key/ ) {
my $port = $amap_rport->{$p_key};
my $slot = $amap_rslot->{$p_key} || 0;
next unless $port;
$amap_port{$key} = defined $slot ? "$slot\/$port" : $port;
}
}
return \%amap_port;
}
sub amap_id {
my $amap = shift;
my $index = $amap->_amap_index() || {};
my $amap_name = $amap->amap_rem_sysname() || {};
my %amap_name;
foreach my $key ( sort keys %$index ) {
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
my $id_key = "$local_idx.$mac.$rem_idx";
if ( $key =~ /^$id_key/ ) {
my $name = $amap_name->{$id_key} || 0;
next unless $name;
$amap_name{$key} = $name;
}
}
return \%amap_name;
}
sub amap_platform {
my $amap = shift;
my $index = $amap->_amap_index() || {};
my $amap_topo_platform = $amap->aipAMAPRemDeviceType() || {};
my %amap_platform;
foreach my $key ( keys %$index ) {
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
my $pf_key = "$local_idx.$mac.$rem_idx";
if ( $key =~ /^$pf_key/ ) {
my $platform = $amap_topo_platform->{$pf_key};
next unless $platform;
$amap_platform{$key} = $platform;
}
}
return \%amap_platform;
}
1;
__END__
=head1 NAME
SNMP::Info::AMAP - SNMP Interface to Alcatel Mapping Adjacency Protocol (AMAP)
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
my $amap = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'router',
Community => 'public',
Version => 2
);
my $class = $amap->class();
print " Using device sub class : $class\n";
$hasamap = $amap->hasAMAP() ? 'yes' : 'no';
# Print out a map of device ports with LLDP neighbors:
my $interfaces = $amap->interfaces();
my $amap_if = $amap->amap_if();
my $amap_ip = $amap->amap_ip();
my $amap_port = $amap->amap_port();
foreach my $amap_key (keys %$amap_ip){
my $iid = $amap_if->{$amap_key};
my $port = $interfaces->{$iid};
my $neighbor = $amap_ip->{$amap_key};
my $neighbor_port = $amap_port->{$amap_key};
print "Port : $port connected to $neighbor / $neighbor_port\n";
}
=head1 DESCRIPTION
SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented
interface to Alcatel Mapping Adjacency Protocol (AMAP) information through
SNMP.
AMAP is a Layer 2 protocol that allows a network device to advertise its
identity and capabilities on the local network providing topology information.
Create or use a device subclass that inherits this class. Do not use
directly.
=head2 Inherited Classes
None.
=head2 Required MIBs
=over
=item F<ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB>
=back
=head1 GLOBAL METHODS
These are methods that return scalar values from SNMP
=over
=item $amap->hasAMAP()
Is AMAP is active in this device?
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $amap->amap_id()
Returns the string value used to identify the remote system.
=item $amap->amap_if()
Returns the mapping to the SNMP Interface Table.
=item $amap->amap_ip()
Returns remote IPv4 addresses. Note: AMAP returns all IP addresses associated
with the remote device. It would be preferable to include only one address
since they should all originate from the same device, but amap_ip() can not
determine if all addresses are reachable from the network management
application therefore all addresses are returned and the calling application
must determine which address to use and if they are in fact from the same
device.
=item $amap->amap_port()
Returns remote port ID
=item $amap->amap_platform()
Returns remote platform ID
=back
=cut

172
Info/AdslLine.pm Normal file
View File

@@ -0,0 +1,172 @@
# SNMP::Info::AdslLine
#
# Copyright (c) 2009 Alexander Hartmaier
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::AdslLine;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::AdslLine::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::AdslLine::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.12';
%MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' );
%GLOBALS = ();
%FUNCS = (
# ADSL-LINE-MIB::adslAtucChanTable
'adsl_atuc_interleave_delay' => 'adslAtucChanInterleaveDelay',
'adsl_atuc_curr_tx_rate' => 'adslAtucChanCurrTxRate',
'adsl_atuc_prev_tx_rate' => 'adslAtucChanPrevTxRate',
'adsl_atuc_crc_block_len' => 'adslAtucChanCrcBlockLength',
# ADSL-LINE-MIB::adslAturChanTable
'adsl_atur_interleave_delay' => 'adslAturChanInterleaveDelay',
'adsl_atur_curr_tx_rate' => 'adslAturChanCurrTxRate',
'adsl_atur_prev_tx_rate' => 'adslAturChanPrevTxRate',
'adsl_atur_crc_block_len' => 'adslAturChanCrcBlockLength',
);
%MUNGE = ();
1;
__END__
=head1 NAME
SNMP::Info::AdslLine - SNMP Interface to the F<ADSL-LINE-MIB>
=head1 AUTHOR
Alexander Hartmaier
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $info = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $info->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
SNMP::Info::AdslLine is a subclass of SNMP::Info that provides
information about the adsl interfaces of a device.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
none.
=head2 Required MIBs
=over
=item F<ADSL-LINE-MIB>
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 GLOBALS
=over
=item none
=back
=head1 TABLE METHODS
=head2 ATUC channel table (C<adslAtucChanTable>)
This table provides one row for each ATUC channel.
ADSL channel interfaces are those C<ifEntries> where C<ifType>
is equal to adslInterleave(124) or adslFast(125).
=over
=item $info->adsl_atuc_interleave_delay()
(C<adslAtucChanInterleaveDelay>)
=item $info->adsl_atuc_curr_tx_rate()
(C<adslAtucChanCurrTxRate>)
=item $info->adsl_atuc_prev_tx_rate()
(C<adslAtucChanPrevTxRate>)
=item $info->adsl_atuc_crc_block_len()
(C<adslAtucChanCrcBlockLength>)
=back
=head2 ATUR channel table (C<adslAturChanTable>)
This table provides one row for each ATUR channel.
ADSL channel interfaces are those C<ifEntries> where C<ifType>
is equal to adslInterleave(124) or adslFast(125).
=over
=item $info->adsl_atur_interleave_delay()
(C<adslAturChanInterleaveDelay>)
=item $info->adsl_atur_curr_tx_rate()
(C<adslAturChanCurrTxRate>)
=item $info->adsl_atur_prev_tx_rate()
(C<adslAturChanPrevTxRate>)
=item $info->adsl_atur_crc_block_len()
(C<adslAturChanCrcBlockLength>)
=back
=cut

130
Info/Aggregate.pm Normal file
View File

@@ -0,0 +1,130 @@
# SNMP::Info::Aggregate
#
# Copyright (c) 2014 SNMP::Info Developers
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Aggregate;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::Aggregate::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Aggregate::EXPORT_OK = qw/agg_ports_ifstack/;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.12';
%MIBS = (); # IF-MIB
%GLOBALS = ();
%FUNCS = ();
%MUNGE = ();
sub agg_ports_ifstack {
my $dev = shift;
my $partial = shift;
my $ifStack = $dev->ifStackStatus();
# TODO: if we want to do partial, we need to use inverse status
my $ifType = $dev->ifType();
my $ret = {};
foreach my $idx ( keys %$ifStack ) {
my ( $higher, $lower ) = split /\./, $idx;
next if ( $higher == 0 or $lower == 0 );
if ( $ifType->{ $higher } eq 'ieee8023adLag' ) {
$ret->{ $lower } = $higher;
}
}
return $ret;
}
1;
__END__
=head1 NAME
SNMP::Info::Aggregate - SNMP Interface to ifStackTable Aggregated Links
=head1 AUTHOR
SNMP::Info Developers
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $info = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $info->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
This class provides access to Aggregated Links configuration on devices
supporting C<ifStackTable>.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
L<SNMP::Info>
=head2 Required MIBs
=over
=item F<IF-MIB>
=back
=head1 METHODS
=over 4
=item C<agg_ports_ifstack>
Returns a HASH reference mapping from slave to master port for each member of
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
ifIndex of the corresponding master ports.
=back
=cut

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::MIBS,
@@ -83,7 +83,8 @@ $VERSION = '2.04';
'airespace_ess_qos' => 'bsnDot11EssQualityOfService',
'airespace_ess_ifname' => 'bsnDot11EssInterfaceName',
'airespace_ess_aclname' => 'bsnDot11EssAclName',
'airespace_ess_bcast' => 'bsnDot11EssBroadcastSsid',
# AIRESPACE-WIRELESS-MIB::bsnAPTable
'airespace_ap_mac' => 'bsnAPDot3MacAddress',
'airespace_ap_name' => 'bsnAPName',
@@ -105,6 +106,7 @@ $VERSION = '2.04';
'airespace_apif' => 'bsnAPIfOperStatus',
'airespace_apif_oride' => 'bsnAPIfWlanOverride',
'airespace_apif_admin' => 'bsnAPIfAdminStatus',
'airespace_apif_a_pwr' => 'bsnAPIfAbsolutePowerList',
# AIRESPACE-WIRELESS-MIB::bsnMobileStationTable
'airespace_sta_mac' => 'bsnMobileStationAPMacAddr',
@@ -146,6 +148,16 @@ $VERSION = '2.04';
# AIRESPACE-SWITCHING-MIB::agentPortConfigTable
'airespace_duplex_admin' => 'agentPortPhysicalMode',
'airespace_duplex' => 'agentPortPhysicalStatus',
# This needs to be cleaned up, but for now we pretend to
# have the CISCO-DOT11-MIB for signal strengths, etc.
'cd11_sigstrength' => 'bsnMobileStationRSSI', # kinda
'cd11_sigqual' => 'bsnMobileStationSnr', # kinda
'cd11_rxbyte' => 'bsnMobileStationBytesReceived',
'cd11_txbyte' => 'bsnMobileStationBytesSent',
'cd11_rxpkt' => 'bsnMobileStationPacketsReceived',
'cd11_txpkt' => 'bsnMobileStationPacketsSent',
'cd11_ssid' => 'bsnMobileStationSsid',
);
%MUNGE = (
@@ -156,6 +168,8 @@ $VERSION = '2.04';
'airespace_bl_mac' => \&SNMP::Info::munge_mac,
'airespace_if_mac' => \&SNMP::Info::munge_mac,
'airespace_sta_mac' => \&SNMP::Info::munge_mac,
'cd11_rxpkt' => \&munge_64bits,
'cd11_txpkt' => \&munge_64bits,
);
sub layers {
@@ -419,11 +433,12 @@ sub i_mac {
next unless defined $mac;
$i_mac{$iid} = $mac;
}
# Don't grab AP MACs - we want the AP to show up on edge switch
# ports
elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
$index =~ s/\.\d+$//;
next unless defined $index;
$i_mac{$iid} = $index;
}
# Some switch interfaces have MACs, virtuals report 00:00:00:00:00:00
else {
my $mac = $if_mac->{$iid};
next unless defined $mac;
@@ -562,6 +577,13 @@ sub bp_index {
return \%bp_index;
}
sub fw_mac {
my $airespace = shift;
my $partial = shift;
return $airespace->SUPER::fw_mac($partial);
}
sub fw_port {
my $airespace = shift;
my $partial = shift;
@@ -631,20 +653,96 @@ sub i_ssidbcast {
my $airespace = shift;
my $partial = shift;
my $ssidlist = $airespace->i_ssidlist($partial) || {};
my $bc_mode = $airespace->airespace_bssid_mode() || 'enable';
my $ssidlist = $airespace->i_ssidlist($partial) || {};
my $bc_mode = $airespace->airespace_bssid_mode() || 'enable';
my $ess_bc_mode = $airespace->airespace_ess_bcast() || {};
my $ssids = $airespace->airespace_ess_ssid() || {};
my %ssid_index = reverse %$ssids;
my %bcmap = qw/enable 1 disable 0/;
my $broadcast = $bcmap{$bc_mode};
my %i_ssidbcast;
foreach my $iid ( keys %$ssidlist ) {
$i_ssidbcast{$iid} = $broadcast;
if (!$broadcast) {
$i_ssidbcast{$iid} = $broadcast;
next;
}
else {
my $ssid = $ssidlist->{$iid};
my $ssid_idx = $ssid_index{$ssid};
my $bc = $ess_bc_mode->{$ssid_idx};
$i_ssidbcast{$iid} = $bcmap{$bc};
}
}
return \%i_ssidbcast;
}
# Secret decoder ring for BSSID: https://supportforums.cisco.com/docs/DOC-2935
# We need radio base MAC, SSID index, radio band, and whether AP is
# VxWorks or IOS based then we can do the arithmetic
sub i_ssidmac {
my $airespace = shift;
my $partial = shift;
my $ssidlist = $airespace->i_ssidlist($partial) || {};
my $apif_type = $airespace->airespace_apif_type() || {};
my $ap_ios = $airespace->bsnAPIOSVersion() || {};
my %i_ssidmac;
foreach my $oid ( keys %$ssidlist ) {
my @parts = split( /\./, $oid );
my $ssid_idx = pop(@parts);
my $slot = pop(@parts);
my $last = pop(@parts);
my $iid = $oid;
# Get radio band
$iid =~ s/\.\d+$//;
my $ap_type = $apif_type->{$iid};
# Determine if IOS based
$iid =~ s/\.\d+$//;
my $ios = $ap_ios->{$iid} || '';
# 17 can be used as index for 3rd Party AP's. We only have one
# hexadecimal digit to work with so skip if outside the range
if ( $ssid_idx > 0 and $ssid_idx < 17 ) {
# Four cases:
# IOS and 2.4Ghz count up, starts at zero
if ( $ios and $ap_type =~ /b$/ ) {
$last = $last + ( $ssid_idx - 1 );
}
# IOS and 5Ghz - count down from maximum of 16
elsif ( $ios and $ap_type =~ /a$/ ) {
$last = $last + ( 16 - $ssid_idx );
}
# VxWorks and 5Ghz - count up, starts at zero
elsif ( $ios and $ap_type =~ /a$/ ) {
$last = $last + ( $ssid_idx - 1 );
}
# VxWorks and 2.4Ghz - count down from maximum of 16
else {
$last = $last + ( 16 - $ssid_idx );
}
}
push( @parts, $last );
my $bssid = join( ':', map { sprintf( "%02x", $_ ) } @parts );
$i_ssidmac{$oid} = $bssid;
}
return \%i_ssidmac;
}
sub i_80211channel {
my $airespace = shift;
my $partial = shift;
@@ -661,6 +759,28 @@ sub i_80211channel {
return \%i_80211channel;
}
sub dot11_cur_tx_pwr_mw {
my $airespace = shift;
my $partial = shift;
my $cur = $airespace->airespace_apif_power($partial);
my $pwr_abs = $airespace->airespace_apif_a_pwr($partial);
my $dot11_cur_tx_pwr_mw = {};
foreach my $idx ( keys %$cur ) {
my $pwr = $cur->{$idx};
if ( $pwr >= 1 && $pwr <= 8 ) {
my @pwr_list = split(/,/, $pwr_abs->{$idx} );
$dot11_cur_tx_pwr_mw->{$idx} = $pwr_list[$pwr-1];
}
else {
next;
}
}
return $dot11_cur_tx_pwr_mw;
}
# Pseudo ENTITY-MIB methods
sub e_index {
@@ -940,6 +1060,13 @@ sub at_netaddr {
return $ret;
}
sub munge_64bits {
# The controller sometimes hands off a ridiculous value for packets.
# Just truncate it to 32 bits.
my $value = shift;
return $value & 0xffffffff;
}
1;
__END__
@@ -989,7 +1116,7 @@ Do not use directly.
=over
None.
=item None.
=back
@@ -1115,12 +1242,9 @@ switch.
=item $airespace->layers()
Returns 00000011. Class emulates Layer 2 functionality for Thin APs through
Returns 00000111. Class emulates Layer 2 functionality for Thin APs through
proprietary MIBs.
=item $airespace->at_netaddr()
=item $airespace->at_paddr()
=item $airespace->serial()
(C<agentInventorySerialNumber>)
@@ -1147,6 +1271,16 @@ Returns reference to hash. Indicates whether the SSID is broadcast.
Returns reference to hash. Current operating frequency channel of the radio
interface.
=item $airespace->dot11_cur_tx_pwr_mw()
Returns reference to hash. Current transmit power, in milliwatts, of the
radio interface.
=item $airespace->i_ssidmac()
With the same keys as i_ssidlist, returns the Basic service set
identification (BSSID), MAC address, the AP is using for the SSID.
=back
=head2 Dot11 Ess Table (C<bsnDot11EssTable>)
@@ -1214,6 +1348,12 @@ enabled.
(C<bsnDot11EssAclName>)
=item $airespace->airespace_ess_bcast()
This attribute when enabled allows the switch to broadcast this SSID.
(C<bsnDot11EssBroadcastSsid>)
=back
=head2 AP Table (C<bsnAPTable>)
@@ -1317,6 +1457,12 @@ However, if this is enabled, then only those WLANs that appear in the
(C<bsnAPIfAdminStatus>)
=item $airespace->airespace_apif_a_pwr()
List of comma separated absolute power levels supported by the radio.
(C<bsnAPIfAbsolutePowerList>)
=back
=head2 Mobile Station Table (C<bsnMobileStationTable>)
@@ -1546,15 +1692,15 @@ airespace_if_name() for virtual interfaces.
=item $airespace->i_description()
Returns reference to map of IIDs to interface types. Returns C<ifDescr>
for Ethernet interfaces, airespace_ap_loc() for thin AP interfaces, and
airespace_if_name() for virtual interfaces.
Returns reference to map of IIDs to interface descriptions. Returns
C<ifDescr> for Ethernet interfaces, airespace_ap_loc() for thin AP
interfaces, and airespace_if_name() for virtual interfaces.
=item $airespace->i_type()
Returns reference to map of IIDs to interface descriptions. Returns
C<ifType> for Ethernet interfaces, airespace_apif_type() for thin AP
interfaces, and airespace_if_type() for virtual interfaces.
Returns reference to map of IIDs to interface types. Returns C<ifType>
for Ethernet interfaces, airespace_apif_type() for thin AP interfaces, and
airespace_if_type() for virtual interfaces.
=item $airespace->i_up()
@@ -1677,4 +1823,32 @@ entity which 'contains' this entity.
=back
=head2 Arp Cache Table Augmentation
The controller has knowledge of MAC->IP mappings for wireless clients.
Augmenting the arp cache data with these MAC->IP mappings enables visibility
for stations that only communicate locally.
=over
=item $airespace->at_paddr()
Adds MAC addresses extracted from the index of C<bsnMobileStationIpAddress>.
=item $airespace->at_netaddr()
Adds IP addresses from C<bsnMobileStationIpAddress>.
=back
=head1 Data Munging Callback Subroutines
=over
=item munge_64bits()
Truncate packet values to 32 bits.
=back
=cut

View File

@@ -42,7 +42,7 @@ use SNMP::Info;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
'BRIDGE-MIB' => 'dot1dBaseBridgeAddress',
@@ -158,6 +158,19 @@ sub qb_fw_mac {
return $qb_fw_mac;
}
sub qb_fw_vlan {
my $bridge = shift;
my $partial = shift;
my $qb_fw_port = $bridge->qb_fw_port($partial);
my $qb_fw_vlan = {};
foreach my $idx ( keys %$qb_fw_port ) {
my ( $fdb_id, $mac ) = _qb_fdbtable_index($idx);
$qb_fw_vlan->{$idx} = $fdb_id;
}
return $qb_fw_vlan;
}
sub qb_i_vlan_t {
my $bridge = shift;
my $partial = shift;
@@ -176,6 +189,35 @@ sub qb_i_vlan_t {
return $i_vlan;
}
# Most devices now support Q-BRIDGE-MIB, fall back to
# BRIDGE-MIB for those that don't.
sub fw_mac {
my $bridge = shift;
my $qb = $bridge->qb_fw_mac();
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
return $bridge->SUPER::fw_mac();
}
sub fw_port {
my $bridge = shift;
my $qb = $bridge->qb_fw_port();
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
return $bridge->SUPER::fw_port();
}
sub fw_status {
my $bridge = shift;
my $qb = $bridge->qb_fw_status();
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
return $bridge->SUPER::fw_status();
}
sub i_stp_state {
my $bridge = shift;
my $partial = shift;
@@ -295,6 +337,8 @@ sub i_vlan {
return $i_vlan;
}
sub i_untagged { goto &i_vlan }
sub i_vlan_membership {
my $bridge = shift;
my $partial = shift;
@@ -352,6 +396,8 @@ sub set_i_vlan {
return;
}
sub set_i_untagged { goto &set_i_vlan }
sub set_add_i_vlan_tagged {
my $bridge = shift;
@@ -584,6 +630,10 @@ to a hash.
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=item $vtp->i_untagged()
An alias for C<i_vlan>.
=item $bridge->i_vlan_membership()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
@@ -631,7 +681,7 @@ identifier (iid)
Returns reference to hash of forwarding table entries status
(C<dot2dTpFdbStatus>)
(C<dot1dTpFdbStatus>)
=back
@@ -855,6 +905,10 @@ identifier (iid)
(C<dot1qTpFdbPort>)
=item $bridge->qb_fw_vlan()
Returns reference to hash of forwarding table entries VLAN ID
=item $bridge->qb_fw_status()
Returns reference to hash of forwarding table entries status
@@ -876,6 +930,10 @@ operations.
Currently unsupported. Throws an error and returns.
=item $bridge->set_i_untagged(vlan, ifIndex)
An alias for C<set_i_vlan>.
=item $bridge->set_i_pvid(pvid, ifIndex)
Currently unsupported. Throws an error and returns.
@@ -888,4 +946,6 @@ Currently unsupported. Throws an error and returns.
Currently unsupported. Throws an error and returns.
=back
=cut

View File

@@ -40,9 +40,10 @@ use SNMP::Info;
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CDP::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
use vars
qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT %CDP_CAPABILITIES/;
$VERSION = '2.04';
$VERSION = '3.12';
# Five data structures required by SNMP::Info
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
@@ -53,40 +54,54 @@ $VERSION = '2.04';
'cdp_run' => 'cdpGlobalRun',
'cdp_interval' => 'cdpGlobalMessageInterval',
'cdp_holdtime' => 'cdpGlobalHoldTime',
'cdp_id' => 'cdpGlobalDeviceId',
'cdp_gid' => 'cdpGlobalDeviceId',
);
%FUNCS = (
'c_index' => 'cdpCacheIfIndex',
'c_proto' => 'cdpCacheAddressType',
'c_addr' => 'cdpCacheAddress',
'c_ver' => 'cdpCacheVersion',
'c_id' => 'cdpCacheDeviceId',
'c_port' => 'cdpCacheDevicePort',
'c_platform' => 'cdpCachePlatform',
'c_capabilities' => 'cdpCacheCapabilities',
'c_domain' => 'cdpCacheVTPMgmtDomain',
'c_vlan' => 'cdpCacheNativeVLAN',
'c_duplex' => 'cdpCacheDuplex',
'c_power' => 'cdpCachePowerConsumption',
'c_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
'c_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
'c_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
'c_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
'cdp_index' => 'cdpCacheIfIndex',
'cdp_proto' => 'cdpCacheAddressType',
'cdp_addr' => 'cdpCacheAddress',
'cdp_ver' => 'cdpCacheVersion',
'cdp_id' => 'cdpCacheDeviceId',
'cdp_port' => 'cdpCacheDevicePort',
'cdp_platform' => 'cdpCachePlatform',
'cdp_capabilities' => 'cdpCacheCapabilities',
'cdp_domain' => 'cdpCacheVTPMgmtDomain',
'cdp_vlan' => 'cdpCacheNativeVLAN',
'cdp_duplex' => 'cdpCacheDuplex',
'cdp_power' => 'cdpCachePowerConsumption',
'cdp_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
'cdp_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
'cdp_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
'cdp_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
);
%MUNGE = (
'c_capabilities' => \&SNMP::Info::munge_caps,
'c_platform' => \&SNMP::Info::munge_null,
'c_domain' => \&SNMP::Info::munge_null,
'c_port' => \&SNMP::Info::munge_null,
'c_id' => \&SNMP::Info::munge_null,
'c_ver' => \&SNMP::Info::munge_null,
'c_ip' => \&SNMP::Info::munge_ip,
'c_power' => \&munge_power,
'cdp_capabilities' => \&SNMP::Info::munge_bits,
'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,
);
%CDP_CAPABILITIES = (
'Router' => 0x001,
'Trans-Bridge' => 0x002,
'Source-Route-Bridge' => 0x004,
'Switch' => 0x008,
'Host' => 0x010,
'IGMP' => 0x020,
'Repeater' => 0x040,
'VoIP-Phone' => 0x080,
'Remotely-Managed-Device' => 0x100,
'Supports-STP-Dispute' => 0x200,
'Two-port Mac Relay' => 0x400,
);
sub munge_power {
my $power = shift;
my $decimal = substr( $power, -3 );
@@ -101,63 +116,98 @@ sub hasCDP {
# SNMP v1 clients dont have the globals
if ( defined $ver and $ver == 1 ) {
my $c_ip = $cdp->c_ip();
my $cdp_ip = $cdp->cdp_ip();
# See if anything in cdp cache, if so we have cdp
return 1 if ( defined $c_ip and scalar( keys %$c_ip ) );
return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) );
return;
}
return $cdp->cdp_run();
}
sub c_if {
sub cdp_if {
my $cdp = shift;
# See if by some miracle Cisco implemented the cdpCacheIfIndex entry
my $c_index = $cdp->c_index();
return $c_index if defined $c_index;
my $cdp_index = $cdp->cdp_index();
return $cdp_index if defined $cdp_index;
# Nope, didn't think so. Now we fake it.
my $c_ip = $cdp->c_ip();
unless ( defined $c_ip ) {
my $cdp_ip = $cdp->cdp_ip();
unless ( defined $cdp_ip ) {
$cdp->error_throw(
"SNMP::Info::CDP:c_if() - Device doesn't have cdp_ip() data. Can't fake cdp_index()"
"SNMP::Info::CDP:cdp_if() - Device doesn't have cdp_ip() data. Can't fake cdp_index()"
);
return;
}
my %c_if;
foreach my $key ( keys %$c_ip ) {
my %cdp_if;
foreach my $key ( keys %$cdp_ip ) {
next unless defined $key;
my $iid = $key;
# Truncate .1 from cdp cache entry
$iid =~ s/\.\d+$//;
$c_if{$key} = $iid;
$cdp_if{$key} = $iid;
}
return \%c_if;
return \%cdp_if;
}
sub c_ip {
sub cdp_ip {
my $cdp = shift;
my $partial = shift;
my $c_addr = $cdp->c_addr($partial) || {};
my $c_proto = $cdp->c_proto($partial) || {};
my $cdp_addr = $cdp->cdp_addr($partial) || {};
my $cdp_proto = $cdp->cdp_proto($partial) || {};
my %c_ip;
foreach my $key ( keys %$c_addr ) {
my $addr = $c_addr->{$key};
my $proto = $c_proto->{$key};
my %cdp_ip;
foreach my $key ( keys %$cdp_addr ) {
my $addr = $cdp_addr->{$key};
my $proto = $cdp_proto->{$key};
next unless defined $addr;
next if ( defined $proto and $proto ne 'ip' );
my $ip = join( '.', unpack( 'C4', $addr ) );
$c_ip{$key} = $ip;
$cdp_ip{$key} = $ip;
}
return \%c_ip;
return \%cdp_ip;
}
sub cdp_cap {
my $cdp = shift;
my $partial = shift;
# Some devices return a hex-string, others return a space separated
# string, we need the raw data to determine return value and
# take appropriate action
my $cdp_caps = $cdp->cdp_capabilities_raw($partial) || {};
my %cdp_cap;
foreach my $key ( keys %$cdp_caps ) {
my $cap_raw = $cdp_caps->{$key};
next unless $cap_raw;
# Simple check, smallest single string is either Host or IGMP with a
# space added on the end for a length of 5, hex string is normally
# 4 bytes, but since only one byte was traditionally needed process
# as hex for a length of 4 or less
if ( length $cap_raw < 5 ) {
my $cap_hex = join( '',
map { sprintf "%x", $_ } unpack( 'C*', $cap_raw ) );
foreach my $capability ( keys %CDP_CAPABILITIES ) {
if ( ( hex $cap_hex ) & $CDP_CAPABILITIES{$capability} ) {
push( @{ $cdp_cap{$key} }, $capability );
}
}
}
else {
my @caps = split /\s/, $cap_raw;
push( @{ $cdp_cap{$key} }, @caps );
}
}
return \%cdp_cap;
}
1;
@@ -188,15 +238,15 @@ Max Baker
# Print out a map of device ports with CDP neighbors:
my $interfaces = $cdp->interfaces();
my $c_if = $cdp->c_if();
my $c_ip = $cdp->c_ip();
my $c_port = $cdp->c_port();
my $cdp_if = $cdp->cdp_if();
my $cdp_ip = $cdp->cdp_ip();
my $cdp_port = $cdp->cdp_port();
foreach my $cdp_key (keys %$c_ip){
my $iid = $c_if->{$cdp_key};
foreach my $cdp_key (keys %$cdp_ip){
my $iid = $cdp_if->{$cdp_key};
my $port = $interfaces->{$iid};
my $neighbor = $c_ip->{$cdp_key};
my $neighbor_port = $c_port->{$cdp_key};
my $neighbor = $cdp_ip->{$cdp_key};
my $neighbor_port = $cdp_port->{$cdp_key};
print "Port : $port connected to $neighbor / $neighbor_port\n";
}
@@ -260,7 +310,7 @@ Time in seconds that CDP messages are kept.
(C<cdpGlobalHoldTime>)
=item $cdp->cdp_id()
=item $cdp->cdp_gid()
Returns CDP device ID.
@@ -280,153 +330,170 @@ to a hash.
=over
=item $cdp->c_capabilities()
=item $cdp->cdp_capabilities()
Returns Device Functional Capabilities. Results are munged into an ascii
binary string, 7 digits long, MSB. Each digit represents a bit from the
table below.
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
binary string, MSB. Each digit represents a bit from the table below from
the CDP Capabilities Mapping to Smartport Type table within the
Cisco Small Business 200 Series Smart Switch Administration Guide,
L<http://www.cisco.com/c/en/us/support/switches/small-business-200-series-smart-switches/products-maintenance-guides-list.html>:
(Bit) - Description
=over
=item (0x40) - Provides level 1 functionality.
=item (0x400) - Two-Port MAC Relay.
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
=item (0x200) - CAST Phone Port / CVTA / Supports-STP-Dispute depending
upon platform.
=item (0x100) - Remotely-Managed Device.
=item (0x80) - VoIP Phone.
=item (0x40) - Provides level 1 functionality.
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
non router ports.
=item (0x10) - Sends and receives packets for at least one network layer
=item (0x10) - Sends and receives packets for at least one network layer
protocol. If the device is routing the protocol, this bit should not be set.
=item (0x08) - Performs level 2 switching. The difference between this bit
=item (0x08) - Performs level 2 switching. The difference between this bit
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
device is assumed to be deployed in a physical loop-free topology.
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
would set both this bit and bit 0x02.
=item (0x02) - Performs level 2 transparent bridging.
=item (0x02) - Performs level 2 transparent bridging.
=item (0x01) - Performs level 3 routing for at least one network layer
=item (0x01) - Performs level 3 routing for at least one network layer
protocol.
=back
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this
information.
Thanks to Martin Lorensen for a pointer to the original information and
CPAN user Alex for updates.
(C<cdpCacheCapabilities>)
=item $cdp->c_domain()
=item $cdp->cdp_domain()
Returns remote VTP Management Domain as defined in
C<CISCO-VTP-MIB::managementDomainName>
(C<cdpCacheVTPMgmtDomain>)
=item $cdp->c_duplex()
=item $cdp->cdp_duplex()
Returns the port duplex status from remote devices.
(C<cdpCacheDuplex>)
=item $cdp->c_id()
=item $cdp->cdp_id()
Returns remote device id string
(C<cdpCacheDeviceId>)
=item $cdp->c_if()
=item $cdp->cdp_if()
Returns the mapping to the SNMP Interface Table.
Note that a lot devices don't implement $cdp->c_index(), So if it isn't
Note that a lot devices don't implement $cdp->cdp_index(), So if it isn't
around, we fake it.
In order to map the cdp table entry back to the interfaces() entry, we
truncate the last number off of it :
# it exists, yay.
my $c_index = $device->c_index();
return $c_index if defined $c_index;
my $cdp_index = $device->cdp_index();
return $cdp_index if defined $cdp_index;
# if not, let's fake it
my $c_ip = $device->c_ip();
my $cdp_ip = $device->cdp_ip();
my %c_if
foreach my $key (keys %$c_ip){
my %cdp_if
foreach my $key (keys %$cdp_ip){
$iid = $key;
## Truncate off .1 from cdp response
$iid =~ s/\.\d+$//;
$c_if{$key} = $iid;
$cdp_if{$key} = $iid;
}
return \%c_if;
return \%cdp_if;
=item $cdp->c_index()
=item $cdp->cdp_index()
Returns the mapping to the SNMP2 Interface table for CDP Cache Entries.
Most devices don't implement this, so you probably want to use $cdp->c_if()
Most devices don't implement this, so you probably want to use $cdp->cdp_if()
instead.
See c_if() entry.
See cdp_if() entry.
(C<cdpCacheIfIndex>)
=item $cdp->c_ip()
=item $cdp->cdp_ip()
If $cdp->c_proto() is supported, returns remote IPV4 address only. Otherwise
If $cdp->cdp_proto() is supported, returns remote IPV4 address only. Otherwise
it will return all addresses.
(C<cdpCacheAddress>)
=item $cdp->c_addr()
=item $cdp->cdp_addr()
Returns remote address
(C<cdpCacheAddress>)
=item $cdp->c_platform()
=item $cdp->cdp_platform()
Returns remote platform id
(C<cdpCachePlatform>)
=item $cdp->c_port()
=item $cdp->cdp_port()
Returns remote port ID
(C<cdpDevicePort>)
=item $cdp->c_proto()
=item $cdp->cdp_proto()
Returns remote address type received. Usually IP.
(C<cdpCacheAddressType>)
=item $cdp->c_ver()
=item $cdp->cdp_ver()
Returns remote hardware version
(C<cdpCacheVersion>)
=item $cdp->c_vlan()
=item $cdp->cdp_vlan()
Returns the remote interface native VLAN.
(C<cdpCacheNativeVLAN>)
=item $cdp->c_power()
=item $cdp->cdp_power()
Returns the amount of power consumed by remote device in milliwatts munged
for decimal placement.
(C<cdpCachePowerConsumption>)
=item $cdp->cdp_cap()
Returns hash of arrays with each array containing the system capabilities
supported by the remote system. Possible elements in the array are
C<Router>, C<Trans-Bridge>, C<Source-Route-Bridge>, C<Switch>, C<Host>,
C<IGMP>, C<Repeater>, C<VoIP-Phone>, C<Remotely-Managed-Device>,
C<Supports-STP-Dispute>, and C<Two-port Mac Relay>.
=back
=head1 Data Munging Callback Subroutines

129
Info/CiscoAgg.pm Normal file
View File

@@ -0,0 +1,129 @@
# SNMP::Info::CiscoAgg
#
# Copyright (c) 2014 SNMP::Info Developers
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::CiscoAgg;
use strict;
use Exporter;
use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
@SNMP::Info::CiscoAgg::ISA = qw/
SNMP::Info::IEEE802dot3ad
Exporter
/;
@SNMP::Info::CiscoAgg::EXPORT_OK = qw/
agg_ports
/;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::IEEE802dot3ad::MIBS,
'CISCO-PAGP-MIB' => 'pagpGroupIfIndex',
);
%GLOBALS = ();
%FUNCS = ();
%MUNGE = ();
# until someone using PAgP sends us a patch
sub agg_ports_pagp { {} }
# until we have PAgP data and need to combine with LAG data
sub agg_ports { return agg_ports_lag(@_) }
1;
__END__
=head1 NAME
SNMP::Info::CiscoAgg - SNMP Interface to Cisco Aggregated Links
=head1 AUTHOR
SNMP::Info Developers
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $info = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $info->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
This class provides access to Aggregated Links configuration on Cisco devices.
It combines Cisco PAgP and IEEE 802.3ad information.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
L<SNMP::Info::IEEE802dot3ad>
=head2 Required MIBs
=over
=item F<CISCO-PAGP-MIB>
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 METHODS
=over 4
=item C<agg_ports>
Returns a HASH reference mapping from slave to master port for each member of
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
ifIndex of the corresponding master ports.
=item C<agg_ports_pagp>
Unimplemented. Returns an empty HASH reference.
=back
=cut

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
@@ -449,7 +449,7 @@ devices running older code revisions.
Example:
$ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig')
or die Couldn't save config. ",$ciscoconfig->error(1);
or die "Couldn't save config. ",$ciscoconfig->error(1);
=item $ciscoconfig->copy_run_start()

View File

@@ -38,7 +38,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = ( 'CISCO-IMAGE-MIB' => 'ciscoImageString', );

View File

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

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' );
@@ -175,7 +175,7 @@ Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
=item $poe->peth_port_power()
Power supplied by PoE ports, in milliwatts
("cpeExtPsePortPwrConsumption")
(C<cpeExtPsePortPwrConsumption>)
=back
@@ -185,8 +185,8 @@ Power supplied by PoE ports, in milliwatts
=item $poe->peth_port_neg_power()
Power negotiated using CDP, in milliwats
("cdpCachePowerConsumption")
Power negotiated using CDP, in milliwatts
(C<cdpCachePowerConsumption>)
=back

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%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 = '2.04';
$VERSION = '3.12';
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );
@@ -65,6 +65,7 @@ $VERSION = '2.04';
'm_type' => 'moduleType',
'm_model' => 'moduleModel',
'm_serial' => 'moduleSerialNumber',
'm_serial_string' => 'moduleSerialNumberString',
'm_status' => 'moduleStatus',
'm_name' => 'moduleName',
'm_ports' => 'moduleNumPorts',
@@ -159,7 +160,7 @@ sub i_duplex {
next if ( defined $partial and $iid !~ /^$partial$/ );
# Test for gigabit
if ( $p_duplex_cap->{$port} == 0 ) {
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) {
$i_duplex->{$iid} = 'full';
}
@@ -194,7 +195,7 @@ sub i_duplex_admin {
next if ( defined $partial and $iid !~ /^$partial$/ );
# Test for gigabit
if ( $p_duplex_cap->{$port} == 0 ) {
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 1 ) {
$i_duplex_admin->{$iid} = 'full';
}
@@ -214,9 +215,8 @@ sub i_speed_admin {
my $partial = shift;
my %i_speed_admin;
my $p_port = $stack->p_port() || {};
my %mapping = reverse %$p_port;
my $p_speed = $stack->p_speed( $mapping{$partial} );
my $p_port = $stack->p_port() || {};
my $p_speed = $stack->p_speed() || {};
my %speeds = (
'autoDetect' => 'auto',

View File

@@ -42,7 +42,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
'SNMPv2-MIB' => 'sysDescr',
@@ -51,6 +51,7 @@ $VERSION = '2.04';
'OLD-CISCO-SYSTEM-MIB' => 'writeMem',
'CISCO-PRODUCTS-MIB' => 'sysName',
'ENTITY-MIB' => 'entPhysicalSoftwareRev',
'CISCO-IMAGE-MIB' => 'ciscoImageString',
# some older catalysts live here
'CISCO-STACK-MIB' => 'wsc1900sysID',
@@ -100,13 +101,16 @@ sub os {
my $descr = $l2->description() || '';
# order here matters - there are Catalysts that run IOS and have catalyst
# in their description field.
# in their description field, as well as Catalysts that run IOS-XE.
return 'ios-xe' if ( $descr =~ /IOS-XE/ );
return 'ios-xr' if ( $descr =~ /IOS XR/ );
return 'ios' if ( $descr =~ /IOS/ );
return 'catalyst' if ( $descr =~ /catalyst/i );
return 'css' if ( $descr =~ /Content Switch SW/ );
return 'css-sca' if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
return 'pix' if ( $descr =~ /Cisco PIX Security Appliance/ );
return 'asa' if ( $descr =~ /Cisco Adaptive Security Appliance/ );
return 'san-os' if ( $descr =~ /Cisco SAN-OS/ );
if ( $descr =~ /Application Control Engine Service Module/ ) {
# Only the admin context implements the entity MIB
@@ -195,6 +199,13 @@ sub os_ver {
return $1;
}
if ( defined $os
and $os eq 'ios-xr'
and defined $descr
and $descr =~ m/Version (\d+[\.\d]+)/ )
{
return $1;
}
# Newer Catalysts and IOS devices
if ( defined $descr
@@ -203,6 +214,15 @@ sub os_ver {
return $1;
}
# Generic fallback: try to determine running image from CISCO-IMAGE-MIB
my $image_info = $l2->ciscoImageString() || {};
foreach my $row (keys %$image_info) {
my $info_string = $image_info->{$row};
if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
return $1;
}
}
return;
}
@@ -358,6 +378,8 @@ None.
=item F<ENTITY-MIB>
=item F<CISCO-IMAGE-MIB>
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
@@ -382,64 +404,41 @@ Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
Returns mem_free() + mem_used()
=item $ciscostats->os()
Tries to parse if device is running IOS or CatOS from description()
=item $ciscostats->vendor()
'cisco'
Available values :
=item $ciscostats->os()
=over
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
from description()
=item pix
Available values:
Cisco PIX
=item asa
Cisco ASA
=item fwsm
Single-mode FWSM
=item fwsm-admin
Admin context of multi-context FWSM
=item fwsm-context
Standard context of multi-context FWSM
=item ace-admin
Admin context of ACE module
=item ace-context
Standard context of ACE module (NB: No OS version detection
is available, but will be the same as it's 'ace admin')
=item css
Cisco Content Switch
=item css-sca
Cisco Content Switch Secure Content Acceleration
=back
'ios' for Cisco IOS
'ios-xe' for Cisco IOS XE
'ios-xr' for Cisco IOS XR
'pix' for Cisco PIX
'asa' for Cisco ASA
'fwsm' for Single-mode FWSM
'fwsm-admin' for Admin context of multi-context FWSM
'fwsm-context' for Standard context of multi-context FWSM
'ace-admin' for Admin context of ACE module
'ace-context' for Standard context of ACE module (NB: No OS version
detection is available, but will be the same as it's
'ace admin')
'css' for Cisco Content Switch
'css-sca' for Cisco Content Switch Secure Content Acceleration
'san-os' for Cisco SAN-OS
=item $ciscostats->os_ver()
Tries to parse device operating system version from description()
Tries to parse device operating system version from description(), falls back
to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed
=item $ciscostats->os_bin()
Tries to parse ROMMON version from rom_id() string
Tries to parse C<ROMMON> version from rom_id() string
=item $ciscostats->ios_cpu()

View File

@@ -35,7 +35,9 @@ use SNMP::Info;
use SNMP::Info::Bridge;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
$VERSION = '2.04';
$VERSION = '3.12';
@SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/;
@SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//;
@@ -75,7 +77,7 @@ $VERSION = '2.04';
sub stp_ver {
my $self = shift;
my $stp_ver = $self->SUPER::stp_ver();
if ( $stp_ver eq 'unknown' ){
if ( !defined($stp_ver) || $stp_ver eq 'unknown' ){
if ( defined $self->stpx_stp_type() ){
$stp_ver = $self->stpx_stp_type();
}

View File

@@ -41,7 +41,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
'CISCO-VTP-MIB' => 'vtpVlanName',
@@ -191,6 +191,22 @@ sub i_vlan {
return \%i_vlans;
}
sub i_untagged {
my $vtp = shift;
my ( $ifindex ) = @_;
# cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
# so we use vtp_trunk_dyn as a hint to use i_pvid
my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
return $vtp->i_pvid(@_);
}
else {
return $vtp->i_vlan(@_);
}
}
sub i_vlan_membership {
my $vtp = shift;
my $partial = shift;
@@ -244,6 +260,7 @@ sub i_vlan_membership {
next unless $list;
my $vlanlist = [ split( //, unpack( "B*", $list ) ) ];
foreach my $vlan ( keys %oper_vlans ) {
next if (($vlan < $offset) or ($vlan - $offset > 1024));
push( @{ $i_vlan_membership->{$port} }, $vlan )
if ( @$vlanlist[ $vlan - $offset ] );
}
@@ -305,6 +322,22 @@ sub set_i_vlan {
return;
}
sub set_i_untagged {
my $vtp = shift;
my ( $vlan_id, $ifindex ) = @_;
# cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
# so we use vtp_trunk_dyn as a hint to use i_pvid
my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
return $vtp->set_i_pvid(@_);
}
else {
return $vtp->set_i_vlan(@_);
}
}
sub set_add_i_vlan_tagged {
my $vtp = shift;
my ( $vlan_id, $ifindex ) = @_;
@@ -539,6 +572,10 @@ Your device will only implement a subset of these methods.
Returns a mapping between C<ifIndex> and assigned VLAN ID for access ports
and the default VLAN ID for trunk ports.
=item $vtp->i_untagged()
An alias for C<i_vlan>.
=item $vtp->i_vlan_membership()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
@@ -834,6 +871,12 @@ port C<ifIndex>. This method should only be used on trunk ports.
$vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'})
or die "Couldn't change port default VLAN. ",$vtp->error(1);
=item $vtp->set_i_untagged ( vlan, ifIndex )
This method attempts to work out whether the port referenced by ifIndex is
trunking, and if so will return the value of C<set_i_pvid>. Otherwise, the
value of C<set_i_vlan> is returned.
=item $vtp->set_add_i_vlan_tagged ( vlan, ifIndex )
Adds the VLAN to the enabled VLANs list of the port, must be supplied with the

295
Info/EDP.pm Normal file
View File

@@ -0,0 +1,295 @@
# SNMP::Info::EDP
#
# Copyright (c) 2012 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::EDP;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::LLDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::LLDP::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
'EXTREME-EDP-MIB' => 'extremeEdpPortIfIndex',
);
%GLOBALS = (
);
%FUNCS = (
# EXTREME-EDP-MIB::extremeEdpTable
'edp_rem_sysname' => 'extremeEdpNeighborName',
);
%MUNGE = (
'edp_rem_sysname' => \&SNMP::Info::munge_null,
);
sub hasEDP {
my $edp = shift;
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
return 1 if ( scalar( keys %$edp_ip ) );
return;
}
# Since we need to get IP Addresses from the extremeEdpNeighborTable which has
# a different index (adds VLAN name) than the extremeEdpTable which holds
# the remote device details use the index from extremeEdpNeighborTable but skip
# indexes which have an address of 0.0.0.0. Would like to include only one
# address since they should all originate from the same device, but we don't
# know if they would all be reachable from the network management application.
#
# We don't inplement partials since this is private index function
sub _edp_index {
my $edp = shift;
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
my %edp_index;
foreach my $key ( keys %$edp_ip ) {
my $ip = $edp_ip->{$key};
next if ($ip eq '0.0.0.0');
next unless $ip;
$edp_index{$key} = $key;
}
return \%edp_index;
}
sub edp_if {
my $edp = shift;
my $index = $edp->_edp_index() || {};
my %edp_if;
foreach my $key (keys %$index) {
my $iid = $key;
# ifIndex is first part of the iid
$iid = $1 if $iid =~ /^(\d+)\./;
$edp_if{$key} = $iid;
}
return \%edp_if;
}
sub edp_ip {
my $edp = shift;
my $index = $edp->_edp_index() || {};
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
my %edp_ip;
foreach my $key ( keys %$index ) {
my $ip = $edp_ip->{$key};
# MIB says should only be IPv4
next unless ($ip =~ /\d+(\.\d+){3}/);
$edp_ip{$key} = $ip;
}
return \%edp_ip;
}
sub edp_port {
my $edp = shift;
my $index = $edp->_edp_index() || {};
my $edp_rport = $edp->extremeEdpNeighborPort() || {};
my $edp_rslot = $edp->extremeEdpNeighborSlot() || {};
my %edp_port;
foreach my $key ( sort keys %$edp_rport ) {
my $port = $edp_rport->{$key};
my $slot = $edp_rslot->{$key} || 0;
next unless $port;
my $slotport = defined $slot ? "$slot\/$port" : $port;
foreach my $iid ( sort keys %$index ) {
$edp_port{$iid} = $slotport if ($iid =~ /^$key/);
}
}
return \%edp_port;
}
sub edp_id {
my $edp = shift;
my $index = $edp->_edp_index() || {};
my $edp_name = $edp->edp_rem_sysname() || {};
my %edp_name;
foreach my $key ( sort keys %$edp_name ) {
my $name = $edp_name->{$key} || 0;
next unless $name;
foreach my $iid ( sort keys %$index ) {
$edp_name{$iid} = $name if ($iid =~ /^$key/);
}
}
return \%edp_name;
}
sub edp_ver {
my $edp = shift;
my $index = $edp->_edp_index() || {};
my $edp_ver = $edp->extremeEdpNeighborSoftwareVersion() || {};
my %edp_ver;
foreach my $key ( sort keys %$edp_ver ) {
my $ver = $edp_ver->{$key} || 0;
next unless $ver;
foreach my $iid ( sort keys %$index ) {
$edp_ver{$iid} = $ver if ($iid =~ /^$key/);
}
}
return \%edp_ver;
}
1;
__END__
=head1 NAME
SNMP::Info::EDP - SNMP Interface to the Extreme Discovery Protocol (EDP)
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
my $edp = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'router',
Community => 'public',
Version => 2
);
my $class = $edp->class();
print " Using device sub class : $class\n";
$haslldp = $edp->hasLLDP() ? 'yes' : 'no';
# Print out a map of device ports with LLDP neighbors:
my $interfaces = $edp->interfaces();
my $edp_if = $edp->edp_if();
my $edp_ip = $edp->edp_ip();
my $edp_port = $edp->edp_port();
foreach my $edp_key (keys %$edp_ip){
my $iid = $edp_if->{$edp_key};
my $port = $interfaces->{$iid};
my $neighbor = $edp_ip->{$edp_key};
my $neighbor_port = $edp_port->{$edp_key};
print "Port : $port connected to $neighbor / $neighbor_port\n";
}
=head1 DESCRIPTION
SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented
interface to EDP information through SNMP.
EDP is a Layer 2 protocol that allows a network device to advertise its
identity and capabilities on the local network providing topology information.
Create or use a device subclass that inherits this class. Do not use
directly.
=head2 Inherited Classes
None.
=head2 Required MIBs
=over
=item F<EXTREME-EDP-MIB>
=back
=head1 GLOBAL METHODS
These are methods that return scalar values from SNMP
=over
=item $edp->hasEDP()
Is EDP is active in this device?
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $edp->edp_id()
Returns the string value used to identify the chassis component associated
with the remote system.
(C<extremeEdpNeighborName>)
=item $edp->edp_if()
Returns the mapping to the SNMP Interface Table.
=item $edp->edp_ip()
Returns remote IPv4 address.
=item $edp->edp_port()
Returns remote port ID
=item $edp->edp_ver()
Returns the operating system version of the remote system.
Nulls are removed before the value is returned.
(C<extremeEdpNeighborSoftwareVersion>)
=back
=cut

View File

@@ -41,7 +41,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
@@ -138,7 +138,7 @@ Max Baker
=head1 DESCRIPTION
F<ENTITY-MIB> is used by Layer 2 devices from HP, Aironet, Foundry, Cisco,
F<ENTITY-MIB> is used by Layer 2 devices from Brocade, Cisco, HP,
and more.
See RFC 2737 for full details.
@@ -207,7 +207,7 @@ Human Friendly
=item $entity->e_fru()
BOOLEAN. Field Replaceable unit?
BOOLEAN. Is a Field Replaceable unit?
(C<entPhysicalFRU>)

View File

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

View File

@@ -42,18 +42,11 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
%GLOBALS = (
# CDP-Compatibility
'cdp_interval' => 'snFdpGlobalMessageInterval',
'cdp_holdtime' => 'snFdpGlobalHoldTime',
'cdp_id' => 'snFdpGlobalDeviceId',
#
'fdp_run' => 'snFdpGlobalRun',
'fdp_interval' => 'snFdpGlobalMessageInterval',
'fdp_holdtime' => 'snFdpGlobalHoldTime',
@@ -61,27 +54,27 @@ $VERSION = '2.04';
);
%FUNCS = (
'c_index' => 'snFdpCacheIfIndex',
'c_proto' => 'snFdpCacheAddressType',
'c_ip' => 'snFdpCacheAddress',
'c_ver' => 'snFdpCacheVersion',
'c_id' => 'snFdpCacheDeviceId',
'c_port' => 'snFdpCacheDevicePort',
'c_platform' => 'snFdpCachePlatform',
'c_capabilities' => 'snFdpCacheCapabilities',
'c_domain' => 'snFdpCacheVTPMgmtDomain',
'c_vlan' => 'snFdpCacheNativeVLAN',
'c_duplex' => 'snFdpCacheDuplex',
'fdp_index' => 'snFdpCacheIfIndex',
'fdp_proto' => 'snFdpCacheAddressType',
'fdp_ip' => 'snFdpCacheAddress',
'fdp_ver' => 'snFdpCacheVersion',
'fdp_id' => 'snFdpCacheDeviceId',
'fdp_port' => 'snFdpCacheDevicePort',
'fdp_platform' => 'snFdpCachePlatform',
'fdp_capabilities' => 'snFdpCacheCapabilities',
'fdp_domain' => 'snFdpCacheVTPMgmtDomain',
'fdp_vlan' => 'snFdpCacheNativeVLAN',
'fdp_duplex' => 'snFdpCacheDuplex',
);
%MUNGE = (
'c_capabilities' => \&SNMP::Info::munge_caps,
'c_ip' => \&SNMP::Info::munge_ip
'fdp_capabilities' => \&SNMP::Info::munge_bits,
'fdp_ip' => \&SNMP::Info::munge_ip
);
sub cdp_run {
sub fdp_run {
my $fdp = shift;
my $fdp_run = $fdp->fdp_run();
my $fdp_run = $fdp->orig_fdp_run();
# if fdp_run isn't implemented on device, assume FDP is on
return $fdp_run if defined $fdp_run;
@@ -107,7 +100,7 @@ sub hasFDP {
return $fdp->fdp_run();
}
sub c_if {
sub fdp_if {
my $fdp = shift;
# See if by some miracle Cisco implemented the fdpCacheIfIndex entry
@@ -115,7 +108,7 @@ sub c_if {
return $fdp_index if defined $fdp_index;
# Nope, didn't think so. Now we fake it.
my $fdp_ip = $fdp->c_ip();
my $fdp_ip = $fdp->fdp_ip();
unless ( defined $fdp_ip ) {
$fdp->error_throw(
"SNMP::Info::FDP:fdp_if() - Device doesn't have fdp_ip() data. Can't fake fdp_index()"
@@ -185,8 +178,7 @@ interface to FDP information through SNMP.
FDP is a Layer 2 protocol that supplies topology information of
devices that also speak FDP, mostly switches and routers. It has
similar functionality to Cisco's CDP, and the SNMP interface is
virtually identical. FDP is implemented in Foundry devices, including
the Bigiron and Fastiron range.
virtually identical. FDP is implemented in Brocade (Foundry) devices.
Create or use a device subclass that inherits this class. Do not use
directly.
@@ -256,19 +248,19 @@ CDP compatibility
=over
=item $fdp->c_interval()
=item $fdp->fdp_interval()
Interval in seconds at which FDP messages are generated.
(C<fdpGlobalMessageInterval>)
=item $fdp->c_holdtime()
=item $fdp->fdp_holdtime()
Time in seconds that FDP messages are kept.
(C<fdpGlobalHoldTime>)
=item $fdp->c_id()
=item $fdp->fdp_id()
Returns FDP device ID.
@@ -277,7 +269,7 @@ retrieved from remote devices with $fdp->id().
(C<fdpGlobalDeviceId>)
=item $cdp->cdp_run()
=item $fdp->fdp_run()
Is FDP enabled on this device?
@@ -294,11 +286,10 @@ CDP compatibility
=over
=item $fdp->c_capabilities()
=item $fdp->fdp_capabilities()
Returns Device Functional Capabilities. Results are munged into an ascii
binary string, 7 digits long, MSB. Each digit represents a bit from the
table below.
binary string, MSB. Each digit represents a bit from the table below.
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
@@ -328,31 +319,30 @@ protocol.
=back
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to
this information.
Thanks to Martin Lorensen for a pointer to this information.
(C<fdpCacheCapabilities>)
=item $fdp->c_domain()
=item $fdp->fdp_domain()
The CDP version of this returns remote VTP Management Domain as defined
in C<CISCO-VTP-MIB::managementDomainName>
(C<fdpCacheVTPMgmtDomain>)
=item $fdp->c_duplex()
=item $fdp->fdp_duplex()
Returns the port duplex status from remote devices.
(C<fdpCacheDuplex>)
=item $fdp->c_id()
=item $fdp->fdp_id()
Returns remote device id string
(C<fdpCacheDeviceId>)
=item $fdp->c_if()
=item $fdp->fdp_if()
Returns the mapping to the SNMP Interface Table.
@@ -380,7 +370,7 @@ truncate the last number off of it :
return \%fdp_if;
=item $fdp->c_index()
=item $fdp->fdp_index()
Returns the mapping to the SNMP2 Interface table for FDP Cache Entries.
@@ -391,37 +381,37 @@ See fdp_if() entry.
(C<fdpCacheIfIndex>)
=item $fdp->c_ip()
=item $fdp->fdp_ip()
Returns remote IP address
(C<fdpCacheAddress>)
=item $fdp->c_platform()
=item $fdp->fdp_platform()
Returns remote platform id
(C<fdpCachePlatform>)
=item $fdp->c_port()
=item $fdp->fdp_port()
Returns remote port ID
(C<fdpDevicePort>)
=item $fdp->c_proto()
=item $fdp->fdp_proto()
Returns remote address type received. Usually IP.
(C<fdpCacheAddressType>)
=item $fdp->c_ver()
=item $fdp->fdp_ver()
Returns remote hardware version
(C<fdpCacheVersion>)
=item $fdp->c_vlan()
=item $fdp->fdp_vlan()
Returns the remote interface native VLAN.

View File

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

141
Info/IEEE802dot3ad.pm Normal file
View File

@@ -0,0 +1,141 @@
# SNMP::Info::IEEE802dot3ad
#
# Copyright (c) 2014 SNMP::Info Developers
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::IEEE802dot3ad;
use strict;
use Exporter;
use SNMP::Info::Aggregate;
@SNMP::Info::IEEE802dot3ad::ISA = qw/
SNMP::Info::Aggregate
Exporter
/;
@SNMP::Info::IEEE802dot3ad::EXPORT_OK = qw/
agg_ports_lag
/;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Aggregate::MIBS,
'IEEE8023-LAG-MIB' => 'dot3adAggPortSelectedAggID',
);
%GLOBALS = ();
%FUNCS = ();
%MUNGE = ();
sub agg_ports_lag {
my $dev = shift;
# TODO: implement partial
my $masters = $dev->dot3adAggActorOperKey;
my $slaves = $dev->dot3adAggPortActorOperKey;
return {} unless
ref {} eq ref $masters and scalar keys %$masters
and ref {} eq ref $slaves and scalar keys %$slaves;
my $ret = {};
foreach my $s (keys %$slaves) {
next if $slaves->{$s} == 0;
foreach my $m (keys %$masters) {
next unless $masters->{$m} == $slaves->{$s};
$ret->{$s} = $m;
last;
}
}
return $ret;
}
1;
__END__
=head1 NAME
SNMP::Info::IEEE802dot3ad - SNMP Interface to IEEE Aggregated Links
=head1 AUTHOR
SNMP::Info Developers
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $info = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $info->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
This class provides access to Aggregated Links configuration on devices
implementing C<IEEE8023-LAG-MIB>.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
L<SNMP::Info::Aggregate>
=head2 Required MIBs
=over
=item F<IEEE8023-LAG-MIB>
=back
=head1 METHODS
=over 4
=item C<agg_ports_lag>
Returns a HASH reference mapping from slave to master port for each member of
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
ifIndex of the corresponding master ports.
=back
=cut

View File

@@ -44,7 +44,7 @@ use constant {
IPV6MIB => 3,
};
$VERSION = '2.04';
$VERSION = '3.12';
@@ -59,7 +59,7 @@ $VERSION = '2.04';
%FUNCS = (
'ip_n2p_phys_addr' => 'ipNetToPhysicalPhysAddress', # IP-MIB
'c_inet_phys_addr' => 'cInetNetToMediaPhysAddress', # CISCO-IETF-IP-MIB
'i6_n2p_phys_addr' => 'ipv6NetToMediaNetAddress', # IPV6-MIB
'i6_n2p_phys_addr' => 'ipv6NetToMediaPhysAddress', # IPV6-MIB
'ip_n2p_phys_type' => 'ipNetToPhysicalType', # IP-MIB
'c_inet_phys_type' => 'cInetNetToMediaType', # CISCO-IETF-IP-MIB
@@ -108,7 +108,7 @@ sub ipv6_n2p_mac {
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
$addrtype = 2;
}
if ($addrtype == 2) { # IPv6
if (($addrtype == 2) && (defined $phys_addr->{$row})) { # IPv6
$return->{$row} = substr($phys_addr->{$row}, 0, 17);
}
}
@@ -137,8 +137,17 @@ sub ipv6_n2p_addr {
}
if ($addrtype == 2) { # IPv6
my $v6_packed = pack("C*", split(/\./, $v6addr));
$v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
$return->{$row} = $v6addr;
if (length($v6_packed) == 15) {
# Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize,
# so what we've collected in that variable is actually the first byte of the address.
$v6_packed = pack('C', $addrsize) . $v6_packed;
}
if (length($v6_packed) == 16) {
$v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
$return->{$row} = $v6addr;
} else {
printf("Invalid size for IPv6 address: expected 16 bytes, got %d (%s = %s)\n", length($v6_packed), $row, $net_addr->{$row});
}
}
}
}
@@ -385,8 +394,9 @@ Jeroen van Ingen and Carlos Vicente
=head1 DESCRIPTION
The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses
to MAC addresses, interfaces and more. It will use data from the IP-MIB, IPV6-MIB
or the CISCO-IETF-IP-MIB, whichever is supported by the device.
to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>,
F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the
device.
This class is inherited by Info::Layer3 to provide IPv6 node tracking across
device classes.

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
'LLDP-MIB' => 'lldpLocSysCapEnabled',
@@ -67,6 +67,7 @@ $VERSION = '2.04';
'lldp_rem_sysname' => 'lldpRemSysName',
'lldp_rem_sysdesc' => 'lldpRemSysDesc',
'lldp_rem_sys_cap' => 'lldpRemSysCapEnabled',
'lldp_rem_cap_spt' => 'lldpRemSysCapSupported',
# LLDP-MIB::lldpRemManAddrTable
'lldp_rman_addr' => 'lldpRemManAddrIfSubtype',
@@ -80,6 +81,7 @@ $VERSION = '2.04';
'lldp_rem_port_desc' => \&SNMP::Info::munge_null,
'lldp_sys_cap' => \&SNMP::Info::munge_bits,
'lldp_rem_sys_cap' => \&SNMP::Info::munge_bits,
'lldp_rem_cap_spt' => \&SNMP::Info::munge_bits,
);
sub hasLLDP {
@@ -97,12 +99,30 @@ sub lldp_if {
my $lldp = shift;
my $partial = shift;
my $addr = $lldp->lldp_rem_pid($partial) || {};
my $addr = $lldp->lldp_rem_pid($partial) || {};
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 );
my $port = $aOID[1];
next unless $port;
# Local LLDP port may not equate to ifIndex, see LldpPortNumber TEXTUAL-CONVENTION in LLDP-MIB.
# Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex,
# 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};
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
if ( exists $r_i_descr{$desc} ) {
$port = $r_i_descr{$desc};
} elsif ( exists $r_i_alias{$desc} ) {
$port = $r_i_alias{$desc};
}
$lldp_if{$key} = $port;
}
return \%lldp_if;
@@ -150,10 +170,15 @@ sub lldp_port {
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};
}
unless ($port) {
$port = $pid->{$key};
next unless $port;
my $type = $ptype->{$key};
next unless $type;
# May need to format other types in the future, i.e. Network address
@@ -163,7 +188,7 @@ sub lldp_port {
}
}
# Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
# 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";
@@ -191,18 +216,63 @@ sub lldp_id {
# May need to format other types in the future
if ( $type =~ /mac/ ) {
$id = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) );
}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];
$id = join '.', map { hex($_) } @octets;
}
}
}
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];
$id = join '.', map { hex($_) } @octets;
}
}
$lldp_id{$key} = $id;
}
return \%lldp_id;
}
sub lldp_platform {
my $lldp = shift;
my $partial = shift;
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) {
$lldp_platform{$key} = $desc->{$key} || $name->{$key};
}
return \%lldp_platform;
}
sub lldp_cap {
my $lldp = shift;
my $partial = shift;
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 %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});
}
$count++;
}
}
return \%lldp_cap;
}
#sub root_ip {
# my $lldp = shift;
#
@@ -343,7 +413,7 @@ Nulls are removed before the value is returned.
The string value used to identify the system description of the local system.
If the local agent supports IETF RFC 3418, C<lldpLocSysDesc> object should
have the same value of C<sysDesc> object.
Nulls are removed before the value is returned.
(C<lldpLocSysDesc>)
@@ -391,14 +461,16 @@ to a hash.
=item $lldp->lldp_id()
Returns the string value used to identify the chassis component associated
Returns the string value used to identify the chassis component associated
with the remote system.
(C<lldpRemChassisId>)
=item $lldp->lldp_if()
Returns the mapping to the SNMP Interface Table.
Returns the mapping to the SNMP Interface Table. Tries to cross reference
(C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>),
if unable defaults to (C<lldpRemLocalPortNum>).
=item $lldp->lldp_ip()
@@ -414,6 +486,17 @@ Currently only returns IPv4 or MAC addresses.
Returns remote port ID
=item $lldp->lldp_platform()
Tries to return something useful from C<lldp_rem_sysdesc()> or
C<lldp_rem_sysname()>.
=item $lldp->lldp_cap()
Returns hash of arrays with each array containing the system capabilities
supported by the remote system. Possible elements in the array are
enumerated from C<LldpSystemCapabilitiesMap>.
=back
=head2 LLDP Remote Table (C<lldpRemTable>)
@@ -429,7 +512,7 @@ the remote system.
=item $lldp->lldp_rem_id()
Returns the string value used to identify the chassis component associated
Returns the string value used to identify the chassis component associated
with the remote system.
(C<lldpRemChassisId>)
@@ -477,9 +560,9 @@ Nulls are removed before the value is returned.
=item $lldp->lldp_rem_sys_cap()
Returns which system capabilities are enabled on the local system. Results
are munged into an ascii binary string, LSB. Each digit
represents a bit from the table below:
Returns which system capabilities are enabled on the remote system. Results
are munged into an ascii binary string, LSB. Each digit represents a bit
from the table below:
=over

View File

@@ -41,7 +41,7 @@ use SNMP::Info;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%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 = '2.04';
$VERSION = '3.12';
# 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 = '2.04';
$VERSION = '3.12';
# 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 = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
@@ -93,7 +93,7 @@ sub os {
}
sub vendor {
return 'nortel';
return 'avaya';
}
sub model {
@@ -334,6 +334,13 @@ sub bp_index {
return \%bp_index;
}
sub fw_mac {
my $bayhub = shift;
my $partial = shift;
return $bayhub->SUPER::fw_mac($partial);
}
sub fw_port {
my $bayhub = shift;
my $partial = shift;
@@ -469,7 +476,7 @@ __END__
=head1 NAME
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay / Nortel Hubs
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay/Nortel/Avaya Hubs
=head1 AUTHOR
@@ -541,7 +548,7 @@ These are methods that return scalar value from SNMP
=item $bayhub->vendor()
Returns 'nortel'
Returns 'avaya'
=item $bayhub->os()

View File

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

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
@@ -324,6 +324,13 @@ sub bp_index {
return \%bp_index;
}
sub fw_mac {
my $s3000 = shift;
my $partial = shift;
return $s3000->SUPER::fw_mac($partial);
}
sub fw_port {
my $s3000 = shift;
my $partial = shift;

View File

@@ -45,7 +45,7 @@ use SNMP::Info::PowerEthernet;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
@@ -123,8 +123,11 @@ sub serial {
# precedence
# serial2,chassis parse,serial1
return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
return $1
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i ) {
return $1;
}
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
return;
@@ -155,10 +158,18 @@ sub interfaces {
my $i_descr = $l2->i_description($partial) || {};
# Replace the Index with the ifDescr field.
# Check for duplicates in ifDescr, if so uniquely identify by adding
# ifIndex to repeated values
my %seen;
foreach my $iid ( keys %$i_descr ) {
my $port = $i_descr->{$iid};
next unless defined $port;
$interfaces->{$iid} = $port;
if ( $seen{$port}++ ) {
$interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
}
else {
$interfaces->{$iid} = $port;
}
}
return $interfaces;
}

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::Airespace
# $Id$
#
# Copyright (c) 2008 Eric Miller
#
@@ -41,13 +40,14 @@ use SNMP::Info::Airespace;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
%SNMP::Info::CDP::MIBS, %SNMP::Info::Airespace::MIBS,
'AIRESPACE-SWITCHING-MIB' => 'agentInterfaceVlanId',
'CISCO-LWAPP-DOT11-CLIENT-MIB' => 'cldcClientCurrentTxRateSet',
'CISCO-LWAPP-DOT11-MIB' => 'cldHtDot11nChannelBandwidth',
'CISCO-LWAPP-AP-MIB' => 'cLApIfMacAddress',
);
%GLOBALS = (
@@ -58,28 +58,68 @@ $VERSION = '2.04';
%FUNCS = (
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
%SNMP::Info::CDP::FUNCS, %SNMP::Info::Airespace::FUNCS,
# This needs to be cleaned up, but for now we pretend to
# have the CISCO-DOT11-MIB for signal strengths, etc.
'cd11_sigstrength' => 'bsnMobileStationRSSI', # kinda
'cd11_sigqual' => 'bsnMobileStationSnr', # kinda
'cd11_rxbyte' => 'bsnMobileStationBytesReceived',
'cd11_txbyte' => 'bsnMobileStationBytesSent',
'cd11_rxpkt' => 'bsnMobileStationPacketsReceived',
'cd11_txpkt' => 'bsnMobileStationPacketsSent',
'cd11_txrate' => 'cldcClientCurrentTxRateSet',
# CISCO-LWAPP-AP-MIB::cLApTable
'ap_if_mac' => 'cLApIfMacAddress',
# CISCO-LWAPP-DOT11-CLIENT-MIB::cldcClientTable
'client_txrate' => 'cldcClientCurrentTxRateSet',
'cd11_proto' => 'cldcClientProtocol',
'cd11_rateset' => 'cldcClientDataRateSet',
# CISCO-LWAPP-DOT11-MIB::cldHtMacOperationsTable
'cd11n_ch_bw' => 'cldHtDot11nChannelBandwidth',
);
%MUNGE = (
%SNMP::Info::MUNGE, %SNMP::Info::Bridge::MUNGE,
%SNMP::Info::CDP::MUNGE, %SNMP::Info::Airespace::MUNGE,
'cd11_rxpkt' => \&munge_64bits,
'cd11_txpkt' => \&munge_64bits,
'cd11_txrate' => \&munge_cd11_txrate,
'ap_if_mac' => \&SNMP::Info::munge_mac,
'cd11n_ch_bw' => \&munge_cd11n_ch_bw,
'cd11_rateset' => \&munge_cd11_rateset,
'cd11_proto' => \&munge_cd11_proto,
);
# 802.11n Modulation and Coding Scheme (MCS)
my $mcs_index = {
20 => {
m0 => '6.5',
m1 => '13',
m2 => '19.5',
m3 => '26',
m4 => '39',
m5 => '52',
m6 => '58.5',
m7 => '65',
m8 => '13',
m9 => '26',
m10 => '39',
m11 => '52',
m12 => '78',
m13 => '104',
m14 => '117',
m15 => '130',
# This is a cheat for 802.11a bonded
m108 => '108',
},
40 => {
m0 => '15',
m1 => '30',
m2 => '45',
m3 => '60',
m4 => '90',
m5 => '120',
m6 => '135',
m7 => '157.5',
m8 => '30',
m9 => '60',
m10 => '90',
m11 => '120',
m12 => '180',
m13 => '240',
m14 => '270',
m15 => '300',
}
};
sub os {
return 'cisco';
}
@@ -96,9 +136,6 @@ sub model {
return $model;
}
# vlan:
# AIRESPACE-SWITCHING-MIB::agentInterfaceVlanId
sub cd11_mac {
my $airespace = shift;
my $cd11_sigstrength = $airespace->cd11_sigstrength();
@@ -111,13 +148,47 @@ sub cd11_mac {
return $ret;
}
sub munge_cd11_txrate {
my $rate = shift;
if ( $rate ) {
return [ $rate * 1.0 ];
} else {
return [ 0.0 ];
sub cd11_txrate {
my $airespace = shift;
my $rates = $airespace->client_txrate() || {};
my $protos = $airespace->cd11_proto() || {};
my $bws = $airespace->cd11n_ch_bw() || {};
my $cd11_txrate = {};
foreach my $idx ( keys %$rates ) {
my $rate = $rates->{$idx} || '0.0';
if ( $rate =~ /^\d+/ ) {
$cd11_txrate->{$idx} = [ $rate * 1.0 ];
}
elsif ( $rate =~ /^m/ ) {
my $band = $protos->{$idx};
my $bw = $bws->{$band};
$cd11_txrate->{$idx} = [ $mcs_index->{$bw}->{$rate} || '0.0' ];
}
else {
$cd11_txrate->{$idx} = [ $rate ];
}
}
return $cd11_txrate;
}
sub munge_cd11n_ch_bw {
my $bw = shift;
if ( $bw =~ /forty/ ) {
return 40;
}
return 20;
}
sub munge_cd11_proto {
my $bw = shift;
return 2 if ( $bw eq 'dot11n5' );
return 1;
}
sub munge_cd11_rateset {
@@ -125,11 +196,29 @@ sub munge_cd11_rateset {
return [ map { $_ * 1.0 } split /,/, $rates ];
}
sub munge_64bits {
# The controller sometimes hands off a ridiculous value for packets.
# Just truncate it to 32 bits.
my $value = shift;
return $value & 0xffffffff;
# Cisco provides the AP's Ethernet MAC via
# CISCO-LWAPP-AP-MIB::cLApIfMacAddress this was not available pre-Cisco
sub i_mac {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->i_index($partial) || {};
my $ap_mac = $airespace->ap_if_mac() || {};
my $i_mac = $airespace->SUPER::i_mac() || {};
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
$index =~ s/\.\d+$//;
next unless defined $index;
my $sys_mac = join( '.', map { hex($_) } split( ':', $index ) );
my $mac = $ap_mac->{$sys_mac};
$i_mac->{$iid} = $mac;
}
}
return $i_mac;
}
1;
@@ -187,6 +276,12 @@ my $airespace = new SNMP::Info::Layer2::Airespace(...);
=over
=item F<CISCO-LWAPP-DOT11-CLIENT-MIB>
=item F<CISCO-LWAPP-DOT11-MIB>
=item F<CISCO-LWAPP-AP-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
@@ -238,10 +333,24 @@ to a hash.
=item cd11_mac()
Returns client radio interface MAC addresses.
=item cd11_txrate()
Returns client transmission speed in Mbs.
=back
=head2 Overrides
=over
=item i_mac()
Adds AP Ethernet MAC as port mac on radio ports from C<CISCO-LWAPP-AP-MIB>.
=back
=head2 Table Methods imported from SNMP::Info::Airespace
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
@@ -254,15 +363,22 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
=head1 MUNGES
=head1 Data Munging Callback Subroutines
=over
=item munge_64bits()
=item munge_cd11n_ch_bw()
Converts 802.11n channel bandwidth to either 20 or 40.
=item munge_cd11_proto()
Converts 802.11n 2.4Ghz to 1 and 5Ghz to 2 to correspond to the
(C<cldHtMacOperationsTable>) index.
=item munge_cd11_rateset()
=item munge_cd11_txrate()
Converts rate set to array.
=back

View File

@@ -49,7 +49,7 @@ use SNMP::Info::IEEE802dot11;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%GLOBALS = (
%SNMP::Info::IEEE802dot11::GLOBALS,
@@ -193,7 +193,7 @@ sub _aironet_breakout_dot11idx {
sub fw_mac {
my $aironet = shift;
return qb_fw_mac($aironet) unless _aironet_special($aironet);
return $aironet->qb_fw_mac() unless _aironet_special($aironet);
my $c_dot11subif = $aironet->c_dot11subif();
my $fw_mac = {};
@@ -437,6 +437,26 @@ sub i_ssidbcast {
return $i_ssidbcast;
}
sub i_ssidmac {
my $aironet = shift;
my $partial = shift;
my $mbss_mac_addr = $aironet->mbss_mac_addr();
# Same logic as i_ssidbcast to return same indexes as i_ssidlist
my $map = {};
foreach my $key ( keys %$mbss_mac_addr ) {
my ( $interface, @idx ) = split( /\./, $key );
$map->{ pack( "C*", @idx ) } = $mbss_mac_addr->{$key};
}
my $i_ssidlist = $aironet->i_ssidlist();
my $i_ssidmac = {};
foreach my $key ( keys %$i_ssidlist ) {
$i_ssidmac->{$key} = $map->{ $i_ssidlist->{$key} };
}
return $i_ssidmac;
}
1;
__END__
@@ -556,7 +576,7 @@ Returns radio interfaces.
=item $aironet->cd11_mac()
Returns radio interface MAC addresses.
Returns client radio interface MAC addresses.
=item $aironet->cd11_ssid()
@@ -623,6 +643,11 @@ to which they belong.
With the same keys as i_ssidlist, returns whether the given SSID is
being broadcast.
=item $aironet->i_ssidmac()
With the same keys as i_ssidlist, returns the Basic service set
identification (BSSID), MAC address, the AP is using for the SSID.
=back
=head2 Table Methods imported from SNMP::Info::Layer2

View File

@@ -40,7 +40,7 @@ use SNMP::Info::Layer1;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
@@ -129,7 +129,7 @@ __END__
=head1 NAME
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesyn switches
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesis switches
=head1 AUTHOR

View File

@@ -1,648 +0,0 @@
# SNMP::Info::Layer2::Aruba
# $Id$
#
# Copyright (c) 2008 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer2::Aruba;
use strict;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Aruba::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Aruba::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'WLSX-SWITCH-MIB' => 'wlsxHostname',
'WLSX-WLAN-MIB' => 'wlanAPFQLN',
'WLSR-AP-MIB' => 'wlsrHideSSID',
#'ALCATEL-IND1-TP-DEVICES' => 'familyOmniAccessWireless',
);
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS, );
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
# WLSX-SWITCH-MIB::wlsxSwitchAccessPointTable
# Table index leafs do not return information
# therefore unable to use apBSSID. We extract
# the information from the IID instead.
'aruba_ap_name' => 'apLocation',
'aruba_ap_ip' => 'apIpAddress',
'aruba_ap_essid' => 'apESSID',
'aruba_ap_ssidbcast' => 'wlsrHideSSID',
# WLSX-WLAN-MIB::wlsxWlanAPTable
'aruba_perap_fqln' => 'wlanAPFQLN',
# WLSR-AP-MIB::wlsrConfigTable
'aruba_ap_channel' => 'apCurrentChannel',
# WLSX-SWITCH-MIB::wlsxSwitchStationMgmtTable
# Table index leafs do not return information
# therefore unable to use staAccessPointBSSID
# or staPhyAddress. We extract the information from
# the IID instead.
#'fw_port' => 'staAccessPointBSSID',
#'fw_mac' => 'staPhyAddress',
'fw_user' => 'staUserName',
);
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
sub layers {
return '00000011';
}
sub os {
my $aruba = shift;
my %osmap = (
'alcatel-lucent' => 'aos-w',
);
return $osmap{$aruba->vendor()} || 'airos';
}
sub vendor {
my $aruba = shift;
my $id = $aruba->id() || 'undef';
my %oidmap = (
6486 => 'alcatel-lucent',
);
$id = $1 if (defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/);
if (defined($id) and exists($oidmap{$id})) {
return $oidmap{$id};
}
else {
return 'aruba';
}
}
sub os_ver {
my $aruba = shift;
my $descr = $aruba->description();
return unless defined $descr;
if ( $descr =~ m/Version\s+(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
return;
}
sub model {
my $aruba = shift;
my $id = $aruba->id();
return unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
return $model;
}
# Thin APs do not support ifMIB requirement
#
# We return all BSSIDs as pseudo-ports on the controller.
sub i_index {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->orig_i_index($partial) || {};
my $ap_index = $aruba->aruba_ap_name($partial) || {};
my %if_index;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
$if_index{$iid} = $index;
}
# Get Attached APs as Interfaces
foreach my $ap_id ( keys %$ap_index ) {
# Convert the 0.254.123.456 index entry to a MAC address.
my $mac = join( ':',
map { sprintf( "%02x", $_ ) } split( /\./, $ap_id ) );
$if_index{$ap_id} = $mac;
}
return \%if_index;
}
sub interfaces {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->i_index($partial) || {};
my $i_descr = $aruba->i_description($partial) || {};
my %if;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /^\d+$/ ) {
# Replace the Index with the ifDescr field.
my $port = $i_descr->{$iid};
next unless defined $port;
$if{$iid} = $port;
}
elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
$if{$index} = $index;
}
else {
next;
}
}
return \%if;
}
# Most items are indexed by BSSID.
# aruba_perap_fqln is indexed by AP, so we use the
# [haven't decided yet] index to figure out all of the
# BSSIDs served by a given radio.
sub aruba_ap_fqln {
my $aruba = shift;
# I don't think $partial is meaningful in this context
my $perap_fqln = $aruba->aruba_perap_fqln();
my $channel = $aruba->wlanAPBssidChannel();
my $aruba_ap_fqln = {};
# Channel index is: AP, radio, BSSID
foreach my $idx (keys %$channel) {
my @oid = split(/\./, $idx );
my $ap = join(".", @oid[0..5]);
my $bssid = join(".", @oid[7..12]);
$aruba_ap_fqln->{$bssid} = $perap_fqln->{$ap};
}
return $aruba_ap_fqln;
}
sub i_name {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->i_index($partial) || {};
my $i_name2 = $aruba->orig_i_name($partial) || {};
my $ap_name = $aruba->aruba_ap_name($partial) || {};
my $ap_fqln = $aruba->aruba_ap_fqln($partial) || {};
my %i_name;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /^\d+$/ ) {
my $name = $i_name2->{$iid};
next unless defined $name;
$i_name{$index} = $name;
}
elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
my $name = $ap_fqln->{$iid} || $ap_name->{$iid};
next unless defined $name;
$i_name{$index} = $name;
}
else {
next;
}
}
return \%i_name;
}
sub i_ssidlist {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->i_index($partial) || {};
my $ap_ssid = $aruba->aruba_ap_essid($partial) || {};
my %i_ssid;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
my $ssid = $ap_ssid->{$iid};
next unless defined $ssid;
$i_ssid{$index} = $ssid;
}
else {
next;
}
}
return \%i_ssid;
}
sub i_80211channel {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->i_index($partial) || {};
my $ap_ch = $aruba->aruba_ap_channel($partial) || {};
my %i_ch;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
my $ch = $ap_ch->{$iid};
next unless defined $ch;
$i_ch{$index} = $ch;
}
else {
next;
}
}
return \%i_ch;
}
sub i_ssidbcast {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->i_index($partial) || {};
my $ap_bc = $aruba->aruba_ap_ssidbcast($partial) || {};
my %i_bc;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
my $bc = $ap_bc->{$iid};
next unless defined $bc;
$bc = ( $bc ? 0 : 1 );
$i_bc{$index} = $bc;
}
else {
next;
}
}
return \%i_bc;
}
# Wireless switches do not support the standard Bridge MIB
sub bp_index {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->orig_i_index($partial) || {};
my $ap_index = $aruba->aruba_ap_name($partial) || {};
my %bp_index;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
$bp_index{$iid} = $index;
}
# Get Attached APs as Interfaces
foreach my $ap_id ( keys %$ap_index ) {
# Convert the 0.254.123.456 index entry to a MAC address.
my $mac = join( ':',
map { sprintf( "%02x", $_ ) } split( /\./, $ap_id ) );
$bp_index{$mac} = $mac;
}
return \%bp_index;
}
sub fw_port {
my $aruba = shift;
my $partial = shift;
my $fw_idx = $aruba->fw_user($partial) || {};
my %fw_port;
foreach my $iid ( keys %$fw_idx ) {
if ( $iid
=~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/
)
{
my $port = join( ':',
map { sprintf( "%02x", $_ ) } split( /\./, $2 ) );
$fw_port{$iid} = $port;
}
else {
next;
}
}
return \%fw_port;
}
sub fw_mac {
my $aruba = shift;
my $partial = shift;
my $fw_idx = $aruba->fw_user($partial) || {};
my %fw_mac;
foreach my $iid ( keys %$fw_idx ) {
if ( $iid
=~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/
)
{
my $mac = join( ':',
map { sprintf( "%02x", $_ ) } split( /\./, $1 ) );
$fw_mac{$iid} = $mac;
}
else {
next;
}
}
return \%fw_mac;
}
# Return the BSSID in i_mac.
sub i_mac {
my $aruba = shift;
my $partial = shift;
# Start with the i_mac entries for the physical ports.
my $i_mac = $aruba->orig_i_mac($partial) || {};
# Add in all the BSSID entries.
my $i_index = $aruba->i_index($partial) || {};
foreach my $iid (keys %$i_index) {
my $index = $i_index->{$iid};
if ($index =~ /:/) {
$i_mac->{$index} = $index;
}
}
return $i_mac;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Aruba - SNMP Interface to Aruba wireless switches
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
my $aruba = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $aruba->class();
print " Using device sub class : $class\n";
=head1 DESCRIPTION
SNMP::Info::Layer2::Aruba is a subclass of SNMP::Info that provides an
interface to Aruba wireless switches. The Aruba platform utilizes
intelligent wireless switches which control thin access points. The thin
access points themselves are unable to be polled for end station information.
This class emulates bridge functionality for the wireless switch. This enables
end station MAC addresses collection and correlation to the thin access point
the end station is using for communication.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $aruba = new SNMP::Info::Layer2::Aruba(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<WLSX-SWITCH-MIB>
=item F<WLSR-AP-MIB>
=back
=head2 Inherited MIBs
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $aruba->model()
Returns model type. Cross references $aruba->id() with product IDs in the
Aruba MIB.
=item $aruba->vendor()
Returns 'aruba'
=item $aruba->os()
Returns 'airos'
=item $aruba->os_ver()
Returns the software version extracted from C<sysDescr>
=back
=head2 Overrides
=over
=item $aruba->layers()
Returns 00000011. Class emulates Layer 2 functionality for Thin APs through
proprietary MIBs.
=back
=head2 Globals imported from SNMP::Info::Layer2
See 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 Overrides
=over
=item $aruba->i_index()
Returns reference to map of IIDs to Interface index.
Extends C<ifIndex> to support thin APs as device interfaces.
=item $aruba->interfaces()
Returns reference to map of IIDs to ports. Thin APs are implemented as device
interfaces. The thin AP BSSID is used as the port identifier.
=item $aruba->i_name()
Interface name. Returns (C<ifName>) for Ethernet interfaces and
(C<wlanAPFQLN> or C<apLocation>) for thin AP interfaces.
=item $aruba->i_mac()
Interface MAC address. Returns interface MAC address for Ethernet
interfaces and BSSID for thin AP interfaces.
=item $aruba->bp_index()
Simulates bridge MIB by returning reference to a hash containing the index for
both the keys and values.
=item $aruba->fw_port()
(C<staAccessPointBSSID>) as extracted from the IID.
=item $aruba->fw_mac()
(C<staPhyAddress>) as extracted from the IID.
=item $aruba->i_ssidlist()
Returns reference to hash. SSID's recognized by the radio interface.
(C<apESSID>)
=item $aruba->i_ssidbcast()
Returns reference to hash. Indicates whether the SSID is broadcast, true or
false.
(C<wlsrHideSSID>)
=item $aruba->i_80211channel()
Returns reference to hash. Current operating frequency channel of the radio
interface.
(C<apCurrentChannel>)
=item $aruba->aruba_ap_fqln()
Returns F<aruba_perap_fqln> indexed by BSSID instead of by AP.
=back
=head2 Aruba Switch AP Table (C<wlsxSwitchAccessPointTable>)
=over
=item $aruba->aruba_ap_name()
(C<apLocation>)
=item $aruba->aruba_ap_ip()
(C<apIpAddress>)
=item $aruba->aruba_ap_essid()
(C<apESSID>)
=item $aruba->aruba_ap_ssidbcast()
(C<wlsrHideSSID>)
=back
=head2 Aruba AP Table (C<wlsxWlanAPTable>)
=over
=item $aruba->aruba_perap_fqln()
(C<wlanAPFQLN>)
=back
=head2 Aruba Switch Station Management Table (C<wlsxSwitchStationMgmtTable>)
=over
=item $aruba->fw_user()
(C<staUserName>)
=back
=head2 Aruba Wireless AP Configuration Table (C<wlsrConfigTable>)
=over
=item $aruba->aruba_ap_channel()
(C<apCurrentChannel>)
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,492 +0,0 @@
# SNMP::Info::Layer2::Bay
# $Id$
# This module depricated. See Layer2::BayStack
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer2::Bay;
use strict;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Bay::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Bay::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
# Set for No CDP
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
'cdp_id' => 's5EnMsTopIpAddr',
'cdp_run' => 's5EnMsTopStatus',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
'imac2' => 'ifPhysAddress',
# S5-ETH-MULTISEG-TOPOLOGY-MIB::s5EnMsTopNmmTable
'bay_topo_slot' => 's5EnMsTopNmmSlot',
'bay_topo_port' => 's5EnMsTopNmmPort',
'bay_topo_ip' => 's5EnMsTopNmmIpAddr',
'bay_topo_seg' => 's5EnMsTopNmmSegId',
'bay_topo_mac' => 's5EnMsTopNmmMacAddr',
'bay_topo_platform' => 's5EnMsTopNmmChassisType',
'bay_topo_localseg' => 's5EnMsTopNmmLocalSeg',
);
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'SYNOPTICS-ROOT-MIB' => 'synoptics',
'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop'
);
delete $MIBS{'CISCO-CDP-MIB'};
# 450's report full duplex as speed = 20mbps?!
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, 'i_mac2' => \&SNMP::Info::munge_mac, );
sub os {
return 'bay';
}
sub os_ver {
my $bay = shift;
my $descr = $bay->description();
return unless defined $descr;
# 303 / 304
if ( $descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
# 450
if ( $descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
return;
}
sub os_bin {
my $bay = shift;
my $descr = $bay->description();
return unless defined $descr;
# 303 / 304
if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) {
return $1;
}
# 450
if ( $descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
return;
}
sub vendor {
# or nortel, or synopsis?
return 'bay';
}
sub i_ignore {
my $bay = shift;
my $descr = $bay->description();
my $i_type = $bay->i_type();
my %i_ignore;
foreach my $if ( keys %$i_type ) {
my $type = $i_type->{$if};
$i_ignore{$if}++ if $type =~ /(loopback|propvirtual|cpu)/i;
}
return \%i_ignore;
}
sub interfaces {
my $bay = shift;
my $i_index = $bay->i_index();
return $i_index;
}
sub i_mac {
my $bay = shift;
my $i_mac = $bay->i_mac2();
# Bay 303's with a hw rev < 2.11.4.5 report the mac as all zeros
foreach my $iid ( keys %$i_mac ) {
my $mac = $i_mac->{$iid};
delete $i_mac->{$iid} if $mac eq '00:00:00:00:00:00';
}
return $i_mac;
}
sub model {
my $bay = shift;
my $id = $bay->id();
return unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^sreg-//i;
my $descr = $bay->description();
return '303' if ( $descr =~ /\D303\D/ );
return '304' if ( $descr =~ /\D304\D/ );
return '450' if ( $model =~ /BayStack450/ );
return $model;
}
# Hack in some CDP type stuff
sub c_if {
my $bay = shift;
my $bay_topo_port = $bay->bay_topo_port();
my %c_if;
foreach my $entry ( keys %$bay_topo_port ) {
my $port = $bay_topo_port->{$entry};
next unless defined $port;
next if $port == 0;
$c_if{"$port.1"} = $port;
}
return \%c_if;
}
sub c_ip {
my $bay = shift;
my $bay_topo_ip = $bay->bay_topo_ip();
my $bay_topo_port = $bay->bay_topo_port();
my $ip = $bay->cdp_ip();
# Count the number of devices seen on each port.
# more than one device seen means connected to a non-bay
# device, but other bay devices are squawking further away.
my %ip_port;
foreach my $entry ( keys %$bay_topo_ip ) {
my $port = $bay_topo_port->{$entry};
next unless defined $port;
next if ( $port =~ /^[\d\.]+$/ and $port == 0 );
my $ip = $bay_topo_ip->{$entry};
push( @{ $ip_port{$port} }, $ip );
}
my %c_ip;
foreach my $port ( keys %ip_port ) {
my $ips = $ip_port{$port};
if ( scalar @$ips == 1 ) {
$c_ip{"$port.1"} = $ips->[0];
}
else {
$c_ip{"$port.1"} = $ips;
}
}
return \%c_ip;
}
sub c_port {
my $bay = shift;
my $bay_topo_port = $bay->bay_topo_port();
my $bay_topo_seg = $bay->bay_topo_seg();
my %c_port;
foreach my $entry ( keys %$bay_topo_seg ) {
my $port = $bay_topo_port->{$entry};
next unless defined $port;
next if $port == 0;
# For fake remotes (multiple IPs for a c_ip), use first found
next if defined $c_port{"$port.1"};
my $seg = $bay_topo_seg->{$entry};
# Segment id is (256 * remote slot_num) + (remote_port)
my $remote_port = $seg % 256;
$c_port{"$port.1"} = $remote_port;
}
return \%c_port;
}
sub c_platform {
my $bay = shift;
my $bay_topo_port = $bay->bay_topo_port();
my $bay_topo_platform = $bay->bay_topo_platform();
my %c_platform;
foreach my $entry ( keys %$bay_topo_platform ) {
my $port = $bay_topo_port->{$entry} || 0;
next if $port == 0;
# For fake remotes (multiple IPs for a c_ip), use first found
next if defined $c_platform{"$port.1"};
my $platform = $bay_topo_platform->{$entry};
$c_platform{"$port.1"} = $platform;
}
return \%c_platform;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Bay - SNMP Interface to old Bay Network BayStack Switches
=head1 AUTHOR
Max Baker
=head1 SYNOPSIS
This module is Deprecated. Please use Layer2::BayStack instead.
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Bay device 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 $bay = new SNMP::Info::Layer2::Bay(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<SYNOPTICS-ROOT-MIB>
=item F<S5-ETH-MULTISEG-TOPOLOGY-MIB>
=item Inherited classes
MIBs required by L<SNMP::Info::Layer2/"Required MIBs"> and its superclasses.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $bay->vendor()
Returns 'bay' :)
=item $bay->model()
Cross references $bay->id() to the F<SYNOPTICS-MIB> and returns
the results. 303s and 304s have the same ID, so we have a hack
to return depending on which it is.
Removes C<sreg-> from the model name
=item $baystack->os()
Returns 'bay'.
=item $bay->os_ver()
Returns the os version extracted from C<sysDescr>.
=item $bay->os_bin()
Returns the firmware version extracted from C<sysDescr>.
=item $bay->cdp_id()
Returns the IP that the device is sending out for its Nmm topology info.
(C<s5EnMsTopIpAddr>)
=item $bay->cdp_run()
Returns if the F<S5-ETH-MULTISEG-TOPOLOGY> info is on for this device.
(C<s5EnMsTopStatus>)
=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 Overrides
=over
=item $bay->interfaces()
Returns reference to map of IIDs to physical ports.
Currently simply returns the C<ifIndex>
=item $bay->i_ignore()
Returns reference to hash of IIDs to ignore.
Simply calls the SNMP::Info::Layer2::i_ignore() for this.
=item $bay->i_mac()
Returns the C<ifPhysAddress> table entries.
Removes all entries matching '00:00:00:00:00:00' -- Certain
older revisions of Bay 303 and 304 firmware report all zeros
for each port mac.
=back
=head2 Pseudo CDP information
All entries with port=0 are local and ignored.
=over
=item $bay->c_if()
Returns reference to hash. Key: port.1 Value: port (iid)
=item $bay->c_ip()
Returns reference to hash. Key: port.1
The value of each hash entry can either be a scalar or an array.
A scalar value is most likely a direct neighbor to that port.
It is possible that there is a non-bay device in between this device and the
remote device.
An array value represents a list of seen devices. The only time you will get
an array of neighbors, is if there is a non-bay device in between two or more
devices.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $bay->c_port()
Returns reference to hash. Key: IID, Value: Remote port (interfaces)
=item $bay->c_platform()
Returns reference to hash. Key: IID, Value: Remote device type
=item $bay->port()
Returns reference to hash. Key: port.1 Value: port
=item $bay->platform()
Returns reference to hash. Key: port.1 Value: Remote Device Type
=back
=head2 Layer2 Topology info (C<s5EnMsTopNmmTable>)
=over
=item $bay->bay_topo_slot()
Returns reference to hash. Key: Table entry, Value:slot number
(C<s5EnMsTopNmmSlot>)
=item $bay->bay_topo_port()
Returns reference to hash. Key: Table entry, Value:Port Number
(interface iid)
(C<s5EnMsTopNmmPort>)
=item $bay->bay_topo_ip()
Returns reference to hash. Key: Table entry, Value:Remote IP address of entry
(C<s5EnMsTopNmmIpAddr>)
=item $bay->bay_topo_seg()
Returns reference to hash. Key: Table entry, Value:Remote Segment ID
(C<s5EnMsTopNmmSegId>)
=item $bay->bay_topo_mac
(C<s5EnMsTopNmmMacAddr>)
Returns reference to hash. Key: Table entry, Value:Remote MAC address
=item $bay->bay_topo_platform
Returns reference to hash. Key: Table entry, Value:Remote Device Type
(C<s5EnMsTopNmmChassisType>)
=item $bay->bay_topo_localseg
Returns reference to hash. Key: Table entry, Value:Boolean, if bay_topo_seg()
is local
(C<s5EnMsTopNmmLocalSeg>)
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -46,12 +46,13 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::LLDP::MIBS,
%SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS,
%SNMP::Info::SONMP::MIBS,
'BAY-STACK-PETH-EXT-MIB' => 'bspePethPsePortExtMeasuredPower',
);
%GLOBALS = (
@@ -64,6 +65,7 @@ $VERSION = '2.04';
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::LLDP::FUNCS,
%SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS,
%SNMP::Info::SONMP::FUNCS,
'peth_port_power' => 'bspePethPsePortExtMeasuredPower',
);
# 450's report full duplex as speed = 20mbps?!
@@ -79,27 +81,20 @@ $SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps';
sub os {
my $baystack = shift;
my $descr = $baystack->description();
my $model = $baystack->model();
my $descr = $baystack->description() || "";
my $model = $baystack->model() || "";
if ( ( defined $descr and $descr =~ /Business Ethernet Switch.*SW:v/i ) )
{
if ( $descr =~ /Business Ethernet Switch.*SW:v/i ) {
return 'bes';
}
if (
(
(defined $model and $model =~ /(420|425|BPS)/ )
and
(defined $descr and $descr =~ m/SW:v[1-2]/i )
)
or
(
(defined $model and $model =~ /(410|450|380)/ )
)
)
if ( ( ( $model =~ /(420|425|BPS)/ ) and ( $descr =~ m/SW:v[1-2]/i ) )
or ( ( $model =~ /(410|450|380)/ ) ) )
{
return 'baystack';
}
if ( $model =~ /VSP/ ) {
return 'vsp';
}
return 'boss';
}
@@ -126,7 +121,7 @@ sub os_bin {
}
sub vendor {
return 'nortel';
return 'avaya';
}
sub model {
@@ -141,9 +136,12 @@ sub model {
return '303' if ( defined $descr and $descr =~ /\D303\D/ );
return '304' if ( defined $descr and $descr =~ /\D304\D/ );
return 'BPS' if ( $model =~ /BPS2000/i );
return $2
if ( $model
=~ /(ES|ERS|BayStack|EthernetRoutingSwitch|EthernetSwitch)-?(\d+)/ );
# Pull sreg- from all
$model =~ s/^sreg-//;
# Strip ES/ERS/BayStack etc. from those families
$model =~ s/^(E(R)?S|BayStack|Ethernet(Routing)?Switch)-?//;
$model =~ s/-ethSwitchNMM//;
return $model;
}
@@ -162,7 +160,7 @@ sub interfaces {
next unless defined $index;
# Ignore cascade ports
next if $index > 513;
next if $index > $index_factor * 8;
my $port = ( $index % $index_factor );
my $slot = ( int( $index / $index_factor ) ) + $slot_offset;
@@ -214,7 +212,7 @@ sub i_name {
sub index_factor {
my $baystack = shift;
my $model = $baystack->model();
my $model = $baystack->model() || "";
my $os = $baystack->os();
my $os_ver = $baystack->os_ver();
my $op_mode = $baystack->ns_op_mode();
@@ -228,142 +226,16 @@ sub index_factor {
my $index_factor = 32;
$index_factor = 64
if ( ( defined $model and $model =~ /(470)/ )
if ( ( $model =~ /(470)/ )
or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) );
$index_factor = 128
if ( ( defined $model and $model =~ /(5[56]\d\d)/ )
if ( ( $model =~ /(5[56]\d\d)|VSP/ )
and ( $os_ver >= 6 ) );
return $index_factor;
}
# Use SONMP and/or LLDP
sub hasCDP {
my $baystack = shift;
return $baystack->hasLLDP() || $baystack->SUPER::hasCDP();
}
sub c_ip {
my $baystack = shift;
my $partial = shift;
my $cdp = $baystack->SUPER::c_ip($partial) || {};
my $lldp = $baystack->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 $baystack = shift;
my $partial = shift;
my $lldp = $baystack->lldp_if($partial) || {};
my $cdp = $baystack->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 $baystack = shift;
my $partial = shift;
my $lldp = $baystack->lldp_port($partial) || {};
my $cdp = $baystack->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 $baystack = shift;
my $partial = shift;
my $lldp = $baystack->lldp_id($partial) || {};
my $cdp = $baystack->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 $baystack = shift;
my $partial = shift;
my $lldp = $baystack->lldp_rem_sysdesc($partial) || {};
my $cdp = $baystack->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;
}
# Newer devices support ENTITY-MIB, use if available otherwise use proprietary
# methods.
@@ -452,14 +324,31 @@ sub e_vendor {
return $stack->SUPER::e_vendor($partial) || $stack->ns_e_vendor($partial);
}
# fix for stack of switches without POE on module 1
# https://sourceforge.net/tracker/?func=detail&aid=3317739&group_id=70362&atid=527529
sub peth_port_ifindex {
my $stack = shift;
my $partial = shift;
my %peth_port_ifindex = ();
my $poe_port_st = $stack->peth_port_status($partial);
my $if_index = $stack->interfaces($partial);
foreach my $i (keys %$if_index) {
next unless defined $poe_port_st->{$if_index->{$i}};
$peth_port_ifindex{$if_index->{$i}} = $i;
}
return \%peth_port_ifindex;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Baystack - SNMP Interface to Nortel Ethernet (Baystack)
Switches
SNMP::Info::Layer2::Baystack - SNMP Interface to Avaya Ethernet Switch
(Baystack) and VSP 7000 series switches
=head1 AUTHOR
@@ -482,8 +371,9 @@ Eric Miller
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a Nortel
Ethernet Switch (Baystack) through SNMP.
Provides abstraction to the configuration information obtainable from an
Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series
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.
@@ -510,6 +400,8 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...);
=over
=item F<BAY-STACK-PETH-EXT-MIBB>
=back
=head2 Inherited MIBs
@@ -532,7 +424,7 @@ These are methods that return scalar value from SNMP
=item $baystack->vendor()
Returns 'nortel'
Returns 'avaya'
=item $baystack->model()
@@ -628,6 +520,16 @@ revisions of Baystack firmware report all zeros for each port mac.
Crosses C<ifName> with C<ifAlias> and returns the human set port name if
exists.
=item $baystack->peth_port_ifindex()
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
=item $baystack->peth_port_power()
Power supplied by PoE ports, in milliwatts
(C<bspePethPsePortExtMeasuredPower>)
=back
=head2 F<ENTITY-MIB> Information
@@ -698,54 +600,6 @@ ns_e_vendor().
=back
=head2 Topology information
Based upon the software version devices may support SynOptics Network
Management Protocol (SONMP) and Link Layer Discovery Protocol (LLDP). These
methods will query both and return the combination of all information. As a
result, there may be identical topology information returned from the two
protocols causing duplicate entries. It is the calling program's
responsibility to identify any duplicate entries and remove duplicates if
necessary.
=over
=item $baystack->hasCDP()
Returns true if the device is running either SONMP or LLDP.
=item $baystack->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $baystack->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-SONMP/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 $baystack->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $baystack->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $baystack->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Table Methods imported from SNMP::Info::SONMP
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.

View File

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

View File

@@ -47,7 +47,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
@@ -139,6 +139,32 @@ sub i_duplex_admin {
return \%i_duplex_admin;
}
sub i_speed_admin {
my $c2900 = shift;
my $partial = shift;
my %i_speed_admin;
my $p_port = $c2900->p_port() || {};
my $interfaces = $c2900->interfaces($partial);
my $c2900_p_index = $c2900->c2900_p_index() || {};
my %reverse_2900 = reverse %$c2900_p_index;
my $c2900_p_speed
= $c2900->c2900_p_speed_admin( $reverse_2900{$partial} );
my %speeds = (
'autoDetect' => 'auto',
's10000000' => '10 Mbps',
's100000000' => '100 Mbps',
);
%i_speed_admin
= map { $c2900_p_index->{$_} => $speeds{ $c2900_p_speed->{$_} } }
keys %$c2900_p_index;
return \%i_speed_admin;
}
sub set_i_speed_admin {
my $c2900 = shift;
my ( $speed, $iid ) = @_;
@@ -349,6 +375,10 @@ Returns reference to hash of IIDs to admin duplex setting
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin()
=item $c2900->i_speed_admin()
Returns reference to hash of IIDs to admin speed setting.
=back
=head2 F<C2900-MIB> Port Entry Table

View File

@@ -49,7 +49,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
@@ -148,7 +148,9 @@ sub interfaces {
foreach my $iid ( keys %$i_index ) {
next unless defined $iid;
my $if = $i_index->{$iid};
$if =~ s/\./\// if $if;
my $port = $portmap{$iid};
$port =~ s/\./\// if $port;
$interfaces{$iid} = $port || $if;
}
return \%interfaces;

View File

@@ -43,7 +43,7 @@ use SNMP::Info::SONMP;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::MIBS,
@@ -246,6 +246,20 @@ sub slot_offset {
return 0;
}
sub fw_mac {
my $centillion = shift;
my $partial = shift;
return $centillion->SUPER::fw_mac($partial);
}
sub fw_port {
my $centillion = shift;
my $partial = shift;
return $centillion->SUPER::fw_port($partial);
}
1;
__END__

View File

@@ -50,7 +50,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoConfig::MIBS,

268
Info/Layer2/CiscoSB.pm Normal file
View File

@@ -0,0 +1,268 @@
# SNMP::Info::Layer2::CiscoSB
# $Id$
#
# Copyright (c) 2013 Nic Bernstein
#
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer2::CiscoSB;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::Entity;
use SNMP::Info::EtherLike;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoConfig;
use SNMP::Info::CDP;
@SNMP::Info::Layer2::CiscoSB::ISA
= qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
@SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.12';
# This will be filled in with the device's index into the EntPhysicalEntry
# table by the serial() function.
our $index = undef;
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
'descr' => 'sysDescr'
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::Entity::FUNCS,
%SNMP::Info::EtherLike::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CDP::FUNCS,
);
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::Entity::MIBS,
%SNMP::Info::EtherLike::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CDP::MIBS,
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::Entity::MUNGE,
%SNMP::Info::EtherLike::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CDP::MUNGE,
);
sub vendor {
return 'cisco';
}
# Walk the entPhysicalSerialNum table and return both the first serial
# number found as well as the index of that entry.
sub serial {
my $ciscosb = shift;
my $serial = undef;
my $e_serial = $ciscosb->e_serial();
# Find entity table entry for this unit
foreach my $e ( keys %$e_serial ) {
if (defined ($e_serial->{$e}) and $e_serial->{$e} !~ /^\s*$/) {
$index = $e;
last;
}
}
return $e_serial->{$index} if defined $index;
}
sub os_ver {
my $ciscosb = shift;
my $os_ver = $ciscosb->e_swver();
return $os_ver->{$index} if defined $index;
}
# Grab e_model from Entity and tag on e_hwver
sub model {
my $ciscosb = shift;
my $e_model = $ciscosb->e_model();
my $e_hwver = $ciscosb->e_hwver();
if (defined ($index)) {
my $model = "$e_model->{$index} $e_hwver->{$index}";
return $model;
}
return $ciscosb->description();
}
# ifDescr is the same for all interfaces in a class, but the ifName is
# unique, so let's use that for port name.
sub interfaces {
my $ciscosb = shift;
my $partial = shift;
my $interfaces = $ciscosb->i_name($partial);
return $interfaces;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::CiscoSB - SNMP Interface to Cisco Small Business series
=head1 AUTHOR
Nic Bernstein (shamelessly stolen from Max Baker's Aironet code)
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $ciscosb = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $ciscosb->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides interface to SNMP Data available on Cisco Small Business (nee LinkSys)
managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1)]
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=item SNMP::Info::Entity
=item SNMP::Info::EtherLike
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoConfig
=back
=head2 Required MIBs
=over
=item Inherited Classes
MIBs required by the inherited classes listed above.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $ciscosb->vendor()
Returns 'cisco'
=item $ciscosb->os_ver()
Returns software version (C<entPhysicalSoftwareRev>)
=item $ciscosb->serial()
Returns serial number of unit (C<entPhysicalSerialNum>)
=item $ciscosb->model()
Returns model and hardware revision of unit
(C<entPhysicalModelName+entPhysicalHardwareRev>)
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Entity
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::EtherLike
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
=head1 TABLE METHODS
=head2 Overrides
=over
=item $ciscosb->interfaces()
Uses the i_name() field.
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Entity
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::EtherLike
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
=cut

View File

@@ -1,349 +0,0 @@
# SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry Switches
# $Id$
#
# Copyright (c) 2008 Max Baker
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer2::Foundry;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::FDP;
use SNMP::Info::EtherLike;
use SNMP::Info::MAU;
@SNMP::Info::Layer2::Foundry::ISA
= qw/SNMP::Info::Layer2 SNMP::Info::FDP SNMP::Info::EtherLike
SNMP::Info::MAU Exporter/;
@SNMP::Info::Layer2::Foundry::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.04';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::FDP::MIBS,
%SNMP::Info::EtherLike::MIBS, %SNMP::Info::MAU::MIBS,
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::FDP::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS, %SNMP::Info::MAU::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::FDP::FUNCS,
%SNMP::Info::EtherLike::FUNCS, %SNMP::Info::MAU::FUNCS,
'test' => 'dot1dStpPortState',
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::FDP::MUNGE,
%SNMP::Info::EtherLike::MUNGE, %SNMP::Info::MAU::MUNGE,
);
# Method OverRides
#sub bulkwalk_no { 1;}
*SNMP::Info::Layer2::Foundry::i_duplex = \&SNMP::Info::MAU::mau_i_duplex;
*SNMP::Info::Layer2::Foundry::i_duplex_admin
= \&SNMP::Info::MAU::mau_i_duplex_admin;
*SNMP::Info::Layer2::Foundry::i_vlan = \&SNMP::Info::Bridge::qb_i_vlan_t;
# todo doc these
sub os_ver {
my $foundry = shift;
my $e_name = $foundry->e_name();
# find entity table entry for "stackmanaget.1"
my $unit_iid = undef;
foreach my $e ( keys %$e_name ) {
my $name = $e_name->{$e} || '';
$unit_iid = $e if $name eq 'stackmanaget.1';
}
# Default to OID method if no dice.
unless ( defined $unit_iid ) {
return $foundry->SUPER::model();
}
# Find Model Name
my $e_fwver = $foundry->e_fwver();
if ( defined $e_fwver->{$unit_iid} ) {
return $e_fwver->{$unit_iid};
}
# Not found in ENTITY-MIB, go up a level.
return $foundry->SUPER::os_ver();
}
sub model {
my $foundry = shift;
my $e_name = $foundry->e_name();
# find entity table entry for "unit.1"
my $unit_iid = undef;
foreach my $e ( keys %$e_name ) {
my $name = $e_name->{$e} || '';
$unit_iid = $e if $name eq 'unit.1';
}
# Default to OID method if no dice.
unless ( defined $unit_iid ) {
return $foundry->SUPER::model();
}
# Find Model Name
my $e_model = $foundry->e_model();
if ( defined $e_model->{$unit_iid} ) {
return $e_model->{$unit_iid};
}
# Not found in ENTITY-MIB, go up a level.
return $foundry->SUPER::model();
}
sub serial {
my $foundry = shift;
my $e_name = $foundry->e_name();
# find entity table entry for "unit.1"
my $unit_iid = undef;
foreach my $e ( keys %$e_name ) {
my $name = $e_name->{$e} || '';
$unit_iid = $e if $name eq 'unit.1';
}
return unless defined $unit_iid;
# Look up serial of found entry.
my $e_serial = $foundry->e_serial();
return $e_serial->{$unit_iid} if defined $e_serial->{$unit_iid};
return $foundry->SUPER::serial();
}
sub interfaces {
my $foundry = shift;
my $i_descr = $foundry->i_description;
my $i_name = $foundry->i_name;
# use ifName only if it is in portn
# format. For EdgeIrons
# else use ifDescr
foreach my $iid ( keys %$i_name ) {
my $name = $i_name->{$iid};
next unless defined $name;
$i_descr->{$iid} = $name
if $name =~ /^port\d+/i;
}
return $i_descr;
}
sub i_ignore {
my $foundry = shift;
my $i_type = $foundry->i_type();
my %i_ignore = ();
foreach my $iid ( keys %$i_type ) {
my $type = $i_type->{$iid} || '';
$i_ignore{$iid}++
# 33 is the console port
if $type =~ /(loopback|propvirtual|other|cpu|33)/i;
}
return \%i_ignore;
}
sub os {
return 'foundry';
}
sub vendor {
return 'foundry';
}
# this hangs on a edgeiron24g
# TODO: check by devicetype and deferr to SUPER if not bad device
sub stp_p_state { return; }
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry FastIron Network
Devices
=head1 AUTHOR
Max Baker
=head1 SYNOPSIS
This module is Deprecated. Please use Layer3::Foundry instead.
# Let SNMP::Info determine the correct subclass for you.
my $foundry = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $foundry->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
This module is Deprecated. Please use Layer3::Foundry instead.
This module provides support for Foundry EdgeIron Switches
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=item SNMP::Info::FDP
=back
=head2 Required MIBs
=over
=item F<FOUNDRY-SN-ROOT-MIB>
=item Inherited Classes' MIBs
See classes listed above for their required MIBs.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $foundry->model()
Returns model type.
=item $foundry->vendor()
Returns 'foundry'
=item $foundry->os()
Returns 'foundry'
=item $foundry->os_ver()
Returns the software version
=item $foundry->serial()
Returns the serial number
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::FDP
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $foundry->interfaces()
Returns reference to hash of interface names to iids.
=item $foundry->i_ignore()
Returns reference to hash of interfaces to be ignored.
Ignores interfaces with descriptions of tunnel,loopback,null
=item $foundry->i_duplex()
Returns reference to hash of interface link duplex status.
Crosses $foundry->sw_duplex() with $foundry->sw_index()
=item $foundry->i_duplex_admin()
Returns reference to hash of interface administrative duplex status.
=item $foundry->stp_p_state()
"The port's current state as defined by application of the Spanning Tree
Protocol.
Skipped if device is an EdgeIron 24G due to reports of hangs.
(C<dot1dStpPortState>)
=item $foundry->i_vlan()
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::FDP
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
=cut

View File

@@ -46,7 +46,7 @@ use SNMP::Info::CDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -61,6 +61,7 @@ $VERSION = '2.04';
'HP-ICF-CHASSIS' => 'hpicfSensorObjectId',
'HP-ICF-BRIDGE' => 'hpicfBridgeRstpForceVersion',
'HP-ICF-POE-MIB' => 'hpicfPoePethPsePortCurrent',
'SEMI-MIB' => 'hpHttpMgSerialNumber',
);
%GLOBALS = (
@@ -69,11 +70,13 @@ $VERSION = '2.04';
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
'serial1' => 'entPhysicalSerialNum.1',
'serial2' => 'hpHttpMgSerialNumber.0',
'hp_cpu' => 'hpSwitchCpuStat.0',
'hp_mem_total' => 'hpGlobalMemTotalBytes.1',
'mem_free' => 'hpGlobalMemFreeBytes.1',
'mem_used' => 'hpGlobalMemAllocBytes.1',
'os_version' => 'hpSwitchOsVersion.0',
'os_version2' => 'hpHttpMgVersion.0',
'os_bin' => 'hpSwitchRomVersion.0',
'mac' => 'hpSwitchBaseMACAddress.0',
'rstp_ver' => 'hpicfBridgeRstpForceVersion',
@@ -145,6 +148,15 @@ $VERSION = '2.04';
'J8771A' => '4202vl-48G',
'J4865A' => '4108GL',
'J4887A' => '4104GL',
'J9588A' => '3800-48G-PoE+-4XG',
'J9574A' => '3800-48G-PoE+-4SFP+',
'J9586A' => '3800-48G-4XG',
'J9576A' => '3800-48G-4SFP+',
'J9584A' => '3800-24SFP-2SFP+',
'J9587A' => '3800-24G-PoE+-2XG',
'J9573A' => '3800-24G-PoE+-2SFP+',
'J9585A' => '3800-24G-2XG',
'J9575A' => '3800-24G-2SFP+',
'J8693A' => '3500yl-48G-PWR',
'J8692A' => '3500yl-24G-PWR',
'J9473A' => '3500-48-PoE',
@@ -155,6 +167,10 @@ $VERSION = '2.04';
'J4905A' => '3400cl-24G',
'J4815A' => '3324XL',
'J4851A' => '3124',
'J9729A' => '2920-48G-PoE+',
'J9728A' => '2920-48G',
'J9727A' => '2920-24G-PoE+',
'J9726A' => '2920-24G',
'J9562A' => '2915-8G-PoE',
'J9148A' => '2910al-48G-PoE+',
'J9147A' => '2910al-48G',
@@ -166,26 +182,35 @@ $VERSION = '2.04';
'J4903A' => '2824',
'J9022A' => '2810-48G',
'J9021A' => '2810-24G',
'J4899C' => '2650C',
'J8165A' => '2650-PWR',
'J4899B' => '2650-CR',
'J4899C' => '2650C',
'J4899A' => '2650',
'J4900C' => '2626C',
'J8164A' => '2626-PWR',
'J4900B' => '2626-CR',
'J4900C' => '2626C',
'J4900A' => '2626',
'J9627A' => '2620-48-PoE+',
'J9626A' => '2620-48',
'J9625A' => '2620-24-PoE+',
'J9624A' => '2620-24-PPoE+',
'J9623A' => '2620-24',
'J9565A' => '2615-8-PoE',
'J9089A' => '2610-48-PWR',
'J9088A' => '2610-48',
'J9087A' => '2610-24-PWR',
'J9086A' => '2610-24/12PWR',
'J9087A' => '2610-24-PWR',
'J9085A' => '2610-24',
'J8762A' => '2600-8-PWR',
'J9772A' => '2530-48G-PoE+',
'J9775A' => '2530-48G',
'J9773A' => '2530-24G-PoE+',
'J9776A' => '2530-24G',
'J4813A' => '2524',
'J9137A' => '2520-8-PoE',
'J9138A' => '2520-24-PoE',
'J9298A' => '2520G-8-PoE',
'J9299A' => '2520G-24-PoE',
'J9137A' => '2520-8-PoE',
'J9138A' => '2520-24-PoE',
'J4812A' => '2512',
'J9280A' => '2510G-48',
'J9279A' => '2510G-24',
@@ -223,7 +248,7 @@ sub os {
sub os_ver {
my $hp = shift;
my $os_version = $hp->os_version();
my $os_version = $hp->os_version() || $hp->os_version2();
return $os_version if defined $os_version;
# Some older ones don't have this value,so we cull it from the description
@@ -234,6 +259,16 @@ sub os_ver {
return;
}
# Regular managed ProCurve switches have the serial num in entity mib,
# the web-managed models in the semi mib (hphttpmanageable).
sub serial {
my $hp = shift;
my $serial = $hp->serial1() || $hp->serial2() || undef;;
return $serial;
}
# Lookup model number, and translate the part number to the common number
sub model {
my $hp = shift;
@@ -386,108 +421,6 @@ sub _sensor {
return $result;
}
# Use CDP and/or LLDP
sub hasCDP {
my $hp = shift;
return $hp->hasLLDP() || $hp->SUPER::hasCDP();
}
sub c_ip {
my $hp = shift;
my $partial = shift;
my $cdp = $hp->SUPER::c_ip($partial) || {};
my $lldp = $hp->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 $hp = shift;
my $partial = shift;
my $lldp = $hp->lldp_if($partial) || {};
my $cdp = $hp->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 $hp = shift;
my $partial = shift;
my $lldp = $hp->lldp_port($partial) || {};
my $cdp = $hp->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 $hp = shift;
my $partial = shift;
my $lldp = $hp->lldp_id($partial) || {};
my $cdp = $hp->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 munge_hp_c_id {
my ($v) = @_;
if ( length(unpack('H*', $v)) == 12 ){
@@ -501,30 +434,6 @@ sub munge_hp_c_id {
}
}
sub c_platform {
my $hp = shift;
my $partial = shift;
my $lldp = $hp->lldp_rem_sysdesc($partial) || {};
my $cdp = $hp->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;
}
# POWER-ETHERNET-MIB doesn't define a mapping of its
# "module"/"port" index to ifIndex. Different vendors
# do this in different ways.
@@ -612,6 +521,7 @@ sub set_i_vlan_tagged {
$hp->error_throw(sprintf("Requested VLAN %s doesn't seem to exist on device...", $vlan));
}
}
return;
}
1;
@@ -731,7 +641,7 @@ Returns bytes of used memory
Returns the model number of the HP Switch. Will translate between the HP Part
number and the common model number with this map :
%MODEL_MAP = (
%MODEL_MAP = (
'J8131A' => 'WAP-420-WW',
'J8130A' => 'WAP-420-NA',
'J8133A' => 'AP520WL',
@@ -761,6 +671,15 @@ number and the common model number with this map :
'J8771A' => '4202vl-48G',
'J4865A' => '4108GL',
'J4887A' => '4104GL',
'J9588A' => '3800-48G-PoE+-4XG',
'J9574A' => '3800-48G-PoE+-4SFP+',
'J9586A' => '3800-48G-4XG',
'J9576A' => '3800-48G-4SFP+',
'J9584A' => '3800-24SFP-2SFP+',
'J9587A' => '3800-24G-PoE+-2XG',
'J9573A' => '3800-24G-PoE+-2SFP+',
'J9585A' => '3800-24G-2XG',
'J9575A' => '3800-24G-2SFP+',
'J8693A' => '3500yl-48G-PWR',
'J8692A' => '3500yl-24G-PWR',
'J9473A' => '3500-48-PoE',
@@ -771,6 +690,7 @@ number and the common model number with this map :
'J4905A' => '3400cl-24G',
'J4815A' => '3324XL',
'J4851A' => '3124',
'J9562A' => '2915-8G-PoE',
'J9148A' => '2910al-48G-PoE+',
'J9147A' => '2910al-48G',
'J9146A' => '2910al-24G-PoE+',
@@ -789,6 +709,12 @@ number and the common model number with this map :
'J4900B' => '2626-CR',
'J4900C' => '2626C',
'J4900A' => '2626',
'J9627A' => '2620-48-PoE+',
'J9626A' => '2620-48',
'J9624A' => '2620-24-PPoE+',
'J9625A' => '2620-24-PoE+',
'J9623A' => '2620-24',
'J9565A' => '2615-8-PoE',
'J9089A' => '2610-48-PWR',
'J9088A' => '2610-48',
'J9087A' => '2610-24-PWR',
@@ -796,6 +722,8 @@ number and the common model number with this map :
'J9085A' => '2610-24',
'J8762A' => '2600-8-PWR',
'J4813A' => '2524',
'J9298A' => '2520G-8-PoE',
'J9299A' => '2520G-24-PoE',
'J9137A' => '2520-8-PoE',
'J9138A' => '2520-24-PoE',
'J4812A' => '2512',
@@ -806,9 +734,11 @@ number and the common model number with this map :
'J9019A' => '2510-24A',
'J4818A' => '2324',
'J4817A' => '2312',
'J9449A' => '1810G-8',
'J9450A' => '1810G-24',
'J9029A' => '1800-8G',
'J9028A' => '1800-24G',
);
);
=item $hp->os()
@@ -827,6 +757,10 @@ the description field.
C<hpSwitchOsVersion.0>
=item $hp->serial()
Returns serial number if available through SNMP
=item $hp->slots()
Returns number of entries in $hp->e_name that have 'slot' in them.
@@ -850,12 +784,12 @@ Power supply 2 status
=item $hp->peth_port_power()
Power supplied by PoE ports, in milliwatts
("hpicfPoePethPsePortPower")
(C<hpicfPoePethPsePortPower>)
=item $hp->stp_ver()
Returns what version of STP the device is running.
("hpicfBridgeRstpForceVersion" with fallback to inherited stp_ver())
(C<hpicfBridgeRstpForceVersion> with fallback to inherited stp_ver())
=back
@@ -894,7 +828,8 @@ Returns reference to hash of IIDs to admin duplex setting.
=item $hp->vendor_i_type()
Returns reference to hash of IIDs to HP specific port type (hpSwitchPortType).
Returns reference to hash of IIDs to HP specific port type
(C<hpSwitchPortType>).
=item $hp->i_name()
@@ -907,53 +842,6 @@ interface index (c<ifIndex>)
=back
=head2 Topology information
Based upon the firmware version HP devices may support Cisco Discovery
Protocol (CDP), Link Layer Discovery Protocol (LLDP), or both. These methods
will query both and return the combination of all information. As a result,
there may be identical topology information returned from the two protocols
causing duplicate entries. It is the calling program's responsibility to
identify any duplicate entries and remove duplicates if necessary.
=over
=item $hp->hasCDP()
Returns true if the device is running either CDP or LLDP.
=item $hp->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $hp->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-CDP/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 $hp->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $hp->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $hp->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.
@@ -989,4 +877,6 @@ operations.
=item set_i_vlan_tagged()
=back
=cut

View File

@@ -44,7 +44,7 @@ use SNMP::Info::CDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -652,7 +652,8 @@ Returns reference to hash of IIDs to admin duplex setting.
=item $hp->vendor_i_type()
Returns reference to hash of IIDs to HP specific port type (hpSwitchPortType).
Returns reference to hash of IIDs to HP specific port type
(C<hpSwitchPortType>).
=item $hp->i_name()
@@ -718,4 +719,6 @@ operations.
=item set_i_vlan_tagged()
=back
=cut

209
Info/Layer2/HPVC.pm Normal file
View File

@@ -0,0 +1,209 @@
# SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
#
# Copyright (c) 2011 Jeroen van Ingen
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer2::HPVC;
use strict;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::HPVC::ISA
= qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'HPVC-MIB' => 'vcDomainName',
'CPQSINFO-MIB' => 'cpqSiSysSerialNum',
'HPVCMODULE-MIB' => 'vcModuleDomainName',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
'serial1' => 'cpqSiSysSerialNum.0',
'os_ver' => 'cpqHoSWRunningVersion.1',
'os_bin' => 'cpqHoFwVerVersion.1',
'productname' => 'cpqSiProductName.0',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::Layer2::MUNGE,
);
# Method Overrides
sub os {
return 'hpvc';
}
sub vendor {
return 'hp';
}
sub model {
my $hp = shift;
return $hp->productname();
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::HPVC - SNMP Interface to HP Virtual Connect Switches
=head1 AUTHOR
Jeroen van Ingen
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $hp = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $hp->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
HP Virtual Connect Switch via 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 $hp = new SNMP::Info::Layer2::HPVC(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<HPVC-MIB>
=item F<CPQSINFO-MIB>
=item F<HPVCMODULE-MIB>
=back
All required MIBs can be found in the netdisco-mibs package.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $hp->os()
Returns C<'hpvc'>
=item $hp->os_bin()
C<cpqHoFwVerVersion.1>
=item $hp->os_ver()
C<cpqHoSWRunningVersion.1>
=item $hp->serial()
C<cpqSiSysSerialNum.0>
=item $hp->vendor()
hp
=item $hp->model()
C<cpqSiProductName.0>
=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 Overrides
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head1 MUNGES
=over
=back
=head1 SET METHODS
These are methods that provide SNMP set functionality for overridden methods
or provide a simpler interface to complex set operations. See
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
operations.
=cut

180
Info/Layer2/Kentrox.pm Normal file
View File

@@ -0,0 +1,180 @@
package SNMP::Info::Layer2::Kentrox;
# Copyright (c) 2011 Netdisco Project
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
use strict;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Kentrox::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Kentrox::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
#from DATASMART-MIB
# MIB isn't yet in netdisco-mibs (not clear permission)
# ... when it is, this can change to dsScWyv
'ds_sysinfo' => '.1.3.6.1.4.1.181.2.2.12.15.0',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
);
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
sub os {
return 'Kentrox';
}
sub os_ver {
my $dsver = shift;
my $descr = $dsver->description();
if ( $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){
return $1;
}
}
sub serial {
my $dsserial = shift;
my $serial = $dsserial->ds_sysinfo();
if ( $serial =~ /SERIAL\s(\S+)/){
my $str = substr($1,8,10);
return $str;
}
}
sub vendor {
return 'Kentrox';
}
sub model {
my $dsmodel = shift;
my $descr = $dsmodel->description();
if ( $descr =~ /^(\S+\s\S+)/){
return $1;
}
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Kentrox - SNMP Interface to L2 Kentrox DataSMART DSU/CSU
=head1 AUTHOR
phishphreek@gmail.com
=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 Kentrox DataSMART DSU/CSU
=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 $router->vendor()
=item $router->os()
=item $router->os_ver()
=item $router->model()
=item $router->serial()
=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 Overrides
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -43,7 +43,7 @@ use SNMP::Info::Airespace;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
$VERSION = '2.04';
$VERSION = '3.12';
%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 = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,

1299
Info/Layer2/NWSS2300.pm Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -33,21 +33,32 @@ 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::Layer2 Exporter/;
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Entity SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = ( %SNMP::Info::Layer2::MIBS, );
# This will be filled in with the device's index into the EntPhysicalEntry
# table by the serial() function.
our $index = undef;
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS, );
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::Entity::MIBS, %SNMP::Info::LLDP::MIBS, );
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, );
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Entity::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',
);
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Entity::FUNCS, %SNMP::Info::LLDP::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Entity::MUNGE, %SNMP::Info::LLDP::MUNGE, );
sub vendor {
return 'netgear';
@@ -57,33 +68,216 @@ sub os {
return 'netgear';
}
# Wish the OID-based method worked, but netgear scatters
# the sysObjectID values across all the device MIBs, and
# makes the device MIBs state secrets.
# They seem to set sysDescr to the model number, though,
# so we'll use that.
# We will attempt to use Entity-MIB if present. In that case, we will
# also set the shared variable $index, which is used by other functions
# to index within Entity-MIB tables. This assumes, of course, that there
# is only one serial number (entPhysicalSerialNum) present in the table.
sub serial {
my $netgear = shift;
my $serial = undef;
my $e_serial = $netgear->e_serial();
if (defined($e_serial)) { # This unit sports the Entity-MIB
# Find entity table entry for this unit
foreach my $e ( keys %$e_serial ) {
if (defined ($e_serial->{$e}) and $e_serial->{$e} !~ /^\s*$/) {
$index = $e;
last;
}
}
return $e_serial->{$index} if defined $index;
}
# Without Enitity-MIB, we've got to work our way through a bunch of
# different locales...
return $netgear->ng_gsmserial() if defined $netgear->model and $netgear->model =~ m/GSM\d/i;;
return 'none';
}
# If device supports Entity-MIB, index into that to divine model and
# hardware version, otherwise default to sysDescr.
sub model {
my $netgear = shift;
if (defined($index)) {
my $model = $netgear->e_descr();
my $e_hwver = $netgear->e_hwver();
$model = "$model->{$index} $e_hwver->{$index}";
return $model;
}
return $netgear->description();
}
#
# This is model-dependent. Some netgear brand devices don't implement
# the bridge MIB forwarding table, so we use the Q-BRIDGE-MIB forwarding
# table. Fall back to the orig functions if the qb versions don't
# return anything.
sub fw_mac {
# ifDescr is the same for all interfaces in a class, but the ifName is
# unique, so let's use that for port name. If all else fails,
# concatentate ifDesc and ifIndex.
sub interfaces {
my $netgear = shift;
my $ret = $netgear->qb_fw_mac();
$ret = $netgear->orig_fw_mac() if ( !defined($ret) );
return $ret;
my $partial = shift;
my $interfaces = $netgear->i_index($partial) || {};
my $i_descr = $netgear->i_description($partial) || {};
my $i_name = $netgear->i_name($partial);
my $i_isset = ();
# Replace the description with the ifName field, if set
foreach my $iid ( keys %$i_name ) {
my $name = $i_name->{$iid};
next unless defined $name;
if (defined $name and $name !~ /^\s*$/) {
$interfaces->{$iid} = $name;
$i_isset->{$iid} = 1;
}
}
# Replace the Index with the ifDescr field, appended with index
# number, to deal with devices with non-unique ifDescr.
foreach my $iid ( keys %$i_descr ) {
my $port = $i_descr->{$iid} . '-' . $iid;
next unless defined $port;
next if (defined $i_isset->{$iid} and $i_isset->{$iid} == 1);
$interfaces->{$iid} = $port;
}
return $interfaces;
}
sub fw_port {
# these seem to work for GSM models but not GS
# https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529
sub os_ver {
my $netgear = shift;
my $ret = $netgear->qb_fw_port();
$ret = $netgear->orig_fw_port() if ( !defined($ret) );
return $ret;
my $serial = $netgear->serial(); # Make sure that index gets primed
if (defined($index)) {
my $os_ver = $netgear->e_swver();
return $os_ver->{$index} if defined $os_ver;
}
return $netgear->ng_gsmosver() if defined $netgear->model and $netgear->model =~ m/GSM\d/i;
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;
@@ -96,7 +290,9 @@ SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches
=head1 AUTHOR
Bill Fenner and Zoltan Erszenyi
Bill Fenner and Zoltan Erszenyi,
Hacked in LLDP support from Baystack.pm by
Nic Bernstein <nic@onlight.com>
=head1 SYNOPSIS
@@ -124,6 +320,8 @@ inherited methods.
=over
=item SNMP::Info::Layer2
=item SNMP::Info::Entity
=item SNMP::Info::LLDP
=back
@@ -136,6 +334,10 @@ inherited methods.
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
classes.
See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
=back
=head1 GLOBALS
@@ -156,7 +358,17 @@ Returns 'netgear'
=item $netgear->model()
Returns description()
Returns concatenation of $e_model and $e_hwver if Entity MIB present,
otherwise returns description()
=item $netgear->os_ver()
Returns OS Version.
=item $netgear->serial()
Returns Serial Number if available (older FS switches have no accessible
serial number).
=back
@@ -164,6 +376,14 @@ Returns description()
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Entity
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of
@@ -173,22 +393,52 @@ a reference to a hash.
=over
=item $netgear->fw_mac()
=item $netgear->interfaces()
Returns reference to hash of forwarding table MAC Addresses.
Uses the i_name() field.
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=back
=item $netgear->fw_port()
=head2 Topology information
Returns reference to hash of forwarding table entries port interface
identifier (iid)
Based upon the software version devices may support Link Layer Discovery
Protocol (LLDP).
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=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
@@ -196,4 +446,12 @@ C<Q-BRIDGE-MIB> doesn't return anything.
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Entity
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

View File

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

1303
Info/Layer2/Trapeze.pm Normal file

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -40,19 +40,22 @@ use SNMP::Info::EtherLike;
use SNMP::Info::Entity;
use SNMP::Info::PowerEthernet;
use SNMP::Info::IPv6;
use SNMP::Info::AdslLine;
@SNMP::Info::Layer3::ISA = qw/
SNMP::Info::PowerEthernet SNMP::Info::IPv6
SNMP::Info::Entity SNMP::Info::EtherLike
SNMP::Info::Bridge SNMP::Info Exporter/;
SNMP::Info::Bridge SNMP::Info::AdslLine
SNMP::Info Exporter/;
@SNMP::Info::Layer3::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::AdslLine::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::EtherLike::MIBS,
%SNMP::Info::Entity::MIBS,
@@ -67,6 +70,7 @@ $VERSION = '2.04';
# Inherit the super class ones
%SNMP::Info::GLOBALS,
%SNMP::Info::AdslLine::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
@@ -82,6 +86,7 @@ $VERSION = '2.04';
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::AdslLine::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::EtherLike::FUNCS,
%SNMP::Info::Entity::FUNCS,
@@ -127,11 +132,11 @@ $VERSION = '2.04';
'bgp_peer_out_upd' => 'bgpPeerOutUpdates',
# IP-MIB Net to Physical Table (ARP Cache)
'n2p_paddr' => 'ipNetToPhysicalPhysAddress',
'n2p_paddr' => 'ipNetToPhysicalPhysAddress',
'n2p_lastupdate' => 'ipNetToPhysicalLastUpdated',
'n2p_ptype' => 'ipNetToPhysicalType',
'n2p_pstate' => 'ipNetToPhysicalState',
'n2p_pstatus' => 'ipNetToPhysicalRowStatus',
'n2p_ptype' => 'ipNetToPhysicalType',
'n2p_pstate' => 'ipNetToPhysicalState',
'n2p_pstatus' => 'ipNetToPhysicalRowStatus',
);
@@ -139,6 +144,7 @@ $VERSION = '2.04';
# Inherit all the built in munging
%SNMP::Info::MUNGE,
%SNMP::Info::AdslLine::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::EtherLike::MUNGE,
%SNMP::Info::Entity::MUNGE,
@@ -146,7 +152,7 @@ $VERSION = '2.04';
%SNMP::Info::IPv6::MUNGE,
'old_at_paddr' => \&SNMP::Info::munge_mac,
'at_paddr' => \&SNMP::Info::munge_mac,
'n2p_paddr' => \&SNMP::Info::munge_mac,
'n2p_paddr' => \&SNMP::Info::munge_mac,
);
# Method OverRides
@@ -157,6 +163,14 @@ sub root_ip {
my $router_ip = $l3->router_ip();
my $ospf_ip = $l3->ospf_ip();
# if the router ip exists and is a route advertised by the device we prefer
# it over the others
return $router_ip
if (( defined $router_ip )
and ( $router_ip ne '0.0.0.0' )
and ( grep { $ospf_ip->{$_} eq $router_ip } ( keys %$ospf_ip ) )
and ( $l3->snmp_connect_ip($router_ip) ) );
# return the first one found here (should be only one)
if ( defined $ospf_ip and scalar( keys %$ospf_ip ) ) {
foreach my $key ( keys %$ospf_ip ) {
@@ -168,10 +182,6 @@ sub root_ip {
}
}
return $router_ip
if (( defined $router_ip )
and ( $router_ip ne '0.0.0.0' )
and ( $l3->snmp_connect_ip($router_ip) ) );
return;
}
@@ -195,18 +205,26 @@ sub i_ignore {
sub serial {
my $l3 = shift;
my $serial1 = $l3->serial1();
my $e_descr = $l3->e_descr() || {};
my $e_serial = $l3->e_serial() || {};
my $serial1 = $l3->serial1();
my $e_parent = $l3->e_parent() || {};
my $serial2 = $e_serial->{1} || undef;
my $chassis = $e_descr->{1} || undef;
foreach my $iid ( keys %$e_parent ) {
my $parent = $e_parent->{$iid};
if ( $parent eq '0' ) {
my $serial = $l3->e_serial($iid);
if ( $serial ) {
return $serial->{$iid};
}
else {
my $descr = $l3->e_descr($iid);
if ( $descr and $descr =~ /serial#?:\s*([a-z0-9]+)/i )
{
return $1;
}
}
}
}
# precedence
# serial2,chassis parse,serial1
return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
return $1
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
return;
@@ -283,32 +301,37 @@ sub interfaces {
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->i_index($partial);
my $descriptions = $l3->i_description($partial);
my $interfaces = $l3->i_index($partial);
my $i_descr = $l3->i_description($partial);
my %interfaces = ();
foreach my $iid ( keys %$interfaces ) {
my $desc = $descriptions->{$iid};
next unless defined $desc;
$interfaces{$iid} = $desc;
# Check for duplicates in ifDescr, if so uniquely identify by adding
# ifIndex to repeated values
my %seen;
foreach my $iid ( keys %$i_descr ) {
my $port = $i_descr->{$iid};
next unless defined $port;
if ( $seen{$port}++ ) {
$interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
}
else {
$interfaces->{$iid} = $port;
}
}
return \%interfaces;
return $interfaces;
}
sub vendor {
my $l3 = shift;
my $descr = $l3->description();
my $id = $l3->id();
my $id = $l3->id();
# .1.3.6.1.4.1.9.1 is the CISCO-PRODUCTS-MIB
# .1.3.6.1.4.1.9.9.368.4 is an old tree that Cisco CSSs were numbered from
return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/;
return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/;
return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/;
return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/;
return 'cisco' if ( $descr =~ /(cisco|\bios\b)/i );
return 'foundry' if ( $descr =~ /foundry/i );
return 'brocade' if ( $descr =~ /foundry/i );
return 'unknown';

View File

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

View File

@@ -34,20 +34,28 @@ use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
use SNMP::Info::AMAP;
# Use LLDP
# (or at least try. The versions I've seen have two problems:
# 1. they report ifIndex values as 'local'; we don't support ifIndex
# but *could*
# 2. They report 0.0.0.0 as the management address
# )
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::AMAP SNMP::Info::LLDP
SNMP::Info::MAU SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::AlcatelLucent::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::AMAP::MIBS,
'ALCATEL-IND1-DEVICES' => 'familyOmniSwitch7000',
'ALCATEL-IND1-CHASSIS-MIB' => 'chasEntPhysOperStatus',
'ALU-POWER-ETHERNET-MIB' => 'pethPsePortDetectionStatus',
@@ -64,17 +72,17 @@ delete $MIBS{'POWER-ETHERNET-MIB'};
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::MAU::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::LLDP::GLOBALS, %SNMP::Info::AMAP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::MAU::FUNCS,
%SNMP::Info::LLDP::FUNCS,
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::AMAP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
%SNMP::Info::LLDP::MUNGE,
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::AMAP::MUNGE,
);
# use MAU-MIB for admin. duplex and admin. speed
@@ -190,21 +198,6 @@ sub interfaces {
return $alu->orig_i_name($partial);
}
# Use Q-BRIDGE-MIB
sub fw_mac {
my $alu = shift;
my $partial = shift;
return $alu->qb_fw_mac($partial);
}
sub fw_port {
my $alu = shift;
my $partial = shift;
return $alu->qb_fw_port($partial);
}
# Work around buggy bp_index in 6.3.1.871.R01 and 6.3.1.975.R01
sub bp_index {
my $alu = shift;
@@ -285,53 +278,6 @@ sub bp_index {
# return $i_vlan;
#}
# Use LLDP
# (or at least try. The versions I've seen have two problems:
# 1. they report ifIndex values as 'local'; we don't support ifIndex
# but *could*
# 2. They report 0.0.0.0 as the management address
# )
sub hasCDP {
my $alu = shift;
return $alu->hasLLDP();
}
sub c_ip {
my $alu = shift;
my $partial = shift;
return $alu->lldp_ip($partial);
}
sub c_if {
my $alu = shift;
my $partial = shift;
return $alu->lldp_if($partial);
}
sub c_port {
my $alu = shift;
my $partial = shift;
return $alu->lldp_port($partial);
}
sub c_id {
my $alu = shift;
my $partial = shift;
return $alu->lldp_id($partial);
}
sub c_platform {
my $alu = shift;
my $partial = shift;
return $alu->lldp_rem_sysdesc($partial);
}
# Power-Ethernet ifIndex mapping. I've only seen this from a
# fixed-config single-module system, so this is only a plausible
# guess as to the mapping on a stack or modular system.
@@ -428,10 +374,6 @@ These are methods that return scalar value from SNMP
Returns 'alcatel-lucent'
=item $alu->hasCDP()
Returns whether LLDP is enabled.
=item $alu->model()
Tries to reference $alu->id() to one of the product MIBs listed above
@@ -488,40 +430,12 @@ to a hash.
Returns interface name from C<ifName>, since the default return value
of C<ifDescr> includes the OS version.
=item $alu->fw_mac()
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
=item $alu->fw_port()
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
=item $alu->bp_index()
Work around various bugs in the F<BRIDGE-MIB> and
F<Q-BRIDGE-MIB> implementations, by returning both
C<ifIndex> and C<dot1dBasePort> mappings to C<ifIndex> values.
=item $alu->c_id()
Returns LLDP information.
=item $alu->c_if()
Returns LLDP information.
=item $alu->c_ip()
Returns LLDP information.
=item $alu->c_platform()
Returns LLDP information.
=item $alu->c_port()
Returns LLDP information.
=item $alu->i_duplex_admin()
Returns info from F<MAU-MIB>

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -66,6 +66,10 @@ $VERSION = '2.04';
'new_tftp_result' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpLastActionStatus',
'old_ip_max' => 'ALTEON_TS_NETWORK_MIB__ipInterfaceTableMax',
'new_ip_max' => 'ALTEON_CHEETAH_NETWORK_MIB__ipInterfaceTableMax',
'fan' => 'ALTEON_CHEETAH_SWITCH_MIB__hwFanStatus',
'old_ps1_stat' => 'ALTEON_TIGON_SWITCH_MIB__hwPowerSupplyStatus',
'old_ps2_stat' => 'ALTEON_TIGON_SWITCH_MIB__hwRedundantPSStatus',
'new_ps_stat' => 'ALTEON_CHEETAH_SWITCH_MIB__hwPowerSupplyStatus',
);
%FUNCS = (
@@ -132,7 +136,7 @@ sub model {
return $id unless defined $model;
$model =~ s/^aceswitch//;
$model =~ s/^(aceswitch|aws|ods)//;
$model =~ s/^acedirector/AD/;
$model =~ s/^(copper|fiber)Module/BladeCenter GbESM/;
@@ -140,7 +144,7 @@ sub model {
}
sub vendor {
return 'nortel';
return 'radware';
}
sub os {
@@ -155,6 +159,36 @@ sub os_ver {
return $version;
}
sub ps1_status {
my $alteon = shift;
my $old_ps = $alteon->old_ps1_stat();
my $new_ps = $alteon->new_ps_stat();
return $old_ps if $old_ps;
if ($new_ps) {
return 'ok' if ($new_ps eq 'singlePowerSupplyOk');
return 'failed' if ($new_ps eq 'firstPowerSupplyFailed');
}
return;
}
sub ps2_status {
my $alteon = shift;
my $old_ps = $alteon->old_ps2_stat();
my $new_ps = $alteon->new_ps_stat();
return $old_ps if $old_ps;
if ($new_ps) {
return 'ok' if ($new_ps eq 'doublePowerSupplyOk');
return 'failed' if ($new_ps eq 'secondPowerSupplyFailed');
}
return;
}
sub interfaces {
my $alteon = shift;
my $interfaces = $alteon->i_index();
@@ -174,6 +208,7 @@ sub interfaces {
# varies by switch model
elsif ( defined $ip_max and $iid > $ip_max ) {
$desc = ( $iid % $ip_max );
$desc = 'mgmt' if $desc == 231;
}
$interfaces{$iid} = $desc;
}
@@ -207,39 +242,48 @@ sub i_duplex {
sub i_duplex_admin {
my $alteon = shift;
my $ag_pref = $alteon->new_ag_p_cfg_pref()
my $ag_pref
= $alteon->new_ag_p_cfg_pref()
|| $alteon->old_ag_p_cfg_pref()
|| {};
my $ag_fe_auto = $alteon->new_ag_p_cfg_fe_auto()
my $ag_fe_auto
= $alteon->new_ag_p_cfg_fe_auto()
|| $alteon->old_ag_p_cfg_fe_auto()
|| {};
my $ag_fe_mode = $alteon->new_ag_p_cfg_fe_mode()
my $ag_fe_mode
= $alteon->new_ag_p_cfg_fe_mode()
|| $alteon->old_ag_p_cfg_fe_mode()
|| {};
my $ag_ge_auto = $alteon->new_ag_p_cfg_ge_auto()
my $ag_ge_auto
= $alteon->new_ag_p_cfg_ge_auto()
|| $alteon->old_ag_p_cfg_ge_auto()
|| {};
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
my $i_speed = $alteon->i_speed() || {};
my %i_duplex_admin;
foreach my $if ( keys %$ag_pref ) {
my $pref = $ag_pref->{$if};
next unless defined $pref;
foreach my $if ( keys %$ag_ge_auto ) {
my $pref = $ag_pref->{$if} || '';
my $speed = $i_speed->{$if} || '';
my $ge_auto = $ag_ge_auto->{$if} || '';
my $fe_auto = $ag_fe_auto->{$if} || '';
my $fe_mode = $ag_fe_mode->{$if} || '';
my $string = 'other';
if ( $pref =~ /gigabit/i ) {
my $ge_auto = $ag_ge_auto->{$if};
$string = 'full' if ( $ge_auto =~ /off/i );
$string = 'auto' if ( $ge_auto =~ /on/i );
# Default to auto
my $string = 'auto';
if ( $ge_auto =~ /off/i
&& ( $pref =~ /gigabit/i || $speed eq '1.0 Gbps' ) )
{
$string = 'full';
}
elsif ( $pref =~ /fast/i ) {
my $fe_auto = $ag_fe_auto->{$if};
my $fe_mode = $ag_fe_mode->{$if};
if ( $fe_auto =~ /off/i
&& ( $pref =~ /fast/i || $speed =~ /100?\sMbps/ ) )
{
$string = 'half'
if ( $fe_mode =~ /half/i and $fe_auto =~ /off/i );
if ( $fe_mode =~ /half/i );
$string = 'full'
if ( $fe_mode =~ /full/i and $fe_auto =~ /off/i );
$string = 'auto' if $fe_auto =~ /on/i;
if ( $fe_mode =~ /full/i );
}
my $idx;
@@ -365,7 +409,7 @@ __END__
=head1 NAME
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Nortel Alteon Layer 2-7
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Radware Alteon ADC
Switches.
=head1 AUTHOR
@@ -389,8 +433,8 @@ Eric Miller
=head1 DESCRIPTION
Abstraction subclass for Nortel Alteon Series Layer 2-7 load balancing
switches and Nortel BladeCenter Layer2-3 GbE Switch Modules.
Abstraction subclass for Radware Alteon Series ADC switches and
Nortel BladeCenter Layer2-3 GbE Switch Modules.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
@@ -438,12 +482,12 @@ These are methods that return scalar value from SNMP
=item $alteon->model()
Returns model type. Checks $alteon->id() against the F<ALTEON-ROOT-MIB> and
then parses out C<aceswitch>, replaces C<acedirector> with AD, and replaces
copperModule/fiberModule with BladeCenter GbESM.
then parses out C<aceswitch>, C<aws>, and C<ods> replaces C<acedirector>
with AD, and replaces copperModule/fiberModule with BladeCenter GbESM.
=item $alteon->vendor()
Returns 'nortel'
Returns 'radware'
=item $alteon->os()
@@ -469,6 +513,18 @@ Returns the software version reported by C<agSoftwareVersion>
(C<agTftpLastActionStatus>)
=item $alteon->fan()
(C<hwFanStatus>)
=item $alteon->ps1_status()
Returns status of primary power supply
=item $alteon->ps2_status()
Returns status of redundant power supply
=back
=head2 Globals imported from SNMP::Info::Layer3
@@ -477,8 +533,8 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
These are methods that return tables of information in the form of a
reference to a hash.
=head2 Overrides

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 = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -152,10 +152,6 @@ sub os {
return 'altiga';
}
sub hasCDP {
return 0;
}
# $altiga->interfaces() - Map the Interfaces to their physical names
# Add interface number to interface name to prevent duplicate ifDescr
# Included statically configured VPN tunnels if ($int_include_vpn)
@@ -350,10 +346,6 @@ Tries to determine OS version from the C<sysDescr.0> field. Returns version or C
Combines results from C<fan1_alarm>, C<fan2_alarm>, and C<fam3_alarm> methods.
=item $altiga->hasCDP()
No.
=item $altiga->ps1_status()
Combines C<ps1_3v_alarm> and C<ps1_5v_alarm> methods.

View File

@@ -36,19 +36,25 @@ use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
use SNMP::Info::LLDP;
use SNMP::Info::Aggregate;
@SNMP::Info::Layer3::Arista::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Arista::ISA = qw/
SNMP::Info::Aggregate
SNMP::Info::LLDP
SNMP::Info::MAU
SNMP::Info::Layer3 Exporter
/;
@SNMP::Info::Layer3::Arista::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::Aggregate::MIBS,
'ARISTA-PRODUCTS-MIB' => 'aristaProducts',
);
@@ -104,64 +110,28 @@ sub model {
return $model;
}
# Use Q-BRIDGE-MIB
sub fw_mac {
# The LLDP MIB leaves it up in the air what the index means.
# On EOS, it's a dot1d port.
sub lldp_if {
my $arista = shift;
my $partial = shift;
return $arista->qb_fw_mac($partial);
# We pick a column that someone else is likely to want,
# so that the cache means that hopefully this doesn't
# cause any more SNMP transactions in total.
my $desc = $arista->lldp_rem_desc($partial) || {};
my $bp_index = $arista->bp_index() || {};
my $lldp_if = {};
foreach my $key ( keys %$desc ) {
my @aOID = split( '\.', $key );
my $port = $aOID[1];
$lldp_if->{$key} = $bp_index->{$port};
}
return $lldp_if;
}
sub fw_port {
my $arista = shift;
my $partial = shift;
return $arista->qb_fw_port($partial);
}
# Use LLDP
sub hasCDP {
my $arista = shift;
return $arista->hasLLDP();
}
sub c_ip {
my $arista = shift;
my $partial = shift;
return $arista->lldp_ip($partial);
}
sub c_if {
my $arista = shift;
my $partial = shift;
return $arista->lldp_if($partial);
}
sub c_port {
my $arista = shift;
my $partial = shift;
return $arista->lldp_port($partial);
}
sub c_id {
my $arista = shift;
my $partial = shift;
return $arista->lldp_id($partial);
}
sub c_platform {
my $arista = shift;
my $partial = shift;
return $arista->lldp_rem_sysdesc($partial);
}
sub agg_ports { return agg_ports_ifstack(@_) }
1;
__END__
@@ -198,6 +168,8 @@ Subclass for Arista Networks EOS-based devices
=over
=item SNMP::Info::Aggregate
=item SNMP::Info::Layer3
=item SNMP::Info::MAU
@@ -216,6 +188,8 @@ Subclass for Arista Networks EOS-based devices
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Aggregate/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
@@ -232,10 +206,6 @@ These are methods that return scalar values from SNMP
Returns 'Arista Networks, Inc.'
=item $arista->hasCDP()
Returns whether LLDP is enabled.
=item $arista->model()
Tries to reference $arista->id() to one of the product MIBs listed above
@@ -271,34 +241,6 @@ to a hash.
=over
=item $arista->fw_mac()
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
=item $arista->fw_port()
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
=item $arista->c_id()
Returns LLDP information.
=item $arista->c_if()
Returns LLDP information.
=item $arista->c_ip()
Returns LLDP information.
=item $arista->c_platform()
Returns LLDP information.
=item $arista->c_port()
Returns LLDP information.
=item $arista->i_duplex_admin()
Returns info from F<MAU-MIB>
@@ -307,6 +249,16 @@ Returns info from F<MAU-MIB>
Returns info from F<MAU-MIB>
=item $arista->lldp_if()
Returns the mapping to the SNMP Interface Table.
=item C<agg_ports>
Returns a HASH reference mapping from slave to master port for each member of
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
ifIndex of the corresponding master ports.
=back
=head2 Table Methods imported from SNMP::Info::Layer3

1770
Info/Layer3/Aruba.pm Normal file

File diff suppressed because it is too large Load Diff

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 = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::MIBS,
@@ -545,7 +545,7 @@ sub model {
}
sub vendor {
return 'nortel';
return 'avaya';
}
sub os {
@@ -1191,7 +1191,7 @@ sub e_vendor {
my %wf_e_vendor;
foreach my $iid ( keys %$wf_e_idx ) {
$wf_e_vendor{$iid} = 'nortel';
$wf_e_vendor{$iid} = 'avaya';
}
return \%wf_e_vendor;
}
@@ -1378,7 +1378,8 @@ __END__
=head1 NAME
SNMP::Info::Layer3::BayRS - SNMP Interface to Nortel routers running BayRS.
SNMP::Info::Layer3::BayRS - SNMP Interface to Avaya/Nortel routers running
BayRS.
=head1 AUTHOR
@@ -1401,7 +1402,7 @@ Eric Miller
=head1 DESCRIPTION
Abstraction subclass for routers running Nortel BayRS.
Abstraction subclass for routers running Avaya/Nortel BayRS.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
@@ -1474,7 +1475,7 @@ and the common model with this map :
=item $bayrs->vendor()
Returns 'nortel'
Returns 'avaya'
=item $bayrs->os()
@@ -1583,7 +1584,7 @@ Returns reference to hash. Key: IID, Value: Hardware version.
=item $bayrs->e_vendor()
Returns reference to hash. Key: IID, Value: nortel.
Returns reference to hash. Key: IID, Value: avaya.
=item $bayrs->e_serial()
@@ -1634,11 +1635,11 @@ See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=over
=item $extreme->munge_hw_rev()
=item $bayrs->munge_hw_rev()
Converts octets to a decimal major.minor string.
=item $extreme->munge_wf_serial()
=item $bayrs->munge_wf_serial()
Coverts octets to a decimal string.

168
Info/Layer3/BlueCoatSG.pm Normal file
View File

@@ -0,0 +1,168 @@
package SNMP::Info::Layer3::BlueCoatSG;
# Copyright (c) 2011 Netdisco Project
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::BlueCoatSG::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::BlueCoatSG::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
'BLUECOAT-SG-PROXY-MIB' => 'sgProxyAdmin',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
#From BLUECOAT-SG-PROXY-MIB
'serial1'=> 'sgProxySerialNumber',
'sw_ver' => 'sgProxyVersion',
);
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'Blue Coat';
}
sub os {
return 'sgos';
}
sub os_ver {
my $sg = shift;
my $os_string = $sg->sw_ver();
if ($os_string =~ /^Version:\s(\w+)\s([\d\.]+)/) {
return $2;
} else {
return ''; # perhaps we can try sysDescr or some other object...
}
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::BlueCoatSG - SNMP Interface to Blue Coat SG Series proxy devices
=head1 AUTHOR
Jeroen van Ingen
=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 Blue Coat SG Series proxy devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
BLUECOAT-SG-PROXY-MIB
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=head2 Overrides
=over
=item $router->vendor()
Returns C<'Blue Coat'>
=item $router->os()
Returns C<'sgos'>
=item $router->os_ver()
Tries to resolve version string from C<"sgProxyVersion">.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

View File

@@ -64,7 +64,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
$VERSION = '2.04';
$VERSION = '3.12';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
@@ -236,141 +236,6 @@ sub cisco_comm_indexing {
return 1;
}
# Use CDP and/or LLDP
sub hasCDP {
my $c3550 = shift;
return $c3550->hasLLDP() || $c3550->SUPER::hasCDP();
}
sub c_ip {
my $c3550 = shift;
my $partial = shift;
my $cdp = $c3550->SUPER::c_ip($partial) || {};
my $lldp = $c3550->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 $c3550 = shift;
my $partial = shift;
my $cdp = $c3550->SUPER::c_if($partial) || {};
my %c_if;
foreach my $iid ( keys %$cdp ) {
my $if = $cdp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
# We need to match the lldp key with the ifIndex
# via lldpLocPortId and ifName
my $i_name = $c3550->ifName($partial) || {};
my $i_name_rev = {};
while ( my($key,$val) = each %$i_name ){
$i_name_rev->{$val} = $key;
}
my $loc_port_id = $c3550->lldpLocPortId($partial) || {};
my $lldp = $c3550->lldp_if($partial) || {};
foreach my $iid ( keys %$lldp ) {
my $if = $lldp->{$iid} || next;
my $name = $loc_port_id->{$if} || next;
my $i_index = $i_name_rev->{$name} || next;
$c_if{$iid} = $i_index;
}
return \%c_if;
}
sub c_port {
my $c3550 = shift;
my $partial = shift;
my $lldp = $c3550->lldp_port($partial) || {};
my $cdp = $c3550->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 $c3550 = shift;
my $partial = shift;
my $lldp = $c3550->lldp_id($partial) || {};
my $cdp = $c3550->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 $c3550 = shift;
my $partial = shift;
my $lldp = $c3550->lldp_rem_sysdesc($partial) || {};
my $cdp = $c3550->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__
@@ -494,23 +359,6 @@ Returns 1. Use vlan indexing.
=back
=head2 Topology information
Based upon the firmware version Cisco devices may support Link Layer Discovery
Protocol (LLDP) in addition to Cisco Discovery Protocol (CDP). These methods
will query both and return the combination of all information. As a result,
there may be identical topology information returned from the two protocols
causing duplicate entries. It is the calling program's responsibility to
identify any duplicate entries and remove duplicates if necessary.
=over
=item $c3550->hasCDP()
Returns true if the device is running either CDP or LLDP.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
@@ -556,40 +404,6 @@ See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $c3550->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $c3550->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-CDP/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 $c3550->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $c3550->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $c3550->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Overrides
=over

View File

@@ -50,7 +50,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -106,6 +106,12 @@ $VERSION = '2.04';
*SNMP::Info::Layer3::C4000::i_speed_admin
= \&SNMP::Info::MAU::mau_i_speed_admin;
*SNMP::Info::Layer3::C4000::set_i_duplex_admin
= \&SNMP::Info::MAU::mau_set_i_duplex_admin;
*SNMP::Info::Layer3::C4000::set_i_speed_admin
= \&SNMP::Info::MAU::mau_set_i_speed_admin;
sub fan {
my $c4000 = shift;
my $fan_state = $c4000->fan_state();
@@ -281,6 +287,18 @@ Returns either (auto,full,half).
Returns administrative speed for interfaces.
=item $c4000->set_i_speed_admin(speed, ifIndex)
Sets port speed, must be supplied with speed and port C<ifIndex>.
Speed choices are '10', '100', '1000', 'auto'.
=item $c4000->set_i_duplex_admin(duplex, ifIndex)
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
Duplex choices are 'auto', 'half', 'full'.
=back
=head2 Table Methods imported from SNMP::Info::CiscoVTP

View File

@@ -33,6 +33,7 @@ package SNMP::Info::Layer3::C6500;
use strict;
use Exporter;
use SNMP::Info::CiscoStack;
use SNMP::Info::LLDP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoImage;
@@ -42,14 +43,18 @@ use SNMP::Info::CiscoPower;
use SNMP::Info::Layer3;
use SNMP::Info::CiscoStpExtensions;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CiscoAgg;
use SNMP::Info::MAU;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
# NOTE : Top-most items gets precedence for @ISA
@SNMP::Info::Layer3::C6500::ISA = qw/
SNMP::Info::CiscoAgg
SNMP::Info::CiscoVTP
SNMP::Info::CiscoStpExtensions
SNMP::Info::CiscoStack
SNMP::Info::LLDP
SNMP::Info::CDP
SNMP::Info::CiscoImage
SNMP::Info::CiscoStats
@@ -57,6 +62,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
SNMP::Info::CiscoConfig
SNMP::Info::CiscoPower
SNMP::Info::Layer3
SNMP::Info::MAU
Exporter
/;
@@ -64,7 +70,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
@@ -73,14 +79,24 @@ $VERSION = '2.04';
# The @ISA order should match these orders.
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoPower::MIBS,
%SNMP::Info::CiscoConfig::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS, %SNMP::Info::CiscoStack::MIBS,
%SNMP::Info::CiscoStpExtensions::MIBS, %SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::CiscoPower::MIBS,
%SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CiscoPortSecurity::MIBS,
%SNMP::Info::CiscoImage::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::CiscoStack::MIBS,
%SNMP::Info::CiscoStpExtensions::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::CiscoAgg::MIBS,
'CISCO-VIRTUAL-SWITCH-MIB' => 'cvsSwitchMode',
);
%GLOBALS = (
%SNMP::Info::MAU::GLOBALS,
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::CiscoPower::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
@@ -88,26 +104,28 @@ $VERSION = '2.04';
%SNMP::Info::CiscoImage::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::CiscoStack::GLOBALS,
%SNMP::Info::CiscoStpExtensions::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CiscoPower::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS, %SNMP::Info::CiscoStack::FUNCS,
%SNMP::Info::CiscoStpExtensions::FUNCS, %SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::MAU::FUNCS, %SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoPower::FUNCS, %SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoPortSecurity::FUNCS, %SNMP::Info::CiscoImage::FUNCS,
%SNMP::Info::CiscoStats::FUNCS, %SNMP::Info::CDP::FUNCS,
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::CiscoStack::FUNCS,
%SNMP::Info::CiscoStpExtensions::FUNCS, %SNMP::Info::CiscoVTP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoPower::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CDP::MUNGE, %SNMP::Info::CiscoStack::MUNGE,
%SNMP::Info::CiscoStpExtensions::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,
%SNMP::Info::MAU::MUNGE, %SNMP::Info::Layer3::MUNGE,
%SNMP::Info::CiscoPower::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CiscoPortSecurity::MUNGE, %SNMP::Info::CiscoImage::MUNGE,
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::CiscoStack::MUNGE,
%SNMP::Info::CiscoStpExtensions::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,
);
sub vendor {
@@ -173,6 +191,16 @@ sub i_duplex_admin {
}
}
sub is_virtual_switch {
my $cvs = shift;
my $cvsSwM = $cvs->cvsSwitchMode() || '';
if ( $cvsSwM eq 'multiNode' ) {
return 1;
}
return 0;
}
sub set_i_duplex_admin {
# map a textual duplex to an integer one the switch understands
@@ -180,6 +208,20 @@ sub set_i_duplex_admin {
my $c6500 = shift;
my ( $duplex, $iid ) = @_;
if ( $c6500->is_virtual_switch() ) {
# VSS -> MAU
# Due to VSS bug
# 1. Set the ifMauDefaultType
# 2. Disable ifMauAutoNegAdminStatus
# If the second set is not done, this is not going to be
# working... Cisco Bug id CSCty97033.
# SXI is not working (up to at least relase SXI9).
# SXJ is working at SXJ3 (not before).
return $c6500->mau_set_i_duplex_admin( $duplex, $iid );
}
my $el_duplex = $c6500->el_duplex($iid);
@@ -197,10 +239,33 @@ sub set_i_duplex_admin {
return $c6500->set_p_duplex( $duplexes{$duplex}, $iid );
}
else {
return $c6500->SUPER::set_i_duplex_admin;
return $c6500->SUPER::set_i_duplex_admin( $duplex, $iid );
}
}
sub set_i_speed_admin {
my $c6500 = shift;
my ( $speed, $iid ) = @_;
if ( $c6500->is_virtual_switch() ) {
# VSS -> MAU
# Due to VSS bug
# 1. Set the ifMauDefaultType
# 2. Disable ifMauAutoNegAdminStatus
# If the second set is not done, this is not going to be working...
# Cisco Bug id CSCty97033.
# SXI is not working (at least up to relase SXI9).
# SXJ is working at SXJ3 (not before).
return $c6500->mau_set_i_speed_admin( $speed, $iid );
}
else {
# normal behavior using the CiscoStack method
return $c6500->SUPER::set_i_speed_admin( $speed, $iid );
}
}
1;
__END__
@@ -247,6 +312,8 @@ after determining a more specific class using the method above.
=over
=item SNMP::Info::CiscoAgg
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CiscoStack
@@ -275,6 +342,8 @@ after determining a more specific class using the method above.
=item Inherited Classes' MIBs
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
@@ -312,6 +381,14 @@ These are methods that return scalar value from SNMP
Returns 1. Use vlan indexing.
=item $c6500->cvsSwitchMode()
Returns the Switch status: multiNode or standalone.
=item $c6500->is_virtual_switch()
Return 1 if the switch (C<cvsSwitchMode>) is in multimode (VSS).
=back
=head2 Global Methods imported from SNMP::Info::CiscoVTP
@@ -397,6 +474,14 @@ Crosses $c6500->p_port() with $c6500->p_duplex() to utilize port C<ifIndex>.
$c6500->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
or die "Couldn't change port duplex. ",$c6500->error(1);
=item $c6500->set_i_speed_admin(speed, ifIndex)
Sets port speed, must be supplied with speed and port C<ifIndex>.
Speed choices are '10', '100', '1000'.
Crosses $c6500->p_port() with $c6500->p_speed() to utilize port C<ifIndex>.
=back
=head2 Table Methods imported from SNMP::Info::CiscoVTP
@@ -434,11 +519,12 @@ See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for
details.
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
=cut

View File

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

252
Info/Layer3/CiscoASA.pm Normal file
View File

@@ -0,0 +1,252 @@
# SNMP::Info::Layer3::CiscoASA
# $Id$
#
# Copyright (c) 2013 Moe Kraus
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::CiscoASA;
use strict;
use Exporter;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoImage;
use SNMP::Info::CiscoRTT;
use SNMP::Info::CiscoQOS;
use SNMP::Info::CiscoConfig;
use SNMP::Info::CiscoPower;
use SNMP::Info::Layer3;
use SNMP::Info::Layer3::Cisco;
@SNMP::Info::Layer3::CiscoASA::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
SNMP::Info::CiscoConfig SNMP::Info::CiscoPower
SNMP::Info::Layer3::Cisco
SNMP::Info::Layer3
Exporter/;
@SNMP::Info::Layer3::CiscoASA::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::Cisco::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer3::Cisco::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::Cisco::FUNCS,
'mac_table' => 'ifPhysAddress',
);
%MUNGE = (
%SNMP::Info::Layer3::Cisco::MUNGE,
'mac_table' => \&SNMP::Info::munge_mac, );
sub b_mac {
my ($asa) = shift;
my $macs = $asa->mac_table();
my @macs;
# gather physical addresses
foreach my $i ( keys %$macs ) {
my $mac = $macs->{$i};
# don't catch the bad macs with zeroed OUI
if ( $mac !~ m/(0{1,2}:){3}/ ) {
push( @macs, $mac);
}
@macs = sort( @macs );
}
# return the least mac
return $macs[0];
}
sub i_description {
my $self = shift;
my $partial = shift;
my $i_descr = $self->orig_i_description($partial) || {};
foreach my $ifindex ( keys %$i_descr ) {
$i_descr->{$ifindex} =~ /'(.*)'/;
$i_descr->{$ifindex} = $1
if defined $1;
}
return $i_descr;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::CiscoASA - Cisco Adaptive Security Appliance
=head1 AUTHOR
Moe Kraus
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $cisco = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $asa->class();
print "SNMP::Info determined this device to fall under subclass: $class\n";
=head1 DESCRIPTION
Subclass for Cisco ASA Devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3::Cisco
=back
=head2 Required MIBs
=over
=item F<CISCO-EIGRP-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $asa->b_mac()
Returns base mac.
Overrides base mac function in L<SNMP::Info::Layer3>.
=item $asa->i_description()
Overrides base interface description function in L<SNMP::Info> to return the
configured interface name instead of "Adaptive Security Appliance
'$configured interface name' interface".
=back
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CDP
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStats
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoImage
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoRTT
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoQOS
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoPower
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer3::Cisco
See documentation in L<SNMP::Info::Layer3::Cisco/"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::CiscoVTP
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStats
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoImage
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoRTT
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoQOS
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer3::Cisco
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
=cut

View File

@@ -40,7 +40,7 @@ use SNMP::Info::Layer3::Cisco;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::Cisco::MIBS,
@@ -202,17 +202,17 @@ to a hash.
=item $fwsm->at_paddr()
This function derives the at_paddr information from the n2p_paddr() table as
the MIB to provide that information isn't supported on FWSMs.
the MIB to provide that information isn't supported on FWSM.
=item $fwsm->at_netaddr()
This function derives the at_netaddr information from the n2p_paddr() table as
the MIB to provide that information isn't supported on FWSMs.
the MIB to provide that information isn't supported on FWSM.
=item $fwsm->at_ifaddr()
This function derives the at_ifaddr information from the n2p_paddr() table as
the MIB to provide that information isn't supported on FWSMs.
the MIB to provide that information isn't supported on FWSM.
=back

View File

@@ -42,7 +42,7 @@ use SNMP::Info::Entity;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS,
@@ -68,7 +68,7 @@ sub layers {
}
sub vendor {
return 'nortel';
return 'avaya';
}
sub model {
@@ -162,8 +162,8 @@ __END__
=head1 NAME
SNMP::Info::Layer3::Contivity - SNMP Interface to Nortel VPN Routers
(Contivity Extranet Switches).
SNMP::Info::Layer3::Contivity - SNMP Interface to Avaya/Nortel VPN Routers
(formerly Contivity Extranet Switches).
=head1 AUTHOR
@@ -186,7 +186,8 @@ Eric Miller
=head1 DESCRIPTION
Abstraction subclass for Nortel VPN Routers (Contivity Extranet Switch).
Abstraction subclass for Avaya/Nortel VPN Routers (formerly Contivity
Extranet Switch).
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
@@ -227,7 +228,7 @@ These are methods that return scalar value from SNMP
=item $contivity->vendor()
Returns 'Nortel'
Returns 'avaya'
=item $contivity->model()

View File

@@ -33,16 +33,18 @@ package SNMP::Info::Layer3::Dell;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::Dell::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Dell::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Dell::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::LLDP::MIBS,
'RADLAN-Physicaldescription-MIB' => 'rlPhdStackReorder',
'RADLAN-rlInterfaces' => 'rlIfNumOfLoopbackPorts',
'RADLAN-HWENVIROMENT' => 'rlEnvPhysicalDescription',
@@ -51,12 +53,14 @@ $VERSION = '2.04';
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
'os_ver' => 'productIdentificationVersion',
'dell_id_name' => 'productIdentificationDisplayName',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::FUNCS,
# RADLAN-rlInterfaces:swIfTable
'dell_duplex_admin' => 'swIfDuplexAdminMode',
@@ -102,7 +106,7 @@ $VERSION = '2.04';
'dell_fan_desc' => 'rlEnvMonFanStatusDescr',
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE, );
# Method OverRides
@@ -189,25 +193,6 @@ sub i_duplex_admin {
return \%i_duplex_admin;
}
# Use same methods as netgear. Some device didn't implement the bridge MIB
# forwarding table and some don't return MACs for VLANs other than default yet
# don't support community indexing, so we use the Q-BRIDGE-MIB forwarding
# table. Fall back to the orig functions if the qb versions don't
# return anything.
sub fw_mac {
my $dell = shift;
my $ret = $dell->qb_fw_mac();
$ret = $dell->orig_fw_mac() if ( !defined($ret) );
return $ret;
}
sub fw_port {
my $dell = shift;
my $ret = $dell->qb_fw_port();
$ret = $dell->orig_fw_port() if ( !defined($ret) );
return $ret;
}
sub _vendor {
my $dell = shift;
@@ -340,6 +325,10 @@ otherwise uses the Layer3 serial method.
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
@@ -398,27 +387,14 @@ sometimes not unique.
Returns reference to hash of iid to current link administrative duplex
setting.
=item $dell->fw_mac()
Returns reference to hash of forwarding table MAC Addresses.
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=item $dell->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid)
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

View File

@@ -44,7 +44,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS,
@@ -149,154 +149,67 @@ sub i_duplex_admin {
return $enterasys->mau_i_duplex_admin($partial);
}
# Normal BRIDGE-MIB has issues on some devices, duplicates and
# non-increasing oids, Use Q-BRIDGE-MIB for macsuck
sub fw_mac {
my $enterasys = shift;
my $partial = shift;
return $enterasys->qb_fw_mac($partial);
}
sub fw_port {
my $enterasys = shift;
my $partial = shift;
return $enterasys->qb_fw_port($partial);
}
# Use CDP and/or LLDP
#
# LLDP table timefilter implementation continuously increments when walked
# and we may never reach the end of the table. This behavior can be
# modified with the "set snmp timefilter break disable" command,
# unfortunately it is not the default. Query with a partial value of zero
# which means no time filter.
sub hasCDP {
sub lldp_ip {
my $enterasys = shift;
my $partial = shift || 0;
return $enterasys->hasLLDP() || $enterasys->SUPER::hasCDP();
return $enterasys->SUPER::lldp_ip($partial);
}
sub c_ip {
my $enterasys = shift;
my $partial = shift;
# [3564920] LLDP-MIB::lldpLocPortDesc isn't always unique,
# use LLDP-MIB::lldpLocPortId this cross references to ifName
sub lldp_if {
my $lldp = shift;
my $partial = shift || 0;
my $cdp = $enterasys->SUPER::c_ip($partial) || {};
my $lldp = $enterasys->lldp_ip(0) || {};
my %c_ip;
foreach my $iid ( keys %$cdp ) {
my $ip = $cdp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
my $addr = $lldp->lldp_rem_pid($partial) || {};
my $i_descr = $lldp->ifName() || {};
my %r_i_descr = reverse %$i_descr;
my %lldp_if;
foreach my $key ( keys %$addr ) {
my @aOID = split( '\.', $key );
my $port = $aOID[1];
next unless $port;
# Local LLDP port may not equate to ifIndex
# Cross reference lldpLocPortId with ifName to get ifIndex
my $lldp_desc = $lldp->lldpLocPortId($port);
my $desc = $lldp_desc->{$port};
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
if ( exists $r_i_descr{$desc} ) {
$port = $r_i_descr{$desc};
}
$lldp_if{$key} = $port;
}
foreach my $iid ( keys %$lldp ) {
my $ip = $lldp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
return \%c_ip;
return \%lldp_if;
}
sub c_if {
sub lldp_port {
my $enterasys = shift;
my $partial = shift;
my $partial = shift || 0;
my $lldp = $enterasys->lldp_if(0) || {};
my $cdp = $enterasys->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;
return $enterasys->SUPER::lldp_port($partial);
}
sub c_port {
sub lldp_id {
my $enterasys = shift;
my $partial = shift;
my $partial = shift || 0;
my $lldp = $enterasys->lldp_port(0) || {};
my $cdp = $enterasys->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;
return $enterasys->SUPER::lldp_id($partial);
}
sub c_id {
sub lldp_platform {
my $enterasys = shift;
my $partial = shift;
my $partial = shift || 0;
my $lldp = $enterasys->lldp_id(0) || {};
my $cdp = $enterasys->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 $enterasys = shift;
my $partial = shift;
my $lldp = $enterasys->lldp_rem_sysdesc(0) || {};
my $cdp = $enterasys->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;
return $enterasys->SUPER::lldp_rem_sysdesc($partial);
}
1;
@@ -399,12 +312,6 @@ Returns base mac
=back
=head2 Overrides
=over
=back
=head2 Globals imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
@@ -450,65 +357,27 @@ See documentation for mau_i_duplex() in L<SNMP::Info::MAU/"TABLE METHODS">.
See documentation for mau_i_duplex_admin() in
L<SNMP::Info::MAU/"TABLE METHODS">.
=item $enterasys->fw_mac()
Returns reference to hash of forwarding table MAC Addresses.
=item $enterasys->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid).
(C<dot1qTpFdbPort>)
=back
=head2 Topology information
=head2 Link Layer Discovery Protocol (LLDP) Overrides
Based upon the firmware version Enterasys devices may support Cabletron
Discovery Protocol (CTRON CDP), Cisco Discovery Protocol (CDP), Link Layer
Discovery Protocol (LLDP), or all. This module currently supports CDP and
LLDP, but not CTRON CDP. These methods will query both CDP and LLDP and
return the combination of all information. As a result, there may be
identical topology information returned from the two protocols
causing duplicate entries. It is the calling program's responsibility to
identify any duplicate entries and remove duplicates if necessary.
The LLDP table time filter implementation continuously increments when
walked and we may never reach the end of the table. This behavior can be
modified with the C<"set snmp timefilter break disable"> command,
unfortunately it is not the default. These methods are overridden to
supply a partial value of zero which means no time filter.
=over
=item $enterasys->hasCDP()
=item $enterasys->lldp_if()
Returns true if the device is running either CDP or LLDP.
=item $enterasys->lldp_ip()
=item $enterasys->c_if()
=item $enterasys->lldp_port()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $enterasys->lldp_id()
=item $enterasys->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-CDP/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 $enterasys->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $enterasys->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $enterasys->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=item $enterasys->lldp_platform()
=back

View File

@@ -1,7 +1,7 @@
# SNMP::Info::Layer3::Extreme - SNMP Interface to Extreme devices
# $Id$
#
# Copyright (c) 2008 Eric Miller
# Copyright (c) 2012 Eric Miller
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
@@ -36,18 +36,23 @@ use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
use SNMP::Info::LLDP;
use SNMP::Info::EDP;
@SNMP::Info::Layer3::Extreme::ISA
= qw/SNMP::Info::Layer3 SNMP::Info::MAU Exporter/;
= qw/SNMP::Info::Layer3 SNMP::Info::MAU SNMP::Info::LLDP
SNMP::Info::EDP Exporter/;
@SNMP::Info::Layer3::Extreme::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::EDP::MIBS,
'EXTREME-BASE-MIB' => 'extremeAgent',
'EXTREME-SYSTEM-MIB' => 'extremeSystem',
'EXTREME-FDB-MIB' => 'extremeSystem',
@@ -58,6 +63,8 @@ $VERSION = '2.04';
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::MAU::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::EDP::GLOBALS,
'serial1' => 'extremeSystemID.0',
'temp' => 'extremeCurrentTemperature',
'ps1_status_old' => 'extremePrimaryPowerOperational.0',
@@ -70,20 +77,25 @@ $VERSION = '2.04';
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::MAU::FUNCS,
%SNMP::Info::LLDP::FUNCS,
%SNMP::Info::EDP::FUNCS,
'fan_state' => 'extremeFanOperational',
# EXTREME-FDB-MIB:extremeFdbMacFdbTable
'ex_fw_mac' => 'extremeFdbMacFdbMacAddress',
'ex_fw_port' => 'extremeFdbMacFdbPortIfIndex',
'ex_fw_status' => 'extremeFdbMacFdbStatus',
# EXTREME-VLAN-MIB:extremeVlanIfTable
'ex_vlan_descr' => 'extremeVlanIfDescr',
'ex_vlan_global_id' => 'extremeVlanIfGlobalIdentifier',
'ex_vlan_id' => 'extremeVlanIfVlanId',
# EXTREME-VLAN-MIB:extremeVlanEncapsIfTable
'ex_vlan_encap_tag' => 'extremeVlanEncapsIfTag',
# EXTREME-VLAN-MIB:extremeVlanOpaqueTable
'ex_vlan_untagged' => 'extremeVlanOpaqueUntaggedPorts',
'ex_vlan_tagged' => 'extremeVlanOpaqueTaggedPorts',
# EXTREME-POE-MIB::extremePethPseSlotTable
'peth_power_watts' => 'extremePethSlotPowerLimit',
# EXTREME-POE-MIB::extremePethPsePortTable
'peth_port_power' => 'extremePethPortMeasuredPower',
);
@@ -92,12 +104,16 @@ $VERSION = '2.04';
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::MAU::MUNGE,
'ex_fw_mac' => \&SNMP::Info::munge_mac,
'ps1_status_old' => \&munge_true_ok,
'ps1_status_new' => \&munge_power_stat,
'ps2_status_old' => \&munge_power_stat,
'ps2_status_new' => \&munge_power_stat,
'fan_state' => \&munge_true_ok,
%SNMP::Info::LLDP::MUNGE,
%SNMP::Info::EDP::MUNGE,
'ex_fw_mac' => \&SNMP::Info::munge_mac,
'ps1_status_old' => \&munge_true_ok,
'ps1_status_new' => \&munge_power_stat,
'ps2_status_old' => \&munge_power_stat,
'ps2_status_new' => \&munge_power_stat,
'fan_state' => \&munge_true_ok,
'ex_vlan_untagged' => \&SNMP::Info::munge_port_list,
'ex_vlan_tagged' => \&SNMP::Info::munge_port_list,
);
# Method OverRides
@@ -129,15 +145,24 @@ sub vendor {
}
sub os {
return 'extreme';
my $extreme = shift;
my $desc = $extreme->description();
if ( $desc =~ /xos/i ) {
return 'xos';
}
return 'extremeware';
}
sub os_ver {
my $extreme = shift;
my $descr = $extreme->description();
return unless defined $descr;
if ( $descr =~ m/Version ([\d.]*)/ ) {
if ( $descr =~ m/Version\s+([^ ]+)/i ) {
return $1;
}
@@ -178,7 +203,7 @@ sub i_ignore {
my %i_ignore;
foreach my $if ( keys %$i_description ) {
if ( $i_description->{$if}
=~ /^(802.1Q Encapsulation Tag \d+|VLAN \d+|lo\d+)/i )
=~ /^(802.1Q Encapsulation Tag \d+|VLAN \d+|lo\d+|VirtualRouter\d+)/i )
{
$i_ignore{$if}++;
}
@@ -191,6 +216,10 @@ sub i_ignore {
# ifIndex.
sub bp_index {
my $extreme = shift;
my $bindex = $extreme->SUPER::bp_index();
return $bindex if (keys %$bindex);
my $if_index = $extreme->i_index();
my %bp_index;
@@ -241,28 +270,45 @@ sub fan {
return $ret;
}
# Newer versions of the Extreme firmware have vendor-specific tables
# for this; those are ex_fw_*(). Older firmware versions don't have
# these tables, so we use the BRIDGE-MIB tables.
# For xos based VLAN functions we need to know how the ports are indexed
# default is slot * 1000, but some older switches start at 1
sub _slot_factor {
my $extreme = shift;
my $index = $extreme->i_index();
return 1 if (exists $index->{1} && $index->{1} == 1);
return 1000;
}
# Some versions of the Extreme firmware have vendor-specific tables
# for this; those are ex_fw_*(). Some don't have these tables,
# we use the BRIDGE-MIB tables if available then the ex_fw_*() methods.
sub fw_mac {
my $extreme = shift;
my $fw_mac = $extreme->ex_fw_mac;
return $fw_mac if defined($fw_mac);
return $extreme->orig_fw_mac();
my $b = $extreme->SUPER::fw_mac();
return $b if (keys %$b);
return $extreme->ex_fw_mac();
}
sub fw_port {
my $extreme = shift;
my $fw_port = $extreme->ex_fw_port;
return $fw_port if defined($fw_port);
return $extreme->orig_fw_port();
my $b = $extreme->SUPER::fw_port();
return $b if (keys %$b);
return $extreme->ex_fw_port();
}
sub fw_status {
my $extreme = shift;
my $fw_status = $extreme->ex_fw_status;
return $fw_status if defined($fw_status);
return $extreme->orig_fw_status();
my $b = $extreme->SUPER::fw_status();
return $b if (keys %$b);
return $extreme->ex_fw_status();
}
# Mapping the virtual VLAN interfaces:
@@ -303,7 +349,7 @@ sub _if2tag {
}
}
if ($missed) {
my $global_id = $extreme->ex_vlan_global_id();
my $global_id = $extreme->ex_vlan_id();
foreach my $if ( keys %if2tag ) {
$if2tag{$if} = -$global_id->{$if}
if ( $if2tag{$if} == -1 && defined( $global_id->{$if} ) );
@@ -312,7 +358,7 @@ sub _if2tag {
return \%if2tag;
}
# No partial support in v_name or v_index, because the obivous partial
# No partial support in v_name or v_index, because the obvious partial
# is the VLAN ID and the index here is the ifIndex of
# the VLAN interface.
sub v_name {
@@ -322,12 +368,66 @@ sub v_name {
sub v_index {
my $extreme = shift;
return $extreme->_if2tag();
return $extreme->ex_vlan_id || $extreme->_if2tag();
}
sub i_vlan {
my $extreme = shift;
my $partial = shift;
# Some devices support Q-Bridge, if so short circuit and return it
my $q_bridge = $extreme->SUPER::i_vlan($partial);
return $q_bridge if (keys %$q_bridge);
# Next we try extremeVlanOpaqueTable
my $xos = $extreme->_xos_i_vlan($partial);
return $xos if (keys %$xos);
# Try older ifStack method
my $extremeware = $extreme->_extremeware_i_vlan($partial);
return $extremeware if (keys %$extremeware);
return;
}
sub _xos_i_vlan {
my $extreme = shift;
my $partial = shift;
my $index = $extreme->i_index();
my $vlans = $extreme->ex_vlan_id() || {};
my $slotx = $extreme->_slot_factor() || 1000;
my $u_ports = $extreme->ex_vlan_untagged() || {};
my $i_vlan = {};
foreach my $idx ( keys %$u_ports ) {
next unless ( defined $u_ports->{$idx} );
my $portlist = $u_ports->{$idx};
my $ret = [];
my ( $vlan_if, $slot ) = $idx =~ /^(\d+)\.(\d+)/;
my $vlan = $vlans->{$vlan_if} || '';
# Convert portlist bit array to bp_index array
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
push( @{$ret}, ( $slotx * $slot + $i + 1 ) )
if ( @$portlist[$i] );
}
#Create HoA ifIndex -> VLAN array
foreach my $port ( @{$ret} ) {
my $ifindex = $index->{$port};
next unless ( defined($ifindex) ); # shouldn't happen
next if ( defined $partial and $ifindex !~ /^$partial$/ );
$i_vlan->{$ifindex} = $vlan;
}
}
return $i_vlan;
}
sub _extremeware_i_vlan {
my $extreme = shift;
my $partial = shift;
my $stack = $extreme->ifStackStatus($partial);
my $encap_tag = $extreme->ex_vlan_encap_tag();
my $vlan_descr = $extreme->ex_vlan_descr();
@@ -351,6 +451,65 @@ sub i_vlan {
}
sub i_vlan_membership {
my $extreme = shift;
my $partial = shift;
# Some devices support Q-Bridge, if so short circuit and return it
my $q_bridge = $extreme->SUPER::i_vlan_membership($partial);
return $q_bridge if (ref {} eq ref $q_bridge and scalar keys %$q_bridge);
# Next we try extremeVlanOpaqueTable
my $xos = $extreme->_xos_i_vlan_membership($partial);
return $xos if (ref {} eq ref $xos and scalar keys %$xos);
# Try older ifStack method
my $extremeware = $extreme->_extremeware_i_vlan_membership($partial);
return $extremeware if (ref {} eq ref $extremeware and scalar keys %$extremeware);
return;
}
sub _xos_i_vlan_membership {
my $extreme = shift;
my $partial = shift;
my $index = $extreme->i_index();
my $vlans = $extreme->ex_vlan_id();
my $slotx = $extreme->_slot_factor() || 1000;
my $u_ports = $extreme->ex_vlan_untagged() || {};
my $t_ports = $extreme->ex_vlan_tagged() || {};
my $i_vlan_membership = {};
foreach my $idx ( keys %$u_ports ) {
next unless ( defined $u_ports->{$idx} );
my $u_portlist = $u_ports->{$idx};
my $t_portlist = $t_ports->{$idx};
my $ret = [];
my ( $vlan_if, $slot ) = $idx =~ /^(\d+)\.(\d+)/;
my $vlan = $vlans->{$vlan_if} || '';
foreach my $portlist ( $u_portlist, $t_portlist ) {
# Convert portlist bit array to bp_index array
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
push( @{$ret}, ( $slotx * $slot + $i + 1 ) )
if ( @$portlist[$i] );
}
}
#Create HoA ifIndex -> VLAN array
foreach my $port ( @{$ret} ) {
my $ifindex = $index->{$port};
next unless ( defined($ifindex) ); # shouldn't happen
next if ( defined $partial and $ifindex !~ /^$partial$/ );
push( @{ $i_vlan_membership->{$ifindex} }, $vlan );
}
}
return $i_vlan_membership;
}
sub _extremeware_i_vlan_membership {
my $extreme = shift;
my $partial = shift;
my $stack = $extreme->ifStackStatus($partial);
@@ -530,6 +689,28 @@ sub set_add_i_vlan_tagged {
return $rv;
}
# LLDP uses the bridge index rather than ifIndex
sub lldp_if {
my $extreme = shift;
my $partial = shift;
my $addr = $extreme->lldp_rem_pid($partial) || {};
my $b_index = $extreme->bp_index() || {};
#my %r_i_descr = reverse %$i_descr;
my %lldp_if;
foreach my $key ( keys %$addr ) {
my @aOID = split( '\.', $key );
my $port = $aOID[1];
next unless $port;
my $idx = $b_index->{$port};
$lldp_if{$key} = $idx;
}
return \%lldp_if;
}
1;
__END__
@@ -576,6 +757,10 @@ my $extreme = new SNMP::Info::Layer3::Extreme(...);
=item SNMP::Info::MAU
=item SNMP::Info::LLDP
=item SNMP::Info::EDP
=back
=head2 Required MIBs
@@ -658,12 +843,6 @@ Returns base mac
=back
=head2 Overrides
=over
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
@@ -672,6 +851,14 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::EDP
See documentation in L<SNMP::Info::EDP/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
@@ -716,6 +903,11 @@ Ignores VLAN meta interfaces and loopback
(C<extremeFdbMacFdbStatus>)
=item $extreme->lldp_if()
Returns the mapping to the SNMP Interface Table. Extreme LLDP uses the
bridge index rather than ifIndex.
=item $extreme->i_vlan()
Returns a mapping between C<ifIndex> and the VLAN.
@@ -756,7 +948,14 @@ F<EXTREME-FDB-MIB> rather than F<BRIDGE-MIB>.
=item $extreme->peth_port_power()
Power supplied by PoE ports, in milliwatts
("extremePethPortMeasuredPower")
(C<extremePethPortMeasuredPower>)
=item $extreme->peth_power_watts()
The configured maximum amount of in-line power available to the slot.
(C<extremePethSlotPowerLimit>)
=back
@@ -768,6 +967,14 @@ See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::EDP
See documentation in L<SNMP::Info::EDP/"TABLE METHODS"> for details.
=head1 SET METHODS
These are methods that provide SNMP set functionality for overridden methods
@@ -818,7 +1025,6 @@ with the numeric VLAN ID and port C<ifIndex>.
$extreme->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
or die "Couldn't add port to egress list. ",$extreme->error(1);
=back
=head1 Data Munging Callback Subroutines

416
Info/Layer3/F5.pm Normal file
View File

@@ -0,0 +1,416 @@
# SNMP::Info::Layer3::F5
#
# Copyright (c) 2012 Eric Miller
# All Rights Reserved
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::F5;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::F5::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::F5::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'F5-BIGIP-SYSTEM-MIB' => 'sysAttrArpMaxEntries',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
'os_ver' => 'sysProductVersion',
'mkt_name' => 'sysPlatformInfoMarketingName',
'ps1_status' => 'sysChassisPowerSupplyStatus.1',
'ps2_status' => 'sysChassisPowerSupplyStatus.2',
# Named serial1 to override serial1 in L3 serial method
'serial1' => 'sysGeneralChassisSerialNum',
'qb_vlans' => 'sysVlanNumber',
'ports' => 'sysInterfaceNumber',
);
%FUNCS = (
%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_in' => 'sysIfxStatHcInOctets',
'i_octet_out' => 'sysIfxStatHcOutOctets',
'i_pkts_ucast_in' => 'sysIfxStatHcInUcastPkts',
'i_pkts_ucast_out' => 'sysIfxStatHcOutUcastPkts',
# sysInterfaceStatTable
'i_discards_in' => 'sysInterfaceStatDropsIn',
'i_discards_out' => 'sysInterfaceStatDropsOut',
'i_errors_in' => 'sysInterfaceStatErrorsIn',
'i_errors_out' => 'sysInterfaceStatErrorsOut',
# sysInterfaceTable
'sys_i_duplex' => 'sysInterfaceMediaActiveDuplex',
# sysChassisFanTable
'fan_state' => 'sysChassisFanStatus',
# sysVlanTable
'sys_v_id' => 'sysVlanId',
'v_name' => 'sysVlanVname',
# sysVlanMemberTable
'sys_vm_tagged' => 'sysVlanMemberTagged',
'sys_vm_name' => 'sysVlanMemberVmname',
'sys_vmp_name' => 'sysVlanMemberParentVname',
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'f5';
}
sub os {
return 'f5';
}
sub fan {
my $f5 = shift;
my $fan_state = $f5->fan_state();
my $ret = "";
my $s = "";
foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
$ret .= $s . $i . ": " . $fan_state->{$i};
$s = ", ";
}
return if ( $s eq "" );
return $ret;
}
sub model {
my $f5 = shift;
my $name = $f5->mkt_name();
if ( defined $name ) { return $name; }
my $id = $f5->id();
my $model = &SNMP::translateObj($id);
if ( !defined $model ) { return $id; }
return $model;
}
# Override L3 interfaces
sub interfaces {
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} = 'ethernetCsmacd';
}
return \%i_type;
}
# Override L3 i_duplex
sub i_duplex {
my $f5 = shift;
my $partial = shift;
my $duplexes = $f5->sys_i_duplex() || {};
my %i_duplex;
foreach my $if ( keys %$duplexes ) {
my $duplex = $duplexes->{$if};
next unless defined $duplex;
next if ( $duplex eq 'none' );
$i_duplex{$if} = $duplex;
}
return \%i_duplex;
}
# Override Bridge v_index
sub v_index {
my $f5 = shift;
my $partial = shift;
return $f5->sys_v_id($partial);
}
sub i_vlan {
my $f5 = shift;
my $partial = shift;
my $index = $f5->i_index($partial) || {};
my $tagged = $f5->sys_vm_tagged() || {};
my $vlans = $f5->v_index() || {};
my $i_vlan = {};
foreach my $iid ( keys %$tagged ) {
my $tag = $tagged->{$iid};
next if ( $tag eq 'true' );
# 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 $len = $iid_array[0];
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
my $idx = join '.', @iid_array;
# Check to make sure we can map to a port
my $p_idx = $index->{$idx};
next unless $p_idx;
my $vlan = $vlans->{$v_idx};
next unless $vlan;
$i_vlan->{$idx} = $vlan;
}
return $i_vlan;
}
sub i_vlan_membership {
my $f5 = shift;
my $partial = shift;
my $index = $f5->i_index($partial) || {};
my $tagged = $f5->sys_vm_tagged() || {};
my $vlans = $f5->v_index() || {};
my $i_vlan_membership = {};
foreach my $iid ( keys %$tagged ) {
# 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 $len = $iid_array[0];
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
my $idx = join '.', @iid_array;
# Check to make sure we can map to a port
my $p_idx = $index->{$idx};
next unless $p_idx;
my $vlan = $vlans->{$v_idx};
next unless $vlan;
push( @{ $i_vlan_membership->{$idx} }, $vlan );
}
return $i_vlan_membership;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::F5 - SNMP Interface to F5 network devices.
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $f5 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $f5->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for F5 network devices.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $f5 = new SNMP::Info::Layer3::F5(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<F5-BIGIP-COMMON-MIB>
=item F<F5-BIGIP-SYSTEM-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $f5->model()
Return (C<sysPlatformInfoMarketingName>), otherwise tries to reference
$f5->id() to F<F5-BIGIP-COMMON-MIB>.
=item $f5->vendor()
Returns 'f5'
=item $f5->os()
Returns 'f5'
=item $f5->os_ver()
Returns the software version reported by C<sysProductVersion>
=item $f5->fan()
Combines (C<sysChassisFanStatus>) into a single string.
=item $f5->ps1_status()
Returns status of primary power supply
=item $f5->ps2_status()
Returns status of redundant power supply
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a
reference to a hash.
=head2 Overrides
=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.
=item $f5->i_vlan()
Returns a mapping between C<ifIndex> and the default VLAN.
=item $f5->i_vlan_membership()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
IDs.
Example:
my $interfaces = $f5->interfaces();
my $vlans = $f5->i_vlan_membership();
foreach my $iid (sort keys %$interfaces) {
my $port = $interfaces->{$iid};
my $vlan = join(',', sort(@{$vlans->{$iid}}));
print "Port: $port VLAN: $vlan\n";
}
=item $f5->v_index()
Returns VLAN IDs
=item $f5->v_name()
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
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

309
Info/Layer3/Force10.pm Normal file
View File

@@ -0,0 +1,309 @@
# SNMP::Info::Layer3::Force10
# $Id$
#
# Copyright (c) 2012 William Bulley
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::Force10;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::Force10::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Force10::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::LLDP::MIBS,
'F10-PRODUCTS-MIB' => 'f10Products',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::MAU::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::MAU::FUNCS,
%SNMP::Info::LLDP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::MAU::MUNGE,
%SNMP::Info::LLDP::MUNGE,
);
# use MAU-MIB for admin. duplex and admin. speed
*SNMP::Info::Layer3::Force10::i_duplex_admin
= \&SNMP::Info::MAU::mau_i_duplex_admin;
*SNMP::Info::Layer3::Force10::i_speed_admin
= \&SNMP::Info::MAU::mau_i_speed_admin;
sub vendor {
return 'force10';
}
sub os {
return 'ftos';
}
sub os_ver {
my $force10 = shift;
my $descr = $force10->description();
my $os_ver = undef;
$os_ver = $1 if ( $descr =~ /Force10\s+Application\s+Software\s+Version:\s+(\S+)/s );
return $os_ver;
}
sub model {
my $force10 = shift;
my $id = $force10->id();
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
return $model;
}
sub v_name {
my $force10 = shift;
my $partial = shift;
return $force10->qb_v_name($partial);
}
# ------------------- stub for now-----------------
sub i_vlan {
my $force10 = shift;
my $partial = shift;
my $i_vlan = {};
return $i_vlan;
}
sub i_vlan_membership {
my $force10 = shift;
my $partial = shift;
my $index = $force10->bp_index();
my $v_index = $force10->v_index();
my $v_ports = $force10->qb_v_egress();
# If given a partial it will be an ifIndex, we need to use dot1dBasePort
if ($partial) {
my %r_index = reverse %$index;
$partial = $r_index{$partial};
}
my $i_vlan_membership = {};
foreach my $idx ( sort keys %{$v_ports} ) {
next unless ( defined $v_ports->{$idx} );
my $portlist = $v_ports->{$idx}; # is an array reference
my $ret = [];
my $vlan_ndx = $idx;
# Convert portlist bit array to bp_index array
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
}
#Create HoA ifIndex -> VLAN array
foreach my $port ( @{$ret} ) {
my $ifindex = $index->{$port};
next unless ( defined($ifindex) ); # shouldn't happen
next if ( defined $partial and $ifindex !~ /^$partial$/ );
my $vlan_tag = $v_index->{$vlan_ndx};
# FIXME: would be preferable to use
# the mapping from Q-BRIDGE-MIB::dot1qVlanFdbId
my $mod = $vlan_tag % 4096;
push ( @{ $i_vlan_membership->{$ifindex} }, ($mod) );
}
}
return $i_vlan_membership;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Force10 - SNMP Interface to Force10 Networks FTOS
=head1 AUTHOR
William Bulley
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $force10 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $force10->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Force10 Networks FTOS-based devices.
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=item SNMP::Info::MAU
=item SNMP::Info::LLDP
=back
=head2 Required MIBs
=over
=item F<F10-PRODUCTS-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar values from SNMP:
=over
=item $force10->vendor()
Returns C<'force10'>
=item $force10->model()
Tries to reference $force10->id() to the Force10 product MIB listed above.
=item $force10->os()
Returns C<'ftos'>.
=item $force10->os_ver()
Grabs the operating system version from C<sysDescr>
=back
=head2 Global Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $force10->v_name()
Returns the VLAN names.
=item $force10->i_vlan()
Currently not implemented.
=item $force10->i_vlan_membership()
Returns reference to hash of arrays:
key = C<ifIndex>, value = array of VLAN IDs.
These are the VLANs which are members of the egress list for the port.
=item $force10->i_duplex_admin()
Returns info from F<MAU-MIB>
=item $force10->i_speed_admin()
Returns info from F<MAU-MIB>
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

File diff suppressed because it is too large Load Diff

232
Info/Layer3/H3C.pm Normal file
View File

@@ -0,0 +1,232 @@
# SNMP::Info::Layer3::H3C
#
# Copyright (c) 2012 Jeroen van Ingen
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::H3C;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::H3C::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::H3C::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::LLDP::MIBS,
'HH3C-LswDEVM-MIB' => 'hh3cDevMFanStatus',
'HH3C-LswINF-MIB' => 'hh3cSlotPortMax',
'HH3C-LSW-DEV-ADM-MIB' => 'hh3cLswSysVersion',
'HH3C-PRODUCT-ID-MIB' => 'hh3c-s5500-28C-EI',
'HH3C-ENTITY-VENDORTYPE-OID-MIB' => 'hh3cevtOther',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
'fan' => 'hh3cDevMFanStatus.1',
'ps1_status' => 'hh3cDevMPowerStatus.1',
'ps2_status' => 'hh3cDevMPowerStatus.2',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::FUNCS,
i_duplex_admin => 'hh3cifEthernetDuplex',
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::LLDP::MUNGE,
);
sub vendor {
my $h3c = shift;
my $mfg = $h3c->entPhysicalMfgName(1) || {};
return $mfg->{1};
}
sub os {
my $h3c = shift;
my $descr = $h3c->description();
return $1 if ( $descr =~ /(\S+)\s+Platform Software/ );
return;
}
sub os_ver {
my $h3c = shift;
my $descr = $h3c->description();
# my $version = $h3c->hh3cLswSysVersion(); # Don't use, indicates base version only, no release details
my $ver_release = $h3c->entPhysicalSoftwareRev(2) || {};
my $os_ver = undef;
$os_ver = "$1 $2" if ( $descr =~ /Software Version ([^,]+),.*(Release\s\S+)/i );
return $ver_release->{2} || $os_ver;
}
sub i_ignore {
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->interfaces($partial) || {};
my %i_ignore;
foreach my $if ( keys %$interfaces ) {
# lo0 etc
if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::H3C - SNMP Interface to L3 Devices, H3C & HP A-series
=head1 AUTHORS
Jeroen van Ingen
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $h3c = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $h3c->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for H3C & HP A-series devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=item SNMP::Info::LLDP
=back
=head2 Required MIBs
=over
=item F<HH3C-LswDEVM-MIB>
=item F<HH3C-LswINF-MIB>
=item F<HH3C-LSW-DEV-ADM-MIB>
=item F<HH3C-PRODUCT-ID-MIB>
=item F<HH3C-ENTITY-VENDORTYPE-OID-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3> for its own MIB requirements.
See L<SNMP::Info::LLDP> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $h3c->vendor()
Returns value for C<entPhysicalMfgName.1>.
=item $h3c->os()
Returns the OS extracted from C<sysDescr>.
=item $h3c->os_ver()
Returns the software version. Either C<entPhysicalSoftwareRev.2> or extracted from
C<sysDescr>.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP> for details.
=head1 TABLE ENTRIES
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $h3c->i_ignore()
Returns reference to hash. Increments value of IID if port is to be ignored.
Ignores loopback
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP> for details.
=cut

View File

@@ -42,7 +42,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -196,134 +196,6 @@ sub interfaces {
return $i_descr;
}
# Use FDP and/or LLDP
sub hasCDP {
my $hp9300 = shift;
return $hp9300->hasLLDP() || $hp9300->SUPER::hasCDP();
}
sub c_ip {
my $hp9300 = shift;
my $partial = shift;
my $cdp = $hp9300->SUPER::c_ip($partial) || {};
my $lldp = $hp9300->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 $hp9300 = shift;
my $partial = shift;
my $lldp = $hp9300->lldp_if($partial) || {};
my $cdp = $hp9300->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 $hp9300 = shift;
my $partial = shift;
my $lldp = $hp9300->lldp_port($partial) || {};
my $cdp = $hp9300->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 $hp9300 = shift;
my $partial = shift;
my $lldp = $hp9300->lldp_id($partial) || {};
my $cdp = $hp9300->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 $hp9300 = shift;
my $partial = shift;
my $lldp = $hp9300->lldp_rem_sysdesc($partial) || {};
my $cdp = $hp9300->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__
@@ -527,54 +399,6 @@ Returns reference to hash. Current Port Speed.
=back
=head2 Topology information
Based upon the software version devices may support Foundry Discovery
Protocol (FDP) and Link Layer Discovery Protocol (LLDP). These
methods will query both and return the combination of all information. As a
result, there may be identical topology information returned from the two
protocols causing duplicate entries. It is the calling program's
responsibility to identify any duplicate entries and remove duplicates
if necessary.
=over
=item $hp9300->hasCDP()
Returns true if the device is running either FDP or LLDP.
=item $hp9300->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $hp9300->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-FDP/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 $hp9300->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $hp9300->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $hp9300->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.

407
Info/Layer3/IBMGbTor.pm Normal file
View File

@@ -0,0 +1,407 @@
# SNMP::Info::Layer3::IBMGbTor - SNMP Interface to IBM Rackswitch devices
# $Id$
#
# Copyright (c) 2013 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::IBMGbTor;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::IBMGbTor::ISA
= qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::IBMGbTor::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
# LLDP MIBs not loaded to prevent possible unqualified namespace conflict
# with IBM definitions
'IBM-GbTOR-10G-L2L3-MIB' => 'lldpInfoRemoteDevicesLocalPort',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
'temp' => 'hwTempSensors',
'fan' => 'hwFanSpeed',
# Can't find the equivalent in IBM-GbTOR-10G-L2L3-MIB
# use a different strategy for lldp_sys_cap in hasLLDP()
#'lldp_sysname' => 'lldpLocSysName',
#'lldp_sysdesc' => 'lldpLocSysDesc',
#'lldp_sys_cap' => 'lldpLocSysCapEnabled',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::FUNCS,
# IBM-GbTOR-10G-L2L3-MIB::portInfoTable
'sw_duplex' => 'portInfoMode',
# Can't find the equivalent in IBM-GbTOR-10G-L2L3-MIB
# not currently used in LLDP class
#'lldp_lman_addr' => 'lldpLocManAddrIfId',
# IBM-GbTOR-10G-L2L3-MIB::lldpInfoPortTable
'lldp_port_status' => 'lldpInfoPortAdminStatus',
# IBM-GbTOR-10G-L2L3-MIB::lldpInfoRemoteDevicesTable
'lldp_rem_id_type' => 'lldpInfoRemoteDevicesChassisSubtype',
'lldp_rem_id' => 'lldpInfoRemoteDevicesSystemName',
'lldp_rem_pid_type' => 'lldpInfoRemoteDevicesPortSubtype',
'lldp_rem_pid' => 'lldpInfoRemoteDevicesPortId',
'lldp_rem_desc' => 'lldpInfoRemoteDevicesPortDescription',
'lldp_rem_sysname' => 'lldpInfoRemoteDevicesSystemName',
'lldp_rem_sysdesc' => 'lldpInfoRemoteDevicesSystemDescription',
'lldp_rem_sys_cap' => 'lldpInfoRemoteDevicesSystemCapEnabled',
# IBM-GbTOR-10G-L2L3-MIB::lldpInfoRemoteDevicesManAddrTable
'lldp_rman_type' => 'lldpInfoRemoteDevicesManAddrSubtype',
'lldp_rman_addr' => 'lldpInfoRemoteDevicesManAddr',
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE, );
sub hasLLDP {
my $ibm = shift;
# We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
# Look to see if LLDP Rx enabled on any port
my $lldp_cap = $ibm->lldp_port_status();
foreach my $if ( keys %$lldp_cap ) {
if ( $lldp_cap->{$if} =~ /enabledRx/i ) {
return 1;
}
}
return;
}
sub lldp_ip {
my $ibm = shift;
my $partial = shift;
my $rman_type = $ibm->lldp_rman_type($partial) || {};
my $rman_addr = $ibm->lldp_rman_addr($partial) || {};
my %lldp_ip;
foreach my $key ( keys %$rman_addr ) {
my $type = $rman_type->{$key};
next unless defined $type;
next unless $type eq 'ipV4';
if ( $key =~ /^(\d+)\./ ) {
$lldp_ip{$1} = $rman_addr->{$key};
}
}
return \%lldp_ip;
}
sub lldp_if {
my $lldp = shift;
my $partial = shift;
my $lldp_desc = $lldp->lldpInfoRemoteDevicesLocalPort($partial) || {};
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 %$lldp_desc ) {
# Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex,
# prefer ifAlias over ifDescr since MIB says 'alias'.
my $desc = $lldp_desc->{$key};
next unless $desc;
my $port = $desc;
# If cross reference is successful use it, otherwise stick with
# lldpRemLocalPortNum
if ( exists $r_i_alias{$desc} ) {
$port = $r_i_alias{$desc};
}
elsif ( exists $r_i_descr{$desc} ) {
$port = $r_i_descr{$desc};
}
$lldp_if{$key} = $port;
}
return \%lldp_if;
}
sub lldp_platform {
my $ibm = shift;
my $partial = shift;
return $ibm->lldpInfoRemoteDevicesSystemDescription($partial);
}
sub i_ignore {
my $ibm = shift;
my $partial = shift;
my $interfaces = $ibm->interfaces($partial) || {};
my %i_ignore;
foreach my $if ( keys %$interfaces ) {
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|lb|null)/i ) {
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
sub i_duplex {
my $ibm = shift;
my $partial = shift;
return $ibm->sw_duplex($partial);
}
sub model {
my $ibm = shift;
my $id = $ibm->id();
my $descr = $ibm->description();
my $model = &SNMP::translateObj($id);
if ( $descr =~ /RackSwitch\s(.*)/ ) {
return $1;
}
return $model || $id;
}
sub os {
return 'ibm';
}
sub vendor {
return 'ibm';
}
sub os_ver {
my $ibm = shift;
return $ibm->agSoftwareVersion();
}
sub interfaces {
my $ibm = shift;
my $partial = shift;
my $i_descr = $ibm->i_description($partial) || {};
my $i_name = $ibm->i_name($partial) || {};
foreach my $iid ( keys %$i_name ) {
my $name = $i_name->{$iid};
next unless defined $name;
$i_descr->{$iid} = $name
if $name =~ /^port\d+/i;
}
return $i_descr;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::IBMGbTor - SNMP Interface to IBM Rackswitch devices
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $ibm = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $ibm->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for IBM Rackswitch (formerly Blade Network Technologies)
network devices.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $ibm = new SNMP::Info::Layer3::IBMGbTor(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3;
=item SNMP::Info::LLDP;
=back
=head2 Required MIBs
=over
=item F<IBM-GbTOR-10G-L2L3-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $ibm->model()
Returns model type. Attempts to pull model from device description.
Otherwise checks $ibm->id() against the F<IBM-GbTOR-10G-L2L3-MIB>.
=item $ibm->vendor()
Returns 'ibm'
=item $ibm->os()
Returns 'ibm'
=item $ibm->os_ver()
Returns the software version
(C<agSoftwareVersion>)
=item $ibm->temp()
(C<hwTempSensors>)
=item $ibm->fan()
(C<hwFanSpeed>)
=back
=head2 Overrides
=over
=item $ibm->hasLLDP()
Is LLDP is active in this device?
Note: LLDP may be active, but nothing in C<lldpRemoteSystemsData> Tables so
the device would not return any useful topology information.
Checks to see if at least one interface is enabled to receive LLDP packets.
=back
=head2 Global Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $ibm->interfaces()
Returns reference to hash of interface names to iids.
=item $ibm->i_ignore()
Returns reference to hash of interfaces to be ignored.
Ignores interfaces with descriptions of tunnel, loopback, and null.
=item $ibm->i_duplex()
Returns reference to hash of interface link duplex status.
(C<portInfoMode>)
=item $ibm->lldp_if()
Returns the mapping to the SNMP Interface Table. Tries to cross reference
(C<lldpInfoRemoteDevicesLocalPort>) with (C<ifDescr>) and (C<ifAlias>)
to get (C<ifIndex>).
=item $ibm->lldp_ip()
Returns remote IPv4 address. Returns for all other address types, use
lldp_addr if you want any return address type.
=item $ibm->lldp_platform()
Returns remote device system description.
(C<lldpInfoRemoteDevicesSystemDescription>)
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

View File

@@ -38,27 +38,47 @@ use SNMP::Info::LLDP;
@SNMP::Info::Layer3::Juniper::ISA = qw/SNMP::Info::Layer3 SNMP::Info::LLDP Exporter/;
@SNMP::Info::Layer3::Juniper::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::LLDP::MIBS,
'JUNIPER-CHASSIS-DEFINES-MIB' => 'jnxChassisDefines',
'JUNIPER-MIB' => 'jnxBoxAnatomy',
'JUNIPER-VIRTUALCHASSIS-MIB' => 'jnxVirtualChassisMemberTable',
'JUNIPER-VLAN-MIB' => 'jnxVlanMIBObjects',
);
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
'serial' => 'jnxBoxSerialNo.0', );
'serial' => 'jnxBoxSerialNo.0',
'mac' => 'dot1dBaseBridgeAddress',
'box_descr' => 'jnxBoxDescr'
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::FUNCS,
# JUNIPER-VLAN-MIB::jnxExVlanTable
'v_index' => 'jnxExVlanTag',
'v_type' => 'jnxExVlanType',
'v_name' => 'jnxExVlanName',
# JUNIPER-VLAN-MIB::jnxExVlanPortGroupTable
'i_trunk' => 'jnxExVlanPortAccessMode',
# JUNPIER-MIB
'e_contents_type' => 'jnxContentsType',
'e_containers_type' => 'jnxContainersType',
'e_hwver' => 'jnxContentsRevision',
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE,
%SNMP::Info::LLDP::MUNGE,
'e_containers_type' => \&SNMP::Info::munge_e_type,
'e_contents_type' => \&SNMP::Info::munge_e_type,
);
sub vendor {
@@ -71,12 +91,16 @@ sub os {
sub os_ver {
my $juniper = shift;
my $descr = $juniper->description();
return unless defined $descr;
my $descr = $juniper->description() || '';
my $lldp_descr = $juniper->lldp_sysdesc() || '';
if ( $descr =~ m/kernel JUNOS (\S+)/ ) {
return $1;
}
elsif ( $lldp_descr =~ m/version\s(\S+)\s/ ) {
return $1;
}
return;
}
@@ -105,82 +129,392 @@ sub serial {
return $juniper->orig_serial();
}
sub i_vlan {
# 'i_trunk' => 'jnxExVlanPortAccessMode',
sub i_trunk {
my $juniper = shift;
my $partial = shift;
my $access = $juniper->jnxExVlanPortAccessMode($partial);
my %i_trunk;
foreach (keys %$access)
{
my $old_key = $_;
m/^\d+\.(\d+)$/o;
my $new_key = $1;
$i_trunk{$new_key} = $access->{$old_key};
}
return \%i_trunk;
}
# 'v_type' => 'jnxExVlanType',
sub v_type {
my $juniper = shift;
my $partial = shift;
my $v_type = $juniper->jnxExVlanType($partial);
return $v_type;
}
# 'v_index' => 'jnxExVlanTag',
sub v_index {
my ($juniper) = shift;
my ($partial) = shift;
my ($i_type) = $juniper->i_type($partial);
my ($i_descr) = $juniper->i_description($partial);
my %i_vlan;
my ($v_index) = $juniper->jnxExVlanTag($partial);
foreach my $idx ( keys %$i_descr ) {
if ( $i_type->{$idx} eq 'l2vlan' || $i_type->{$idx} eq 135 ) {
if ( $i_descr->{$idx} =~ /\.(\d+)$/ ) {
$i_vlan{$idx} = $1;
}
return $v_index;
}
sub i_vlan {
my $juniper = shift;
my $partial = shift;
my $index = $juniper->bp_index();
# If given a partial it will be an ifIndex, we need to use dot1dBasePort
if ($partial) {
my %r_index = reverse %$index;
$partial = $r_index{$partial};
}
my $v_index = $juniper->jnxExVlanTag();
my $i_pvid = $juniper->qb_i_vlan($partial) || {};
my $i_vlan = {};
foreach my $bport ( keys %$i_pvid ) {
my $q_vlan = $i_pvid->{$bport};
my $vlan = $v_index->{$q_vlan};
my $ifindex = $index->{$bport};
unless ( defined $ifindex ) {
print " Port $bport has no bp_index mapping. Skipping.\n"
if $DEBUG;
next;
}
$i_vlan->{$ifindex} = $vlan;
}
return $i_vlan;
}
sub i_vlan_membership {
my $juniper = shift;
my $partial = shift;
my $index = $juniper->bp_index();
my ($v_index) = $juniper->jnxExVlanTag($partial);
my $v_ports = $juniper->qb_v_egress() || {};
my $i_vlan_membership = {};
foreach my $idx ( sort keys %$v_ports ) {
next unless ( defined $v_ports->{$idx} );
my $portlist = $v_ports->{$idx}; # is an array reference
my $ret = [];
my $vlan_ndx = $idx;
# Convert portlist bit array to bp_index array
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
}
#Create HoA ifIndex -> VLAN array
foreach my $port ( @{$ret} ) {
my $ifindex = $index->{$port};
next unless ( defined($ifindex) ); # shouldn't happen
next if ( defined $partial and $ifindex !~ /^$partial$/ );
push ( @{ $i_vlan_membership->{$ifindex} }, $v_index->{$vlan_ndx} );
}
}
return \%i_vlan;
return $i_vlan_membership;
}
# Use Q-BRIDGE-MIB for bridge forwarding tables
sub fw_mac {
my $juniper = shift;
my $partial = shift;
# Pseudo ENTITY-MIB methods
return $juniper->qb_fw_mac($partial);
}
# This class supports both virtual chassis (stackable) and physical chassis
# based devices, identify if we have a virtual chassis so that we return
# appropriate entPhysicalClass and correct ordering
sub fw_port {
my $juniper = shift;
my $partial = shift;
return $juniper->qb_fw_port($partial);
}
# Use LLDP
sub hasCDP {
sub _e_is_virtual {
my $juniper = shift;
return $juniper->hasLLDP();
my $v_test = $juniper->jnxVirtualChassisMemberRole() || {};
#If we are functioning as a stack someone should be master
foreach my $iid ( keys %$v_test ) {
my $role = $v_test->{$iid};
return 1 if ($role =~ /master/i);
}
return 0;
}
sub c_ip {
my $juniper = shift;
my $partial = shift;
sub _e_virtual_index {
my $juniper = shift;
return $juniper->lldp_ip($partial);
my $containers = $juniper->jnxContainersWithin() || {};
my $members = $juniper->jnxVirtualChassisMemberRole() || {};
my %v_index;
foreach my $key (keys %$containers) {
foreach my $member ( keys %$members ) {
# Virtual chassis members start at zero
$member++;
# We will be duplicating and eliminating some keys,
# but this is for the benefit of e_parent()
my $index = sprintf ("%02d", $key) . sprintf ("%02d", $member) . "0000";
my $iid = "$key\.$member\.0\.0";
$v_index{$iid} = $index;
}
unless ($containers->{$key}) {
my $index = sprintf ("%02d", $key) . "000000";
$v_index{$key} = $index;
}
}
return \%v_index;
}
sub c_if {
my $juniper = shift;
my $partial = shift;
sub e_index {
my $juniper = shift;
return $juniper->lldp_if($partial);
my $contents = $juniper->jnxContentsDescr() || {};
my $containers = $juniper->jnxContainersDescr() || {};
my $virtuals = $juniper->_e_virtual_index() || {};
my $is_virtual = $juniper->_e_is_virtual();
# Format into consistent integer format so that numeric sorting works
my %e_index;
if ($is_virtual) {
foreach my $key ( keys %$virtuals ) {
$e_index{$key} = $virtuals->{$key};
}
}
else {
foreach my $key ( keys %$containers ) {
$e_index{$key} = sprintf ("%02d", $key) . "000000";
}
}
foreach my $key ( keys %$contents ) {
$e_index{$key} = join( '', map { sprintf "%02d", $_ } split /\./, $key );
}
return \%e_index;
}
sub c_port {
my $juniper = shift;
my $partial = shift;
sub e_class {
my $juniper = shift;
return $juniper->lldp_port($partial);
my $e_index = $juniper->e_index() || {};
my $fru_type = $juniper->jnxFruType() || {};
my $c_type = $juniper->jnxContainersDescr() || {};
my $is_virtual = $juniper->_e_is_virtual();
my %e_class;
foreach my $iid ( keys %$e_index ) {
my $type = $fru_type->{$iid} || 0;
my $container = $c_type->{$iid} || 0;
if ( $type =~ /power/i ) {
$e_class{$iid} = 'powerSupply';
}
elsif ( $type =~ /fan/i ) {
$e_class{$iid} = 'fan';
}
elsif ( $type ) {
$e_class{$iid} = 'module';
}
# Shouldn't get here if we have type which means
# we only have container, chassis, and stack left
elsif (($container =~ /chassis/i) and (!$is_virtual) ) {
$e_class{$iid} = 'chassis';
}
elsif (($container =~ /chassis/i) and ($is_virtual)) {
$e_class{$iid} = 'stack';
}
# Were calling the second level chassis a container in the case
# of a virtual chassis but not sure that it really matters
else {
$e_class{$iid} = 'container';
}
}
return \%e_class;
}
sub c_id {
my $juniper = shift;
my $partial = shift;
sub e_descr {
my $juniper = shift;
return $juniper->lldp_id($partial);
my $e_index = $juniper->e_index() || {};
my $box_descr = $juniper->box_descr;
my $contents = $juniper->jnxContentsDescr() || {};
my $containers = $juniper->jnxContainersDescr() || {};
my %e_descr;
foreach my $iid ( keys %$e_index ) {
my $content_descr = $contents->{$iid} || 0;
my $container_descr = $containers->{$iid} || 0;
if ($content_descr) {
$e_descr{$iid} = $content_descr;
}
elsif ($container_descr and $container_descr !~ /chassis/) {
$e_descr{$iid} = $container_descr;
}
elsif ($container_descr and $container_descr =~ /chassis/) {
$e_descr{$iid} = $box_descr;
}
# We should only be left with virtual entries created in
# _e_virtual_index()
elsif ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) {
my $descr = $containers->{$1};
$e_descr{$iid} = $descr;
}
# Anything past here undef
}
return \%e_descr;
}
sub c_platform {
my $juniper = shift;
my $partial = shift;
sub e_serial {
my $juniper = shift;
return $juniper->lldp_rem_sysdesc($partial);
my $e_index = $juniper->e_index() || {};
my $serials = $juniper->jnxContentsSerialNo() || {};
my $e_class = $juniper->e_class() || {};
my $is_virtual = $juniper->_e_is_virtual();
my $box_serial = $juniper->serial();
my %e_serial;
foreach my $iid ( keys %$e_index ) {
my $serial = $serials->{$iid} || '';
my $class = $e_class->{$iid} || '';
# Chassis serial number is seperate on true chassis
# Virtual chassis (stack) report master switch serial
if (!$is_virtual and ($class =~ /chassis/i)){
$e_serial{$iid} = $box_serial;
}
elsif (($serial !~ /^\w/) or ($serial =~ /builtin/i)) {
next;
}
else {
$e_serial{$iid} = $serial;
}
}
return \%e_serial;
}
sub e_fru {
my $juniper = shift;
my $e_index = $juniper->e_index() || {};
my $frus = $juniper->jnxContentsPartNo() || {};
my %e_fru;
foreach my $iid ( keys %$e_index ) {
my $fru = $frus->{$iid} || '';
if ( ($fru !~ /^\w/) or ($fru =~ /builtin/i)) {
$e_fru{$iid} = "false";
}
else {
$e_fru{$iid} = "true";
}
}
return \%e_fru;
}
sub e_type {
my $juniper = shift;
my $e_index = $juniper->e_index() || {};
my $contents = $juniper->e_contents_type() || {};
my $containers = $juniper->e_containers_type() || {};
my %e_type;
foreach my $iid ( keys %$e_index ) {
my $content_type = $contents->{$iid} || 0;
my $container_type = $containers->{$iid} || 0;
if ($content_type) {
$content_type =~ s/\.0//;
$e_type{$iid} = $content_type;
}
elsif ($container_type) {
$container_type =~ s/\.0//;
$e_type{$iid} = $container_type;
}
# We should only be left with virtual entries created in
# _e_virtual_index()
elsif ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) {
my $descr = $containers->{$1};
$descr =~ s/\.0//;
$e_type{$iid} = $descr;
}
# Anything past here undef
}
return \%e_type;
}
sub e_vendor {
my $juniper = shift;
my $e_idx = $juniper->e_index() || {};
my %e_vendor;
foreach my $iid ( keys %$e_idx ) {
$e_vendor{$iid} = 'juniper';
}
return \%e_vendor;
}
sub e_pos {
my $juniper = shift;
# We could look at index levels, but his will work as well
return $juniper->e_index();
}
sub e_parent {
my $juniper = shift;
my $e_idx = $juniper->e_index() || {};
my $c_within = $juniper->jnxContainersWithin() || {};
my $e_descr = $juniper->e_descr() || {};
my $is_virtual = $juniper->_e_is_virtual();
my %e_parent;
foreach my $iid ( keys %$e_idx ) {
next unless $iid;
my ($idx, $l1,$l2, $l3) = split /\./, $iid;
my $within = $c_within->{$idx};
my $descr = $e_descr->{$iid};
if ( !$is_virtual and ($iid =~ /^(\d+)\.\d+/) ) {
$e_parent{$iid} = sprintf ("%02d", $1) . "000000";
}
elsif ( $is_virtual and ($descr =~ /chassis/i) and ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) ) {
$e_parent{$iid} = sprintf ("%02d", $1) . "000000";
}
elsif ( $is_virtual and ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) ) {
$e_parent{$iid} = sprintf ("%02d", $within) . sprintf ("%02d", $2) . "0000";
}
elsif ( $is_virtual and ($iid =~ /^(\d+)\.(\d+)\.[1-9]+/) ) {
$e_parent{$iid} = sprintf ("%02d", $1) . sprintf ("%02d", $2) . "0000";
}
elsif ( defined $within and $iid =~ /\d+/ ) {
$e_parent{$iid} = sprintf ("%02d", $within) . "000000";
}
else {
next;
}
}
return \%e_parent;
}
1;
__END__
@@ -210,7 +544,7 @@ Bill Fenner
=head1 DESCRIPTION
Subclass for Generic Juniper Routers running JUNOS
Subclass for Juniper Devices running JUNOS
=head2 Inherited Classes
@@ -226,14 +560,22 @@ Subclass for Generic Juniper Routers running JUNOS
=over
=item Inherited Classes' MIBs
=item F<JUNIPER-VLAN-MIB> dated "200901090000Z" or later.
=item F<JUNIPER-CHASSIS-DEFINES-MIB>
=item F<JUNIPER-MIB>
=item F<JUNIPER-VIRTUALCHASSIS-MIB>
=back
=head2 Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -242,19 +584,20 @@ These are methods that return scalar value from SNMP
=item $juniper->vendor()
Returns C<'juniper'>
Returns 'juniper'
=item $juniper->os()
Returns C<'junos'>
Returns 'junos'
=item $juniper->os_ver()
Returns the software version extracted from C<sysDescr>.
Returns the software version extracted first from C<sysDescr> or
C<lldpLocSysDesc> if not available in C<sysDescr>.
=item $juniper->model()
Returns the model from C<sysObjectID>, with C<jnxProductNameremoved> from the
Returns the model from C<sysObjectID>, with C<jnxProductName> removed from the
beginning.
=item $juniper->serial()
@@ -263,9 +606,18 @@ Returns serial number
(C<jnxBoxSerialNo.0>)
=item $juniper->hasCDP()
=item $juniper->mac()
Returns whether LLDP is enabled.
Returns the MAC address used by this bridge when it must be referred
to in a unique fashion.
(C<dot1dBaseBridgeAddress>)
=item $juniper->box_descr()
The name, model, or detailed description of the device.
(C<jnxBoxDescr.0>)
=back
@@ -284,51 +636,89 @@ to a hash.
=over
=item $juniper->v_index()
(C<jnxExVlanTag>)
=item $juniper->v_name()
(C<jnxExVlanName>)
=item $juniper->v_type()
(C<jnxExVlanType>)
=item $juniper->i_trunk()
(C<jnxExVlanPortAccessMode>)
=item $juniper->i_vlan()
Returns the list of interfaces whose C<ifType> is l2vlan(135), and
the VLAN ID extracted from the interface description.
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=item $juniper->c_id()
=item $juniper->i_vlan_membership()
Returns LLDP information.
=item $juniper->c_if()
Returns LLDP information.
=item $juniper->c_ip()
Returns LLDP information.
=item $juniper->c_platform()
Returns LLDP information.
=item $juniper->c_port()
Returns LLDP information.
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
IDs. These are the VLANs which are members of the egress list for the port.
=back
=head2 Forwarding Table (C<dot1dTpFdbEntry>)
=head2 Pseudo F<ENTITY-MIB> information
=over
These methods emulate F<ENTITY-MIB> Physical Table methods using
F<JUNIPER-MIB> and F<JUNIPER-VIRTUALCHASSIS-MIB>.
=item $juniper->fw_mac()
=over
Returns reference to hash of forwarding table MAC Addresses
=item $juniper->e_index()
(C<dot1dTpFdbAddress>)
Returns reference to hash. Key: IID, Value: Integer, Indices are combined
into a eight digit integer, each index is two digits padded with leading zero
if required.
=item $juniper->fw_port()
=item $juniper->e_class()
Returns reference to hash of forwarding table entries port interface
identifier (iid)
Returns reference to hash. Key: IID, Value: General hardware type.
(C<dot1dTpFdbPort>)
=item $juniper->e_descr()
=back
Returns reference to hash. Key: IID, Value: Human friendly name
=item $juniper->e_hwver()
Returns reference to hash. Key: IID, Value: Hardware version
=item $juniper->e_vendor()
Returns reference to hash. Key: IID, Value: juniper
=item $juniper->e_serial()
Returns reference to hash. Key: IID, Value: Serial number
=item $juniper->e_pos()
Returns reference to hash. Key: IID, Value: The relative position among all
entities sharing the same parent.
=item $juniper->e_type()
Returns reference to hash. Key: IID, Value: Type of component/sub-component
as defined in F<JUNIPER-CHASSIS-DEFINES-MIB>.
=item $juniper->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?
(C<entPhysicalFRU>)
=back
=head2 Table Methods imported from SNMP::Info::Layer3

271
Info/Layer3/Lantronix.pm Normal file
View File

@@ -0,0 +1,271 @@
# SNMP::Info::Layer3::Lantronix
# $Id$
#
# Copyright (c) 2012 J R Binks
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::Lantronix;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Lantronix::ISA = qw/
SNMP::Info::Layer3
Exporter
/;
@SNMP::Info::Layer3::Lantronix::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'LANTRONIX-MIB' => 'products',
'LANTRONIX-SLC-MIB' => 'slcNetwork',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
'slc_os_ver' => 'slcSystemFWRev',
'slc_serial' => 'slcSystemSerialNo',
'slc_model' => 'slcSystemModel',
'slc_psu_a_status' => 'slcDevPowerSupplyA',
'slc_psu_b_status' => 'slcDevPowerSupplyB',
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
# General notes:
#
# Products like the EDS have very minimal MIB support for the basics.
# Much information has to be derived from sysDescr string.
#
sub vendor {
return 'lantronix';
}
sub os {
my $device = shift;
my $descr = $device->description() || '';
my $os;
# On EDS, it is called the "Evolution OS"
# Not sure what, if any, name it has a name on other products
$os = 'EvolutionOS' if ( $descr =~ m/Lantronix EDS\w+ V([\d\.R]+)/ );
return 'LantronixOS';
}
sub os_ver {
my $device = shift;
my $descr = $device->description() || '';
my $slc_os_ver = $device->slc_os_ver;
my $os_ver;
return $slc_os_ver if defined $slc_os_ver;
return unless defined $descr;
# EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
$os_ver = $1 if ( $descr =~ m/Lantronix EDS\w+ V([\d\.R]+)/ );
return $os_ver;
}
sub serial {
my $device = shift;
my $descr = $device->description() || '';
my $slc_serial = $device->slc_serial;
my $serial;
return $slc_serial if defined $slc_serial;
return unless defined $descr;
# EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
$serial = $1 if ( $descr =~ m/Lantronix EDS\w+ V[\d\.R]+ \((\w+)\)/ );
return $serial;
}
sub model {
my $device = shift;
my $descr = $device->description() || '';
my $slc_model = $device->slc_model;
my $model;
return $slc_model if defined $slc_model;
return unless defined $descr;
# EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
$model = $1 if ( $descr =~ m/Lantronix (EDS\w+)/ );
return $model;
}
sub ps1_status {
my $device = shift;
my $slc_psu_a_status = $device->slc_psu_a_status;
return $slc_psu_a_status if defined $slc_psu_a_status;
return;
}
sub ps2_status {
my $device = shift;
my $slc_psu_b_status = $device->slc_psu_b_status;
return $slc_psu_b_status if defined $slc_psu_b_status;
return;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Lantronix - SNMP Interface to Lantronix devices such as terminal servers
=head1 AUTHOR
J R Binks
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $device = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'mydevice',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $device->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Lantronix devices such as terminal servers.
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<LANTRONIX-MIB>
=item F<LANTRONIX-SLC-MIB>
=back
=head2 Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP.
=over
=item $device->vendor()
Returns 'lantronix'.
=item $device->os()
Returns 'EvolutionOS' for EDS devices.
=item $device->os_ver()
Returns the software version.
=item $device->model()
Returns the model.
=item $device->serial()
Returns the serial number.
=item $device->ps1_status()
Power supply 1 status
=item $device->ps2_status()
Power supply 2 status
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE ENTRIES
These are methods that return tables of information in the form of a reference
to a hash.
=over
=back
=head2 Overrides
=over
=item $device->i_ignore()
Returns reference to hash. Increments value of IID if port is to be ignored.
=back
=head2 Lantronix specific items
None at present.
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

View File

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

175
Info/Layer3/Mikrotik.pm Normal file
View File

@@ -0,0 +1,175 @@
# SNMP::Info::Layer3::Mikrotik
# $Id$
#
# Copyright (c) 2011 Jeroen van Ingen
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::Mikrotik;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Mikrotik::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Mikrotik::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'HOST-RESOURCES-MIB' => 'hrSystem',
'MIKROTIK-MIB' => 'mtxrLicVersion',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
'hrSystemUptime' => 'hrSystemUptime',
'os_ver' => 'mtxrLicVersion',
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'mikrotik';
}
sub model {
my $mikrotik = shift;
my $descr = $mikrotik->description() || '';
my $model = undef;
$model = $1 if ( $descr =~ /^RouterOS\s+(\S+)$/i );
return $model;
}
sub os {
return 'routeros';
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Mikrotik - SNMP Interface to Mikrotik devices
=head1 AUTHORS
Jeroen van Ingen
initial version based on SNMP::Info::Layer3::NetSNMP by Bradley Baetz and Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $mikrotik = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $mikrotik->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Mikrotik devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<HOST-RESOURCES-MIB>
=item F<MIKROTIK-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $mikrotik->vendor()
Returns C<'mikrotik'>.
=item $mikrotik->os()
Returns C<'routeros'>.
=item $mikrotik->model()
Tries to extract the device model from C<sysDescr>.
=item $mikrotik->os_ver()
Returns the value of C<mtxrLicVersion>.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=head1 TABLE ENTRIES
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
None.
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=cut

View File

@@ -41,7 +41,7 @@ use SNMP::Info::SONMP;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -93,7 +93,7 @@ sub model {
}
sub vendor {
return 'nortel';
return 'avaya';
}
sub os {
@@ -174,7 +174,8 @@ __END__
=head1 NAME
SNMP::Info::Layer3::N1600 - SNMP Interface to Nortel 16XX Network Devices
SNMP::Info::Layer3::N1600 - SNMP Interface to Avaya/Nortel 16XX Network
Devices
=head1 AUTHOR
@@ -198,8 +199,8 @@ Eric Miller
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a Nortel
N16XX device through SNMP.
Provides abstraction to the configuration information obtainable from an
Avaya/Nortel N16XX device 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.
@@ -247,7 +248,7 @@ F<RAPID-CITY-MIB> and then parses out C<rcA>.
=item $n1600->vendor()
Returns 'nortel'
Returns 'avaya'
=item $n1600->os()

View File

@@ -33,16 +33,18 @@ package SNMP::Info::Layer3::NetSNMP;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::NetSNMP::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::NetSNMP::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::NetSNMP::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::LLDP::MIBS,
'UCD-SNMP-MIB' => 'versionTag',
'NET-SNMP-TC' => 'netSnmpAgentOIDs',
'HOST-RESOURCES-MIB' => 'hrSystem',
@@ -50,13 +52,20 @@ $VERSION = '2.04';
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
'netsnmp_vers' => 'versionTag',
'hrSystemUptime' => 'hrSystemUptime',
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::FUNCS,
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::LLDP::MUNGE,
);
sub vendor {
return 'Net-SNMP';
@@ -173,6 +182,8 @@ Subclass for Generic Net-SNMP devices
See L<SNMP::Info::Layer3> for its own MIB requirements.
See L<SNMP::Info::LLDP> for its own MIB requirements.
=back
=head1 GLOBALS
@@ -210,6 +221,10 @@ Returns ''.
See documentation in L<SNMP::Info::Layer3> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP> for details.
=head1 TABLE ENTRIES
These are methods that return tables of information in the form of a reference
@@ -231,6 +246,10 @@ Ignores loopback
See documentation in L<SNMP::Info::Layer3> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP> for details.
=head1 NOTES
In order to cause SNMP::Info to classify your device into this class, it

View File

@@ -1,7 +1,6 @@
# SNMP::Info::Layer3::Netscreen
# $Id$
#
# Copyright (c) 2008 Eric Miller
# Copyright (c) 2012 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -33,34 +32,62 @@ package SNMP::Info::Layer3::Netscreen;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::IEEE802dot11;
@SNMP::Info::Layer3::Netscreen::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Netscreen::ISA
= qw/SNMP::Info::Layer3 SNMP::Info::IEEE802dot11 Exporter/;
@SNMP::Info::Layer3::Netscreen::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::IEEE802dot11::MIBS,
'NETSCREEN-SMI' => 'netscreenSetting',
'NETSCREEN-PRODUCTS-MIB' => 'netscreenGeneric',
'NETSCREEN-INTERFACE-MIB' => 'nsIfIndex',
'NETSCREEN-SET-GEN-MIB' => 'nsSetGenSwVer',
'NETSCREEN-IP-ARP-MIB' => 'nsIpArpAOD',
);
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, 'os_version' => 'nsSetGenSwVer', );
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::IEEE802dot11::GLOBALS,
'os_version' => 'nsSetGenSwVer',
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::IEEE802dot11::FUNCS,
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
ns_i_index => 'nsIfIndex',
ns_i_name => 'nsIfName',
ns_i_description => 'nsIfDescr',
ns_i_mac => 'nsIfMAC',
ns_i_up => 'nsIfStatus',
ns_ip_table => 'nsIfIp',
ns_ip_netmask => 'nsIfNetmask',
bp_index => 'nsIfInfo',
std_at_paddr => 'ipNetToMediaPhysAddress',
ns_at_paddr => 'nsIpArpMac',
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::IEEE802dot11::MUNGE,
'ns_i_mac' => \&SNMP::Info::munge_mac,
'ns_at_paddr' => \&SNMP::Info::munge_mac,
'std_at_paddr' => \&SNMP::Info::munge_mac,
);
sub layers {
return '01001100';
return '01001110';
}
sub vendor {
return 'netscreen';
return 'juniper';
}
sub os {
@@ -92,6 +119,392 @@ sub serial {
return;
}
sub model {
my $netscreen = shift;
my $id = $netscreen->id();
unless ( defined $id ) {
print
" SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
if $netscreen->debug();
return;
}
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^netscreen//i;
return $model;
}
# provides mapping from IF-MIB to nsIf interfaces - many to 1 (!)
# - on WLAN devices wireless0/0(|-[ag]) -> wireless0/0 !!
sub _if_nsif_map {
my $netscreen = shift;
my $i_descr = $netscreen->SUPER::i_description;
my $ns_descr = $netscreen->i_description;
my %if_nsif_map = ();
my @ikeys = sort { $a <=> $b } keys %$i_descr;
my @nskeys = sort { $a <=> $b } keys %$ns_descr;
my $i = 0;
my $n = 0;
# assumes descriptions are in the same order from both walks
while ( $i < @ikeys && $n < @nskeys ) {
# find matching sub interfaces
while (
$i < @ikeys
&& substr(
$i_descr->{ $ikeys[$i] },
0,
length $ns_descr->{ $nskeys[$n] }
) eq $ns_descr->{ $nskeys[$n] }
)
{
$if_nsif_map{ $ikeys[$i] } = $nskeys[$n];
$i++;
}
$n++;
# skip non-matching interfaces (e.g. tunnel.N)
while (
$i < @ikeys
&& substr(
$i_descr->{ $ikeys[$i] },
0,
length $ns_descr->{ $nskeys[$n] }
) ne $ns_descr->{ $nskeys[$n] }
&& $n < @nskeys
)
{
$if_nsif_map{ $ikeys[$i] } = 0; # no matching interface
$i++;
}
}
return \%if_nsif_map;
}
# Provides mapping from nsIf interfaces to IF-MIB interfaces - many to 1
# Example, tunnel.# interfaces are not present in IF-MIB. There exist no
# mapping of index IID's between the tables so create mapping based on names
sub _nsif_if_map {
my $netscreen = shift;
my $i_descr = $netscreen->SUPER::i_description;
my $ns_descr = $netscreen->i_description;
my %rev_i_descr = reverse %$i_descr;
my %rev_ns_descr = reverse %$ns_descr;
my %nsif_if_map = ();
foreach my $value ( values %$ns_descr ) {
if ( exists $rev_i_descr{$value} ) {
$nsif_if_map{ $rev_ns_descr{$value} } = $rev_i_descr{$value};
}
else {
$nsif_if_map{ $rev_ns_descr{$value} } = 0;
}
}
return \%nsif_if_map;
}
sub interfaces {
my $netscreen = shift;
return $netscreen->i_description();
}
sub i_index {
my $netscreen = shift;
return $netscreen->ns_i_index();
}
sub i_name {
my $netscreen = shift;
return $netscreen->ns_i_name();
}
sub i_description {
my $netscreen = shift;
# Versions prior to 5.4 do not support nsIfDescr but do have nsIfName
return $netscreen->ns_i_description() || $netscreen->ns_i_name();
}
sub i_mac {
my $netscreen = shift;
my $ns_mac = $netscreen->ns_i_mac() || {};
my $if_i_mac = $netscreen->SUPER::i_mac() || {};
my $ns_i_map = $netscreen->_nsif_if_map();
my %i_mac = ();
foreach my $iid ( keys %$ns_i_map ) {
$i_mac{$iid} = $ns_mac->{$iid} || $if_i_mac->{ $ns_i_map->{$iid} };
}
return \%i_mac;
}
sub i_lastchange {
my $netscreen = shift;
my $if_i_lastchange = $netscreen->SUPER::i_lastchange() || {};
my $ns_i_map = $netscreen->_nsif_if_map();
my %i_lastchange;
foreach my $iid ( keys %$ns_i_map ) {
$i_lastchange{$iid} = $if_i_lastchange->{ $ns_i_map->{$iid} };
}
return \%i_lastchange;
}
sub i_up {
my $netscreen = shift;
return $netscreen->ns_i_up();
}
sub i_up_admin {
my $netscreen = shift;
my $i_up = $netscreen->i_up();
my $i_up_admin = $netscreen->SUPER::i_up_admin();
my $ns_i_map = $netscreen->_nsif_if_map();
my %i_up_admin;
foreach my $iid ( keys %$ns_i_map ) {
$i_up_admin{$iid}
= $i_up->{$iid} eq "up" && "up"
|| $i_up_admin->{ $ns_i_map->{$iid} }
|| 0;
}
return \%i_up_admin;
}
sub i_type {
my $netscreen = shift;
my $if_i_type = $netscreen->SUPER::i_type() || {};
my $ns_i_map = $netscreen->_nsif_if_map();
my %i_type;
foreach my $iid ( keys %$ns_i_map ) {
$i_type{$iid} = $if_i_type->{ $ns_i_map->{$iid} } || "tunnel";
}
return \%i_type;
}
sub i_mtu {
my $netscreen = shift;
my $i_type = $netscreen->SUPER::i_mtu() || {};
my $ns_i_map = $netscreen->_nsif_if_map();
my %i_mtu;
foreach my $iid ( keys %$ns_i_map ) {
$i_mtu{$iid} = $i_type->{ $ns_i_map->{$iid} };
}
return \%i_mtu;
}
sub i_ignore {
return;
}
sub i_speed {
my $netscreen = shift;
my $i_speed = $netscreen->SUPER::i_speed();
my $i_name = $netscreen->i_name();
my $ns_i_map = $netscreen->_nsif_if_map;
my %i_speed;
foreach my $iid ( keys %$ns_i_map ) {
$i_speed{$iid}
= $i_speed->{ $ns_i_map->{$iid} }
|| $i_name->{$iid} =~ /tunnel/ && "vpn"
|| 0;
}
return \%i_speed;
}
sub _mac_map {
my $netscreen = shift;
my $arp_mac = $netscreen->nsIpArpMac() || {};
my %mac_map = ();
foreach my $iid ( keys %$arp_mac ) {
my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
$mac_map{$oid} = $iid;
}
return \%mac_map;
}
# Interfaces can have two addresses, we want to capture both the network
# address and the management address
sub ip_index {
my $netscreen = shift;
my $ns_ip = $netscreen->ns_ip_table() || {};
my $if_mng_ip = $netscreen->nsIfMngIp() || {};
my %ip_index = ();
foreach my $iid ( keys %$ns_ip ) {
$ip_index{ $ns_ip->{$iid} } = $iid if $ns_ip->{$iid} ne "0.0.0.0";
}
foreach my $iid ( keys %$if_mng_ip ) {
$ip_index{ $if_mng_ip->{$iid} } = $iid
if $if_mng_ip->{$iid} ne "0.0.0.0";
}
return \%ip_index;
}
sub ip_table {
my $netscreen = shift;
my $ip_index = $netscreen->ip_index() || {};
my $if_mng_ip = $netscreen->nsIfMngIp() || {};
my %ip_table = ();
foreach my $iid ( keys %$ip_index ) {
my $mgmt_ip = $if_mng_ip->{$iid};
if ( defined $mgmt_ip && $mgmt_ip ne '0.0.0.0' ) {
$ip_table{$iid} = $mgmt_ip;
}
else {
$ip_table{$iid} = $iid;
}
}
return \%ip_table;
}
# There is only one netmask for the interface both network and management
# addresses should have the same netmask
sub ip_netmask {
my $netscreen = shift;
my $ip_index = $netscreen->ip_index() || {};
my $ns_netmask = $netscreen->ns_ip_netmask();
my %ip_netmask = ();
foreach my $iid ( keys %$ip_index ) {
$ip_netmask{$iid} = $ns_netmask->{ $ip_index->{$iid} };
}
return \%ip_netmask;
}
sub fw_index {
my $netscreen = shift;
my %fw_index = ();
my $arp_mac = $netscreen->nsIpArpMac() || {};
foreach my $iid ( keys %$arp_mac ) {
my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
$fw_index{$iid} = $oid;
}
return \%fw_index;
}
sub fw_mac {
my $netscreen = shift;
my $mac_map = $netscreen->_mac_map() || {};
my %fw_mac = ();
foreach my $oid ( keys %$mac_map ) {
my $mac
= join( ":", ( map { sprintf "%lx", $_ } split( /\./, $oid ) ) );
$fw_mac{$oid} = $mac;
}
return \%fw_mac;
}
sub bp_index {
my $netscreen = shift;
my $if_info = $netscreen->nsIfInfo() || {};
my %bp_index = ();
foreach my $iid ( keys %$if_info ) {
$bp_index{ $if_info->{$iid} } = $iid;
}
return \%bp_index;
}
sub fw_port {
my $netscreen = shift;
my $fw_index = $netscreen->fw_index();
my $arp_if = $netscreen->nsIpArpIfIdx() || {};
my %fw_port;
foreach my $iid ( keys %$arp_if ) {
$fw_port{ $fw_index->{$iid} } = $arp_if->{$iid}
if defined $fw_index->{$iid};
}
return \%fw_port;
}
# need to remap from IF-MIB index to nsIf index
sub i_ssidlist {
my $netscreen = shift;
my $i_ssidlist = $netscreen->SUPER::i_ssidlist() || {};
my $ns_i_map = $netscreen->_if_nsif_map();
my %i_ssidlist;
foreach my $iid ( keys %$i_ssidlist ) {
$i_ssidlist{ $ns_i_map->{$iid} } = $i_ssidlist->{$iid};
}
return \%i_ssidlist;
}
sub i_80211channel {
my $netscreen = shift;
my $i_80211channel = $netscreen->SUPER::i_80211channel() || {};
my $ns_i_map = $netscreen->_if_nsif_map();
my %i_80211channel;
foreach my $iid ( keys %$i_80211channel ) {
$i_80211channel{ $ns_i_map->{$iid} } = $i_80211channel->{$iid};
}
return \%i_80211channel;
}
sub at_index {
my $netscreen = shift;
my $std = $netscreen->ipNetToMediaIfIndex();
return $std if (ref {} eq ref $std and scalar keys %$std);
return $netscreen->nsIpArpIfIdx();
}
sub at_paddr {
my $netscreen = shift;
my $std = $netscreen->std_at_paddr();
return $std if (ref {} eq ref $std and scalar keys %$std);
return $netscreen->ns_at_paddr();
}
sub at_netaddr {
my $netscreen = shift;
my $std = $netscreen->ipNetToMediaNetAddress();
return $std if (ref {} eq ref $std and scalar keys %$std);
return $netscreen->nsIpArpIp();
}
1;
__END__
@@ -124,8 +537,10 @@ Kent Hamilton
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Netscreen device through SNMP. See inherited classes' documentation for
inherited methods.
Juniper Netscreen devices 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 $netscreen = new SNMP::Info::Layer3::Netscreen(...);
@@ -135,6 +550,8 @@ my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
=item SNMP::Info::Layer3
=item SNMP::Info::IEEE802dot11
=back
=head2 Required MIBs
@@ -149,9 +566,13 @@ my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
=item F<NETSCREEN-SET-GEN-MIB>
=item Inherited Classes
=item F<NETSCREEN-IP-ARP-MIB>
See L<SNMP::Info::Layer3/"Required MIBs"> and its inherited classes.
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
=back
@@ -161,9 +582,13 @@ These are methods that return scalar value from SNMP
=over
=item $netscreen->model()
Tries to reference $netscreen->id() to F<NETSCREEN-PRODUCTS-MIB>
=item $netscreen->vendor()
Returns 'netscreen'
Returns C<'juniper'>
=item $netscreen->os()
@@ -175,7 +600,7 @@ Extracts the OS version from the description string.
=item $netscreen->serial()
Returns serial number..
Returns serial number.
=back
@@ -185,8 +610,8 @@ Returns serial number..
=item $netscreen->layers()
Returns 01001100. Device doesn't report layers properly, modified to reflect
Layer3 functionality.
Returns 01001110. Device doesn't report layers properly, modified to reflect
Layer 2 and 3 functionality.
=back
@@ -194,14 +619,193 @@ Layer3 functionality.
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Globals 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 Overrides
=head3 Interface Information
=over
=item $netscreen->interfaces()
Creates a map between the interface identifier (iid) and the physical port
name.
Defaults to C<insIfDescr> if available, uses C<nsIfName> if not.
=item $netscreen->i_description()
Description of the interface. Uses C<insIfDescr> if available, C<nsIfName>
if not.
=item $netscreen->i_ignore()
Returns without defining any interfaces to ignore.
=item $netscreen->i_index()
Default SNMP IID to Interface index.
(C<nsIfIndex>)
=item $netscreen->i_lastchange()
The value of C<sysUpTime> when this port last changed states (up,down),
maps from C<ifIndex> to C<nsIfIndex>.
(C<ifLastChange>)
=item $netscreen->i_mac()
MAC address of the interface. Note this is just the MAC of the port, not
anything connected to it. Uses C<nsIfMAC> if available, C<ifPhysAddress>
if not.
=item $netscreen->i_mtu()
INTEGER. Interface MTU value, maps from C<ifIndex> to C<nsIfIndex>.
(C<ifMtu>)
=item $netscreen->i_name()
Interface Name field.
(C<nsIfName>)
=item $netscreen->i_speed()
Speed of the link, maps from C<ifIndex> to C<nsIfIndex>.
=item $netscreen->i_type()
Interface type. Maps from C<ifIndex> to C<nsIfIndex>.
(C<ifType>)
=item $netscreen->i_up()
Link Status of the interface. Typical values are 'up' and 'down'.
(C<nsIfStatus>)
=item $netscreen->i_up_admin()
Administrative status of the port. Checks both C<ifAdminStatus> and
C<nsIfStatus>.
=back
=head3 IP Address Table
Each entry in this table is an IP address in use on this device.
=over
=item $netscreen->ip_index()
Maps the IP Table to the IID
=item $netscreen->ip_table()
Maps the Table to the IP address
(C<nsIfIp>)
=item $netscreen->ip_netmask()
Gives netmask setting for IP table entry.
(C<nsIfNetmask>)
=back
=head3 Forwarding Table
Uses C<nsIpArpTable> to emulate the forwarding table.
=over
=item $netscreen->fw_index()
Maps the Forwarding Table to the IID
=item $netscreen->fw_mac()
Returns reference to hash of forwarding table MAC Addresses.
=item $netscreen->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (IID).
=item $netscreen->bp_index()
Returns reference to hash of bridge port table entries map back to interface
identifier (IID).
=back
=head2 Arp Cache Table
=over
=item $netscreen->at_index()
Returns reference to hash. Maps ARP table entries to Interface IIDs
If the device doesn't support C<ipNetToMediaIfIndex>, this will try
the proprietary C<nsIpArpIfIdx>.
=item $netscreen->at_paddr()
Returns reference to hash. Maps ARP table entries to MAC addresses.
If the device doesn't support C<ipNetToMediaPhysAddress>, this will try
the proprietary C<nsIpArpMac>.
=item $netscreen->at_netaddr()
Returns reference to hash. Maps ARP table entries to IP addresses.
If the device doesn't support C<ipNetToMediaNetAddress>, this will try
the proprietary C<nsIpArpIp>.
=back
=head3 Wireless Information
=over
=item $dot11->i_ssidlist()
Returns reference to hash. SSID's recognized by the radio interface.
Remaps from C<ifIndex> to C<nsIfIndex>.
(C<dot11DesiredSSID>)
=item $dot11->i_80211channel()
Returns reference to hash. Current operating frequency channel of the radio
interface. Remaps from C<ifIndex> to C<nsIfIndex>.
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
=cut

494
Info/Layer3/Nexus.pm Normal file
View File

@@ -0,0 +1,494 @@
# SNMP::Info::Layer3::Nexus
#
# Copyright (c) 2012 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::Nexus;
use strict;
use Exporter;
use SNMP::Info::LLDP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoImage;
use SNMP::Info::CiscoPortSecurity;
use SNMP::Info::CiscoConfig;
use SNMP::Info::CiscoPower;
use SNMP::Info::Layer3;
use SNMP::Info::CiscoStpExtensions;
use SNMP::Info::CiscoVTP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
# NOTE : Top-most items gets precedence for @ISA
@SNMP::Info::Layer3::Nexus::ISA = qw/
SNMP::Info::CiscoVTP
SNMP::Info::CiscoStpExtensions
SNMP::Info::LLDP
SNMP::Info::CDP
SNMP::Info::CiscoImage
SNMP::Info::CiscoPortSecurity
SNMP::Info::CiscoConfig
SNMP::Info::CiscoPower
SNMP::Info::Layer3
Exporter
/;
@SNMP::Info::Layer3::Nexus::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.12';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
# Bridge is called from Layer3 and CiscoStpExtensions
# So we want CiscoVTP to come last to get the right one.
# The @ISA order should be reverse of these orders.
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::CiscoPower::MIBS,
%SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CiscoPortSecurity::MIBS,
%SNMP::Info::CiscoImage::MIBS,
%SNMP::Info::CDP::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::CiscoStpExtensions::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevMIBObjects',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::CiscoPower::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoPortSecurity::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::CiscoStpExtensions::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
'mac' => 'dot1dBaseBridgeAddress',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoPower::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoPortSecurity::FUNCS,
%SNMP::Info::CiscoImage::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::LLDP::FUNCS,
%SNMP::Info::CiscoStpExtensions::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::CiscoPower::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CiscoPortSecurity::MUNGE,
%SNMP::Info::CiscoImage::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::LLDP::MUNGE,
%SNMP::Info::CiscoStpExtensions::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
);
sub cisco_comm_indexing { return 1; }
sub vendor {
return 'cisco';
}
sub os {
return 'nx-os';
}
sub os_ver {
my $nexus = shift;
my $descr = $nexus->description();
return $1 if ( $descr =~ /\),\s+Version\s+(.+?),/ );
return $descr;
}
sub serial {
my $nexus = shift;
my $e_parent = $nexus->e_parent();
foreach my $iid ( keys %$e_parent ) {
my $parent = $e_parent->{$iid};
if ($parent eq '0') {
my $serial = $nexus->e_serial($iid);
return $serial->{$iid};
}
}
return;
}
# sysObjectID returns an IID to an entry in the CISCO-ENTITY-VENDORTYPE-OID-MIB.
# Look it up and return it.
sub model {
my $nexus = shift;
my $id = $nexus->id();
unless ( defined $id ) {
print
" SNMP::Info::Layer3::Nexus::model() - Device does not support sysObjectID\n"
if $nexus->debug();
return;
}
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^cevChassis//i;
return $model;
}
# Reported version 6.x of NX-OS doesn't use the IPv4 address as index
# override methods in ipAddrTable
sub ip_table {
my $nexus = shift;
my $orig_ip_table = $nexus->orig_ip_table();
my %ip_table;
foreach my $iid ( keys %$orig_ip_table ) {
my $ip = $orig_ip_table->{$iid};
next unless defined $ip;
$ip_table{$ip} = $ip;
}
return \%ip_table;
}
sub ip_index {
my $nexus = shift;
my $orig_ip_table = $nexus->orig_ip_table();
my $orig_ip_index = $nexus->orig_ip_index();
my %ip_index;
foreach my $iid ( keys %$orig_ip_table ) {
my $ip = $orig_ip_table->{$iid};
my $index = $orig_ip_index->{$iid};
next unless ( defined $ip && defined $index );
$ip_index{$ip} = $index;
}
return \%ip_index;
}
sub ip_netmask {
my $nexus = shift;
my $orig_ip_table = $nexus->orig_ip_table();
my $orig_ip_netmask = $nexus->orig_ip_netmask();
my %ip_netmask;
foreach my $iid ( keys %$orig_ip_table ) {
my $ip = $orig_ip_table->{$iid};
my $netmask = $orig_ip_netmask->{$iid};
next unless ( defined $ip && defined $netmask );
$ip_netmask{$ip} = $netmask;
}
return \%ip_netmask;
}
sub ip_broadcast {
my $nexus = shift;
my $orig_ip_table = $nexus->orig_ip_table();
my $orig_ip_broadcast = $nexus->orig_ip_broadcast();
my %ip_broadcast;
foreach my $iid ( keys %$orig_ip_table ) {
my $ip = $orig_ip_table->{$iid};
my $broadcast = $orig_ip_broadcast->{$iid};
next unless ( defined $ip && defined $broadcast );
$ip_broadcast{$ip} = $broadcast;
}
return \%ip_broadcast;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Nexus - SNMP Interface to Cisco Nexus Switches running
NX-OS
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $nexus = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $nexus->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for Cisco Nexus Switches running NX-OS.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $nexus = new SNMP::Info::Layer3::Nexus(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CDP
=item SNMP::Info::CiscoImage
=item SNMP::Info::CiscoPortSecurity
=item SNMP::Info::CiscoConfig
=item SNMP::Info::CiscoPower
=item SNMP::Info::CiscoStpExtensions
=item SNMP::Info::LLDP
=back
=head2 Required MIBs
=over
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
=back
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
requirements.
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return a scalar value from SNMP
=over
=item $nexus->vendor()
Returns 'cisco'
=item $nexus->os()
Returns C<'nx-os'>
=item $nexus->os_ver()
Returns operating system version extracted from C<sysDescr>.
=item $nexus->serial()
Returns the serial number of the chassis from F<ENTITY-MIB>.
=item $nexus->model()
Tries to reference $nexus->id() to F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
Removes C<'cevChassis'> for readability.
=item $nexus->mac()
C<dot1dBaseBridgeAddress>
=item $nexus->cisco_comm_indexing()
Returns 1. Use vlan indexing.
=back
=head2 Overrides
=head3 IP Address Table
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.
=over
=item $nexus->ip_index()
Maps the IP Table to the IID
(C<ipAdEntIfIndex>)
=item $nexus->ip_table()
Maps the Table to the IP address
(C<ipAdEntAddr>)
=item $nexus->ip_netmask()
Gives netmask setting for IP table entry.
(C<ipAdEntNetMask>)
=item $nexus->ip_broadcast()
Gives broadcast address for IP table entry.
(C<ipAdEntBcastAddr>)
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CDP
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoImage
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoPower
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"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::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoVTP
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStats
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoImage
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
details.
=head2 Table Methods imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoPower
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

220
Info/Layer3/PacketFront.pm Normal file
View File

@@ -0,0 +1,220 @@
# SNMP::Info::Layer3::PacketFront
# $Id$
#
# Copyright (c) 2011 Jeroen van Ingen
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::PacketFront;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::PacketFront::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::PacketFront::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'UCD-SNMP-MIB' => 'versionTag',
'NET-SNMP-TC' => 'netSnmpAgentOIDs',
'HOST-RESOURCES-MIB' => 'hrSystem',
'PACKETFRONT-PRODUCTS-MIB' => 'drg100',
'PACKETFRONT-DRG-MIB' => 'productName',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
'snmpd_vers' => 'versionTag',
'hrSystemUptime' => 'hrSystemUptime',
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'packetfront';
}
sub os {
# Only DRGOS for now (not tested with other product lines than DRG series)
my $pfront = shift;
my $descr = $pfront->description();
if ( $descr =~ /drgos/i ) {
return 'drgos';
} else {
return;
}
}
sub os_ver {
my $pfront = shift;
my $descr = $pfront->description();
my $os_ver = undef;
if ( $descr =~ /Version:\sdrgos-(\w+)-([\w\-\.]+)/ ) {
$os_ver = $2;
}
return $os_ver;
}
sub serial {
my $pfront = shift;
return $pfront->productSerialNo();
}
sub i_ignore {
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->interfaces($partial) || {};
my %i_ignore;
foreach my $if ( keys %$interfaces ) {
# lo0 etc
if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::PacketFront - SNMP Interface to PacketFront devices
=head1 AUTHORS
Jeroen van Ingen
initial version based on SNMP::Info::Layer3::NetSNMP by Bradley Baetz and Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $pfront = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $pfront->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for PacketFront devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<UCD-SNMP-MIB>
=item F<NET-SNMP-TC>
=item F<HOST-RESOURCES-MIB>
=item F<PACKETFRONT-PRODUCTS-MIB>
=item F<PACKETFRONT-DRG-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $pfront->vendor()
Returns C<'packetfront'>.
=item $pfront->os()
Returns the OS extracted from C<sysDescr>.
=item $pfront->os_ver()
Returns the software version extracted from C<sysDescr>.
=item $pfront->serial()
Returns the value of C<productSerialNo>.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=head1 TABLE ENTRIES
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $pfront->i_ignore()
Returns reference to hash. Increments value of IID if port is to be ignored.
Ignores loopback
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=cut

View File

@@ -1,7 +1,6 @@
# SNMP::Info::Layer3::Passport
# $Id$
#
# Copyright (c) 2008 Eric Miller
# Copyright (c) 2012 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -30,6 +29,7 @@
package SNMP::Info::Layer3::Passport;
use warnings;
use strict;
use Exporter;
use SNMP::Info::SONMP;
@@ -43,7 +43,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::RapidCity::MIBS,
@@ -80,12 +80,12 @@ sub model {
return $id unless defined $model;
$model =~ s/^rcA//i;
$model =~ s/^rc(A)?//i;
return $model;
}
sub vendor {
return 'nortel';
return 'avaya';
}
sub os {
@@ -126,9 +126,9 @@ sub i_index {
# Get VLAN Virtual Router Interfaces
if (!defined $partial
or (defined $model
and ( ( $partial > 2000 and $model =~ /(86|83|81|16)/ )
or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
|| (defined $model
&& ( ( $partial > 2000 && $model =~ /^8[8631]|16|VSP/ )
|| ( $partial > 256 && $model =~ /^1[012][05]0/ ) )
)
)
{
@@ -145,7 +145,7 @@ sub i_index {
}
}
if ( defined $model and $model =~ /(86)/ ) {
if ( defined $model and $model =~ /^8[86]/ ) {
my $cpu_index = $passport->rc_cpu_ifindex($partial) || {};
my $virt_ip = $passport->rc_virt_ip();
@@ -182,9 +182,9 @@ sub interfaces {
my $vlan_id = {};
if (!defined $partial
or (defined $model
and ( ( $partial > 2000 and $model =~ /(86|83|81|16)/ )
or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
|| (defined $model
&& ( ( $partial > 2000 && $model =~ /^8[8631]|16|VSP/ )
|| ( $partial > 256 && $model =~ /^1[012][05]0/ ) )
)
)
{
@@ -198,24 +198,24 @@ sub interfaces {
my $index = $i_index->{$iid};
next unless defined $index;
if ( ( $index == 1 ) and ( $model =~ /(86)/ ) ) {
if ( ( $index == 1 ) and ( $model =~ /^8[86]/ ) ) {
$if{$index} = 'Cpu.Virtual';
}
elsif ( ( $index == 192 ) and ( $model eq '8603' ) ) {
elsif ( ( $index == 192 ) and ( $model =~ /^8[86]03/ ) ) {
$if{$index} = 'Cpu.3';
}
elsif ( ( $index == 320 ) and ( $model =~ /(8606|8610|8610co)/ ) ) {
elsif ( ( $index == 320 ) and ( $model =~ /^8[86][10][06]/ ) ) {
$if{$index} = 'Cpu.5';
}
elsif ( ( $index == 384 ) and ( $model =~ /(8606|8610|8610co)/ ) ) {
elsif ( ( $index == 384 ) and ( $model =~ /^8[86][10][06]/ ) ) {
$if{$index} = 'Cpu.6';
}
elsif (( $index > 2000 and $model =~ /(86|83|81|16)/ )
or ( $index > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
elsif (( $index > 2000 and $model =~ /^8[8631]|16|VSP/ )
or ( $index > 256 and $model =~ /^1[012][05]0/ ) )
{
my $v_index = $reverse_vlan{$iid};
@@ -255,9 +255,9 @@ sub i_mac {
# Get VLAN Virtual Router Interfaces
if (!defined $partial
or (defined $model
and ( ( $partial > 2000 and $model =~ /(86|83|81|16)/ )
or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
|| (defined $model
&& ( ( $partial > 2000 && $model =~ /^8[8631]|16|VSP/ )
|| ( $partial > 256 && $model =~ /^1[012][05]0/ ) )
)
)
{
@@ -276,7 +276,7 @@ sub i_mac {
}
}
if ( defined $model and $model =~ /(86)/ ) {
if ( defined $model and $model =~ /^8[86]/ ) {
my $cpu_mac = $passport->rc_cpu_mac($partial) || {};
my $virt_ip = $passport->rc_virt_ip() || '0.0.0.0';
@@ -329,9 +329,9 @@ sub i_description {
# Get VLAN Virtual Router Interfaces
if (!defined $partial
or (defined $model
and ( ( $partial > 2000 and $model =~ /(86|83|81|16)/ )
or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
|| (defined $model
&& ( ( $partial > 2000 && $model =~ /^8[8631]|16|VSP/ )
|| ( $partial > 256 && $model =~ /^1[012][05]0/ ) )
)
)
{
@@ -365,9 +365,9 @@ sub i_name {
my %reverse_vlan;
if (!defined $partial
or (defined $model
and ( ( $partial > 2000 and $model =~ /(86|83|81|16)/ )
or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) )
|| (defined $model
&& ( ( $partial > 2000 && $model =~ /^8[8631]|16|VSP/ )
|| ( $partial > 256 && $model =~ /^1[012][05]0/ ) )
)
)
{
@@ -379,31 +379,31 @@ sub i_name {
my %i_name;
foreach my $iid ( keys %$i_index ) {
if ( ( $iid == 1 ) and ( $model =~ /(86)/ ) ) {
if ( ( $iid == 1 ) and ( $model =~ /^8[86]/ ) ) {
$i_name{$iid} = 'CPU Virtual Management IP';
}
elsif ( ( $iid == 192 ) and ( $model eq '8603' ) ) {
elsif ( ( $iid == 192 ) and ( $model =~ /^8[86]03/ ) ) {
$i_name{$iid} = 'CPU 3 Ethernet Port';
}
elsif ( ( $iid == 320 ) and ( $model =~ /(8606|8610|8610co)/ ) ) {
elsif ( ( $iid == 320 ) and ( $model =~ /^8[86][10][06]/ ) ) {
$i_name{$iid} = 'CPU 5 Ethernet Port';
}
elsif ( ( $iid == 384 ) and ( $model =~ /(8606|8610|8610co)/ ) ) {
elsif ( ( $iid == 384 ) and ( $model =~ /^8[86][10][06]/ ) ) {
$i_name{$iid} = 'CPU 6 Ethernet Port';
}
elsif (
( $iid > 2000 and defined $model and $model =~ /(86|83|81|16)/ )
( $iid > 2000 and defined $model and $model =~ /^8[8631]|16|VSP/ )
or ( $iid > 256
and defined $model
and $model =~ /(105|11[05]0|12[05])/ )
and $model =~ /^1[012][05]0/ )
)
{
my $vlan_index = $reverse_vlan{$iid};
my $vlan_name = $v_name->{$vlan_index};
my $vlan_idx = $reverse_vlan{$iid};
my $vlan_name = $v_name->{$vlan_idx};
next unless defined $vlan_name;
$i_name{$iid} = $vlan_name;
@@ -433,12 +433,16 @@ sub ip_index {
foreach my $ip ( keys %$ip_index ) {
my $iid = $ip_index->{$ip};
next unless defined $iid;
# Skip VSP default CPU addresses
next if ($ip =~ /^192\.168\.1\.1/);
# Skip default CPU addresses
next if ($ip =~ /^192\.168\.168\.16[89]/);
$ip_index{$ip} = $iid;
}
# Only 8600 has CPU and Virtual Management IP
if ( defined $model and $model =~ /(86)/ ) {
if ( defined $model and $model =~ /^8[86]/ ) {
my $cpu_ip = $passport->rc_cpu_ip($partial) || {};
my $virt_ip = $passport->rc_virt_ip($partial);
@@ -447,6 +451,8 @@ sub ip_index {
foreach my $cid ( keys %$cpu_ip ) {
my $c_ip = $cpu_ip->{$cid};
next unless defined $c_ip;
# Skip default CPU addresses
next if ($c_ip =~ /192\.168\.168\.16[89]/);
$ip_index{$c_ip} = $cid;
}
@@ -467,6 +473,10 @@ sub ip_netmask {
my %ip_index;
foreach my $iid ( keys %$ip_mask ) {
# Skip VSP default CPU addresses
next if ($iid =~ /^192\.168\.1\./);
# Skip default CPU addresses
next if ($iid =~ /^192\.168\.168\.16[89]/);
my $mask = $ip_mask->{$iid};
next unless defined $mask;
@@ -474,7 +484,7 @@ sub ip_netmask {
}
# Only 8600 has CPU and Virtual Management IP
if ( defined $model and $model =~ /(86)/ ) {
if ( defined $model and $model =~ /^8[86]/ ) {
my $cpu_ip = $passport->rc_cpu_ip($partial) || {};
my $cpu_mask = $passport->rc_cpu_mask($partial) || {};
@@ -485,6 +495,8 @@ sub ip_netmask {
foreach my $iid ( keys %$cpu_mask ) {
my $c_ip = $cpu_ip->{$iid};
next unless defined $c_ip;
# Skip default CPU addresses
next if ($c_ip =~ /192\.168\.168\.16[89]/);
my $c_mask = $cpu_mask->{$iid};
next unless defined $c_mask;
@@ -510,7 +522,7 @@ sub root_ip {
my $sonmp_topo_ip = $passport->sonmp_topo_ip();
# Only 8600 and 1600 have CLIP or Management Virtual IP
if ( defined $model and $model =~ /(86|16)/ ) {
if ( defined $model and $model =~ /^8[86]|16|VSP/ ) {
# Return CLIP (CircuitLess IP)
foreach my $iid ( keys %$rc_ip_type ) {
@@ -560,7 +572,7 @@ sub index_factor {
# Older Accelar models use base 16 instead of 64
$index_factor = 16
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ );
if ( defined $model and $model =~ /^1[012][05]0/ );
return $index_factor;
}
@@ -583,9 +595,86 @@ sub bp_index {
foreach my $iid ( keys %$if_index ) {
$bp_index{$iid} = $iid;
}
# If we have MLT's map them to the designated port
my $trunks = $passport->rc_mlt_index;
my $dps = $passport->rc_mlt_dp || {};
if ( ref {} eq ref $trunks and scalar keys %$trunks ) {
foreach my $m ( keys %$trunks ) {
my $m_idx = $trunks->{$m};
next unless $m_idx;
my $i_idx = $dps->{$m} ? $dps->{$m} : $m_idx;
$bp_index{$m_idx} = $i_idx;
}
}
return \%bp_index;
}
# We have devices which support BRIDGE-MIB, Q-BRIDGE-MIB, and RAPID-CITY
# exclusively. Use standards-based first and fall back to RAPID-CITY.
sub fw_mac {
my $passport = shift;
my $partial = shift;
my $qb = $passport->SUPER::fw_mac($partial);
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
my $qb_fw_port = $passport->rcBridgeTpFdbPort($partial);
my $qb_fw_mac = {};
foreach my $idx ( keys %$qb_fw_port ) {
my ( $fdb_id, $mac ) = _rc_fdbtable_index($idx);
$qb_fw_mac->{$idx} = $mac;
}
return $qb_fw_mac;
}
sub fw_port {
my $passport = shift;
my $partial = shift;
my $qb = $passport->SUPER::fw_port($partial);
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
return $passport->rcBridgeTpFdbPort($partial);
}
sub fw_status {
my $passport = shift;
my $partial = shift;
my $qb = $passport->SUPER::fw_status($partial);
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
return $passport->rcBridgeTpFdbStatus($partial);
}
sub qb_fw_vlan {
my $passport = shift;
my $partial = shift;
my $qb = $passport->SUPER::qb_fw_vlan($partial);
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
my $qb_fw_port = $passport->rcBridgeTpFdbPort($partial);
my $qb_fw_vlan = {};
foreach my $idx ( keys %$qb_fw_port ) {
my ( $fdb_id, $mac ) = _rc_fdbtable_index($idx);
$qb_fw_vlan->{$idx} = $fdb_id;
}
return $qb_fw_vlan;
}
# break up the rcBridgeTpFdbEntry INDEX into FDB ID and MAC Address.
sub _rc_fdbtable_index {
my $idx = shift;
my @values = split( /\./, $idx );
my $fdb_id = shift(@values);
return ( $fdb_id, join( ':', map { sprintf "%02x", $_ } @values ) );
}
# Pseudo ENTITY-MIB methods
sub e_index {
@@ -613,7 +702,7 @@ sub e_index {
}
# Older Accelars use RAPID-CITY::rcCardTable
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ ) {
if ( defined $model and $model =~ /^1[012][05]0/ ) {
my $rc_c_t = $passport->rc_c_type() || {};
foreach my $idx ( keys %$rc_c_t ) {
next unless $idx;
@@ -683,7 +772,7 @@ sub e_descr {
my $model = $passport->model();
my $rc_ps = $passport->rc_ps_detail() || {};
my $rc_ch = $passport->rcChasType();
my $rc_ch = $passport->chassis() || '';
$rc_ch =~ s/a//;
my %rc_e_descr;
@@ -701,7 +790,7 @@ sub e_descr {
}
# Older Accelars use RAPID-CITY::rcCardTable
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ ) {
if ( defined $model and $model =~ /^1[012][05]0/ ) {
my $rc_c_t = $passport->rc_c_type() || {};
foreach my $idx ( keys %$rc_c_t ) {
next unless $idx;
@@ -752,7 +841,7 @@ sub e_type {
my $model = $passport->model();
my $rc_ps = $passport->rc_ps_type() || {};
my $rc_ch = $passport->rcChasType();
my $rc_ch = $passport->chassis();
my %rc_e_type;
@@ -769,7 +858,7 @@ sub e_type {
}
# Older Accelars use RAPID-CITY::rcCardTable
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ ) {
if ( defined $model and $model =~ /^1[012][05]0/ ) {
my $rc_c_t = $passport->rc_c_type() || {};
foreach my $idx ( keys %$rc_c_t ) {
next unless $idx;
@@ -842,7 +931,7 @@ sub e_name {
$rc_e_name{$iid} = "Card $slot, MDA $mod";
}
elsif ( defined $model
and $model =~ /(105|11[05]0|12[05])/
and $model =~ /^1[012][05]0/
and $iid =~ /1$/ )
{
$rc_e_name{$iid} = "Card $slot";
@@ -878,7 +967,7 @@ sub e_hwver {
}
# Older Accelars use RAPID-CITY::rcCardTable
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ ) {
if ( defined $model and $model =~ /^1[012][05]0/ ) {
my $rc_c_t = $passport->rc_c_rev() || {};
foreach my $idx ( keys %$rc_c_t ) {
next unless $idx;
@@ -927,7 +1016,7 @@ sub e_vendor {
my %rc_e_vendor;
foreach my $iid ( keys %$rc_e_idx ) {
$rc_e_vendor{$iid} = 'nortel';
$rc_e_vendor{$iid} = 'avaya';
}
return \%rc_e_vendor;
}
@@ -953,7 +1042,7 @@ sub e_serial {
}
# Older Accelars use RAPID-CITY::rcCardTable
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ ) {
if ( defined $model and $model =~ /^1[012][05]0/ ) {
my $rc_c_t = $passport->rc_c_serial() || {};
foreach my $idx ( keys %$rc_c_t ) {
next unless $idx;
@@ -1051,8 +1140,8 @@ __END__
=head1 NAME
SNMP::Info::Layer3::Passport - SNMP Interface to modular Nortel Ethernet Routing
Switches (formerly Passport / Accelar)
SNMP::Info::Layer3::Passport - SNMP Interface to modular Avaya
Ethernet Routing Switch 8000 Series and VSP 9000 Series switches.
=head1 AUTHOR
@@ -1075,10 +1164,10 @@ Eric Miller
=head1 DESCRIPTION
Abstraction subclass for modular Nortel Ethernet Routing Switches (formerly
Passport and Accelar Series Switches).
Abstraction subclass for modular Avaya Ethernet Routing Switch 8000 Series
(formerly Nortel/Bay Passport/Accelar) and VSP 9000 Series switches.
These devices have some of the same characteristics as the stackable Nortel
These devices have some of the same characteristics as the stackable Avaya
Ethernet Switches (Baystack). For example, extended interface information is
gleaned from F<RAPID-CITY>.
@@ -1126,7 +1215,7 @@ F<RAPID-CITY-MIB> and then parses out C<rcA>.
=item $passport->vendor()
Returns 'nortel'
Returns 'avaya'
=item $passport->os()
@@ -1240,6 +1329,40 @@ problems with F<BRIDGE-MIB>
=back
=head2 Forwarding Table
These methods utilize, in order; F<Q-BRIDGE-MIB>, F<BRIDGE-MIB>, and
F<RAPID-CITY> to obtain the forwarding table information.
=over
=item $passport->fw_mac()
Returns reference to hash of forwarding table MAC Addresses
(C<dot1qTpFdbAddress>), (C<dot1dTpFdbAddress>), (C<rcBridgeTpFdbAddress>)
=item $passport->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid)
(C<dot1qTpFdbPort>), (C<dot1dTpFdbPort>), (C<rcBridgeTpFdbPort>)
=item $passport->fw_status()
Returns reference to hash of forwarding table entries status
(C<dot1qTpFdbStatus>), (C<dot1dTpFdbStatus>), (C<rcBridgeTpFdbStatus>)
=item $passport->qb_fw_vlan()
Returns reference to hash of forwarding table entries VLAN ID
(C<dot1qFdbId>), (C<rcBridgeTpFdbVlanId>)
=back
=head2 Pseudo F<ENTITY-MIB> information
These devices do not support F<ENTITY-MIB>. These methods emulate Physical
@@ -1273,7 +1396,7 @@ Returns reference to hash. Key: IID, Value: Hardware version.
=item $passport->e_vendor()
Returns reference to hash. Key: IID, Value: nortel.
Returns reference to hash. Key: IID, Value: avaya.
=item $passport->e_serial()

View File

@@ -41,7 +41,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.04';
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -118,42 +118,6 @@ sub os_ver {
return $os_ver;
}
# Use LLDP
sub hasCDP {
my $pf = shift;
return $pf->hasLLDP();
}
sub c_ip {
my $pf = shift;
my $partial = shift;
return $pf->lldp_ip($partial);
}
sub c_if {
my $pf = shift;
my $partial = shift;
return $pf->lldp_if($partial);
}
sub c_port {
my $pf = shift;
my $partial = shift;
return $pf->lldp_port($partial);
}
sub c_id {
my $pf = shift;
my $partial = shift;
return $pf->lldp_id($partial);
}
sub c_platform {
my $pf = shift;
my $partial = shift;
return $pf->lldp_rem_sysdesc($partial);
}
1;
__END__
@@ -230,10 +194,6 @@ These are methods that return scalar values from SNMP
Returns 'FreeBSD'
=item $pf->hasCDP()
Returns whether LLDP is enabled.
=item $pf->model()
Grabs the os version from C<sysDescr>
@@ -259,30 +219,6 @@ 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.
=over
=item $pf->c_id()
Returns LLDP information.
=item $pf->c_if()
Returns LLDP information.
=item $pf->c_ip()
Returns LLDP information.
=item $pf->c_platform()
Returns LLDP information.
=item $pf->c_port()
Returns LLDP information.
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.

191
Info/Layer3/Pica8.pm Normal file
View File

@@ -0,0 +1,191 @@
# SNMP::Info::Layer3::Pica8
#
# Copyright (c) 2013 Jeroen van Ingen
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::Pica8;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::Pica8::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Pica8::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::LLDP::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::LLDP::MUNGE,
);
sub vendor {
return 'Pica8';
}
sub os {
my $pica8 = shift;
my $descr = $pica8->description();
return $1 if ( $descr =~ /(\S+)\s+Platform Software/i );
return;
}
sub os_ver {
my $pica8 = shift;
my $descr = $pica8->description();
return $1 if ( $descr =~ /Software version ([\d\.]+)/i );
return;
}
sub model {
my $pica8 = shift;
my $descr = $pica8->description();
return $1 if ( $descr =~ /Hardware model (P-\d{4})/i );
return;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Pica8 - SNMP Interface to L3 Devices, Pica8
=head1 AUTHORS
Jeroen van Ingen
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $pica8 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $pica8->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Pica8 devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=item SNMP::Info::LLDP
=back
=head2 Required MIBs
=over
=item F<PICA-PRIVATE-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3> for its own MIB requirements.
See L<SNMP::Info::LLDP> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $pica8->vendor()
Returns 'Pica8'
=item $pica8->model()
Returns the model name extracted from C<sysDescr>.
=item $pica8->os()
Returns the OS extracted from C<sysDescr>.
=item $pica8->os_ver()
Returns the OS version extracted from C<sysDescr>.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP> for details.
=head1 TABLE ENTRIES
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP> for details.
=cut

189
Info/Layer3/SonicWALL.pm Normal file
View File

@@ -0,0 +1,189 @@
package SNMP::Info::Layer3::SonicWALL;
# Copyright (c) 2011 Netdisco Project
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::SonicWALL::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::SonicWALL::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
'SNWL-COMMON-MIB' => 'snwlCommonModule',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
#From SNWL-COMMON-MIB
'sw_model' => 'snwlSysModel',
'sw_serial' => 'snwlSysSerialNumber',
'sw_firmware' => 'snwlSysFirmwareVersion',
);
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'SonicWALL';
}
sub os {
my $sonicos = shift;
my $swos = $sonicos->sw_firmware();
if ($swos =~ /Enhanced/) {
return 'SonicOS Enhanced';
}
return 'SonicOS Standard';
}
sub os_ver {
my $sonicosver = shift;
my $osver = $sonicosver->sw_firmware();
if ( $osver =~ /\S+\s\S+\s(\S+)/) {
return $1
}
}
sub serial {
my $sw = shift;
my $serial = $sw->sw_serial();
return $serial;
}
sub model {
my $swmodel = shift;
my $model = $swmodel->sw_model();
return $model;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::SonicWALL - SNMP Interface to L3 SonicWALL Firewall
=head1 AUTHOR
phishphreek@gmail.com
=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 Generic SonicWALL Firewalls
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=head2 Overrides
=over
=item $router->vendor()
Returns C<'SonicWALL'>
=item $router->os()
Returns C<'SonicOS'>
=item $router->os_ver()
Returns '4.2.0.0-10e'
=item $router->model()
Returns C<'PRO 3060 Enhanced'>
=item $router->serial()
Returns the MAC address of the first X0/LAN interface.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

216
Info/Layer3/Steelhead.pm Normal file
View File

@@ -0,0 +1,216 @@
# SNMP::Info::Layer3::Steelhead
#
# Copyright (c) 2013 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::Steelhead;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Steelhead::ISA
= qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Steelhead::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.12';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'STEELHEAD-MIB' => 'serialNumber',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
# Fully qualified to remove ambiguity of 'model'
'rb_model' => 'STEELHEAD-MIB::model',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
);
sub layers {
return '01001100';
}
sub vendor {
return 'riverbed';
}
sub model {
my $riverbed = shift;
my $model = $riverbed->rb_model() || '';
if ($model =~ /^(\d+)/) {
return $1;
}
return $model;
}
sub os {
return 'steelhead';
}
sub os_ver {
my $riverbed = shift;
my $ver = $riverbed->systemVersion() || '';
if ( $ver =~ /(\d+[\.\d]+)/ ) {
return $1;
}
return $ver;
}
sub serial {
my $riverbed = shift;
return $riverbed->serialNumber();
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Steelhead - SNMP Interface to Riverbed Steelhead WAN
optimization appliances.
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $riverbed = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $riverbed->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for Riverbed Steelhead WAN optimization appliances.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $riverbed = new SNMP::Info::Layer3::Steelhead(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
F<STEELHEAD-MIB>
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $riverbed->vendor()
Returns 'riverbed'
=item $riverbed->model()
Returns the chassis model.
(C<STEELHEAD-MIB::model>)
=item $riverbed->os()
Returns 'steelhead'
=item $riverbed->os_ver()
Returns the software version extracted from (C<systemVersion>).
=item $riverbed->serial()
Returns the chassis serial number.
(C<serialNumber>)
=back
=head2 Overrides
=over
=item $riverbed->layers()
Returns 01001100. Steelhead does not support bridge MIB, so override reported
layers.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"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::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

View File

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

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