Compare commits
221 Commits
ver_3_0_4_
...
3.30
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e6ad08733d | ||
|
|
a8d83b5e1c | ||
|
|
9392b74cbc | ||
|
|
e09624efd0 | ||
|
|
d4d7429de4 | ||
|
|
b97cef86a3 | ||
|
|
70615a172b | ||
|
|
d399ca90d3 | ||
|
|
bbc9695075 | ||
|
|
c8fceeb75b | ||
|
|
036cb4556e | ||
|
|
e7b06a0b06 | ||
|
|
c0067113e9 | ||
|
|
ce4349a188 | ||
|
|
224085dfca | ||
|
|
9b3262a5fe | ||
|
|
86856b6d54 | ||
|
|
d5bf08329e | ||
|
|
60efce8404 | ||
|
|
83164f456a | ||
|
|
c0141bcfee | ||
|
|
8dfe9ef1cf | ||
|
|
73d713b670 | ||
|
|
db6c3573c1 | ||
|
|
c8cbdaef8a | ||
|
|
2c7243b87d | ||
|
|
46515dd5d3 | ||
|
|
7eb799adc6 | ||
|
|
c85b61bbd0 | ||
|
|
045ff8b789 | ||
|
|
7b7f197439 | ||
|
|
9e1c462836 | ||
|
|
e97e8309cb | ||
|
|
8c5be1a47d | ||
|
|
afef2e6732 | ||
|
|
7b2051b55c | ||
|
|
8e470a2d72 | ||
|
|
35213d5cb2 | ||
|
|
b24f1a8ac4 | ||
|
|
5454ab577e | ||
|
|
046c15a074 | ||
|
|
ddb9dda894 | ||
|
|
d7047bda13 | ||
|
|
c7934f4d10 | ||
|
|
c97dc06177 | ||
|
|
76b1faa159 | ||
|
|
1e0438857e | ||
|
|
b6494effa6 | ||
|
|
a359184b83 | ||
|
|
ce50a3f627 | ||
|
|
ee7d254329 | ||
|
|
d674b22b39 | ||
|
|
47954aba8e | ||
|
|
09e18e9b64 | ||
|
|
163ba86196 | ||
|
|
e57e7d99d5 | ||
|
|
7ad449303b | ||
|
|
49b853de1a | ||
|
|
03a81ad4be | ||
|
|
eb046b6a61 | ||
|
|
1bf62f9524 | ||
|
|
9aca213a5f | ||
|
|
ce8bb68200 | ||
|
|
7ee562c5ac | ||
|
|
bdb719004d | ||
|
|
842ac96d48 | ||
|
|
5bb9011fb4 | ||
|
|
97564f50b8 | ||
|
|
efcf6a0db3 | ||
|
|
9e813784f7 | ||
|
|
aaca03062b | ||
|
|
c1242017e2 | ||
|
|
5f1426a0a3 | ||
|
|
e84225fb23 | ||
|
|
32c0e64bfb | ||
|
|
0793ff31f5 | ||
|
|
d3c2c1b607 | ||
|
|
893def7910 | ||
|
|
f875639435 | ||
|
|
70bb263d79 | ||
|
|
536d7d6901 | ||
|
|
6ea34316b0 | ||
|
|
aeebe5c95c | ||
|
|
eb62f95636 | ||
|
|
c7ee746fe6 | ||
|
|
9a062499b3 | ||
|
|
0c876452d8 | ||
|
|
3b6088f454 | ||
|
|
719f14984b | ||
|
|
2e480dbec5 | ||
|
|
66910c7827 | ||
|
|
0f5319bc52 | ||
|
|
cd54b07e09 | ||
|
|
b197e9739b | ||
|
|
8dd32c0dd7 | ||
|
|
08e049eb31 | ||
|
|
d09e4a125c | ||
|
|
8353db2bc4 | ||
|
|
250d2a0c0a | ||
|
|
46b3127bb5 | ||
|
|
f1e9e3423d | ||
|
|
158ee40f1b | ||
|
|
713d052b64 | ||
|
|
0e28436086 | ||
|
|
3f7229f4e7 | ||
|
|
1ae7f8c8a2 | ||
|
|
8e63954c3f | ||
|
|
0fbcd5f8b1 | ||
|
|
71f84d48dc | ||
|
|
867a635ab8 | ||
|
|
3d2c9ceaf5 | ||
|
|
47736b08ce | ||
|
|
3f49e5f8ef | ||
|
|
7c8575bfa5 | ||
|
|
102a7e10cc | ||
|
|
9148764d20 | ||
|
|
ce619415de | ||
|
|
745807007f | ||
|
|
e85b3f70aa | ||
|
|
edc0fe4fbe | ||
|
|
3cceec9044 | ||
|
|
18602855da | ||
|
|
72c223f72e | ||
|
|
c6b3c45412 | ||
|
|
c60a04f530 | ||
|
|
f7430ab1a6 | ||
|
|
827398228c | ||
|
|
a264bb36cb | ||
|
|
c24e63ec4c | ||
|
|
6519570839 | ||
|
|
2c88544158 | ||
|
|
d0722d3677 | ||
|
|
d2b404763b | ||
|
|
88fb9e4df3 | ||
|
|
440ec276d3 | ||
|
|
6e91b90c48 | ||
|
|
0bfc8c5ed6 | ||
|
|
63547c2ea1 | ||
|
|
efecf1bbb7 | ||
|
|
682b8c2a9c | ||
|
|
88295e8c1e | ||
|
|
6764f15fd0 | ||
|
|
8b8ee8693e | ||
|
|
fe89001166 | ||
|
|
416a18377c | ||
|
|
8fda38184c | ||
|
|
280e9260f7 | ||
|
|
22642c1095 | ||
|
|
d68b2047b0 | ||
|
|
7240f034e5 | ||
|
|
97ce41e363 | ||
|
|
31a8abc3b8 | ||
|
|
6b49bfd4c4 | ||
|
|
985b4aab3f | ||
|
|
a4e7c3a61a | ||
|
|
d82d8781c4 | ||
|
|
b4c3f92ba3 | ||
|
|
1c57d2eab8 | ||
|
|
409de77b2c | ||
|
|
3e22e24dc9 | ||
|
|
17b1bdacfe | ||
|
|
b570fdbc89 | ||
|
|
cceb0f4e5e | ||
|
|
04f8c7f7e2 | ||
|
|
37aca89af7 | ||
|
|
5445a496db | ||
|
|
0ab93b142c | ||
|
|
d39dc76949 | ||
|
|
c6abd7b62b | ||
|
|
0e572db832 | ||
|
|
602bb15b47 | ||
|
|
b4882285c4 | ||
|
|
834b27bdad | ||
|
|
7db148a5a1 | ||
|
|
9e332095a2 | ||
|
|
7bf950026b | ||
|
|
f246444d89 | ||
|
|
8e84aea1bf | ||
|
|
d6a7a944cc | ||
|
|
fb478d3c7b | ||
|
|
24f8a8fdba | ||
|
|
28bbe0ee19 | ||
|
|
c21ca2062e | ||
|
|
e3e289a27c | ||
|
|
9540f6b9d3 | ||
|
|
539943fb0f | ||
|
|
7a8ebffd40 | ||
|
|
3d48f4e210 | ||
|
|
667cdbea13 | ||
|
|
f5fb4dd3b0 | ||
|
|
5a2722d049 | ||
|
|
f3b6cfbd01 | ||
|
|
e239a6057c | ||
|
|
9b1c439e15 | ||
|
|
074f2e7c8f | ||
|
|
4b1533e925 | ||
|
|
6812a60668 | ||
|
|
6f0cb846f0 | ||
|
|
c79307692b | ||
|
|
08b2f50ac7 | ||
|
|
3577fa1e42 | ||
|
|
cb6630582a | ||
|
|
ca5fff31a7 | ||
|
|
69b1f1e29e | ||
|
|
4e2b642ed1 | ||
|
|
3c26ce2a55 | ||
|
|
7d2cf97c06 | ||
|
|
cfce6296fb | ||
|
|
1601703ff2 | ||
|
|
905ad3e2b7 | ||
|
|
15b7e95545 | ||
|
|
247f6f038d | ||
|
|
7c6df7cce3 | ||
|
|
1a92306d51 | ||
|
|
59e9fae1d5 | ||
|
|
998094241d | ||
|
|
d6c3313138 | ||
|
|
b7e252b91a | ||
|
|
6071beb15d | ||
|
|
cda830686d | ||
|
|
a29b888620 |
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
*.db
|
||||
SNMP
|
||||
*.komodo*
|
||||
blib/
|
||||
META.*
|
||||
MYMETA.*
|
||||
Makefile
|
||||
Makefile.old
|
||||
pm_to_blib
|
||||
422
ChangeLog
422
ChangeLog
@@ -1,6 +1,361 @@
|
||||
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
|
||||
|
||||
version 3.04_001 (2013-08-16)
|
||||
version 3.30 (2015-11-16)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* RT #106254: Add new sysObjectID mapping for Ubiquiti
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Correct link to MIB tarball
|
||||
* Correct port indexing of newer VSP 4K and 8K in L3::Passport
|
||||
* Statistics in the sysIfxStatTable are 64-bit counters, so they should
|
||||
override the 64-bit methods.
|
||||
|
||||
version 3.29 (2015-10-13)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add IPv6::ipv6_addr() method to map IPv6 interface address indexes to actual addresses
|
||||
* Add support for (remote) IPv6 addresses to LLDP::lldp_addr()
|
||||
* Add LLDP::lldp_ipv6() and LLDP::lldp_mac() so that remote management
|
||||
addresses of specific types can be requested
|
||||
|
||||
version 3.28 (2015-06-18)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add Layer3::Huawei class for Huawei Quidway switches
|
||||
* Modified generic Layer3::Cisco class: use community based indexing if
|
||||
the device returns a value for vtpVersion
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Correct port indexing of VSP 4K in L3::Passport
|
||||
|
||||
version 3.27 (2015-05-05)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Cisco Aironet PSU information
|
||||
* Only log adding mibdirs at debug level 2
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [#221] Drop Cisco Voice VLAN 4096
|
||||
|
||||
version 3.26 (2015-03-07)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add fan and psu reporting to Layer3::Dell
|
||||
* Include Voice VLANs in (tagged) VLAN Membership on Cisco devices
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Fix typo in MRO::print_superclasses
|
||||
|
||||
version 3.25 (2015-02-25)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add new model name mappings for to Layer2::HP
|
||||
|
||||
version 3.24 (2015-02-04)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Support RSTP and ieee8021d STP operating modes in RapidCity
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Fix single instance leafs defined in %FUNCS to behave like table leafs
|
||||
* Fix incorrect FDB ID to VLAN ID mapping in Bridge and L3:Enterasys
|
||||
|
||||
version 3.23 (2014-12-09)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Update MIB used in L1::Asante
|
||||
* Enhanced STP support for L3::Extreme
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Fix Cisco VLAN membership issue introduced in 3.22 related to capturing
|
||||
port VLANs on Cisco interfaces which are configured for trunking but
|
||||
are not in operational trunking mode
|
||||
|
||||
version 3.22 (2014-12-02)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Support obtaining FDB in Avaya SPBM edge deployments in L2::Baystack
|
||||
NOTE: This requires a RAPID-CITY MIB with the rcBridgeSpbmMacTable
|
||||
* Support for Fortinet devices in new class L3::Fortinet
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Include LLDP support in base Layer2 and Layer3 classes. Due to the
|
||||
widespread adoption of LLDP, this should improve mapping networks
|
||||
when devices aren't supported in a more specific class.
|
||||
* No longer ignore interfaces based on name, in base L2/L3/L7 device
|
||||
classes. For several device classes SNMP::Info will now return tunnel
|
||||
interfaces and/or loopbacks, if present.
|
||||
* Use dot1qVlanCurrentTable if available to capture dynamic and static
|
||||
VLANs, fall back to dot1qVlanStaticTable if not available.
|
||||
* New method i_vlan_membership_untagged() for VLANs transmitted as
|
||||
untagged frames.
|
||||
* Capture Aruba AP hardware and software version when available
|
||||
* New STP methods to support gathering information from devices running
|
||||
mutiple STP instances such as PVST and MST
|
||||
* Enhanced STP support for Avaya and Foundry classes
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [#64] Misdetection: Wireless APs, add products MIB to L2::3Com
|
||||
* Use FDB ID to VID mapping if available to determine end station VLAN
|
||||
rather than assuming they are the same.
|
||||
* Capture port VLANs on Cisco interfaces which are configured for
|
||||
trunking but are not in operational trunking mode
|
||||
* Correct munging of stp_p_port(), i_stp_port(), and stp_root() methods
|
||||
in Bridge
|
||||
* In LLDP.pm don't create a variable in a conditional
|
||||
|
||||
version 3.20 (2014-09-08)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Override layers in Juniper for routers with switch modules
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Update MANIFEST to include Ubiquiti files
|
||||
|
||||
version 3.19 (2014-08-01)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Support for Ubiquiti Access Points in new class L2::Ubiquiti (begemot)
|
||||
* Preliminary support for 3Com switches in new class L2::3Com (begemot)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Fix Avaya detection lldp_port()
|
||||
* Silence uninitialized value warning in L3::Cisco
|
||||
* H3C fixes (begemot)
|
||||
* Only use L2::ZyXEL_DSLAM for ZyXEL DSL modules
|
||||
|
||||
version 3.18 (2014-07-02)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Pseudo ENTITY-MIB methods added to L3::Tasman for hardware information
|
||||
* Capture VPC Keepalive IP addresses in L3::Nexus (jeroenvi)
|
||||
* L2::Netgear inheritance clean up and removal of unnecessary c_* methods
|
||||
defined in Info base class
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Correctly identify device type (class) for instantiated objects which
|
||||
have overridden layers.
|
||||
* [#58] Fix inheritance in L3::FWSM and L3::CiscoASA
|
||||
* [#71] Don't try to match on a false port description in lldp_if
|
||||
* [#54] Possible bad values returned for cdp_id and lldp_port with some HP
|
||||
gear (Joel Leonhardt)
|
||||
|
||||
version 3.17 (2014-06-23)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* POD tests are not required for distribution.
|
||||
|
||||
version 3.16 (2014-06-23)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Add method resolution discovery in SNMP::Info::MRO helper module
|
||||
* Consolidate CiscoImage class into CiscoStats class
|
||||
* Clean up inheritance for Cisco classes. With this change
|
||||
all applicable classes now inherit CiscoAgg, CiscoStpExtensions,
|
||||
CiscoPortSecurity, CiscoPower, and LLDP classes.
|
||||
* Remove inheritance of classes the devices do not support in L3::FWSM
|
||||
and L3::CiscoASA
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Use CiscoVTP methods to get interface VLAN in L3::Cisco rather than
|
||||
solely relying on the interface description.
|
||||
|
||||
version 3.15 (2014-07-10)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Offline mode and Cache export/priming.
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Return serial number for Cisco 3850 from entPhysicalSerialNum
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Cisco SB serial number probably did not work
|
||||
|
||||
version 3.14 (2014-06-07)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Improvements to Mikrotik module (Alex Z)
|
||||
* Don't unshift length from broken lldpRemManAddrTable implementations (G. Shtern)
|
||||
* 802.3ad LAG support in Layer3::H3C
|
||||
* Add LLDP capabilities to Layer2::HPVC class
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Return correct VLAN info with qb_fw_table() on Layer2::HP
|
||||
|
||||
version 3.13 (2014-03-27)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Cisco PAgP support added to LAG method
|
||||
* HP ProCurve LAG support by inheriting Info::Aggregate class
|
||||
|
||||
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]
|
||||
|
||||
@@ -9,12 +364,11 @@ version 3.04_001 (2013-08-16)
|
||||
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.
|
||||
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)
|
||||
|
||||
@@ -44,7 +398,7 @@ version 3.01 (2013-04-13)
|
||||
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.
|
||||
L2::Baystack and L3::Foundry.
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
@@ -74,7 +428,7 @@ version 3.01 (2013-04-13)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* UNIVERSAL::can() now works with dynamic methods
|
||||
* 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
|
||||
@@ -106,20 +460,20 @@ version 2.09 (2012-11-28)
|
||||
* 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
|
||||
* 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
|
||||
* [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)
|
||||
* [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)
|
||||
@@ -139,7 +493,7 @@ version 2.08 (2012-07-15)
|
||||
|
||||
* 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
|
||||
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)
|
||||
@@ -188,7 +542,7 @@ version 2.06 (2011-09-28)
|
||||
* [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
|
||||
* [3408506] Fix uninitialized value in IPv6 when neighbor state is
|
||||
incomplete (Michael Borgelt)
|
||||
|
||||
version 2.05 (2011-06-23)
|
||||
@@ -204,13 +558,13 @@ version 2.04 (2011-03-31)
|
||||
(Brian De Wolf)
|
||||
+ Added L3::Pf for FreeBSD PFSense Firewalls (max)
|
||||
* Added specific functions for neighbor mgmt addresses to CDP class
|
||||
* Implemented os_bin() method in CiscoStats
|
||||
* Implemented os_bin() method in CiscoStats
|
||||
+ [2980787] Fix for C1900 bp_index not containing interfaces.
|
||||
(Brian De Wolf)
|
||||
+ [2599795] Added vendor_i_type() method to HP and HP4000 clases
|
||||
+ [2688801] Minor modification for obscure Proxim/Orinoco device
|
||||
(jrbinks)
|
||||
+ [3051443] Add PoE measured power per port to Cisco, Extrme and HP
|
||||
+ [3051443] Add PoE measured power per port to Cisco, Extrme and HP
|
||||
classes (jeroenvi)
|
||||
* Minor tweaks to support devices without sysServices
|
||||
* Added Cisco CBS3xxx blade switches to L3::C6500
|
||||
@@ -248,7 +602,7 @@ version 2.00 (08/01/08)
|
||||
+ Support for Alcatel-Lucent Service Router via L3::Timetra
|
||||
+ Support for Alcatel-Lucent OmniAccess via L2::Aruba
|
||||
|
||||
* Silence warnings in MAU due to uninitialized variables
|
||||
* Silence warnings in MAU due to uninitialized variables
|
||||
|
||||
version 1.09 (07/22/08) - Beta/developer release
|
||||
+ Added support for HP ProCurve Foundry OEM switches, such as the 9300
|
||||
@@ -272,7 +626,7 @@ version 1.09 (07/22/08) - Beta/developer release
|
||||
+ Add support to specify MIB to resolve leaf names conflicts in
|
||||
%GLOBALS and %FUNCS.
|
||||
+ Added munge_port_list() and modify_port_list() methods to assist in
|
||||
working with PortList objects.
|
||||
working with PortList objects.
|
||||
+ Added set_multi() method to enable a SNMP set command on several new
|
||||
values in one request. Required for complex set operations
|
||||
on some agents.
|
||||
@@ -299,7 +653,7 @@ version 1.05 (11/25/07) - CVS only. No official release
|
||||
Augenstein)
|
||||
+ Added device specific support for LLDP in L2::HP, L2::Baystack,
|
||||
L3::Enterasys and L3::Foundry
|
||||
+ Added support for Enterasys devices as new class L3::Enterasys
|
||||
+ Added support for Enterasys devices as new class L3::Enterasys
|
||||
+ Added support for Dell PowerConnect switches as new class L3::Dell
|
||||
+ Added basic support for generic routers running Microsoft Windows OS
|
||||
as new class L3::Microsoft (begemot)
|
||||
@@ -323,7 +677,7 @@ version 1.05 (11/25/07) - CVS only. No official release
|
||||
+ New class IEEE802dot11 class for generic standards based wireless AP
|
||||
support to include i_ssidlist()and i_80211channel() methods.
|
||||
+ L2::Orinoco inherits from new IEEE802dot11 for i_ssidlist()and
|
||||
i_80211channel() support.
|
||||
i_80211channel() support.
|
||||
+ Added new VLAN methods i_pvid(), i_vlan_membership(), set_i_pvid(),
|
||||
set_i_vlan(), set_add_i_vlan_tagged(), set_remove_i_vlan_tagged() to
|
||||
Bridge, CiscoVTP, Extreme, HP, and RapidCity classes.
|
||||
@@ -385,14 +739,14 @@ version 1.04 (07/08/06)
|
||||
+ Added C1130 and C1240 to L2::Aironet (Ralf Gross)
|
||||
+ Added detection for Cisco 2960, 2940, 3400 w/ MetroBase
|
||||
+ Added generic L2::Cisco Class
|
||||
* Corrected detection for Cisco Supervisor Engine 2 and 32 (IOS).
|
||||
* Corrected detection for Cisco Supervisor Engine 2 and 32 (IOS).
|
||||
* Fixed warnings in CiscoStack
|
||||
* Updated ProCurve HP device detection for newer firmwares
|
||||
|
||||
version 1.03 (04/14/06) - Beta/developer release
|
||||
* Use ipNetToMedia table instead of atTable for ARP
|
||||
* Remove CiscoStack from Layer3::C4000
|
||||
* Fixed bug in MAU class when polling devices without MAU-MIB support
|
||||
* Fixed bug in MAU class when polling devices without MAU-MIB support
|
||||
|
||||
version 1.01 (04/08/06) - Beta/developer release
|
||||
+ Change version numbers to X.XX format. Odd releases are beta
|
||||
@@ -458,15 +812,15 @@ version 1.0 (04/07/06) - CVS only. No official release
|
||||
translated properly
|
||||
|
||||
verison 0.9 (11/15/04)
|
||||
+ ** Added full Nortel/Bay/BayStack support
|
||||
by new developer Eric Miller.
|
||||
+ ** Added full Nortel/Bay/BayStack support
|
||||
by new developer Eric Miller.
|
||||
L2::Bay now depricated.
|
||||
+ Added Alteon Ace support (Eric Miller)
|
||||
+ Added Nortel Cotivity support (Eric Miller)
|
||||
+ Added Nortel BayRS support (Eric Miller)
|
||||
+ Added Nortel Centillion support (Eric Miller)
|
||||
+ Added Nortel AP 222x support (Eric Miller)
|
||||
+ Added Orinco AP support (Eric Miller)
|
||||
+ Added Orinco AP support (Eric Miller)
|
||||
+ Added i_lastchange() per suggestion of Nicolai Petri
|
||||
+ Added BULKWALK patch by Bradley Baetz - This should
|
||||
greatly speed up requests on SNMPv2c devices.
|
||||
@@ -516,27 +870,27 @@ version 0.6 (06/18/03)
|
||||
|
||||
version 0.5 (06/10/03)
|
||||
* Added ability to get paritial tables. For example to get the
|
||||
IP routing table for 128.114.* you can do
|
||||
IP routing table for 128.114.* you can do
|
||||
$ipr = $dev->ipr_dest('128.114');
|
||||
* Added IP Routing Table entries from RFC1213 to SNMP::Info
|
||||
* minor bug fixes
|
||||
|
||||
version 0.4 (04/29/03)
|
||||
* BIG CHANGE ! Internal Data structure has changed.
|
||||
* BIG CHANGE ! Internal Data structure has changed.
|
||||
* Added clear_cache() method
|
||||
* Added NO_SUCH support for snmpget (TABLE) calls to get SNMP MIB II data
|
||||
* Added NO_SUCH support for snmpget (TABLE) calls to get SNMP MIB II data
|
||||
from SNMP Version 1 devices.
|
||||
* Methods load_all() and all() have changed their return value. Sorry but
|
||||
the API had to change.
|
||||
* New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch()
|
||||
to make it more OO happy.
|
||||
* Globals are now cached
|
||||
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
|
||||
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
|
||||
detected in device_type()
|
||||
* New method specify() returns a new subclass object
|
||||
* Subclasses are automatically loaded when specify or autospecify is used!
|
||||
* Added methods for Interface statistics (ifInOctets ...)
|
||||
* Added methods for Memory and CPU statistics
|
||||
* Added methods for Memory and CPU statistics
|
||||
* Added SNMP::Info::Entity, moved out of L2-HP
|
||||
* Added SNMP::Info::Layer2::Aironet
|
||||
|
||||
@@ -549,7 +903,7 @@ version 0.3 (03/06/03)
|
||||
Thanks to Martin Lorensen <martin /at- lorensen.dk>
|
||||
* Removed requirement for SNMP in the Makefile.PL and moved it to t/prereq.t
|
||||
so that the Module will install via CPAN without trying to install the old
|
||||
4.2.0 version of SNMP on CPAN. Will now fail in the test phase.
|
||||
4.2.0 version of SNMP on CPAN. Will now fail in the test phase.
|
||||
Thanks again to Martin Lorensen <martin /at- lorensen.dk>
|
||||
* Moved tests from test.pl to t/*
|
||||
|
||||
@@ -559,10 +913,10 @@ version 0.2 (02/19/03)
|
||||
* Fixed HP Detection in device_type()
|
||||
* Added Spanning Tree Protocol (STP) methods to SNMP::Info::Bridge
|
||||
* Removed HP Specific MIBS in SNMP::Info::Layer2 and cleaned up model()
|
||||
* Added poke for Bay 450 Switches
|
||||
* Added poke for Bay 450 Switches
|
||||
* Mapped HP Part Numbers to model numbers J4812A => 2512 in
|
||||
SNMP::Info::Layer2::HP
|
||||
|
||||
|
||||
version 0.1 (12/30/02)
|
||||
* Initial Release
|
||||
* SubClasses Included:
|
||||
@@ -572,13 +926,13 @@ version 0.1 (12/30/02)
|
||||
* SNMP::Info::MAU
|
||||
* SNMP::Info::Layer1
|
||||
o SNMP::Info::Layer1::Allied
|
||||
o SNMP::Info::Layer1::Asante
|
||||
o SNMP::Info::Layer1::Asante
|
||||
* SNMP::Info::Layer2
|
||||
o SNMP::Info::Layer2::Bay
|
||||
o SNMP::Info::Layer2::C1900
|
||||
o SNMP::Info::Layer2::C2900
|
||||
o SNMP::Info::Layer2::Catalyst
|
||||
o SNMP::Info::Layer2::HP
|
||||
o SNMP::Info::Layer2::HP
|
||||
* SNMP::Info::Layer3
|
||||
o SNMP::Info::Layer3::Aironet
|
||||
o SNMP::Info::Layer3::Foundry
|
||||
|
||||
@@ -386,7 +386,7 @@ note: The Cisco 3000 device can return duplicate interface names, while Netdisco
|
||||
|
||||
device: ASA
|
||||
note: The Cisco ASA is the successor of the PIX which was bought from Altiga Networks.
|
||||
Class: Layer3::CiscoASA
|
||||
class: Layer3::CiscoASA
|
||||
|
||||
device-family: 1000
|
||||
duplex: no
|
||||
|
||||
499
Info.pm
499
Info.pm
@@ -24,7 +24,7 @@ use vars
|
||||
qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG %SPEED_MAP
|
||||
$NOSUCH $BIGINT $REPEATERS/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
=head1 NAME
|
||||
|
||||
@@ -32,7 +32,7 @@ SNMP::Info - OO Interface to Network devices and MIBs through SNMP
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
SNMP::Info - Version 3.04_001
|
||||
SNMP::Info - Version 3.30
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -108,7 +108,7 @@ See L<http://netdisco.org/doc/DeviceMatrix.html> or L<DeviceMatrix.txt> for more
|
||||
=head1 SUPPORT
|
||||
|
||||
Please direct all support, help, and bug requests to the snmp-info-users
|
||||
Mailing List at <http://lists.sourceforge.net/lists/listinfo/snmp-info-users>.
|
||||
Mailing List at L<http://lists.sourceforge.net/lists/listinfo/snmp-info-users>.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
@@ -168,7 +168,7 @@ install by hand.
|
||||
SNMP::Info operates on textual descriptors found in MIBs.
|
||||
|
||||
If you are using SNMP::Info separate from Netdisco,
|
||||
download the Netdisco MIB package at L<http://sourceforge.net/project/showfiles.php?group_id=80033&package_id=135517>
|
||||
download the Netdisco MIB package at L<http://sourceforge.net/projects/netdisco/files/netdisco-mibs/latest-snapshot/>
|
||||
|
||||
Make sure that your snmp.conf is updated to point to your MIB directory
|
||||
and that the MIBs are world-readable.
|
||||
@@ -235,6 +235,12 @@ Requires the F<ADSL-LINE-MIB>, down loadable from Cisco.
|
||||
|
||||
See documentation in L<SNMP::Info::AdslLine> for details.
|
||||
|
||||
=item SNMP::Info::Aggregate
|
||||
|
||||
SNMP Interface to F<IF-MIB> C<ifStackTable> Aggregated Links
|
||||
|
||||
See documentation in L<SNMP::Info::Aggregate> for details.
|
||||
|
||||
=item SNMP::Info::Airespace
|
||||
|
||||
F<AIRESPACE-WIRELESS-MIB> and F<AIRESPACE-SWITCHING-MIB>. Inherited by
|
||||
@@ -256,6 +262,12 @@ support.
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge> for details.
|
||||
|
||||
=item SNMP::Info::CiscoAgg
|
||||
|
||||
SNMP Interface to Cisco Aggregated Links
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoAgg> for details.
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
F<CISCO-CDP-MIB>. Cisco Discovery Protocol (CDP) Support. Inherited by
|
||||
@@ -270,12 +282,6 @@ These OIDs facilitate the writing of configuration files.
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig> for details.
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
F<CISCO-IMAGE-MIB>. A collection of OIDs providing IOS image characteristics.
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage> for details.
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB>.
|
||||
@@ -369,6 +375,12 @@ standards based 802.11 wireless devices.
|
||||
|
||||
See documentation in L<SNMP::Info::IEEE802dot11> for details.
|
||||
|
||||
=item SNMP::Info::IEEE802dot3ad
|
||||
|
||||
SNMP Interface to IEEE Aggregated Links. F<IEEE8023-LAG-MIB>
|
||||
|
||||
See documentation in L<SNMP::Info::IEEE802dot3ad> for details.
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
F<LLDP-MIB>, F<LLDP-EXT-DOT1-MIB>, and F<LLDP-EXT-DOT3-MIB>. Link Layer
|
||||
@@ -383,6 +395,12 @@ F<MAU-MIB> (RFC2668). Some Layer2 devices use this for extended Ethernet
|
||||
|
||||
See documentation in L<SNMP::Info::MAU> for details.
|
||||
|
||||
=item SNMP::Info::MRO
|
||||
|
||||
Method resolution introspection for SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info::MRO> for details.
|
||||
|
||||
=item SNMP::Info::NortelStack
|
||||
|
||||
F<S5-AGENT-MIB>, F<S5-CHASSIS-MIB>.
|
||||
@@ -475,6 +493,12 @@ See documentation in L<SNMP::Info::Layer2> for details.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2::3Com
|
||||
|
||||
SNMP::Info::Layer2::3Com - SNMP Interface to L2 3Com Switches
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2::3Com> for details.
|
||||
|
||||
=item SNMP::Info::Layer2::Airespace
|
||||
|
||||
Subclass for Cisco (Airespace) wireless controllers.
|
||||
@@ -535,8 +559,9 @@ See documentation in L<SNMP::Info::Layer2::Centillion> for details.
|
||||
|
||||
=item SNMP::Info::Layer2::Cisco
|
||||
|
||||
Generic Cisco subclass for layer2 devices that are not yet supported
|
||||
in more specific subclasses.
|
||||
Generic Cisco subclass for layer 2 devices that are not yet supported
|
||||
in more specific subclassesand the base layer 2 Cisco class for
|
||||
other device specific layer 2 Cisco classes.
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2::Cisco> for details.
|
||||
|
||||
@@ -605,6 +630,12 @@ SNMP Interface to Juniper (Trapeze) Wireless Controllers
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2::Trapeze> for details.
|
||||
|
||||
=item SNMP::Info::Layer2::Ubiquiti
|
||||
|
||||
SNMP Interface to Ubiquiti Access Points
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2::Ubiquiti> for details.
|
||||
|
||||
=item SNMP::Info::Layer2::ZyXEL_DSLAM
|
||||
|
||||
Zyxel DSLAMs. Need I say more?
|
||||
@@ -693,7 +724,8 @@ See documentation in L<SNMP::Info::Layer3::C6500> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::Cisco
|
||||
|
||||
This is a simple wrapper around Layer3 for IOS devices. It adds on CiscoVTP.
|
||||
This is a simple wrapper around layer 3 for IOS devices and the base layer 3
|
||||
Cisco class for other device specific layer 3 Cisco classes.
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Cisco> for details.
|
||||
|
||||
@@ -709,6 +741,11 @@ Subclass for Cisco Firewall Services Modules.
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoFWSM> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
Base class for L3 Cisco switches. See documentation in
|
||||
L<SNMP::Info::Layer3::CiscoSwitch> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::Contivity
|
||||
|
||||
Subclass for Avaya/Nortel Contivity/VPN Routers.
|
||||
@@ -747,6 +784,12 @@ Subclass for Force10 devices.
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Force10> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::Fortinet
|
||||
|
||||
Subclass for Fortinet devices.
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Fortinet> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::Foundry
|
||||
|
||||
Subclass for Brocade (Foundry) Network devices.
|
||||
@@ -766,6 +809,19 @@ Original Equipment Manufacturer (OEM) such as the HP ProCurve 9300 and 6300 seri
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::HP9300> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::Huawei
|
||||
|
||||
SNMP Interface to Huawei Layer 3 switches and routers.
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Huawei> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::IBMGbTor
|
||||
|
||||
SNMP Interface to IBM Rackswitch (formerly Blade Network Technologies)
|
||||
network devices.
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::IBMGbTor> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::Juniper
|
||||
|
||||
Subclass for Juniper devices
|
||||
@@ -833,11 +889,22 @@ Subclass for FreeBSD-Based Firewalls using Pf /Pf Sense
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Pf> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::Pica8
|
||||
|
||||
Subclass for Pica8 devices.
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Pica8> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::SonicWALL
|
||||
|
||||
Subclass for generic SonicWALL devices. See documentation in
|
||||
L<SNMP::Info::Layer3::SonicWALL> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::Steelhead
|
||||
|
||||
Subclass for Riverbed Steelhead WAN optimization appliances. See
|
||||
documentation in L<SNMP::Info::Layer3::Steelhead> for details.
|
||||
|
||||
=item SNMP::Info::Layer3::Sun
|
||||
|
||||
Subclass for Generic Sun Routers running SunOS.
|
||||
@@ -1017,6 +1084,20 @@ SNMP::Session object to use instead of connecting on own.
|
||||
|
||||
(default creates session automatically)
|
||||
|
||||
=item Offline
|
||||
|
||||
Causes SNMP::Info to avoid network activity and return data only from its
|
||||
cache. If you ask for something not in the cache, an error is thrown. See
|
||||
also the C<cache()> and C<offline()> methods.
|
||||
|
||||
(default 0, which means "online")
|
||||
|
||||
=item Cache
|
||||
|
||||
Pass in a HashRef to prime the cache of retrieved data. Useful for creating an
|
||||
instance in C<Offline> mode from a previously dumped cache. See also the
|
||||
C<cache()> method to retrieve a cache after running actial queries.
|
||||
|
||||
=item OTHER
|
||||
|
||||
All other arguments are passed to SNMP::Session.
|
||||
@@ -1106,6 +1187,16 @@ sub new {
|
||||
delete $sess_args{IgnoreNetSNMPConf};
|
||||
}
|
||||
|
||||
if ( defined $args{Offline} ) {
|
||||
$new_obj->{Offline} = $args{Offline} || 0;
|
||||
delete $sess_args{Offline};
|
||||
}
|
||||
|
||||
if ( defined $args{Cache} and ref {} eq ref $args{Cache} ) {
|
||||
$new_obj->{$_} = $args{Cache}->{$_} for keys %{$args{Cache}};
|
||||
delete $sess_args{Cache};
|
||||
}
|
||||
|
||||
my $sess = undef;
|
||||
if ( defined $args{Session} ) {
|
||||
$sess = $args{Session};
|
||||
@@ -1230,6 +1321,9 @@ data from a method.
|
||||
Run $info->clear_cache() to clear the cache to allow reload of both globals
|
||||
and table methods.
|
||||
|
||||
The cache can be retreved or set using the $info->cache() method. This works
|
||||
together with the C<Offline> option.
|
||||
|
||||
=head2 Object Scalar Methods
|
||||
|
||||
These are for package related data, not directly supplied
|
||||
@@ -1278,6 +1372,50 @@ sub debug {
|
||||
return $self->{debug};
|
||||
}
|
||||
|
||||
=item $info->offline([1|0])
|
||||
|
||||
Returns if offline mode is currently turned on for this object.
|
||||
|
||||
Optionally sets the Offline parameter.
|
||||
|
||||
=cut
|
||||
|
||||
sub offline {
|
||||
my $self = shift;
|
||||
my $ol = shift;
|
||||
|
||||
if ( defined $ol ) {
|
||||
$self->{Offline} = $ol;
|
||||
}
|
||||
return $self->{Offline};
|
||||
}
|
||||
|
||||
=item $info->cache([new_cache])
|
||||
|
||||
Returns a HashRef of all cached data in this object. There will be a C<store>
|
||||
key for table data and then one key for each leaf.
|
||||
|
||||
Optionally sets the cache parameters if passed a HashRef.
|
||||
|
||||
=cut
|
||||
|
||||
sub cache {
|
||||
my $self = shift;
|
||||
my $data = shift;
|
||||
|
||||
if ( defined $data and ref {} eq ref $data ) {
|
||||
$self->{$_} = $data->{$_} for keys %$data;
|
||||
}
|
||||
|
||||
my $cache = { store => $self->{store} };
|
||||
foreach my $key ( keys %$self ) {
|
||||
next unless defined $key;
|
||||
next unless $key =~ /^_/;
|
||||
$cache->{$key} = $self->{$key};
|
||||
}
|
||||
return $cache;
|
||||
}
|
||||
|
||||
=item $info->bulkwalk([1|0])
|
||||
|
||||
Returns if bulkwalk is currently turned on for this object.
|
||||
@@ -1364,6 +1502,7 @@ sub device_type {
|
||||
11 => 'SNMP::Info::Layer2::HP',
|
||||
18 => 'SNMP::Info::Layer3::BayRS',
|
||||
42 => 'SNMP::Info::Layer3::Sun',
|
||||
43 => 'SNMP::Info::Layer2::3Com',
|
||||
45 => 'SNMP::Info::Layer2::Baystack',
|
||||
171 => 'SNMP::Info::Layer3::Dell',
|
||||
244 => 'SNMP::Info::Layer3::Lantronix',
|
||||
@@ -1372,6 +1511,7 @@ sub device_type {
|
||||
1872 => 'SNMP::Info::Layer3::AlteonAD',
|
||||
1916 => 'SNMP::Info::Layer3::Extreme',
|
||||
1991 => 'SNMP::Info::Layer3::Foundry',
|
||||
2011 => 'SNMP::Info::Layer3::Huawei',
|
||||
2021 => 'SNMP::Info::Layer3::NetSNMP',
|
||||
2272 => 'SNMP::Info::Layer3::Passport',
|
||||
2636 => 'SNMP::Info::Layer3::Juniper',
|
||||
@@ -1387,16 +1527,25 @@ sub device_type {
|
||||
6527 => 'SNMP::Info::Layer3::Timetra',
|
||||
8072 => 'SNMP::Info::Layer3::NetSNMP',
|
||||
9303 => 'SNMP::Info::Layer3::PacketFront',
|
||||
10002 => 'SNMP::Info::Layer2::Ubiquiti',
|
||||
12325 => 'SNMP::Info::Layer3::Pf',
|
||||
12356 => 'SNMP::Info::Layer3::Fortinet',
|
||||
14179 => 'SNMP::Info::Layer2::Airespace',
|
||||
14525 => 'SNMP::Info::Layer2::Trapeze',
|
||||
14823 => 'SNMP::Info::Layer3::Aruba',
|
||||
14988 => 'SNMP::Info::Layer3::Mikrotik',
|
||||
17163 => 'SNMP::Info::Layer3::Steelhead',
|
||||
25506 => 'SNMP::Info::Layer3::H3C',
|
||||
26543 => 'SNMP::Info::Layer3::IBMGbTor',
|
||||
30065 => 'SNMP::Info::Layer3::Arista',
|
||||
35098 => 'SNMP::Info::Layer3::Pica8',
|
||||
41112 => 'SNMP::Info::Layer2::Ubiquiti',
|
||||
);
|
||||
|
||||
my %l2sysoidmap = (
|
||||
9 => 'SNMP::Info::Layer2::Cisco',
|
||||
11 => 'SNMP::Info::Layer2::HP',
|
||||
43 => 'SNMP::Info::Layer2::3Com',
|
||||
45 => 'SNMP::Info::Layer2::Baystack',
|
||||
171 => 'SNMP::Info::Layer3::Dell',
|
||||
207 => 'SNMP::Info::Layer2::Allied',
|
||||
@@ -1404,6 +1553,7 @@ sub device_type {
|
||||
1872 => 'SNMP::Info::Layer3::AlteonAD',
|
||||
1916 => 'SNMP::Info::Layer3::Extreme',
|
||||
1991 => 'SNMP::Info::Layer3::Foundry',
|
||||
2011 => 'SNMP::Info::Layer3::Huawei',
|
||||
2272 => 'SNMP::Info::Layer3::Passport',
|
||||
2925 => 'SNMP::Info::Layer1::Cyclades',
|
||||
3224 => 'SNMP::Info::Layer3::Netscreen',
|
||||
@@ -1411,10 +1561,17 @@ sub device_type {
|
||||
4526 => 'SNMP::Info::Layer2::Netgear',
|
||||
5624 => 'SNMP::Info::Layer3::Enterasys',
|
||||
6486 => 'SNMP::Info::Layer3::AlcatelLucent',
|
||||
9303 => 'SNMP::Info::Layer3::PacketFront',
|
||||
11898 => 'SNMP::Info::Layer2::Orinoco',
|
||||
14179 => 'SNMP::Info::Layer2::Airespace',
|
||||
14525 => 'SNMP::Info::Layer2::Trapeze',
|
||||
14823 => 'SNMP::Info::Layer3::Aruba',
|
||||
17163 => 'SNMP::Info::Layer3::Steelhead',
|
||||
26543 => 'SNMP::Info::Layer3::IBMGbTor',
|
||||
);
|
||||
|
||||
my %l1sysoidmap = (
|
||||
2925 => 'SNMP::Info::Layer1::Cyclades',
|
||||
);
|
||||
|
||||
my %l7sysoidmap = (
|
||||
@@ -1527,6 +1684,27 @@ sub device_type {
|
||||
$objtype = 'SNMP::Info::Layer2::HPVC'
|
||||
if ( $desc =~ /HP\sVC\s/ );
|
||||
|
||||
# Aironet - IOS
|
||||
# Starting with IOS 15, Aironet reports sysServices 6, even though
|
||||
# it still is the same layer2 access point.
|
||||
$objtype = 'SNMP::Info::Layer2::Aironet'
|
||||
if ($desc =~ /\b(C1100|C1130|C1140|AP1200|C350|C1200|C1240|C1250|C2700|C3700)\b/
|
||||
and $desc =~ /\bIOS\b/ );
|
||||
|
||||
# Airespace (WLC) Module
|
||||
$objtype = 'SNMP::Info::Layer2::Airespace'
|
||||
if ( $desc =~ /^Cisco Controller$/ );
|
||||
|
||||
#Nortel 2270
|
||||
$objtype = 'SNMP::Info::Layer2::N2270'
|
||||
if (
|
||||
$desc =~ /Nortel\s+(Networks\s+)??WLAN\s+-\s+Security\s+Switch/ );
|
||||
|
||||
# Nortel (Trapeze) WSS 2300 Series
|
||||
$objtype = 'SNMP::Info::Layer2::NWSS2300'
|
||||
if (
|
||||
$desc =~ /^(Nortel\s)??Wireless\sSecurity\sSwitch\s23[568][012]\b/);
|
||||
|
||||
# Generic device classification based upon sysObjectID
|
||||
if ( ( $objtype eq 'SNMP::Info::Layer3' )
|
||||
and ( defined($id) )
|
||||
@@ -1544,6 +1722,18 @@ sub device_type {
|
||||
|
||||
# Device Type Overrides
|
||||
|
||||
# Bay Hub (Needed here for layers override)
|
||||
$objtype = 'SNMP::Info::Layer1::Bayhub'
|
||||
if ( $desc =~ /\bNMM.*Agent/ );
|
||||
$objtype = 'SNMP::Info::Layer1::Bayhub'
|
||||
if ( $desc =~ /\bBay\s*Stack.*Hub/i );
|
||||
|
||||
# Synoptics Hub (Needed here for layers override)
|
||||
# This will override Bay Hub only for specific devices supported
|
||||
# by this class
|
||||
$objtype = 'SNMP::Info::Layer1::S3000'
|
||||
if ( $desc =~ /\bNMM\s+(281|3000|3030)/i );
|
||||
|
||||
# Catalyst 1900 series override
|
||||
$objtype = 'SNMP::Info::Layer2::C1900'
|
||||
if ( $desc =~ /catalyst/i and $desc =~ /\D19\d{2}/ );
|
||||
@@ -1630,7 +1820,7 @@ sub device_type {
|
||||
|
||||
# Airespace (WLC) Module
|
||||
$objtype = 'SNMP::Info::Layer2::Airespace'
|
||||
if ( $desc =~ /Cisco Controller/ );
|
||||
if ( $desc =~ /^Cisco Controller$/ );
|
||||
|
||||
#Nortel 2270
|
||||
$objtype = 'SNMP::Info::Layer2::N2270'
|
||||
@@ -1641,6 +1831,9 @@ sub device_type {
|
||||
$objtype = 'SNMP::Info::Layer2::HPVC'
|
||||
if ( $desc =~ /HP\sVC\s/ );
|
||||
|
||||
$objtype = 'SNMP::Info::Layer2::ZyXEL_DSLAM'
|
||||
if ( $desc =~ /8-port .DSL Module\(Annex .\)/i );
|
||||
|
||||
# Generic device classification based upon sysObjectID
|
||||
if ( ( $objtype eq 'SNMP::Info::Layer2' )
|
||||
and ( defined($id) )
|
||||
@@ -1664,12 +1857,20 @@ sub device_type {
|
||||
if ( $desc =~ /\bBay\s*Stack.*Hub/i );
|
||||
|
||||
# Synoptics Hub
|
||||
# This will override Bay Hub only for specific devices supported by this class
|
||||
# This will override Bay Hub only for specific devices supported
|
||||
# by this class
|
||||
$objtype = 'SNMP::Info::Layer1::S3000'
|
||||
if ( $desc =~ /\bNMM\s+(281|3000|3030)/i );
|
||||
|
||||
# These devices don't claim to have Layer1-3 but we like em anyways.
|
||||
# Generic device classification based upon sysObjectID
|
||||
if ( ( $objtype eq 'SNMP::Info::Layer1' )
|
||||
and ( defined($id) )
|
||||
and ( exists( $l1sysoidmap{$id} ) ) )
|
||||
{
|
||||
$objtype = $l1sysoidmap{$id};
|
||||
}
|
||||
}
|
||||
# These devices don't claim to have Layer1-3 but we like em anyways.
|
||||
else {
|
||||
$objtype = 'SNMP::Info::Layer2::ZyXEL_DSLAM'
|
||||
if ( $desc =~ /8-port .DSL Module\(Annex .\)/i );
|
||||
@@ -1696,7 +1897,8 @@ sub device_type {
|
||||
|
||||
# Nortel (Trapeze) WSS 2300 Series
|
||||
$objtype = 'SNMP::Info::Layer2::NWSS2300'
|
||||
if ( $desc =~ /\bWireless\sSecurity\sSwitch\s23[568][012]\b/);
|
||||
if (
|
||||
$desc =~ /^(Nortel\s)??Wireless\sSecurity\sSwitch\s23[568][012]\b/);
|
||||
|
||||
# Generic device classification based upon sysObjectID
|
||||
if ( defined($id) and $objtype eq 'SNMP::Info') {
|
||||
@@ -2447,7 +2649,7 @@ sub _get_topo_data {
|
||||
my $topo_cap = shift;
|
||||
my $method = shift;
|
||||
|
||||
return unless $method =~ /(ip|if|port|id|platform)/;
|
||||
return unless $method =~ /(ip|if|port|id|platform|cap)/;
|
||||
|
||||
my %t_data;
|
||||
foreach my $proto (@$topo_cap) {
|
||||
@@ -2602,7 +2804,8 @@ sub c_id {
|
||||
|
||||
Returns reference to hash. Key: iid, Value: Remote Device Type
|
||||
|
||||
Note: LLDP and EDP do not provide this information.
|
||||
Note: EDP does not provide this information. LLDP uses (C<lldpRemSysDesc>)
|
||||
or C<lldp_rem_sysname> as the closest match.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -2624,6 +2827,34 @@ sub c_platform {
|
||||
return _get_topo_data ($self, $partial, $topo_cap, 'platform');
|
||||
}
|
||||
|
||||
=item $info->c_cap(partial, topology_protocol_arrayref)
|
||||
|
||||
Returns reference to hash of arrays. Key: iid, Value: Array of capabilities
|
||||
supported by the device. See the specific protocol class for string values
|
||||
which could be elements within the array.
|
||||
|
||||
Note: Only CDP and LLDP support this method.
|
||||
|
||||
=cut
|
||||
|
||||
sub c_cap {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
my $topo_cap = shift;
|
||||
|
||||
# Default to old behavior if not called with topo_cap
|
||||
if ( !$topo_cap ) {
|
||||
my $topo_test = $self->has_topo();
|
||||
if ($topo_test) {
|
||||
$topo_cap = $topo_test;
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
return _get_topo_data ($self, $partial, $topo_cap, 'cap');
|
||||
}
|
||||
|
||||
=back
|
||||
|
||||
=head1 SETTING DATA VIA SNMP
|
||||
@@ -2677,6 +2908,38 @@ Beware, calling $info->error() clears the error.
|
||||
|
||||
=head1 EXTENDING SNMP::INFO
|
||||
|
||||
To support a new class (vendor or platform) of device, add a Perl package with
|
||||
the data structures and methods listed below.
|
||||
|
||||
If this seems a little scary, then the SNMP::Info developers are usually happy
|
||||
to accept the SNMP data from your device and make an attempt at the class
|
||||
themselves. Usually a "beta" release will go to CPAN for you to verify the
|
||||
implementation.
|
||||
|
||||
=head2 Gathering MIB data for SNMP::Info Developers
|
||||
|
||||
The preference is to open a feature request in the SourceForge project. This
|
||||
allows all developers to have visibility into the request. Please include
|
||||
pointers to the applicable platform MIBs. For development we will need an
|
||||
C<snmpwalk> of the device. There is a tool now included in the SNMP::Info
|
||||
distribution to help with this task, although you'll most likely need to
|
||||
download the distribution from CPAN as it's included in the "C<t/util>"
|
||||
directory.
|
||||
|
||||
The utility is named C<make_snmpdata.pl>. Run it with a command line like:
|
||||
|
||||
./make_snmpdata.pl -c community -i -d device_ip \
|
||||
-m /home/netdisco-mibs/rfc:/home/netdisco-mibs/net-snmp:/home/netdisco-mibs/dir3 \
|
||||
SNMPv2-MIB IF-MIB EtherLike-MIB BRIDGE-MIB Q-BRIDGE-MIB ENTITY-MIB \
|
||||
POWER-ETHERNET-MIB IPV6-MIB LLDP-MIB DEVICE-SPECIFIC-MIB-NAME(s) > output.txt
|
||||
|
||||
This will print to the file every MIB entry with data in a format that the
|
||||
developers can use to emulate read operations without needing access to the
|
||||
device. Preference would be to mask any sensitive data in the output, zip the
|
||||
file, and upload as an attachment to the Sourceforge tracker. However, if you
|
||||
do not feel comfortable uploading the output to the tracker you could e-mail
|
||||
it to the developer that has claimed the ticket.
|
||||
|
||||
=head2 Data Structures required in new Subclass
|
||||
|
||||
A class inheriting this class must implement these data structures :
|
||||
@@ -3164,7 +3427,7 @@ sub munge_mac {
|
||||
|
||||
=item munge_prio_mac()
|
||||
|
||||
Takes an 8-byte octet stream (HEX-STRING) and returns a colon separated ASCII
|
||||
Takes an 2-byte octet stream (HEX-STRING) and returns a colon separated ASCII
|
||||
hex string.
|
||||
|
||||
=cut
|
||||
@@ -3178,6 +3441,22 @@ sub munge_prio_mac {
|
||||
return;
|
||||
}
|
||||
|
||||
=item munge_prio_port()
|
||||
|
||||
Takes an 8-byte octet stream (HEX-STRING) and returns a colon separated ASCII
|
||||
hex string.
|
||||
|
||||
=cut
|
||||
|
||||
sub munge_prio_port {
|
||||
my $mac = shift;
|
||||
return unless defined $mac;
|
||||
return unless length $mac;
|
||||
$mac = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $mac ) );
|
||||
return $mac if $mac =~ /^([0-9A-F][0-9A-F]:){1}[0-9A-F][0-9A-F]$/i;
|
||||
return;
|
||||
}
|
||||
|
||||
=item munge_octet2hex()
|
||||
|
||||
Takes a binary octet stream and returns an ASCII hex string
|
||||
@@ -3217,21 +3496,7 @@ sub munge_bits {
|
||||
my $bits = shift;
|
||||
return unless defined $bits;
|
||||
|
||||
return unpack( "b*", $bits );
|
||||
}
|
||||
|
||||
=item munge_caps
|
||||
|
||||
Takes an octet string and returns an ascii binary string, 7 digits long, MSB.
|
||||
|
||||
=cut
|
||||
|
||||
sub munge_caps {
|
||||
my $caps = shift;
|
||||
return unless defined $caps;
|
||||
|
||||
my $bits = substr( unpack( "B*", $caps ), -7 );
|
||||
return $bits;
|
||||
return unpack( "B*", $bits );
|
||||
}
|
||||
|
||||
=item munge_counter64
|
||||
@@ -3292,15 +3557,15 @@ sub munge_port_list {
|
||||
|
||||
=item munge_null()
|
||||
|
||||
Removes nulls from a string
|
||||
Removes control characters from a string
|
||||
|
||||
=cut
|
||||
|
||||
# munge_null() - removes nulls (\0)
|
||||
# munge_null() - removes nulls (\0) and other control characters
|
||||
sub munge_null {
|
||||
my $text = shift || return;
|
||||
|
||||
$text =~ s/\0//g;
|
||||
$text =~ s/[[:cntrl:]]//g;
|
||||
return $text;
|
||||
}
|
||||
|
||||
@@ -3367,7 +3632,8 @@ sub init {
|
||||
|
||||
foreach my $d (@$mibdirs) {
|
||||
next unless -d $d;
|
||||
print "SNMP::Info::init() - Adding new mibdir:$d\n" if $self->debug();
|
||||
print "SNMP::Info::init() - Adding new mibdir:$d\n"
|
||||
if $self->debug() > 1;
|
||||
SNMP::addMibDirs($d);
|
||||
}
|
||||
|
||||
@@ -3541,22 +3807,25 @@ sub _global {
|
||||
$attr =~ s/^(load|orig)_//;
|
||||
$attr =~ s/_raw$//;
|
||||
|
||||
# Get the callback hash for data munging
|
||||
my $munge = $self->munge();
|
||||
|
||||
# Return cached data unless loading
|
||||
# We now store in raw format so munge before returning
|
||||
# unless expecting raw data
|
||||
if ( defined $self->{"_$attr"} && !$load ) {
|
||||
if ( defined $munge->{$attr} && !$raw ) {
|
||||
my $val = $self->{"_$attr"};
|
||||
my $subref = $munge->{$attr};
|
||||
return &$subref($val);
|
||||
my $val = $self->{"_$attr"};
|
||||
|
||||
if ( !$raw ) {
|
||||
return $self->_munge($attr, $val);
|
||||
} else{
|
||||
return $self->{"_$attr"};
|
||||
return $val;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $self->{Offline} ) {
|
||||
$self->error_throw(
|
||||
"SNMP::Info::_global: Offline but $attr is not in cache\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( $self->debug() ) {
|
||||
# Let's get the MIB Module and leaf name along with the OID
|
||||
my $qual_leaf = SNMP::translateObj($oid,0,1) || '';
|
||||
@@ -3584,12 +3853,11 @@ sub _global {
|
||||
}
|
||||
|
||||
# Save Cached Value
|
||||
$self->{"_$attr"} = $val;
|
||||
$self->_cache($attr, $val);
|
||||
|
||||
# Data Munging
|
||||
if ( defined $munge->{$attr} && !$raw ) {
|
||||
my $subref = $munge->{$attr};
|
||||
$val = &$subref($val);
|
||||
if ( !$raw ) {
|
||||
$val = $self->_munge($attr, $val);
|
||||
}
|
||||
|
||||
return $val;
|
||||
@@ -3866,7 +4134,6 @@ sub _load_attr {
|
||||
my $ver = $self->snmp_ver();
|
||||
my $nosuch = $self->nosuch();
|
||||
my $store = $self->store();
|
||||
my $munge = $self->munge();
|
||||
|
||||
my $load = $method =~ /^load/;
|
||||
my $raw = $method =~ /raw$/;
|
||||
@@ -3883,6 +4150,12 @@ sub _load_attr {
|
||||
&& !$load
|
||||
&& !defined $partial );
|
||||
|
||||
if ( $self->{Offline} ) {
|
||||
$self->error_throw(
|
||||
"SNMP::Info::_load_atrr: Offline but $attr is not in cache\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
# We want the qualified leaf name so that we can
|
||||
# specify the Module (MIB) in the case of private leaf naming
|
||||
# conflicts. Example: ALTEON-TIGON-SWITCH-MIB::agSoftwareVersion
|
||||
@@ -4046,24 +4319,14 @@ sub _load_attr {
|
||||
|
||||
# Cache data if we are not getting partial data:
|
||||
if ( !defined $partial ) {
|
||||
$self->{"_${attr}"}++;
|
||||
$store->{$attr} = $localstore;
|
||||
$self->_cache($attr, $localstore);
|
||||
}
|
||||
|
||||
# Data Munging
|
||||
# Checks for an entry in %munge and munges values unless we expect
|
||||
# raw data
|
||||
if ( defined $munge->{$attr} && !$raw ) {
|
||||
my $subref = $munge->{$attr};
|
||||
my %munged;
|
||||
foreach my $key ( keys %$localstore ) {
|
||||
my $value = $localstore->{$key};
|
||||
next unless $key;
|
||||
my $munged_value = &$subref($value);
|
||||
$munged{$key} = $munged_value;
|
||||
}
|
||||
return \%munged;
|
||||
if ( !$raw ) {
|
||||
$localstore = $self->_munge($attr, $localstore);
|
||||
}
|
||||
|
||||
return $localstore;
|
||||
}
|
||||
}
|
||||
@@ -4072,11 +4335,6 @@ sub _load_attr {
|
||||
|
||||
Used internally by AUTOLOAD to return data called by methods listed in %FUNCS.
|
||||
|
||||
Called like $info->METHOD().
|
||||
|
||||
The first time ran, it will call $info->load_METHOD().
|
||||
Every time after it will return cached data.
|
||||
|
||||
=cut
|
||||
|
||||
sub _show_attr {
|
||||
@@ -4086,20 +4344,9 @@ sub _show_attr {
|
||||
|
||||
my $store = $self->store();
|
||||
|
||||
# Get the callback hash for data munging
|
||||
my $munge = $self->munge();
|
||||
|
||||
if ( defined $munge->{$attr} && !$raw ) {
|
||||
if ( !$raw ) {
|
||||
my $localstore = $store->{$attr};
|
||||
my $subref = $munge->{$attr};
|
||||
my %munged;
|
||||
foreach my $key ( keys %$localstore ) {
|
||||
my $value = $localstore->{$key};
|
||||
next unless $key;
|
||||
my $munged_value = &$subref($value);
|
||||
$munged{$key} = $munged_value;
|
||||
}
|
||||
return \%munged;
|
||||
return $self->_munge($attr, $localstore);
|
||||
}
|
||||
else {
|
||||
return $store->{$attr};
|
||||
@@ -4118,6 +4365,7 @@ sub snmp_connect_ip {
|
||||
my $ver = $self->snmp_ver();
|
||||
my $comm = $self->snmp_comm();
|
||||
|
||||
return if $self->{Offline};
|
||||
return if ( $ip eq '0.0.0.0' ) or ( $ip =~ /^127\./ );
|
||||
|
||||
# Create session object
|
||||
@@ -4173,6 +4421,66 @@ sub modify_port_list {
|
||||
return pack( "B*", join( '', @$portlist ) );
|
||||
}
|
||||
|
||||
=item $info->_cache(attr, data)
|
||||
|
||||
Cache retrieved data so that if it's asked for again, we use the cache instead
|
||||
of going back to Net-SNMP. Data is cached inside the blessed hashref C<$self>.
|
||||
|
||||
Accepts the leaf and value (scalar, or hashref for a table). Does not return
|
||||
anything useful.
|
||||
|
||||
=cut
|
||||
|
||||
sub _cache {
|
||||
my $self = shift;
|
||||
my ($attr, $data) = @_;
|
||||
my $store = $self->store();
|
||||
|
||||
if (ref {} eq ref $data) {
|
||||
$self->{"_${attr}"}++;
|
||||
$store->{$attr} = $data;
|
||||
}
|
||||
else {
|
||||
$self->{"_$attr"} = $data;
|
||||
}
|
||||
}
|
||||
|
||||
=item $info->_munge(attr, data)
|
||||
|
||||
Raw data returned from Net-SNMP might not be formatted correctly or might have
|
||||
platform-specific bugs or mistakes. The MUNGE feature of SNMP::Info allows for
|
||||
fixups to take place.
|
||||
|
||||
Accepts the leaf and value (scalar, or hashref for a table) and returns the raw
|
||||
or the munged data, as appropriate. That is, you do not need to know whether
|
||||
MUNGE is installed, and it's safe to call this method regardless.
|
||||
|
||||
=cut
|
||||
|
||||
sub _munge {
|
||||
my $self = shift;
|
||||
my ($attr, $data) = @_;
|
||||
my $munge = $self->munge();
|
||||
|
||||
return $data unless defined $munge->{$attr};
|
||||
|
||||
if (ref {} eq ref $data) {
|
||||
my $subref = $munge->{$attr};
|
||||
my %munged;
|
||||
foreach my $key ( keys %$data ) {
|
||||
my $value = $data->{$key};
|
||||
next unless defined $value;
|
||||
$munged{$key} = $subref->($value);
|
||||
}
|
||||
return \%munged;
|
||||
}
|
||||
else {
|
||||
return unless $data;
|
||||
my $subref = $munge->{$attr};
|
||||
return $subref->($data);
|
||||
}
|
||||
}
|
||||
|
||||
=item _validate_autoload_method(method)
|
||||
|
||||
Used internally by AUTOLOAD to validate that a dynamic method should be
|
||||
@@ -4248,7 +4556,8 @@ sub _validate_autoload_method {
|
||||
my $table_leaf = 0;
|
||||
|
||||
if ( !$globals->{$attr}
|
||||
&& ( defined $indexes && scalar( @{$indexes} ) > 0 ) )
|
||||
&& ( ( defined $indexes && scalar( @{$indexes} ) > 0 )
|
||||
|| $funcs->{$attr} ))
|
||||
{
|
||||
$table_leaf = 1;
|
||||
}
|
||||
@@ -4285,14 +4594,7 @@ sub can {
|
||||
my $method = shift;
|
||||
|
||||
# use results of parent can()
|
||||
my $meth_ref = $self->SUPER::can($method);
|
||||
|
||||
# Don't return if passed $super as it means we were called
|
||||
# from AUTOLOAD for a method that hasn't been generated yet.
|
||||
if ($meth_ref) {
|
||||
return $meth_ref
|
||||
unless ( defined $AUTOLOAD && $AUTOLOAD =~ /SUPER::$method$/ );
|
||||
}
|
||||
return $self->SUPER::can($method) if $self->SUPER::can($method);
|
||||
|
||||
my $validated = $self->_validate_autoload_method($method);
|
||||
return unless $validated;
|
||||
@@ -4359,7 +4661,7 @@ subclass.
|
||||
=cut
|
||||
|
||||
sub AUTOLOAD {
|
||||
my $self = shift;
|
||||
my $self = shift;
|
||||
my ($sub_name) = $AUTOLOAD =~ /::(\w+)$/;
|
||||
|
||||
return if $sub_name =~ /DESTROY$/;
|
||||
@@ -4377,10 +4679,19 @@ sub AUTOLOAD {
|
||||
);
|
||||
}
|
||||
|
||||
# This enables us to use SUPER:: for AUTOLOAD methods as well
|
||||
# as the true OO methods. Method needs to be renamed to prevent
|
||||
# namespace collision when we insert into the symbol table later.
|
||||
if ( $AUTOLOAD =~ /SUPER::$sub_name$/ ) {
|
||||
$AUTOLOAD =~ s/SUPER::$sub_name/orig_$sub_name/;
|
||||
$sub_name = "orig_$sub_name";
|
||||
}
|
||||
|
||||
return unless my $meth_ref = $self->can($sub_name, @_);
|
||||
return $self->$meth_ref(@_);
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
@@ -38,7 +38,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS
|
||||
= ( 'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', );
|
||||
|
||||
@@ -38,7 +38,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' );
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# $Id$
|
||||
# SNMP::Info::Aggregate
|
||||
#
|
||||
# Copyright (c) 2005 Matt Tuttle
|
||||
# Copyright (c) 2014 SNMP::Info Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
@@ -27,88 +27,103 @@
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoImage;
|
||||
package SNMP::Info::Aggregate;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoImage::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoImage::EXPORT_OK = qw//;
|
||||
@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.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( 'CISCO-IMAGE-MIB' => 'ciscoImageString', );
|
||||
%MIBS = (); # IF-MIB
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = ( 'ci_images' => 'ciscoImageString', );
|
||||
%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::CiscoImage - SNMP Interface to image strings for Cisco Devices
|
||||
SNMP::Info::Aggregate - SNMP Interface to ifStackTable Aggregated Links
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Matt Tuttle (C<mtuttle@americanhebrewacademy.org>)
|
||||
SNMP::Info Developers
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ci = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
# 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 = $ci->class();
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoImage is a subclass of SNMP::Info that provides access to
|
||||
image strings embedded in an image running on Cisco Devices.
|
||||
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
|
||||
|
||||
None.
|
||||
L<SNMP::Info>
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-IMAGE-MIB>
|
||||
=item F<IF-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
=head1 METHODS
|
||||
|
||||
=head1 GLOBALS
|
||||
=over 4
|
||||
|
||||
None.
|
||||
=item C<agg_ports_ifstack>
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=over
|
||||
|
||||
=item $ci->ci_images()
|
||||
|
||||
Returns the table of image strings.
|
||||
|
||||
C<ciscoImageString>
|
||||
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
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
@@ -577,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;
|
||||
@@ -688,42 +695,52 @@ sub 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 $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} || '';
|
||||
|
||||
# Four cases:
|
||||
# IOS and 2.4Ghz count up, starts at zero
|
||||
if ($ios and $ap_type =~ /b$/) {
|
||||
$last = $last + ($ssid_idx - 1);
|
||||
|
||||
# 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 );
|
||||
}
|
||||
}
|
||||
# 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;
|
||||
|
||||
push( @parts, $last );
|
||||
my $bssid = join( ':', map { sprintf( "%02x", $_ ) } @parts );
|
||||
$i_ssidmac{$oid} = $bssid;
|
||||
}
|
||||
|
||||
return \%i_ssidmac;
|
||||
return \%i_ssidmac;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
@@ -1225,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>)
|
||||
@@ -1257,7 +1271,7 @@ Returns reference to hash. Indicates whether the SSID is broadcast.
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface.
|
||||
|
||||
=item $dot11->dot11_cur_tx_pwr_mw()
|
||||
=item $airespace->dot11_cur_tx_pwr_mw()
|
||||
|
||||
Returns reference to hash. Current transmit power, in milliwatts, of the
|
||||
radio interface.
|
||||
@@ -1678,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()
|
||||
|
||||
@@ -1809,6 +1823,24 @@ 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
|
||||
|
||||
175
Info/Bridge.pm
175
Info/Bridge.pm
@@ -42,7 +42,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
'BRIDGE-MIB' => 'dot1dBaseBridgeAddress',
|
||||
@@ -84,6 +84,17 @@ $VERSION = '3.04_001';
|
||||
'bs_to' => 'dot1dStaticAllowedToGoTo',
|
||||
'bs_status' => 'dot1dStaticStatus',
|
||||
|
||||
# These leafs are not part of a table, but placed here
|
||||
# to return a hash reference to ease API compatibility with
|
||||
# MST and PVST implementations indexed by a spanning tree
|
||||
# instance id
|
||||
'stp_i_mac' => 'dot1dBaseBridgeAddress',
|
||||
'stp_i_time' => 'dot1dStpTimeSinceTopologyChange',
|
||||
'stp_i_ntop' => 'dot1dStpTopChanges',
|
||||
'stp_i_root' => 'dot1dStpDesignatedRoot',
|
||||
'stp_i_root_port' => 'dot1dStpRootPort',
|
||||
'stp_i_priority' => 'dot1dStpPriority',
|
||||
|
||||
# Spanning Tree Protocol Table : dot1dStpPortTable
|
||||
'stp_p_id' => 'dot1dStpPort',
|
||||
'stp_p_priority' => 'dot1dStpPortPriority',
|
||||
@@ -125,15 +136,18 @@ $VERSION = '3.04_001';
|
||||
'b_mac' => \&SNMP::Info::munge_mac,
|
||||
'fw_mac' => \&SNMP::Info::munge_mac,
|
||||
'bs_mac' => \&SNMP::Info::munge_mac,
|
||||
'stp_root' => \&SNMP::Info::munge_mac,
|
||||
'stp_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_i_mac' => \&SNMP::Info::munge_mac,
|
||||
'stp_i_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_bridge' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_port' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_port' => \&SNMP::Info::munge_prio_port,
|
||||
'qb_cv_egress' => \&SNMP::Info::munge_port_list,
|
||||
'qb_cv_untagged' => \&SNMP::Info::munge_port_list,
|
||||
'qb_v_egress' => \&SNMP::Info::munge_port_list,
|
||||
'qb_v_fbdn_egress' => \&SNMP::Info::munge_port_list,
|
||||
'qb_v_untagged' => \&SNMP::Info::munge_port_list,
|
||||
'qb_cv_untagged' => \&SNMP::Info::munge_port_list,
|
||||
|
||||
);
|
||||
|
||||
@@ -163,10 +177,20 @@ sub qb_fw_vlan {
|
||||
my $partial = shift;
|
||||
|
||||
my $qb_fw_port = $bridge->qb_fw_port($partial);
|
||||
my $qb_fdb_ids = $bridge->qb_fdb_index() || {};
|
||||
|
||||
|
||||
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;
|
||||
# Many devices do not populate the dot1qVlanCurrentTable, so default
|
||||
# to FDB ID = VID, but if we have a mapping use it.
|
||||
my $vlan = $fdb_id;
|
||||
# defined as test since some devices have a vlan 0
|
||||
if (defined $qb_fdb_ids->{$fdb_id}) {
|
||||
$vlan = $qb_fdb_ids->{$fdb_id};
|
||||
}
|
||||
$qb_fw_vlan->{$idx} = $vlan;
|
||||
}
|
||||
return $qb_fw_vlan;
|
||||
}
|
||||
@@ -189,6 +213,54 @@ sub qb_i_vlan_t {
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub qb_fdb_index {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Some devices may not implement TimeFilter in a standard manner
|
||||
# appearing to loop on this request. Override in the device class,
|
||||
# see Enterasys for example.
|
||||
my $qb_fdb_ids = $bridge->dot1qVlanFdbId() || {};
|
||||
|
||||
# Strip the TimeFilter
|
||||
my $vl_fdb_index = {};
|
||||
for my $fdb_entry (keys(%$qb_fdb_ids)) {
|
||||
(my $vlan = $fdb_entry) =~ s/^\d+\.//;
|
||||
$vl_fdb_index->{$qb_fdb_ids->{$fdb_entry}} = $vlan;
|
||||
}
|
||||
|
||||
return $vl_fdb_index;
|
||||
}
|
||||
|
||||
# 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;
|
||||
@@ -308,24 +380,37 @@ sub i_vlan {
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_untagged { goto &i_vlan }
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $bridge->bp_index();
|
||||
# Use VlanCurrentTable if available since it will include dynamic
|
||||
# VLANs. However, some devices do not populate the table.
|
||||
my $v_ports = $bridge->qb_cv_egress() || $bridge->qb_v_egress();
|
||||
|
||||
return $bridge->_vlan_hoa($v_ports, $partial);
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Use VlanCurrentTable if available since it will include dynamic
|
||||
# VLANs. However, some devices do not populate the table.
|
||||
my $v_ports = $bridge->qb_cv_untagged() || $bridge->qb_v_untagged();
|
||||
|
||||
# 11/07 - Todo: Issue with some devices trying to query VlanCurrentTable
|
||||
# as table may grow very large with frequent VLAN changes.
|
||||
# 06/08 - VlanCurrentTable may be due to timefilter, should query with
|
||||
# zero partial for no time filter.
|
||||
# my $v_ports = $bridge->qb_cv_egress() || $bridge->qb_v_egress();
|
||||
return $bridge->_vlan_hoa($v_ports, $partial);
|
||||
}
|
||||
|
||||
my $v_ports = $bridge->qb_v_egress() || {};
|
||||
sub _vlan_hoa {
|
||||
my $bridge = shift;
|
||||
my ( $v_ports, $partial ) = @_;
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
my $index = $bridge->bp_index();
|
||||
|
||||
my $vlan_hoa = {};
|
||||
foreach my $idx ( keys %$v_ports ) {
|
||||
next unless ( defined $v_ports->{$idx} );
|
||||
my $portlist = $v_ports->{$idx};
|
||||
@@ -345,10 +430,10 @@ sub i_vlan_membership {
|
||||
my $ifindex = $index->{$port};
|
||||
next unless ( defined($ifindex) ); # shouldn't happen
|
||||
next if ( defined $partial and $ifindex !~ /^$partial$/ );
|
||||
push( @{ $i_vlan_membership->{$ifindex} }, $vlan );
|
||||
push( @{ $vlan_hoa->{$ifindex} }, $vlan );
|
||||
}
|
||||
}
|
||||
return $i_vlan_membership;
|
||||
return $vlan_hoa;
|
||||
}
|
||||
|
||||
sub set_i_pvid {
|
||||
@@ -365,6 +450,8 @@ sub set_i_vlan {
|
||||
return;
|
||||
}
|
||||
|
||||
sub set_i_untagged { goto &set_i_vlan }
|
||||
|
||||
sub set_add_i_vlan_tagged {
|
||||
my $bridge = shift;
|
||||
|
||||
@@ -597,6 +684,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
|
||||
@@ -612,11 +703,21 @@ IDs. These are the VLANs which are members of the egress list for the port.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $bridge->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $bridge->qb_i_vlan_t()
|
||||
|
||||
Returns reference to hash: key = C<dot1dBasePort>, value = either 'trunk' for
|
||||
tagged ports or the VLAN ID.
|
||||
|
||||
=item $bridge->qb_fdb_index()
|
||||
|
||||
Returns reference to hash: key = VLAN ID, value = FDB ID.
|
||||
|
||||
=item $bridge->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
@@ -670,6 +771,48 @@ to this port.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Spanning Tree Instance Globals
|
||||
|
||||
These are not part of a table, but return a hash reference to ease API
|
||||
compatibility with MST and PVST implementations indexed by a spanning tree
|
||||
instance id.
|
||||
|
||||
=over
|
||||
|
||||
=item $bridge->stp_i_time()
|
||||
|
||||
Returns time since last topology change detected. (100ths/second)
|
||||
|
||||
(C<dot1dStpTimeSinceTopologyChange>)
|
||||
|
||||
=item $bridge->stp_i_time()
|
||||
|
||||
Returns the total number of topology changes detected.
|
||||
|
||||
(C<dot1dStpTopChanges>)
|
||||
|
||||
=item $bridge->stp_i_root()
|
||||
|
||||
Returns root of STP.
|
||||
|
||||
(C<dot1dStpDesignatedRoot>)
|
||||
|
||||
=item $bridge->stp_i_root_port()
|
||||
|
||||
Returns the port number of the port that offers the lowest cost path
|
||||
to the root bridge.
|
||||
|
||||
(C<dot1dStpRootPort>)
|
||||
|
||||
=item $bridge->stp_i_priority()
|
||||
|
||||
Returns the port number of the port that offers the lowest cost path
|
||||
to the root bridge.
|
||||
|
||||
(C<dot1dStpPriority>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Spanning Tree Protocol Table (C<dot1dStpPortTable>)
|
||||
|
||||
Descriptions are straight from F<BRIDGE-MIB.my>
|
||||
@@ -893,6 +1036,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.
|
||||
|
||||
118
Info/CDP.pm
118
Info/CDP.pm
@@ -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 = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
# Five data structures required by SNMP::Info
|
||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
|
||||
@@ -61,7 +62,7 @@ $VERSION = '3.04_001';
|
||||
'cdp_proto' => 'cdpCacheAddressType',
|
||||
'cdp_addr' => 'cdpCacheAddress',
|
||||
'cdp_ver' => 'cdpCacheVersion',
|
||||
'cdp_id' => 'cdpCacheDeviceId',
|
||||
'cdp_dev_id' => 'cdpCacheDeviceId',
|
||||
'cdp_port' => 'cdpCacheDevicePort',
|
||||
'cdp_platform' => 'cdpCachePlatform',
|
||||
'cdp_capabilities' => 'cdpCacheCapabilities',
|
||||
@@ -76,17 +77,30 @@ $VERSION = '3.04_001';
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'cdp_capabilities' => \&SNMP::Info::munge_caps,
|
||||
'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 );
|
||||
@@ -160,6 +174,57 @@ sub cdp_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;
|
||||
}
|
||||
|
||||
sub cdp_id {
|
||||
my $cdp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ch = $cdp->cdp_dev_id($partial) || {};
|
||||
|
||||
my %cdp_id;
|
||||
foreach my $key ( sort keys %$ch ) {
|
||||
my $id = $ch->{$key};
|
||||
next unless $id;
|
||||
$id = SNMP::Info::munge_mac($id) || SNMP::Info::munge_null($id);
|
||||
$cdp_id{$key} = $id;
|
||||
}
|
||||
return \%cdp_id;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -283,39 +348,48 @@ to a hash.
|
||||
=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>)
|
||||
|
||||
@@ -427,6 +501,14 @@ 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
|
||||
|
||||
150
Info/CiscoAgg.pm
Normal file
150
Info/CiscoAgg.pm
Normal file
@@ -0,0 +1,150 @@
|
||||
# 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.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::IEEE802dot3ad::MIBS,
|
||||
'CISCO-PAGP-MIB' => 'pagpGroupIfIndex',
|
||||
);
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = ();
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub agg_ports_pagp {
|
||||
my $dev = shift;
|
||||
|
||||
# Note that this mapping will miss any interfaces that are down during
|
||||
# polling. If one of the members is up, we could use
|
||||
# pagpAdminGroupCapability to figure things out, but if they're all
|
||||
# down, we're hosed. Since we could be hosed anyway, we skip the fancy
|
||||
# stuff.
|
||||
my $mapping = {};
|
||||
my $group = $dev->pagpGroupIfIndex;
|
||||
for my $slave (keys %$group) {
|
||||
my $master = $group->{$slave};
|
||||
next if($master == 0 || $slave == $master);
|
||||
|
||||
$mapping->{$slave} = $master;
|
||||
}
|
||||
|
||||
return $mapping;
|
||||
}
|
||||
|
||||
# until we have PAgP data and need to combine with LAG data
|
||||
sub agg_ports {
|
||||
my $ret = {%{agg_ports_pagp(@_)}, %{agg_ports_lag(@_)}};
|
||||
return $ret;
|
||||
}
|
||||
|
||||
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>
|
||||
|
||||
Implements the PAgP LAG info retrieval. Merged into C<agg_ports> data
|
||||
automatically.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
|
||||
|
||||
@@ -38,7 +38,7 @@ use Exporter;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
|
||||
'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' );
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', );
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );
|
||||
|
||||
|
||||
@@ -32,14 +32,13 @@ package SNMP::Info::CiscoStack;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoStack::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStack::ISA = qw/Exporter/;
|
||||
@SNMP::Info::CiscoStack::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
'SNMPv2-MIB' => 'sysDescr',
|
||||
@@ -88,6 +88,9 @@ $VERSION = '3.04_001';
|
||||
|
||||
# CISCO-FLASH-MIB::ciscoFlashDeviceTable
|
||||
'cisco_flash_size' => 'ciscoFlashDeviceSize',
|
||||
|
||||
# CISCO-IMAGE-MIB
|
||||
'ci_images' => 'ciscoImageString',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
@@ -103,6 +106,7 @@ sub os {
|
||||
# order here matters - there are Catalysts that run IOS and have catalyst
|
||||
# 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/ );
|
||||
@@ -198,6 +202,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
|
||||
@@ -409,6 +420,7 @@ Available values:
|
||||
|
||||
'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
|
||||
@@ -530,4 +542,16 @@ zero if the device has been removed.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Cisco Image Table (C<ciscoImageTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ci->ci_images()
|
||||
|
||||
Returns the table of image strings.
|
||||
|
||||
C<ciscoImageString>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
@@ -36,7 +36,7 @@ use SNMP::Info::Bridge;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
@SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//;
|
||||
|
||||
101
Info/CiscoVTP.pm
101
Info/CiscoVTP.pm
@@ -41,7 +41,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-VTP-MIB' => 'vtpVlanName',
|
||||
@@ -149,6 +149,7 @@ sub i_vlan {
|
||||
|
||||
my $port_vlan = $vtp->vtp_trunk_native($partial) || {};
|
||||
my $i_vlan = $vtp->i_vlan2($partial) || {};
|
||||
my $trunk_dyn = $vtp->vtp_trunk_dyn($partial) || {};
|
||||
my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
|
||||
|
||||
my %i_vlans;
|
||||
@@ -165,15 +166,23 @@ sub i_vlan {
|
||||
foreach my $port ( keys %$port_vlan ) {
|
||||
my $vlan = $port_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
|
||||
# ports up and trunking should have a trunking status
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
if ( defined $stat and $stat =~ /^trunking/ ) {
|
||||
|
||||
# vtp_trunk_dyn_stat is not useful for down ports
|
||||
# so we use vtp_trunk_dyn to see if trunking is set
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
|
||||
if (($stat and $stat =~ /^trunking/ )
|
||||
or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))))
|
||||
{
|
||||
$i_vlans{$port} = $vlan;
|
||||
}
|
||||
}
|
||||
|
||||
# Check in CISCO-VLAN-IFTABLE-RELATION-MIB
|
||||
# Is this only for Aironet??? If so, it needs
|
||||
# to be removed from this class
|
||||
# Used for traditional Cisco Routers and Aironet
|
||||
|
||||
my $v_cvi_if = $vtp->v_cvi_if();
|
||||
if ( defined $v_cvi_if ) {
|
||||
@@ -191,6 +200,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;
|
||||
@@ -202,6 +227,8 @@ sub i_vlan_membership {
|
||||
my $vtp_vlans = $vtp->v_state();
|
||||
my $i_vlan = $vtp->i_vlan2($partial) || {};
|
||||
my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
|
||||
my $trunk_dyn = $vtp->vtp_trunk_dyn($partial) || {};
|
||||
my $i_voice_vlan = $vtp->i_voice_vlan($partial) || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
|
||||
@@ -209,14 +236,24 @@ sub i_vlan_membership {
|
||||
foreach my $port ( keys %$i_vlan ) {
|
||||
my $vlan = $i_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
if ( defined $stat and $stat =~ /notTrunking/ ) {
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
}
|
||||
|
||||
# Get voice VLANs
|
||||
foreach my $port ( keys %$i_voice_vlan ) {
|
||||
my $vlan = $i_voice_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
next unless ($vlan =~ m/[[:digit:]]+/ and $vlan < 4095);
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
}
|
||||
|
||||
# Get trunk ports
|
||||
|
||||
my %oper_vlans;
|
||||
foreach my $iid ( keys %$vtp_vlans ) {
|
||||
my $vlan = 0;
|
||||
@@ -233,7 +270,9 @@ sub i_vlan_membership {
|
||||
|
||||
foreach my $port ( keys %$ports_vlans ) {
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
if ( defined $stat and $stat =~ /^trunking/ ) {
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
if (($stat and $stat =~ /^trunking/ )
|
||||
or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate')))) {
|
||||
my $k = 0;
|
||||
my $list1 = $ports_vlans->{$port} || '0';
|
||||
my $list2 = $ports_vlans_2k->{$port} || '0';
|
||||
@@ -255,6 +294,20 @@ sub i_vlan_membership {
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $vtp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlans = $vtp->i_vlan($partial);
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $port (keys %$vlans) {
|
||||
my $vlan = $vlans->{$port};
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub set_i_pvid {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
@@ -306,6 +359,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 ) = @_;
|
||||
@@ -540,6 +609,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
|
||||
@@ -555,6 +628,12 @@ IDs. These are the VLANs which are members of enabled VLAN list for the port.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $vtp->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Table (C<CISCO-VTP-MIB::vtpVlanTable>)
|
||||
@@ -835,6 +914,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
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
'EXTREME-EDP-MIB' => 'extremeEdpPortIfIndex',
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
|
||||
|
||||
|
||||
10
Info/FDP.pm
10
Info/FDP.pm
@@ -42,7 +42,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
|
||||
|
||||
@@ -68,7 +68,7 @@ $VERSION = '3.04_001';
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'fdp_capabilities' => \&SNMP::Info::munge_caps,
|
||||
'fdp_capabilities' => \&SNMP::Info::munge_bits,
|
||||
'fdp_ip' => \&SNMP::Info::munge_ip
|
||||
);
|
||||
|
||||
@@ -289,8 +289,7 @@ CDP compatibility
|
||||
=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>:
|
||||
|
||||
@@ -320,8 +319,7 @@ 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>)
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ use Exporter;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );
|
||||
|
||||
|
||||
141
Info/IEEE802dot3ad.pm
Normal file
141
Info/IEEE802dot3ad.pm
Normal 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.30';
|
||||
|
||||
%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
|
||||
29
Info/IPv6.pm
29
Info/IPv6.pm
@@ -44,7 +44,7 @@ use constant {
|
||||
IPV6MIB => 3,
|
||||
};
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
|
||||
|
||||
@@ -321,6 +321,29 @@ sub ipv6_addr_prefix {
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_addr {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $indexes = $info->ipv6_index();
|
||||
foreach my $row (keys %$indexes) {
|
||||
my @parts = split(/\./, $row);
|
||||
my $is_valid = 0;
|
||||
if (scalar @parts == 18) {
|
||||
my $addrtype = shift @parts;
|
||||
$is_valid = 1;
|
||||
} elsif (scalar @parts == 17) {
|
||||
$is_valid = 1;
|
||||
}
|
||||
my $addrsize = shift @parts; # First element now is addrsize, should be 16
|
||||
if ($is_valid && $addrsize == 16) {
|
||||
$return->{$row} = join(':', unpack('(H4)*', pack('C*', @parts)));
|
||||
} else {
|
||||
warn sprintf("%s: unable to decode table index to IPv6 address. Raw data is [%s].\n", &_my_sub_name, $row);
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub _method_used {
|
||||
my $info = shift;
|
||||
my $return = 'none of the MIBs';
|
||||
@@ -459,6 +482,10 @@ Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.)
|
||||
|
||||
Maps IPv6 addresses with their prefixes
|
||||
|
||||
=item $info->ipv6_addr()
|
||||
|
||||
Maps a table instance to an IPv6 address
|
||||
|
||||
=back
|
||||
|
||||
=head2 Internet Address Translation Table
|
||||
|
||||
176
Info/LLDP.pm
176
Info/LLDP.pm
@@ -39,7 +39,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
'LLDP-MIB' => 'lldpLocSysCapEnabled',
|
||||
@@ -67,6 +67,7 @@ $VERSION = '3.04_001';
|
||||
'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 = '3.04_001';
|
||||
'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 {
|
||||
@@ -88,8 +90,12 @@ sub hasLLDP {
|
||||
# We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
|
||||
# so we could be running LLDP but not return any useful information
|
||||
my $lldp_cap = $lldp->lldp_sys_cap();
|
||||
|
||||
return 1 if defined $lldp_cap;
|
||||
|
||||
# If the device doesn't return local system capabilities, fallback by checking if it would report neighbors
|
||||
my $lldp_rem = $lldp->lldp_rem_id() || {};
|
||||
return 1 if scalar keys %$lldp_rem;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -98,11 +104,11 @@ sub lldp_if {
|
||||
my $partial = shift;
|
||||
|
||||
my $addr = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $i_descr = $lldp->i_description() || {};
|
||||
my $i_alias = $lldp->i_alias() || {};
|
||||
my $i_descr = $lldp->i_description() || {};
|
||||
my $i_alias = $lldp->i_alias() || {};
|
||||
my %r_i_descr = reverse %$i_descr;
|
||||
my %r_i_alias = reverse %$i_alias;
|
||||
|
||||
|
||||
my %lldp_if;
|
||||
foreach my $key ( keys %$addr ) {
|
||||
my @aOID = split( '\.', $key );
|
||||
@@ -113,14 +119,15 @@ sub lldp_if {
|
||||
# prefer ifDescr over ifAlias because using cross ref with description is correct behavior
|
||||
# according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though.
|
||||
my $lldp_desc = $lldp->lldpLocPortDesc($port);
|
||||
my $desc = $lldp_desc->{$port};
|
||||
my $desc = $lldp_desc->{$port};
|
||||
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
|
||||
if ( exists $r_i_descr{$desc} ) {
|
||||
if ( $desc && exists $r_i_descr{$desc} ) {
|
||||
$port = $r_i_descr{$desc};
|
||||
} elsif ( exists $r_i_alias{$desc} ) {
|
||||
}
|
||||
elsif ( $desc && exists $r_i_alias{$desc} ) {
|
||||
$port = $r_i_alias{$desc};
|
||||
}
|
||||
|
||||
|
||||
$lldp_if{$key} = $port;
|
||||
}
|
||||
return \%lldp_if;
|
||||
@@ -142,6 +149,38 @@ sub lldp_ip {
|
||||
return \%lldp_ip;
|
||||
}
|
||||
|
||||
sub lldp_ipv6 {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ipv6;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
next unless $proto == 2;
|
||||
$lldp_ipv6{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ipv6;
|
||||
}
|
||||
|
||||
sub lldp_mac {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ipv6;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
next unless $proto == 6;
|
||||
$lldp_ipv6{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ipv6;
|
||||
}
|
||||
|
||||
sub lldp_addr {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
@@ -164,14 +203,21 @@ sub lldp_port {
|
||||
my $pdesc = $lldp->lldp_rem_desc($partial) || {};
|
||||
my $pid = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $ptype = $lldp->lldp_rem_pid_type($partial) || {};
|
||||
my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
|
||||
|
||||
my %lldp_port;
|
||||
foreach my $key ( sort keys %$pid ) {
|
||||
my $port = $pdesc->{$key};
|
||||
my $type = $ptype->{$key};
|
||||
if ( $type and $type eq 'interfaceName' ) {
|
||||
|
||||
# If the pid claims to be an interface name,
|
||||
# believe it.
|
||||
$port = $pid->{$key};
|
||||
}
|
||||
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
|
||||
@@ -183,8 +229,12 @@ sub lldp_port {
|
||||
|
||||
# Avaya/Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
|
||||
# figure out slot.port based upon lldpRemPortDesc
|
||||
if ( $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ ) {
|
||||
$port = defined $1 ? "$2.$3" : "$3";
|
||||
if ( defined $desc->{$key}
|
||||
&& $desc->{$key}
|
||||
=~ /^Ethernet\s(?:Routing\s)?Switch\s\d|^Virtual\sServices\sPlatform\s\d/
|
||||
&& $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ )
|
||||
{
|
||||
$port = defined $1 ? "$2.$3" : "1.$3";
|
||||
}
|
||||
|
||||
$lldp_port{$key} = $port;
|
||||
@@ -210,10 +260,13 @@ sub lldp_id {
|
||||
if ( $type =~ /mac/ ) {
|
||||
$id = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) );
|
||||
}
|
||||
elsif ($type eq 'networkAddress') {
|
||||
if ( length(unpack('H*', $id)) == 10 ) {
|
||||
elsif ( $type eq 'networkAddress' ) {
|
||||
if ( length( unpack( 'H*', $id ) ) == 10 ) {
|
||||
|
||||
# IP address (first octet is sign, I guess)
|
||||
my @octets = (map { sprintf "%02x",$_ } unpack('C*', $id))[1..4];
|
||||
my @octets
|
||||
= ( map { sprintf "%02x", $_ } unpack( 'C*', $id ) )
|
||||
[ 1 .. 4 ];
|
||||
$id = join '.', map { hex($_) } @octets;
|
||||
}
|
||||
}
|
||||
@@ -222,6 +275,54 @@ sub lldp_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;
|
||||
#
|
||||
@@ -247,20 +348,26 @@ sub _lldp_addr_index {
|
||||
my @oids = split( /\./, $idx );
|
||||
my $index = join( '.', splice( @oids, 0, 3 ) );
|
||||
my $proto = shift(@oids);
|
||||
my $length = shift(@oids);
|
||||
shift(@oids) if scalar @oids > 4; # $length
|
||||
|
||||
# IPv4
|
||||
if ( $proto == 1 ) {
|
||||
return ( $index, $proto, join( '.', @oids ) );
|
||||
}
|
||||
|
||||
# IPv6
|
||||
elsif ( $proto == 2 ) {
|
||||
return ( $index, $proto,
|
||||
join(':', unpack('(H4)*', pack('C*', @oids)) ) );
|
||||
}
|
||||
|
||||
# MAC
|
||||
elsif ( $proto == 6 ) {
|
||||
return ( $index, $proto,
|
||||
join( ':', map { sprintf "%02x", $_ } @oids ) );
|
||||
}
|
||||
|
||||
# TODO - Need to handle other protocols, i.e. IPv6
|
||||
# TODO - Other protocols may be used as well; implement when needed?
|
||||
else {
|
||||
return;
|
||||
}
|
||||
@@ -426,15 +533,40 @@ if unable defaults to (C<lldpRemLocalPortNum>).
|
||||
Returns remote IPv4 address. Returns for all other address types, use
|
||||
lldp_addr if you want any return address type.
|
||||
|
||||
=item $lldp->lldp_ipv6()
|
||||
|
||||
Returns remote IPv6 address, if known. Returns for all other address types,
|
||||
use lldp_addr if you don't care about return address type.
|
||||
|
||||
=item $lldp->lldp_mac()
|
||||
|
||||
Returns remote (management) MAC address, if known. Returns for all other
|
||||
address types, use lldp_addr if you don't care about return address type.
|
||||
|
||||
=item $lldp->lldp_addr()
|
||||
|
||||
Returns remote address. Type may be any IANA Address Family Number.
|
||||
Currently only returns IPv4 or MAC addresses.
|
||||
Currently only returns IPv4, IPv6 or MAC addresses. If the remote device
|
||||
returns more than one address type, this method will give only one. Which one
|
||||
is returned is decided by chance, phase of the moon and Perl hash ordering.
|
||||
|
||||
Use lldp_mac, lldp_ip or lldp_ipv6 if you want a specific address type.
|
||||
|
||||
=item $lldp->lldp_port()
|
||||
|
||||
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>)
|
||||
@@ -450,7 +582,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>)
|
||||
@@ -498,9 +630,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
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer1;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer1;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
|
||||
@@ -50,11 +50,11 @@ $VERSION = '3.04_001';
|
||||
%SNMP::Info::Layer1::FUNCS,
|
||||
'asante_port' => 'ePortIndex',
|
||||
'asante_group' => 'ePortGrpIndex',
|
||||
'i_type' => 'ePortStateType',
|
||||
'i_type' => 'ePortGrpIndex',
|
||||
'asante_up' => 'ePortStateLinkStatus',
|
||||
);
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-HUB1012-MIB' => 'asante' );
|
||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-AH1012-MIB' => 'asante' );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
|
||||
|
||||
@@ -202,7 +202,7 @@ Asante device through SNMP.
|
||||
|
||||
=over
|
||||
|
||||
=item F<ASANTE-HUB1012-MIB>
|
||||
=item F<ASANTE-AH1012-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -230,7 +230,7 @@ Returns 'asante' :)
|
||||
|
||||
=item $asante->model()
|
||||
|
||||
Cross references $asante->id() to the F<ASANTE-HUB1012-MIB> and returns
|
||||
Cross references $asante->id() to the F<ASANTE-AH1012-MIB> and returns
|
||||
the results.
|
||||
|
||||
=back
|
||||
|
||||
@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
@@ -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;
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer1;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer1::MIBS,
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%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;
|
||||
|
||||
@@ -38,18 +38,20 @@ use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::PowerEthernet;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer2::ISA
|
||||
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet Exporter/;
|
||||
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet SNMP::Info::LLDP Exporter/;
|
||||
@SNMP::Info::Layer2::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
@@ -57,6 +59,7 @@ $VERSION = '3.04_001';
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::PowerEthernet::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'serial1' =>
|
||||
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||
);
|
||||
@@ -64,6 +67,7 @@ $VERSION = '3.04_001';
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
@@ -73,6 +77,7 @@ $VERSION = '3.04_001';
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::PowerEthernet::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
@@ -123,30 +128,16 @@ 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;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l2 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_type = $l2->i_type($partial) || {};
|
||||
|
||||
my %i_ignore = ();
|
||||
|
||||
foreach my $if ( keys %$i_type ) {
|
||||
my $type = $i_type->{$if};
|
||||
$i_ignore{$if}++
|
||||
if $type =~ /(loopback|other|cpu)/i;
|
||||
}
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $l2 = shift;
|
||||
my $partial = shift;
|
||||
@@ -155,10 +146,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;
|
||||
}
|
||||
@@ -224,6 +223,8 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -277,6 +278,10 @@ See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
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 a reference
|
||||
@@ -293,12 +298,6 @@ name.
|
||||
|
||||
Defaults to C<ifDescr> but checks and overrides with C<ifName>
|
||||
|
||||
=item $l2->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores ports with C<ifType> of loopback, propvirtual, other, and cpu
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
@@ -313,4 +312,8 @@ See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
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
|
||||
|
||||
173
Info/Layer2/3Com.pm
Normal file
173
Info/Layer2/3Com.pm
Normal file
@@ -0,0 +1,173 @@
|
||||
package SNMP::Info::Layer2::3Com;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
|
||||
@SNMP::Info::Layer2::3Com::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::3Com::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
|
||||
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'A3Com-products-MIB' => 'wlanAP7760',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
sub os {
|
||||
return '3Com';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $dev = shift;
|
||||
my $e_serial = $dev->e_serial();
|
||||
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( sort keys %$e_serial ) {
|
||||
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
|
||||
return $e_serial->{$e};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
|
||||
my $dev = shift;
|
||||
my $e_swver = $dev->e_swver();
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( sort keys %$e_swver ) {
|
||||
if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
|
||||
return $e_swver->{$e};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return '3Com';
|
||||
}
|
||||
|
||||
sub model {
|
||||
|
||||
my $dsmodel = shift;
|
||||
my $descr = $dsmodel->description();
|
||||
if ( $descr =~ /^([\S ]+) Software.*/){
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::3Com - SNMP Interface to L2 3Com Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Kosmach
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $router = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $router->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for 3Com L2 devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<A3Com-products-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $device->vendor()
|
||||
|
||||
Returns '3Com'
|
||||
|
||||
=item $device->os()
|
||||
|
||||
Returns '3Com'
|
||||
|
||||
=item $device->os_ver()
|
||||
|
||||
Return os version
|
||||
|
||||
=item $device->model()
|
||||
|
||||
Returns device model extracted from description
|
||||
|
||||
=item $device->serial()
|
||||
|
||||
Returns serial number
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -40,7 +40,7 @@ use SNMP::Info::Airespace;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||
|
||||
@@ -49,7 +49,7 @@ use SNMP::Info::IEEE802dot11;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||
@@ -60,7 +60,8 @@ $VERSION = '3.04_001';
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'serial' => 'entPhysicalSerialNum.1',
|
||||
'descr' => 'sysDescr'
|
||||
'descr' => 'sysDescr',
|
||||
'ps1_type' => 'cpoePdCurrentPowerSource'
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
@@ -97,6 +98,7 @@ $VERSION = '3.04_001';
|
||||
'CISCO-DOT11-ASSOCIATION-MIB' => 'cDot11ClientSubIfIndex',
|
||||
'CISCO-DOT11-SSID-SECURITY-MIB' => 'cdot11SecVlanNameId',
|
||||
'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
|
||||
'CISCO-POE-PD-MIB' => 'cpoePdCurrentPowerSource',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
@@ -457,6 +459,18 @@ sub i_ssidmac {
|
||||
return $i_ssidmac;
|
||||
}
|
||||
|
||||
###
|
||||
# PoE status. The ps1_type is the PoE injector type, which is just
|
||||
# a scalar; the status is a little more complex.
|
||||
sub ps1_status {
|
||||
my $aironet = shift;
|
||||
my $idx = $aironet->cpoePdCurrentPowerLevel();
|
||||
my $mw = $aironet->cpoePdSupportedPower( $idx );
|
||||
my $descr = $aironet->cpoePdSupportedPowerMode( $idx );
|
||||
|
||||
return sprintf( "%.2fW (%s)", $mw->{$idx} * 0.001, $descr->{$idx} );
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -540,17 +554,13 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->discription()
|
||||
|
||||
Adds info from method e_descr() from SNMP::Info::Entity
|
||||
|
||||
=item $aironet->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $aironet->description()
|
||||
|
||||
System description
|
||||
System description. Adds info from method e_descr() from SNMP::Info::Entity
|
||||
|
||||
=back
|
||||
|
||||
@@ -648,6 +658,11 @@ being broadcast.
|
||||
With the same keys as i_ssidlist, returns the Basic service set
|
||||
identification (BSSID), MAC address, the AP is using for the SSID.
|
||||
|
||||
=item $aironet ps1_status()
|
||||
|
||||
Returns the PoE injector status based on C<cpoePdSupportedPower> and
|
||||
C<cpoePdSupportedPowerMode>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer1;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||
|
||||
|
||||
@@ -46,12 +46,13 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%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 = '3.04_001';
|
||||
%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?!
|
||||
@@ -139,6 +141,7 @@ sub model {
|
||||
$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;
|
||||
}
|
||||
@@ -338,6 +341,60 @@ sub peth_port_ifindex {
|
||||
return \%peth_port_ifindex;
|
||||
}
|
||||
|
||||
# Currently only ERS 4800 v5.8+ support the rcBridgeSpbmMacTable
|
||||
# which holds the FDB for a SPBM edge deployment.
|
||||
#
|
||||
# Q-BRIDGE still holds some entries when the rcBridgeSpbmMacTable is in use
|
||||
# so we merge hash entries.
|
||||
|
||||
sub fw_mac {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::fw_mac() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_mac() || {};
|
||||
my $fw_mac = { %$qb, %$spbm };
|
||||
|
||||
return $fw_mac;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::fw_port() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_port() || {};
|
||||
my $fw_port = { %$qb, %$spbm };
|
||||
|
||||
return $fw_port;
|
||||
}
|
||||
|
||||
sub fw_status {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::fw_status() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_status() || {};
|
||||
my $fw_status = { %$qb, %$spbm };
|
||||
|
||||
return $fw_status;
|
||||
}
|
||||
|
||||
sub qb_fw_vlan {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::qb_fw_vlan() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_vlan() || {};
|
||||
my $qb_fw_vlan = { %$qb, %$spbm };
|
||||
|
||||
return $qb_fw_vlan;
|
||||
}
|
||||
|
||||
# Baystack uses S5-AGENT-MIB (loaded in NortelStack) versus RAPID-CITY
|
||||
sub stp_ver {
|
||||
my $rapidcity = shift;
|
||||
|
||||
return $rapidcity->s5AgSysSpanningTreeOperMode()
|
||||
|| $rapidcity->SUPER::stp_ver();
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
@@ -393,6 +450,14 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...);
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<BAY-STACK-PETH-EXT-MIBB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
|
||||
@@ -433,6 +498,14 @@ Returns 'baystack' or 'boss' depending on software version.
|
||||
|
||||
Returns the firmware version extracted from C<sysDescr>.
|
||||
|
||||
=item $baystack->stp_ver()
|
||||
|
||||
Returns the particular STP version running on this device.
|
||||
|
||||
Values: C<nortelStpg>, C<pvst>, C<rstp>, C<mstp>, C<ieee8021d>
|
||||
|
||||
(C<s5AgSysSpanningTreeOperMode>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
@@ -509,10 +582,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 $poe->peth_port_ifindex()
|
||||
=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
|
||||
@@ -583,6 +662,32 @@ ns_e_vendor().
|
||||
|
||||
=back
|
||||
|
||||
=head2 Layer 2 Forwarding Database
|
||||
|
||||
These methods try to obtain the layer 2 forwarding database entries via the
|
||||
normal bridge methods as well as SPBM entries via rapid city methods.
|
||||
|
||||
=over
|
||||
|
||||
=item $baystack->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses
|
||||
|
||||
=item $baystack->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
=item $baystack->qb_fw_vlan()
|
||||
|
||||
Returns reference to hash of forwarding table entries VLAN ID
|
||||
|
||||
=item $baystack->fw_status()
|
||||
|
||||
Returns reference to hash of forwarding table entries status
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
@@ -37,19 +37,23 @@ use Exporter;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::CiscoAgg;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoConfig SNMP::Info::Layer2
|
||||
SNMP::Info::CiscoConfig SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg SNMP::Info::Layer2
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoAgg::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
@@ -58,6 +62,8 @@ $VERSION = '3.04_001';
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoAgg::FUNCS,
|
||||
%SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
@@ -75,6 +81,8 @@ $VERSION = '3.04_001';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoAgg::MIBS,
|
||||
%SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
@@ -84,8 +92,9 @@ $VERSION = '3.04_001';
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoAgg::MUNGE,
|
||||
%SNMP::Info::CiscoStpExtensions::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
);
|
||||
|
||||
sub bulkwalk_no { return 1; }
|
||||
@@ -203,7 +212,8 @@ sub i_vlan {
|
||||
my $partial = shift;
|
||||
|
||||
# Overlap allows more than one VLAN per port. Unable to determine default
|
||||
my $overlap = $c1900->bridgeGroupAllowMembershipOverlap()
|
||||
my $overlap
|
||||
= $c1900->bridgeGroupAllowMembershipOverlap()
|
||||
|| $c1900->vlanAllowMembershipOverlap()
|
||||
|| 'disabled';
|
||||
|
||||
@@ -251,6 +261,8 @@ sub i_vlan_membership {
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged { return; }
|
||||
|
||||
sub bp_index {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
@@ -258,7 +270,7 @@ sub bp_index {
|
||||
my $if_index = $c1900->i_index($partial);
|
||||
my $index = $c1900->orig_bp_index($partial) || {};
|
||||
foreach my $iid ( keys %$if_index ) {
|
||||
$index->{$iid} = $iid if(!defined $index->{$iid});
|
||||
$index->{$iid} = $iid if ( !defined $index->{$iid} );
|
||||
}
|
||||
return $index;
|
||||
}
|
||||
@@ -312,6 +324,10 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=item SNMP::Info::CiscoAgg
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
@@ -336,6 +352,10 @@ See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
@@ -394,6 +414,14 @@ See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
@@ -444,6 +472,9 @@ bridge group IDs.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $c1900->i_vlan_membership_untagged()
|
||||
|
||||
Unsupported, returns nothing.
|
||||
|
||||
=item $c1900->bp_index()
|
||||
|
||||
@@ -513,6 +544,14 @@ See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
@@ -34,33 +34,21 @@ package SNMP::Info::Layer2::C2900;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Layer2::Cisco;
|
||||
|
||||
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig
|
||||
SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::Layer2::Cisco Exporter/;
|
||||
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::Layer2::Cisco::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::Layer2::Cisco::FUNCS,
|
||||
'i_name' => 'ifAlias',
|
||||
|
||||
# C2900PortEntry
|
||||
@@ -71,15 +59,12 @@ $VERSION = '3.04_001';
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS, 'CISCO-C2900-MIB' => 'ciscoC2900MIB',
|
||||
%SNMP::Info::Layer2::Cisco::MIBS,
|
||||
'CISCO-C2900-MIB' => 'ciscoC2900MIB',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
%SNMP::Info::Layer2::Cisco::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
@@ -139,6 +124,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 ) = @_;
|
||||
@@ -243,15 +254,7 @@ after determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
=item SNMP::Info::Layer2::Cisco
|
||||
|
||||
=back
|
||||
|
||||
@@ -267,15 +270,7 @@ Part of the v2 MIBs from Cisco.
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -295,25 +290,9 @@ Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoVTP
|
||||
=head2 Globals imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
See L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
@@ -349,6 +328,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
|
||||
@@ -381,25 +364,9 @@ Gives Admin speed of port
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
See L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
|
||||
@@ -34,48 +34,34 @@ package SNMP::Info::Layer2::Catalyst;
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Layer2::Cisco;
|
||||
|
||||
@SNMP::Info::Layer2::Catalyst::ISA
|
||||
= qw/SNMP::Info::CiscoStack SNMP::Info::CiscoVTP
|
||||
SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::Layer2 Exporter/;
|
||||
= qw/SNMP::Info::CiscoStack SNMP::Info::Layer2::Cisco Exporter/;
|
||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS, %SNMP::Info::CiscoStack::MIBS,
|
||||
%SNMP::Info::Layer2::Cisco::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::Layer2::Cisco::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS, %SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS, %SNMP::Info::CiscoStack::FUNCS,
|
||||
%SNMP::Info::Layer2::Cisco::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE, %SNMP::Info::CiscoStack::MUNGE,
|
||||
%SNMP::Info::Layer2::Cisco::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
|
||||
# Overidden Methods
|
||||
@@ -228,18 +214,10 @@ after determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2::Cisco
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -248,19 +226,10 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStack/"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::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
These MIBs are found in the standard v2 MIBs from Cisco.
|
||||
@@ -290,30 +259,14 @@ Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=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
|
||||
@@ -348,29 +301,12 @@ have problems with F<BRIDGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"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::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -43,7 +43,7 @@ use SNMP::Info::SONMP;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%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__
|
||||
|
||||
@@ -371,11 +385,6 @@ Returns 'Centillion'
|
||||
|
||||
=over
|
||||
|
||||
=item $centillion->layers()
|
||||
|
||||
Returns 00000011. Class emulates Layer 2 functionality through proprietary
|
||||
MIBs.
|
||||
|
||||
=item $centillion->index_factor()
|
||||
|
||||
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||
|
||||
@@ -35,49 +35,71 @@ 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::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::CiscoAgg;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Cisco::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::Layer2
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoRTT
|
||||
SNMP::Info::CiscoConfig SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg
|
||||
SNMP::Info::Layer2
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoQOS::MIBS, %SNMP::Info::CiscoRTT::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS, %SNMP::Info::CiscoVTP::MIBS,
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoAgg::MIBS,
|
||||
%SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoRTT::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoQOS::GLOBALS, %SNMP::Info::CiscoRTT::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS, %SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoAgg::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoRTT::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoQOS::FUNCS, %SNMP::Info::CiscoRTT::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS, %SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoAgg::FUNCS,
|
||||
%SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoRTT::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoQOS::MUNGE, %SNMP::Info::CiscoRTT::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::CiscoAgg::MUNGE,
|
||||
%SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoRTT::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
1;
|
||||
@@ -85,8 +107,9 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
|
||||
that are not covered in other classes.
|
||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L2 Cisco devices that are
|
||||
not covered in other classes and the base L2 Cisco class for other device
|
||||
specific L2 Cisco classes.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -110,7 +133,8 @@ Max Baker
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Cisco Routers running IOS
|
||||
Subclass for Generic Layer 2 Cisco devices and the base L2 Cisco class for
|
||||
other device specific L2 Cisco classes.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
@@ -122,14 +146,16 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoRTT
|
||||
|
||||
=item SNMP::Info::CiscoQOS
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=item SNMP::Info::CiscoAgg
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
@@ -142,18 +168,20 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"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::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoQOS/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
@@ -182,22 +210,26 @@ See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
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::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"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::CiscoAgg
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoAgg/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
@@ -219,22 +251,26 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
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::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"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::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
@@ -50,7 +50,7 @@ use SNMP::Info::CDP;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
# This will be filled in with the device's index into the EntPhysicalEntry
|
||||
# table by the serial() function.
|
||||
@@ -98,21 +98,17 @@ sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
# Walk the entPhysicalSerialNum table and return both the first serial
|
||||
# number found as well as the index of that entry.
|
||||
# Walk the entPhysicalSerialNum table and return the first serial found
|
||||
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;
|
||||
foreach my $e ( sort keys %$e_serial ) {
|
||||
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
|
||||
return $e_serial->{$e};
|
||||
}
|
||||
}
|
||||
return $e_serial->{$index} if defined $index;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
@@ -216,15 +212,16 @@ Returns 'cisco'
|
||||
|
||||
=item $ciscosb->os_ver()
|
||||
|
||||
Returns software version (entPhysicalSoftwareRev)
|
||||
Returns software version (C<entPhysicalSoftwareRev>)
|
||||
|
||||
=item $ciscosb->serial()
|
||||
|
||||
Returns serial number of unit (entPhysicalSerialNum)
|
||||
Returns serial number of unit (C<entPhysicalSerialNum>)
|
||||
|
||||
=item $ciscosb->model()
|
||||
|
||||
Returns model and hardware revision of unit (entPhysicalModelName+entPhysicalHardwareRev)
|
||||
Returns model and hardware revision of unit
|
||||
(C<entPhysicalModelName+entPhysicalHardwareRev>)
|
||||
|
||||
=back
|
||||
|
||||
|
||||
@@ -36,23 +36,27 @@ use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::Aggregate;
|
||||
|
||||
@SNMP::Info::Layer2::HP::ISA
|
||||
= qw/SNMP::Info::Layer3 SNMP::Info::MAU SNMP::Info::LLDP
|
||||
SNMP::Info::CDP Exporter/;
|
||||
@SNMP::Info::Layer2::HP::ISA = qw/
|
||||
SNMP::Info::Aggregate
|
||||
SNMP::Info::Layer3
|
||||
SNMP::Info::MAU
|
||||
SNMP::Info::CDP
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::Layer2::HP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::Aggregate::MIBS,
|
||||
'RFC1271-MIB' => 'logDescription',
|
||||
'HP-ICF-OID' => 'hpSwitch4000',
|
||||
'STATISTICS-MIB' => 'hpSwitchCpuStat',
|
||||
@@ -67,8 +71,8 @@ $VERSION = '3.04_001';
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::Aggregate::GLOBALS,
|
||||
'serial1' => 'entPhysicalSerialNum.1',
|
||||
'serial2' => 'hpHttpMgSerialNumber.0',
|
||||
'hp_cpu' => 'hpSwitchCpuStat.0',
|
||||
@@ -85,8 +89,8 @@ $VERSION = '3.04_001';
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::Aggregate::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
|
||||
# RFC1271
|
||||
@@ -110,8 +114,8 @@ $VERSION = '3.04_001';
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::Aggregate::MUNGE,
|
||||
'c_id' => \&munge_hp_c_id,
|
||||
);
|
||||
|
||||
@@ -121,6 +125,8 @@ $VERSION = '3.04_001';
|
||||
%MODEL_MAP = (
|
||||
'J8131A' => 'WAP-420-WW',
|
||||
'J8130A' => 'WAP-420-NA',
|
||||
'J9833A' => 'PS1810-8G',
|
||||
'J9834A' => 'PS1810-24G',
|
||||
'J8133A' => 'AP520WL',
|
||||
'J8680A' => '9408sl',
|
||||
'J9091A' => '8212zl',
|
||||
@@ -135,8 +141,10 @@ $VERSION = '3.04_001';
|
||||
'J8992A' => '6200yl-24G',
|
||||
'J4902A' => '6108',
|
||||
'J8698A' => '5412zl',
|
||||
'J9851A' => '5412R-zl2',
|
||||
'J8719A' => '5408yl',
|
||||
'J8697A' => '5406zl',
|
||||
'J9850A' => '5406R-zl2',
|
||||
'J8718A' => '5404yl',
|
||||
'J4819A' => '5308XL',
|
||||
'J4850A' => '5304XL',
|
||||
@@ -168,8 +176,12 @@ $VERSION = '3.04_001';
|
||||
'J4815A' => '3324XL',
|
||||
'J4851A' => '3124',
|
||||
'J9729A' => '2920-48G-PoE+',
|
||||
'J9729A' => '2920-48G-PoE+',
|
||||
'J9728A' => '2920-48G',
|
||||
'J9728A' => '2920-48G',
|
||||
'J9727A' => '2920-24G-PoE+',
|
||||
'J9727A' => '2920-24G-PoE+',
|
||||
'J9726A' => '2920-24G',
|
||||
'J9726A' => '2920-24G',
|
||||
'J9562A' => '2915-8G-PoE',
|
||||
'J9148A' => '2910al-48G-PoE+',
|
||||
@@ -182,30 +194,41 @@ $VERSION = '3.04_001';
|
||||
'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+',
|
||||
'J9624A' => '2620-48',
|
||||
'J9625A' => '2620-24-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',
|
||||
'J9086A' => '2610-24/12PWR',
|
||||
'J9087A' => '2610-24-PWR',
|
||||
'J9086A' => '2610-24/12PWR',
|
||||
'J9085A' => '2610-24',
|
||||
'J8762A' => '2600-8-PWR',
|
||||
'J9780A' => '2530-8-PoE+',
|
||||
'J9777A' => '2530-8G',
|
||||
'J9783A' => '2530-8',
|
||||
'J9778A' => '2530-48-PoE+',
|
||||
'J9853A' => '2530-48G-PoE+-2SFP+',
|
||||
'J9772A' => '2530-48G-PoE+',
|
||||
'J9855A' => '2530-48G-2SFP+',
|
||||
'J9775A' => '2530-48G',
|
||||
'J9781A' => '2530-48',
|
||||
'J9779A' => '2530-24-PoE+',
|
||||
'J9854A' => '2530-24G-PoE+-2SFP+',
|
||||
'J9773A' => '2530-24G-PoE+',
|
||||
'J9856A' => '2530-24G-2SFP+',
|
||||
'J9776A' => '2530-24G',
|
||||
'J9782A' => '2530-24',
|
||||
'J4813A' => '2524',
|
||||
'J9298A' => '2520G-8-PoE',
|
||||
'J9299A' => '2520G-24-PoE',
|
||||
@@ -221,6 +244,8 @@ $VERSION = '3.04_001';
|
||||
'J4817A' => '2312',
|
||||
'J9449A' => '1810G-8',
|
||||
'J9450A' => '1810G-24',
|
||||
'J9802A' => '1810-8G',
|
||||
'J9803A' => '1810-24G',
|
||||
'J9029A' => '1800-8G',
|
||||
'J9028A' => '1800-24G',
|
||||
);
|
||||
@@ -524,6 +549,8 @@ sub set_i_vlan_tagged {
|
||||
return;
|
||||
}
|
||||
|
||||
sub agg_ports { return agg_ports_ifstack(@_) }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -570,8 +597,6 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=back
|
||||
@@ -710,7 +735,7 @@ number and the common model number with this map :
|
||||
'J4900C' => '2626C',
|
||||
'J4900A' => '2626',
|
||||
'J9627A' => '2620-48-PoE+',
|
||||
'J9624A' => '2620-48',
|
||||
'J9626A' => '2620-48',
|
||||
'J9624A' => '2620-24-PPoE+',
|
||||
'J9625A' => '2620-24-PoE+',
|
||||
'J9623A' => '2620-24',
|
||||
@@ -797,10 +822,6 @@ Returns what version of STP the device is running.
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"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::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
@@ -812,7 +833,7 @@ to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
=over 4
|
||||
|
||||
=item $hp->interfaces()
|
||||
|
||||
@@ -840,16 +861,18 @@ Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias()
|
||||
Returns reference to hash of power Ethernet port table entries map back to
|
||||
interface index (c<ifIndex>)
|
||||
|
||||
=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::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"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::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
@@ -44,7 +44,7 @@ use SNMP::Info::CDP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -376,6 +376,20 @@ sub i_vlan_membership {
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlans = $hp->i_vlan($partial);
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $port (keys %$vlans) {
|
||||
my $vlan = $vlans->{$port};
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub set_i_vlan {
|
||||
my $hp = shift;
|
||||
my $rv;
|
||||
@@ -680,6 +694,12 @@ It is the union of tagged, untagged, and auto ports.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $hp->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $hp->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
@@ -33,17 +33,19 @@ package SNMP::Info::Layer2::HPVC;
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer2::HPVC::ISA
|
||||
= qw/SNMP::Info::Layer2 Exporter/;
|
||||
= qw/SNMP::Info::Layer2 SNMP::Info::LLDP Exporter/;
|
||||
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'HPVC-MIB' => 'vcDomainName',
|
||||
'CPQSINFO-MIB' => 'cpqSiSysSerialNum',
|
||||
'HPVCMODULE-MIB' => 'vcModuleDomainName',
|
||||
@@ -51,6 +53,7 @@ $VERSION = '3.04_001';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'serial1' => 'cpqSiSysSerialNum.0',
|
||||
'os_ver' => 'cpqHoSWRunningVersion.1',
|
||||
'os_bin' => 'cpqHoFwVerVersion.1',
|
||||
@@ -59,12 +62,14 @@ $VERSION = '3.04_001';
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
|
||||
@@ -43,7 +43,7 @@ use SNMP::Info::Airespace;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||
|
||||
@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Bridge;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
|
||||
@@ -33,32 +33,31 @@ package SNMP::Info::Layer2::Netgear;
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Entity SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
# This will be filled in with the device's index into the EntPhysicalEntry
|
||||
# table by the serial() function.
|
||||
our $index = undef;
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::Entity::MIBS, %SNMP::Info::LLDP::MIBS, );
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::LLDP::MIBS, );
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Entity::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
|
||||
ng_fsosver => '.1.3.6.1.4.1.4526.11.11.1.0',
|
||||
ng_gsmserial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
|
||||
ng_gsmosver => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Entity::FUNCS, %SNMP::Info::LLDP::FUNCS, );
|
||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::LLDP::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Entity::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'netgear';
|
||||
@@ -140,25 +139,6 @@ sub interfaces {
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
|
||||
# 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 {
|
||||
my $netgear = shift;
|
||||
my $ret = $netgear->qb_fw_mac();
|
||||
$ret = $netgear->orig_fw_mac() if ( !defined($ret) );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $netgear = shift;
|
||||
my $ret = $netgear->qb_fw_port();
|
||||
$ret = $netgear->orig_fw_port() if ( !defined($ret) );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
# 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 {
|
||||
@@ -172,134 +152,6 @@ sub os_ver {
|
||||
return $netgear->ng_fsosver() if defined $netgear->model and $netgear->model =~ m/FS\d/i;
|
||||
}
|
||||
|
||||
# Use LLDP
|
||||
|
||||
sub hasCDP {
|
||||
my $netgear = shift;
|
||||
return $netgear->hasLLDP() || $netgear->SUPER::hasCDP();
|
||||
}
|
||||
|
||||
sub c_ip {
|
||||
my $netgear = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $cdp = $netgear->SUPER::c_ip($partial) || {};
|
||||
my $lldp = $netgear->lldp_ip($partial) || {};
|
||||
|
||||
my %c_ip;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $ip = $cdp->{$iid};
|
||||
next unless defined $ip;
|
||||
|
||||
$c_ip{$iid} = $ip;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $ip = $lldp->{$iid};
|
||||
next unless defined $ip;
|
||||
|
||||
$c_ip{$iid} = $ip;
|
||||
}
|
||||
return \%c_ip;
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
my $netgear = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $netgear->lldp_if($partial) || {};
|
||||
my $cdp = $netgear->SUPER::c_if($partial) || {};
|
||||
|
||||
my %c_if;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $if = $cdp->{$iid};
|
||||
next unless defined $if;
|
||||
|
||||
$c_if{$iid} = $if;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $if = $lldp->{$iid};
|
||||
next unless defined $if;
|
||||
|
||||
$c_if{$iid} = $if;
|
||||
}
|
||||
return \%c_if;
|
||||
}
|
||||
|
||||
sub c_port {
|
||||
my $netgear = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $netgear->lldp_port($partial) || {};
|
||||
my $cdp = $netgear->SUPER::c_port($partial) || {};
|
||||
|
||||
my %c_port;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $port = $cdp->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$c_port{$iid} = $port;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $port = $lldp->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$c_port{$iid} = $port;
|
||||
}
|
||||
return \%c_port;
|
||||
}
|
||||
|
||||
sub c_id {
|
||||
my $netgear = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $netgear->lldp_id($partial) || {};
|
||||
my $cdp = $netgear->SUPER::c_id($partial) || {};
|
||||
|
||||
my %c_id;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $id = $cdp->{$iid};
|
||||
next unless defined $id;
|
||||
|
||||
$c_id{$iid} = $id;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $id = $lldp->{$iid};
|
||||
next unless defined $id;
|
||||
|
||||
$c_id{$iid} = $id;
|
||||
}
|
||||
return \%c_id;
|
||||
}
|
||||
|
||||
sub c_platform {
|
||||
my $netgear = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp = $netgear->lldp_rem_sysdesc($partial) || {};
|
||||
my $cdp = $netgear->SUPER::c_platform($partial) || {};
|
||||
|
||||
my %c_platform;
|
||||
foreach my $iid ( keys %$cdp ) {
|
||||
my $platform = $cdp->{$iid};
|
||||
next unless defined $platform;
|
||||
|
||||
$c_platform{$iid} = $platform;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$lldp ) {
|
||||
my $platform = $lldp->{$iid};
|
||||
next unless defined $platform;
|
||||
|
||||
$c_platform{$iid} = $platform;
|
||||
}
|
||||
return \%c_platform;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
@@ -413,72 +265,12 @@ a reference to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $netgear->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 $netgear->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.
|
||||
|
||||
=item $netgear->interfaces()
|
||||
|
||||
Uses the i_name() field.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Topology information
|
||||
|
||||
Based upon the software version devices may support Link Layer Discovery
|
||||
Protocol (LLDP).
|
||||
|
||||
=over
|
||||
|
||||
=item $netgear->hasCDP()
|
||||
|
||||
Returns true if the device is running LLDP.
|
||||
|
||||
=item $netgear->c_if()
|
||||
|
||||
Returns reference to hash. Key: iid Value: local device port (interfaces)
|
||||
|
||||
=item $netgear->c_ip()
|
||||
|
||||
Returns reference to hash. Key: iid Value: remote IPv4 address
|
||||
|
||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
|
||||
address, c_ip(), it may be a duplicate entry.
|
||||
|
||||
If multiple entries exist with the same local port, c_if(), with different
|
||||
IPv4 addresses, c_ip(), there is either a non-LLDP device in between two or
|
||||
more devices or multiple devices which are not directly connected.
|
||||
|
||||
Use the data from the Layer2 Topology Table below to dig deeper.
|
||||
|
||||
=item $netgear->c_port()
|
||||
|
||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
|
||||
|
||||
=item $netgear->c_id()
|
||||
|
||||
Returns reference to hash. Key: iid Value: string value used to identify the
|
||||
chassis component associated with the remote system.
|
||||
|
||||
=item $netgear->c_platform()
|
||||
|
||||
Returns reference to hash. Key: iid Value: Remote Device Type
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
|
||||
@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
|
||||
177
Info/Layer2/Ubiquiti.pm
Normal file
177
Info/Layer2/Ubiquiti.pm
Normal file
@@ -0,0 +1,177 @@
|
||||
# SNMP::Info::Layer2::Ubiquiti
|
||||
# $Id$
|
||||
#
|
||||
|
||||
package SNMP::Info::Layer2::Ubiquiti;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::IEEE802dot11;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Ubiquiti::ISA
|
||||
= qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Ubiquiti::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::IEEE802dot11::MIBS,
|
||||
|
||||
);
|
||||
|
||||
%GLOBALS
|
||||
= ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, );
|
||||
|
||||
sub os {
|
||||
return 'Ubiquiti';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $versions = $dot11->dot11_prod_ver();
|
||||
|
||||
foreach my $iid ( keys %$versions ) {
|
||||
my $ver = $versions->{$iid};
|
||||
next unless defined $ver;
|
||||
return $ver;
|
||||
if ( $ver =~ /([\d\.]+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'Ubiquiti Networks, Inc.';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $names = $dot11->dot11_prod_name();
|
||||
|
||||
foreach my $iid ( keys %$names ) {
|
||||
my $prod = $names->{$iid};
|
||||
next unless defined $prod;
|
||||
return $prod;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Ubiquiti - SNMP Interface to Ubiquiti Access Points
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Kosmach
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ubnt = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ubnt->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from
|
||||
Ubiquiti Access Point through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $ubnt = new SNMP::Info::Layer2::Ubiquiti(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::IEEE802dot11
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
None.
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $ubnt->vendor()
|
||||
|
||||
Returns 'Ubiquiti Networks, Inc.'
|
||||
|
||||
=item $ubnt->model()
|
||||
|
||||
Returns the model extracted from C<dot11manufacturerProductName>.
|
||||
|
||||
=item $ubnt->os()
|
||||
|
||||
Returns 'Ubiquiti'
|
||||
|
||||
=item $ubnt->os_ver()
|
||||
|
||||
Returns the software version extracted from C<dot11manufacturerProductVersion>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||
|
||||
126
Info/Layer3.pm
126
Info/Layer3.pm
@@ -41,17 +41,19 @@ use SNMP::Info::Entity;
|
||||
use SNMP::Info::PowerEthernet;
|
||||
use SNMP::Info::IPv6;
|
||||
use SNMP::Info::AdslLine;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::ISA = qw/
|
||||
SNMP::Info::PowerEthernet SNMP::Info::IPv6
|
||||
SNMP::Info::Entity SNMP::Info::EtherLike
|
||||
SNMP::Info::Bridge SNMP::Info::AdslLine
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer3::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
@@ -61,6 +63,7 @@ $VERSION = '3.04_001';
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
%SNMP::Info::PowerEthernet::MIBS,
|
||||
%SNMP::Info::IPv6::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'IP-MIB' => 'ipNetToMediaIfIndex',
|
||||
'OSPF-MIB' => 'ospfRouterId',
|
||||
'BGP4-MIB' => 'bgpIdentifier',
|
||||
@@ -76,6 +79,7 @@ $VERSION = '3.04_001';
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::PowerEthernet::GLOBALS,
|
||||
%SNMP::Info::IPv6::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'serial1' =>
|
||||
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||
@@ -92,6 +96,7 @@ $VERSION = '3.04_001';
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
%SNMP::Info::PowerEthernet::FUNCS,
|
||||
%SNMP::Info::IPv6::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
|
||||
# Obsolete Address Translation Table (ARP Cache)
|
||||
'old_at_index' => 'atIfIndex',
|
||||
@@ -132,11 +137,11 @@ $VERSION = '3.04_001';
|
||||
'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',
|
||||
|
||||
);
|
||||
|
||||
@@ -150,9 +155,10 @@ $VERSION = '3.04_001';
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::PowerEthernet::MUNGE,
|
||||
%SNMP::Info::IPv6::MUNGE,
|
||||
%SNMP::Info::LLDP::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
|
||||
@@ -163,12 +169,12 @@ 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
|
||||
# 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 ( 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)
|
||||
@@ -185,38 +191,29 @@ sub root_ip {
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo -> cisco aironet 350 loopback
|
||||
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%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;
|
||||
@@ -293,30 +290,35 @@ 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 'brocade' if ( $descr =~ /foundry/i );
|
||||
|
||||
@@ -414,6 +416,8 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::IPv6
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -442,6 +446,8 @@ See L<SNMP::Info::PowerEthernet/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::IPv6/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -515,6 +521,18 @@ See L<SNMP::Info::EtherLike/"GLOBALS"> for details.
|
||||
|
||||
See L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info:PowerEthernet
|
||||
|
||||
See L<SNMP::Info::PowerEthernet/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::IPv6
|
||||
|
||||
See L<SNMP::Info::IPv6/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
@@ -531,12 +549,6 @@ name.
|
||||
|
||||
Only returns those iids that have a description listed in $l3->i_description()
|
||||
|
||||
=item $l3->i_ignore()
|
||||
|
||||
Returns reference to hash. Creates a key for each IID that should be ignored.
|
||||
|
||||
Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
|
||||
|
||||
=item $l3->i_name()
|
||||
|
||||
Returns reference to hash of iid to human set name.
|
||||
@@ -790,4 +802,8 @@ See L<SNMP::Info::PowerEthernet/"TABLE METHODS"> for details.
|
||||
|
||||
See L<SNMP::Info::IPv6/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
|
||||
@@ -49,7 +49,7 @@ use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -198,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;
|
||||
@@ -445,14 +430,6 @@ 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
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -385,6 +385,20 @@ sub i_vlan_membership {
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $alteon = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlans = $alteon->i_vlan($partial);
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $port (keys %$vlans) {
|
||||
my $vlan = $vlans->{$port};
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
# Bridge MIB does not map Bridge Port to ifIndex correctly on some code
|
||||
# versions
|
||||
sub bp_index {
|
||||
@@ -574,6 +588,12 @@ IDs. These are the VLANs which are members of the egress list for the port.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $alteon->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $alteon->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer3;
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE
|
||||
$int_include_vpn $fake_idx $type_class/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
|
||||
@@ -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 = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::Aggregate::MIBS,
|
||||
'ARISTA-PRODUCTS-MIB' => 'aristaProducts',
|
||||
);
|
||||
|
||||
@@ -104,21 +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);
|
||||
}
|
||||
sub agg_ports { return agg_ports_ifstack(@_) }
|
||||
|
||||
1;
|
||||
__END__
|
||||
@@ -155,6 +168,8 @@ Subclass for Arista Networks EOS-based devices
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Aggregate
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
@@ -173,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.
|
||||
@@ -224,14 +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->i_duplex_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
@@ -240,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
|
||||
|
||||
1740
Info/Layer3/Aruba.pm
1740
Info/Layer3/Aruba.pm
File diff suppressed because it is too large
Load Diff
@@ -43,7 +43,7 @@ use SNMP::Info::Bridge;
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE %MODEL_MAP
|
||||
%MODID_MAP %PROCID_MAP/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
@@ -732,6 +732,8 @@ sub i_vlan {
|
||||
return \%i_vlan;
|
||||
}
|
||||
|
||||
sub i_pvid { goto &i_vlan }
|
||||
|
||||
sub root_ip {
|
||||
my $bayrs = shift;
|
||||
|
||||
@@ -1549,6 +1551,10 @@ interfaces.
|
||||
|
||||
Returns reference to hash. Maps port VLAN ID to IIDs.
|
||||
|
||||
=item $bayrs->i_pvid()
|
||||
|
||||
Returns reference to hash. Maps port VLAN ID to IIDs.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Pseudo F<ENTITY-MIB> information
|
||||
@@ -1635,11 +1641,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.
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
|
||||
|
||||
@@ -32,39 +32,22 @@
|
||||
package SNMP::Info::Layer3::C3550;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoPower;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::Layer3::CiscoSwitch;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# NOTE : Top-most items gets precedence for @ISA
|
||||
@SNMP::Info::Layer3::C3550::ISA = qw/
|
||||
SNMP::Info::CiscoVTP
|
||||
SNMP::Info::CiscoStpExtensions
|
||||
SNMP::Info::CiscoStack
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig
|
||||
SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3
|
||||
SNMP::Info::Layer3::CiscoSwitch
|
||||
Exporter/;
|
||||
|
||||
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
# NOTE: Order creates precedence
|
||||
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
|
||||
@@ -72,46 +55,23 @@ $VERSION = '3.04_001';
|
||||
# So we want CiscoVTP to come last to get the right one.
|
||||
# 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::LLDP::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS, %SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
|
||||
%MIBS
|
||||
= ( %SNMP::Info::Layer3::CiscoSwitch::MIBS, %SNMP::Info::CiscoStack::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::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::LLDP::FUNCS, %SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS, %SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::FUNCS,
|
||||
%SNMP::Info::CiscoStack::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::LLDP::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE, %SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
@@ -232,10 +192,6 @@ sub set_i_duplex_admin {
|
||||
}
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
return 1;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -281,25 +237,9 @@ after determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoSTPExtensions
|
||||
|
||||
=item SNMP::Info::CiscoPower
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
=item SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
=back
|
||||
|
||||
@@ -309,26 +249,10 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"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.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
See L<SNMP::Info::Layer3::CiscoSwitch/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -353,51 +277,15 @@ Will take the translated model number and try to format it better.
|
||||
|
||||
Tries to cull the number of ports from the model number.
|
||||
|
||||
=item $c3550->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"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::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
=head2 Globals imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"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::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.
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
@@ -444,45 +332,13 @@ Crosses $c3550->p_port() with $c3550->p_duplex() to utilize port C<ifIndex>.
|
||||
|
||||
=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::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"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::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"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::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"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::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.
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -31,48 +31,30 @@
|
||||
package SNMP::Info::Layer3::C4000;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::Layer3::CiscoSwitch;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::C4000::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::C4000::ISA = qw/
|
||||
SNMP::Info::Layer3::CiscoSwitch
|
||||
SNMP::Info::MAU
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::C4000::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::MIBS,
|
||||
'CISCO-ENVMON-MIB' => 'ciscoEnvMonMIB',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::GLOBALS,
|
||||
'ps1_type' => 'ciscoEnvMonSupplyStatusDescr.1',
|
||||
'ps1_status' => 'ciscoEnvMonSupplyState.1',
|
||||
'ps2_type' => 'ciscoEnvMonSupplyStatusDescr.2',
|
||||
@@ -80,24 +62,14 @@ $VERSION = '3.04_001';
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::FUNCS,
|
||||
'fan_state' => 'ciscoEnvMonFanState',
|
||||
'fan_descr' => 'ciscoEnvMonFanStatusDescr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
%MUNGE
|
||||
= ( %SNMP::Info::MAU::MUNGE, %SNMP::Info::Layer3::CiscoSwitch::MUNGE, );
|
||||
|
||||
# Override Inheritance for these specific methods
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
@@ -106,6 +78,11 @@ $VERSION = '3.04_001';
|
||||
*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();
|
||||
@@ -120,8 +97,6 @@ sub fan {
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -163,22 +138,10 @@ after determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
=item SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -187,23 +150,11 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
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::CiscoStats/"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
|
||||
See L<SNMP::Info::Layer3::CiscoSwitch/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
@@ -214,48 +165,20 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $c4000->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=item $c4000->fan()
|
||||
|
||||
Returns fan status
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
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::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.
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=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
|
||||
@@ -281,39 +204,27 @@ 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
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
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
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -31,34 +31,19 @@
|
||||
package SNMP::Info::Layer3::C6500;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
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 SNMP::Info::Layer3::CiscoSwitch;
|
||||
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::CiscoVTP
|
||||
SNMP::Info::CiscoStpExtensions
|
||||
SNMP::Info::CiscoStack
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::CDP
|
||||
SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig
|
||||
SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3
|
||||
SNMP::Info::Layer3::CiscoSwitch
|
||||
SNMP::Info::MAU
|
||||
Exporter
|
||||
/;
|
||||
|
||||
@@ -66,7 +51,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
# NOTE: Order creates precedence
|
||||
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
|
||||
@@ -75,52 +60,50 @@ $VERSION = '3.04_001';
|
||||
# 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::LLDP::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS, %SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS,
|
||||
'CISCO-VIRTUAL-SWITCH-MIB' => 'cvsSwitchMode',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::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::LLDP::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS, %SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::FUNCS,
|
||||
%SNMP::Info::CiscoStack::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::LLDP::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE, %SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::Layer3::CiscoSwitch::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
sub serial {
|
||||
my $c6500 = shift;
|
||||
|
||||
my $serial = $c6500->SUPER::serial();
|
||||
return $serial if defined $serial and $serial;
|
||||
|
||||
# now grab the table only if SUPER cannot find it
|
||||
my $e_serial = $c6500->e_serial();
|
||||
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( sort keys %$e_serial ) {
|
||||
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
|
||||
return $e_serial->{$e};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Newer versions use the ETHERLIKE-MIB to report operational duplex.
|
||||
|
||||
@@ -179,6 +162,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
|
||||
@@ -186,6 +179,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);
|
||||
|
||||
@@ -203,7 +210,31 @@ 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 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,25 +283,11 @@ after determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
=item SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoPower
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=back
|
||||
|
||||
@@ -280,26 +297,12 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"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
|
||||
See L<SNMP::Info::Layer3::CiscoSwitch/"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::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -313,51 +316,31 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $c6500->cisco_comm_indexing()
|
||||
=item $c6500->cvsSwitchMode()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
Returns the Switch status: multiNode or standalone.
|
||||
|
||||
=item $c6500->is_virtual_switch()
|
||||
|
||||
Return 1 if the switch (C<cvsSwitchMode>) is in multimode (VSS).
|
||||
|
||||
=item $c6500->serial()
|
||||
|
||||
Returns serial number of unit (falls back to C<entPhysicalSerialNum>).
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
=head2 Globals imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
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::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::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
@@ -402,48 +385,29 @@ 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
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"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::Layer3::CiscoSwitch
|
||||
|
||||
=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
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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::MAU
|
||||
|
||||
=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
|
||||
|
||||
=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.
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -31,59 +31,70 @@
|
||||
package SNMP::Info::Layer3::Cisco;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::LLDP;
|
||||
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::CiscoStpExtensions;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Cisco::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::ISA = qw/SNMP::Info::CiscoVTP
|
||||
SNMP::Info::LLDP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoRTT
|
||||
SNMP::Info::CiscoQOS SNMP::Info::CiscoConfig
|
||||
SNMP::Info::CiscoPower SNMP::Info::CiscoStpExtensions
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::Cisco::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoPower::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoQOS::MIBS,
|
||||
%SNMP::Info::CiscoRTT::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
'CISCO-EIGRP-MIB' => 'cEigrpAsRouterId',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS, %SNMP::Info::CiscoQOS::GLOBALS,
|
||||
%SNMP::Info::CiscoRTT::GLOBALS, %SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS, 'eigrp_id' => 'cEigrpAsRouterId',
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoQOS::GLOBALS,
|
||||
%SNMP::Info::CiscoRTT::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
'eigrp_id' => 'cEigrpAsRouterId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoPower::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoQOS::FUNCS,
|
||||
%SNMP::Info::CiscoRTT::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
|
||||
# EIGRP
|
||||
@@ -92,33 +103,44 @@ $VERSION = '3.04_001';
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoPower::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoQOS::MUNGE,
|
||||
%SNMP::Info::CiscoRTT::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
'eigrp_peers' => \&SNMP::Info::munge_ip,
|
||||
);
|
||||
|
||||
sub i_vlan {
|
||||
my ($cisco) = shift;
|
||||
my ($partial) = shift;
|
||||
my $cisco = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my ($i_type) = $cisco->i_type($partial);
|
||||
my ($i_descr) = $cisco->i_description($partial);
|
||||
my %i_vlan;
|
||||
my $i_type = $cisco->i_type($partial);
|
||||
my $i_descr = $cisco->i_description($partial);
|
||||
my $i_vlan = $cisco->SUPER::i_vlan($partial);
|
||||
|
||||
foreach my $idx ( keys %$i_descr ) {
|
||||
if ( $i_type->{$idx} eq 'l2vlan' || $i_type->{$idx} eq 135 ) {
|
||||
next unless $i_type->{$idx};
|
||||
if ( $i_type->{$idx} eq 'l2vlan'
|
||||
|| $i_type->{$idx} eq '135' && !defined $i_vlan->{$idx} )
|
||||
{
|
||||
if ( $i_descr->{$idx} =~ /\.(\d+)$/ ) {
|
||||
$i_vlan{$idx} = $1;
|
||||
$i_vlan->{$idx} = $1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return \%i_vlan;
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
my $cisco = shift;
|
||||
# If we get a VTP version, it's *extremely* likely that the device needs community based indexing
|
||||
my $vtp = $cisco->vtp_version() || '0';
|
||||
return ($vtp ne '0');
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -127,7 +149,9 @@ __END__
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
|
||||
that are not covered in other classes.
|
||||
that are not covered in other classes and the base L3 Cisco class for other
|
||||
device specific L3 Cisco classes.
|
||||
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -151,7 +175,8 @@ Max Baker
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Cisco Routers running IOS
|
||||
Subclass for Generic Cisco Routers running IOS and the base L3 Cisco class
|
||||
for other device specific L3 Cisco classes.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
@@ -159,12 +184,12 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoRTT
|
||||
|
||||
=item SNMP::Info::CiscoQOS
|
||||
@@ -173,6 +198,8 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
=item SNMP::Info::Power
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
@@ -187,12 +214,12 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoQOS/"Required MIBs"> for its own MIB requirements.
|
||||
@@ -201,6 +228,8 @@ 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::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
@@ -211,20 +240,25 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cisco->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $cisco->eigrp_id()
|
||||
|
||||
(C<cEigrpAsRouterId>)
|
||||
|
||||
=item $switch->cisco_comm_indexing()
|
||||
|
||||
Returns 1 when the device is likely to need vlan indexing.
|
||||
Determined by checking C<vtpVersion>.
|
||||
|
||||
=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::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
@@ -233,10 +267,6 @@ See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
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.
|
||||
@@ -253,6 +283,10 @@ See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
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::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
@@ -280,6 +314,10 @@ Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"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::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
@@ -288,10 +326,6 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
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.
|
||||
@@ -308,6 +342,10 @@ See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
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.
|
||||
|
||||
@@ -32,68 +32,61 @@
|
||||
package SNMP::Info::Layer3::CiscoASA;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
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::CiscoASA::ISA = qw/
|
||||
SNMP::Info::CiscoStats
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::CiscoASA::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::Cisco::MIBS,
|
||||
);
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, );
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::Cisco::GLOBALS,
|
||||
);
|
||||
%GLOBALS
|
||||
= ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::Cisco::FUNCS,
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
'mac_table' => 'ifPhysAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::Cisco::MUNGE,
|
||||
'mac_table' => \&SNMP::Info::munge_mac, );
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoStats::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];
|
||||
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 $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $self->orig_i_description($partial) || {};
|
||||
|
||||
@@ -135,13 +128,15 @@ Moe Kraus
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Cisco ASAs
|
||||
Subclass for Cisco ASA Devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3::Cisco
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
@@ -149,11 +144,11 @@ Subclass for Cisco ASAs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-EIGRP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -176,77 +171,25 @@ configured interface name instead of "Adaptive Security Appliance
|
||||
|
||||
=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
|
||||
=head2 Global Methods 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
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
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.
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -31,34 +31,31 @@
|
||||
package SNMP::Info::Layer3::CiscoFWSM;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3::Cisco;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::Layer3::Cisco
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::CiscoStats
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::CiscoFWSM::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::Cisco::MIBS,
|
||||
);
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, );
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::Cisco::GLOBALS,
|
||||
);
|
||||
%GLOBALS
|
||||
= ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::Cisco::FUNCS,
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::Cisco::MUNGE,
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoStats::MUNGE, );
|
||||
|
||||
# For FWSMs, the ipNetToPhysicalPhysAddress table appears to be of the form:
|
||||
# $ifindex.$inetaddresstype.$proto.$ip_address -> $mac_address
|
||||
@@ -69,65 +66,65 @@ $VERSION = '3.04_001';
|
||||
# This doesn't really line up to what at_* return, so we munge it
|
||||
|
||||
sub at_paddr {
|
||||
my ($fwsm) = shift;
|
||||
my ($partial) = shift;
|
||||
my ($fwsm) = shift;
|
||||
my ($partial) = shift;
|
||||
|
||||
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||
my $n_paddrs = {};
|
||||
|
||||
foreach my $key (keys %$paddrs) {
|
||||
my $paddr = $paddrs->{$key};
|
||||
my @parts = split /\./, $key;
|
||||
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
|
||||
my $ip = join ".", @parts;
|
||||
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||
my $n_paddrs = {};
|
||||
|
||||
next if($proto != 4); # at_paddr doesn't support non-IPv4
|
||||
foreach my $key ( keys %$paddrs ) {
|
||||
my $paddr = $paddrs->{$key};
|
||||
my @parts = split /\./, $key;
|
||||
my ( $ifindex, $addrtype, $proto ) = splice @parts, 0, 3;
|
||||
my $ip = join ".", @parts;
|
||||
|
||||
$n_paddrs->{"$ifindex.$ip"} = $paddr;
|
||||
}
|
||||
return $n_paddrs;
|
||||
next if ( $proto != 4 ); # at_paddr doesn't support non-IPv4
|
||||
|
||||
$n_paddrs->{"$ifindex.$ip"} = $paddr;
|
||||
}
|
||||
return $n_paddrs;
|
||||
}
|
||||
|
||||
sub at_netaddr {
|
||||
my ($fwsm) = shift;
|
||||
my ($partial) = shift;
|
||||
my ($fwsm) = shift;
|
||||
my ($partial) = shift;
|
||||
|
||||
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||
|
||||
my $netaddrs = {};
|
||||
|
||||
foreach my $key (keys %$paddrs) {
|
||||
my $paddr = $paddrs->{$key};
|
||||
my @parts = split /\./, $key;
|
||||
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
|
||||
my $ip = join ".", @parts;
|
||||
my $netaddrs = {};
|
||||
|
||||
next if($proto != 4); # at_netaddr doesn't support non-IPv4
|
||||
foreach my $key ( keys %$paddrs ) {
|
||||
my $paddr = $paddrs->{$key};
|
||||
my @parts = split /\./, $key;
|
||||
my ( $ifindex, $addrtype, $proto ) = splice @parts, 0, 3;
|
||||
my $ip = join ".", @parts;
|
||||
|
||||
$netaddrs->{"$ifindex.$ip"} = $ip;
|
||||
}
|
||||
return $netaddrs;
|
||||
next if ( $proto != 4 ); # at_netaddr doesn't support non-IPv4
|
||||
|
||||
$netaddrs->{"$ifindex.$ip"} = $ip;
|
||||
}
|
||||
return $netaddrs;
|
||||
}
|
||||
|
||||
sub at_ifaddr {
|
||||
my ($fwsm) = shift;
|
||||
my ($partial) = shift;
|
||||
my ($fwsm) = shift;
|
||||
my ($partial) = shift;
|
||||
|
||||
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||
|
||||
my $ifaddrs = {};
|
||||
|
||||
foreach my $key (keys %$paddrs) {
|
||||
my $paddr = $paddrs->{$key};
|
||||
my @parts = split /\./, $key;
|
||||
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
|
||||
my $ip = join ".", @parts;
|
||||
my $ifaddrs = {};
|
||||
|
||||
next if($proto != 4); # at_ifaddr doesn't support non-IPv4
|
||||
foreach my $key ( keys %$paddrs ) {
|
||||
my $paddr = $paddrs->{$key};
|
||||
my @parts = split /\./, $key;
|
||||
my ( $ifindex, $addrtype, $proto ) = splice @parts, 0, 3;
|
||||
my $ip = join ".", @parts;
|
||||
|
||||
$ifaddrs->{"$ifindex.$ip"} = $ip;
|
||||
}
|
||||
return $ifaddrs;
|
||||
next if ( $proto != 4 ); # at_ifaddr doesn't support non-IPv4
|
||||
|
||||
$ifaddrs->{"$ifindex.$ip"} = $ip;
|
||||
}
|
||||
return $ifaddrs;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -135,8 +132,8 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::CiscoFWSM - SNMP Interface to Firewall Services Modules for
|
||||
features not covered elsewhere.
|
||||
SNMP::Info::Layer3::CiscoFWSM - SNMP Interface to Firewall Services Modules
|
||||
for features not covered elsewhere.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
@@ -146,14 +143,14 @@ Brian De Wolf
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $fwsm = 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";
|
||||
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 = $fwsm->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
@@ -166,7 +163,9 @@ Subclass for Cisco Firewall Services Modules
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3::Cisco
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
@@ -176,15 +175,21 @@ Subclass for Cisco Firewall Services Modules
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3::Cisco
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details.
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
@@ -216,8 +221,12 @@ the MIB to provide that information isn't supported on FWSM.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3::Cisco
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
190
Info/Layer3/CiscoSwitch.pm
Normal file
190
Info/Layer3/CiscoSwitch.pm
Normal file
@@ -0,0 +1,190 @@
|
||||
# SNMP::Info::Layer3::CiscoSwitch
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2014 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::CiscoSwitch;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoAgg;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::Layer3::Cisco;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
@SNMP::Info::Layer3::CiscoSwitch::ISA = qw/
|
||||
SNMP::Info::CiscoAgg
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::Layer3::Cisco
|
||||
Exporter
|
||||
/;
|
||||
|
||||
@SNMP::Info::Layer3::CiscoSwitch::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::Cisco::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoAgg::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::Cisco::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoAgg::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::Cisco::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoAgg::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::Cisco::MUNGE,
|
||||
%SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoAgg::MUNGE,
|
||||
);
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::CiscoSwitch - Base class for L3 Cisco switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $switch = 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 = $switch->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Base subclass for Cisco Layer 2/3 Switches.
|
||||
|
||||
These devices have switch specific characteristics beyond those in
|
||||
traditional routers covered by L<SNMP::Info::Layer3::Cisco>. For example,
|
||||
port security interface information from L<SNMP::Info::CiscoPortSecurity>.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $swich = new SNMP::Info::Layer3::CiscoSwitch(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoAgg
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::Layer3::Cisco
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
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 $switch->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoAgg/"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::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::CiscoAgg
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoAgg/"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::Layer3::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -42,7 +42,7 @@ use SNMP::Info::Entity;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS,
|
||||
|
||||
@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -153,6 +153,48 @@ sub serial {
|
||||
return $dell->SUPER::serial();
|
||||
}
|
||||
|
||||
# check all fans, and report overall status
|
||||
sub fan {
|
||||
my $dell = shift;
|
||||
|
||||
my $fan = $dell->dell_fan_desc() || {};
|
||||
my $state = $dell->dell_fan_state() || {};
|
||||
my @messages = ();
|
||||
|
||||
foreach my $k (keys %$fan) {
|
||||
next if $state->{$k} and $state->{$k} eq 'normal';
|
||||
push @messages, "$fan->{$k}: $state->{$k}";
|
||||
}
|
||||
|
||||
push @messages, ((scalar keys %$fan). " fans OK")
|
||||
if scalar @messages == 0;
|
||||
|
||||
return (join ", ", @messages);
|
||||
}
|
||||
|
||||
sub _ps_status {
|
||||
my ($dell, $unit) = @_;
|
||||
|
||||
my $status = 'unknown';
|
||||
return $status if !defined $unit;
|
||||
|
||||
my $desc = $dell->dell_pwr_desc() || {};
|
||||
my $state = $dell->dell_pwr_state() || {};
|
||||
|
||||
foreach my $k (keys %$desc) {
|
||||
next unless $desc->{$k} and $desc->{$k} eq "ps1_unit$unit";
|
||||
return ($state->{$k} || $status);
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
sub ps1_type { return 'internalRedundant' }
|
||||
sub ps2_type { return 'internalRedundant' }
|
||||
|
||||
sub ps1_status { return (shift)->_ps_status(1) }
|
||||
sub ps2_status { return (shift)->_ps_status(2) }
|
||||
|
||||
sub interfaces {
|
||||
my $dell = shift;
|
||||
my $partial = shift;
|
||||
@@ -193,25 +235,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;
|
||||
|
||||
@@ -232,6 +255,10 @@ sub _vendor {
|
||||
}
|
||||
}
|
||||
|
||||
# dot1qTpFdbTable uses dot1qVlanIndex rather than dot1qFdbId as index,
|
||||
# so pretend we don't have the mapping
|
||||
sub qb_fdb_index {return}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -327,6 +354,26 @@ id(). Defaults to 'dlink'.
|
||||
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
|
||||
id(). Defaults to 'dlink'.
|
||||
|
||||
=item $dell->fan()
|
||||
|
||||
Return the status of all fans from the F<Dell-Vendor-MIB>
|
||||
|
||||
=item $dell->ps1_type()
|
||||
|
||||
Return the type of the first power supply from the F<Dell-Vendor-MIB>
|
||||
|
||||
=item $dell->ps2_type()
|
||||
|
||||
Return the type of the second power supply from the F<Dell-Vendor-MIB>
|
||||
|
||||
=item $dell->ps1_status()
|
||||
|
||||
Return the status of the first power supply from the F<Dell-Vendor-MIB>
|
||||
|
||||
=item $dell->ps2_status()
|
||||
|
||||
Return the status of the second power supply from the F<Dell-Vendor-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
@@ -406,22 +453,9 @@ sometimes not unique.
|
||||
Returns reference to hash of iid to current link administrative duplex
|
||||
setting.
|
||||
|
||||
=item $dell->fw_mac()
|
||||
=item $dell->qb_fdb_index()
|
||||
|
||||
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.
|
||||
Returns nothing to work around incorrect indexing of C<dot1qTpFdbTable>
|
||||
|
||||
=back
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
@@ -149,27 +149,47 @@ 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);
|
||||
}
|
||||
|
||||
# LLDP table timefilter implementation continuously increments when walked
|
||||
# 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.
|
||||
# which means no time filter for tables with and index containing a
|
||||
# TimeFilter
|
||||
|
||||
sub qb_fdb_index {
|
||||
my $bridge = shift;
|
||||
|
||||
my $qb_fdb_ids = $bridge->dot1qVlanFdbId(0) || {};
|
||||
|
||||
# Strip the TimeFilter
|
||||
my $vl_fdb_index = {};
|
||||
for my $fdb_entry (keys(%$qb_fdb_ids)) {
|
||||
(my $vlan = $fdb_entry) =~ s/^\d+\.//;
|
||||
$vl_fdb_index->{$qb_fdb_ids->{$fdb_entry}} = $vlan;
|
||||
}
|
||||
|
||||
return $vl_fdb_index;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# dot1qVlanCurrentTable TimeFilter index
|
||||
my $v_ports = $bridge->qb_cv_egress(0) || $bridge->qb_v_egress();
|
||||
|
||||
return $bridge->_vlan_hoa($v_ports, $partial);
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $bridge = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# dot1qVlanCurrentTable TimeFilter index
|
||||
my $v_ports = $bridge->qb_cv_untagged(0) || $bridge->qb_v_untagged();
|
||||
|
||||
return $bridge->_vlan_hoa($v_ports, $partial);
|
||||
}
|
||||
|
||||
sub lldp_ip {
|
||||
my $enterasys = shift;
|
||||
@@ -373,22 +393,11 @@ 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 Link Layer Discovery Protocol (LLDP) Overrides
|
||||
=head2 Time Filter Table Index Overrides
|
||||
|
||||
The LLDP table time filter implementation continuously increments when
|
||||
The time filter C<TimeFilter> 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
|
||||
@@ -396,6 +405,12 @@ supply a partial value of zero which means no time filter.
|
||||
|
||||
=over
|
||||
|
||||
=item $enterasys->qb_fdb_index()
|
||||
|
||||
=item $enterasys->i_vlan_membership()
|
||||
|
||||
=item $enterasys->i_vlan_membership_untagged()
|
||||
|
||||
=item $enterasys->lldp_if()
|
||||
|
||||
=item $enterasys->lldp_ip()
|
||||
|
||||
@@ -46,18 +46,19 @@ use SNMP::Info::EDP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%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',
|
||||
'EXTREME-VLAN-MIB' => 'extremeVlan',
|
||||
'EXTREME-POE-MIB' => 'extremePethSystemAdminEnable',
|
||||
'EXTREME-BASE-MIB' => 'extremeAgent',
|
||||
'EXTREME-SYSTEM-MIB' => 'extremeSystem',
|
||||
'EXTREME-FDB-MIB' => 'extremeFdbMacFdbMacAddress',
|
||||
'EXTREME-VLAN-MIB' => 'extremeVlan',
|
||||
'EXTREME-POE-MIB' => 'extremePethSystemAdminEnable',
|
||||
'EXTREME-STP-EXTENSIONS-MIB' => 'extremeStpDomainBridgeId',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
@@ -97,6 +98,20 @@ $VERSION = '3.04_001';
|
||||
'peth_power_watts' => 'extremePethSlotPowerLimit',
|
||||
# EXTREME-POE-MIB::extremePethPsePortTable
|
||||
'peth_port_power' => 'extremePethPortMeasuredPower',
|
||||
# EXTREME-STP-EXTENSIONS-MIB::extremeStpDomainTable
|
||||
'stp_i_time' => 'extremeStpDomainTimeSinceTopologyChange',
|
||||
'stp_i_ntop' => 'extremeStpDomainTopChanges',
|
||||
'stp_i_root' => 'extremeStpDomainDesignatedRoot',
|
||||
'stp_i_root_port' => 'extremeStpDomainRootPortIfIndex',
|
||||
'stp_i_priority' => 'extremeStpDomainBridgePriority',
|
||||
'ex_stp_i_mac' => 'extremeStpDomainBridgeId',
|
||||
# EXTREME-STP-EXTENSIONS-MIB::extremeStpPortTable
|
||||
'stp_p_priority' => 'extremeStpPortPortPriority',
|
||||
'stp_p_state' => 'extremeStpPortPortState',
|
||||
'stp_p_cost' => 'extremeStpPortPathCost',
|
||||
'stp_p_root' => 'extremeStpPortDesignatedRoot',
|
||||
'stp_p_bridge' => 'extremeStpPortDesignatedBridge',
|
||||
'stp_p_port' => 'extremeStpPortDesignatedPort',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
@@ -114,6 +129,11 @@ $VERSION = '3.04_001';
|
||||
'fan_state' => \&munge_true_ok,
|
||||
'ex_vlan_untagged' => \&SNMP::Info::munge_port_list,
|
||||
'ex_vlan_tagged' => \&SNMP::Info::munge_port_list,
|
||||
'ex_stp_i_mac' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_i_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_bridge' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_port' => \&SNMP::Info::munge_prio_port,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
@@ -290,9 +310,6 @@ sub fw_mac {
|
||||
my $b = $extreme->SUPER::fw_mac();
|
||||
return $b if (keys %$b);
|
||||
|
||||
my $qb = $extreme->qb_fw_mac();
|
||||
return $qb if (keys %$qb);
|
||||
|
||||
return $extreme->ex_fw_mac();
|
||||
}
|
||||
|
||||
@@ -301,9 +318,6 @@ sub fw_port {
|
||||
|
||||
my $b = $extreme->SUPER::fw_port();
|
||||
return $b if (keys %$b);
|
||||
|
||||
my $qb = $extreme->qb_fw_port();
|
||||
return $qb if (keys %$qb);
|
||||
|
||||
return $extreme->ex_fw_port();
|
||||
}
|
||||
@@ -314,9 +328,6 @@ sub fw_status {
|
||||
my $b = $extreme->SUPER::fw_status();
|
||||
return $b if (keys %$b);
|
||||
|
||||
my $qb = $extreme->qb_fw_status();
|
||||
return $qb if (keys %$qb);
|
||||
|
||||
return $extreme->ex_fw_status();
|
||||
}
|
||||
|
||||
@@ -505,14 +516,14 @@ sub _xos_i_vlan_membership {
|
||||
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 );
|
||||
}
|
||||
#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;
|
||||
@@ -551,6 +562,78 @@ sub _extremeware_i_vlan_membership {
|
||||
return \%i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
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_untagged($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_untagged($partial);
|
||||
return $xos if (ref {} eq ref $xos and scalar keys %$xos);
|
||||
|
||||
# Try older ifStack method
|
||||
my $extremeware = $extreme->_extremeware_i_vlan_membership_untagged($partial);
|
||||
return $extremeware if (ref {} eq ref $extremeware and scalar keys %$extremeware);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub _xos_i_vlan_membership_untagged {
|
||||
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_membership = {};
|
||||
foreach my $idx ( keys %$u_ports ) {
|
||||
next unless ( defined $u_ports->{$idx} );
|
||||
my $u_portlist = $u_ports->{$idx};
|
||||
my $ret = [];
|
||||
|
||||
my ( $vlan_if, $slot ) = $idx =~ /^(\d+)\.(\d+)/;
|
||||
my $vlan = $vlans->{$vlan_if} || '';
|
||||
|
||||
foreach my $portlist ( $u_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;
|
||||
}
|
||||
|
||||
# Assuming Cisco-like trunk behavior that native VLAN is transmitted untagged
|
||||
sub _extremeware_i_vlan_membership_untagged {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlans = $extreme->_extremeware_i_vlan($partial);
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $port (keys %$vlans) {
|
||||
my $vlan = $vlans->{$port};
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
# VLAN management.
|
||||
# See extreme-vlan.mib for a detailed description of
|
||||
# Extreme's use of ifStackTable and EXTREME-VLAN-MIB.
|
||||
@@ -720,6 +803,75 @@ sub lldp_if {
|
||||
return \%lldp_if;
|
||||
}
|
||||
|
||||
# extremeStpDomainStpdInstance not accessible, so we need to extract from iid
|
||||
sub stp_i_id {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stp_i_roots = $extreme->stp_i_root($partial);
|
||||
|
||||
my %stp_i_id;
|
||||
foreach my $iid ( keys %$stp_i_roots ) {
|
||||
$stp_i_id{$iid} = $iid;
|
||||
}
|
||||
return \%stp_i_id;
|
||||
}
|
||||
|
||||
# extremeStpDomainBridgeId returns priority and mac,
|
||||
# for cross class compatibility we just need mac
|
||||
sub stp_i_mac {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stp_i_bids = $extreme->ex_stp_i_mac($partial);
|
||||
|
||||
my %stp_i_mac;
|
||||
foreach my $iid ( keys %$stp_i_bids ) {
|
||||
my $mac = $stp_i_bids->{$iid};
|
||||
next unless $mac;
|
||||
|
||||
$mac =~ s/^([0-9A-F][0-9A-F]:){2}//;
|
||||
|
||||
$stp_i_mac{$iid} = $mac;
|
||||
}
|
||||
return \%stp_i_mac;
|
||||
}
|
||||
|
||||
# Break up the extremeStpPortEntry INDEX into Stpd Instance and IfIndex.
|
||||
sub _ex_stpport_index {
|
||||
my $idx = shift;
|
||||
my ( $id, $ifindex ) = split( /\./, $idx);
|
||||
return ($id, $ifindex);
|
||||
}
|
||||
|
||||
# extremeStpPortPortIfIndex not-accessible, extract from iid
|
||||
sub stp_p_id {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stp_port = $extreme->stp_p_root($partial);
|
||||
my $stp_p_id = {};
|
||||
foreach my $idx ( keys %$stp_port ) {
|
||||
my ( $id, $ifindex ) = _ex_stpport_index($idx);
|
||||
$stp_p_id->{$idx} = $ifindex;
|
||||
}
|
||||
return $stp_p_id;
|
||||
}
|
||||
|
||||
# extremeStpDomainStpdInstance not-accessible, extract from iid
|
||||
sub stp_p_stg_id {
|
||||
my $extreme = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stp_port = $extreme->stp_p_root($partial);
|
||||
my $stp_p_stg_id = {};
|
||||
foreach my $idx ( keys %$stp_port ) {
|
||||
my ( $id, $ifindex ) = _ex_stpport_index($idx);
|
||||
$stp_p_stg_id->{$idx} = $id;
|
||||
}
|
||||
return $stp_p_stg_id;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
@@ -936,6 +1088,12 @@ IDs. These are the VLANs which are members of the egress list for the port.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $extreme->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $extreme->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
@@ -968,6 +1126,98 @@ The configured maximum amount of in-line power available to the slot.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Spanning Tree Instance Globals
|
||||
|
||||
=over
|
||||
|
||||
=item $extreme->stp_i_mac()
|
||||
|
||||
Returns the MAC extracted from (C<extremeStpDomainBridgeId>).
|
||||
|
||||
=item $extreme->stp_i_id()
|
||||
|
||||
Returns the unique identifier of the STP domain.
|
||||
|
||||
(C<extremeStpDomainStpdInstance>)
|
||||
|
||||
=item $extreme->stp_i_time()
|
||||
|
||||
Returns time since last topology change detected. (100ths/second)
|
||||
|
||||
(C<extremeStpDomainTimeSinceTopologyChange>)
|
||||
|
||||
=item $extreme->stp_i_time()
|
||||
|
||||
Returns time since last topology change detected. (100ths/second)
|
||||
|
||||
(C<extremeStpDomainTimeSinceTopologyChange>)
|
||||
|
||||
=item $extreme->stp_i_time()
|
||||
|
||||
Returns the total number of topology changes detected.
|
||||
|
||||
(C<extremeStpDomainTopChanges>)
|
||||
|
||||
=item $extreme->stp_i_root()
|
||||
|
||||
Returns root of STP.
|
||||
|
||||
(C<extremeStpDomainDesignatedRoot>)
|
||||
|
||||
=item $extreme->stp_i_root_port()
|
||||
|
||||
Returns the port number of the port that offers the lowest cost path
|
||||
to the root bridge.
|
||||
|
||||
(C<extremeStpDomainRootPortIfIndex>)
|
||||
|
||||
=item $extreme->stp_i_priority()
|
||||
|
||||
Returns the port number of the port that offers the lowest cost path
|
||||
to the root bridge.
|
||||
|
||||
(C<extremeStpDomainBridgePriority>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Spanning Tree Protocol Port Table
|
||||
|
||||
=over
|
||||
|
||||
=item $extreme->stp_p_id()
|
||||
|
||||
(C<extremeStpPortPortIfIndex>)
|
||||
|
||||
=item $extreme->stp_p_stg_id()
|
||||
|
||||
(C<extremeStpDomainStpdInstance>)
|
||||
|
||||
=item $extreme->stp_p_priority()
|
||||
|
||||
(C<extremeStpPortPortPriority>)
|
||||
|
||||
=item $extreme->stp_p_state()
|
||||
|
||||
(C<extremeStpPortPortState>)
|
||||
|
||||
=item $extreme->stp_p_cost()
|
||||
|
||||
(C<extremeStpPortPathCost>)
|
||||
|
||||
=item $extreme->stp_p_root()
|
||||
|
||||
(C<extremeStpPortDesignatedRoot>)
|
||||
|
||||
=item $extreme->stp_p_bridge()
|
||||
|
||||
(C<extremeStpPortDesignatedBridge>)
|
||||
|
||||
=item $extreme->stp_p_port()
|
||||
|
||||
(C<extremeStpPortDesignatedPort>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
@@ -38,7 +38,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -72,10 +72,14 @@ $VERSION = '3.04_001';
|
||||
'i_up' => 'sysInterfaceStatus',
|
||||
|
||||
# sysIfxStatTable
|
||||
'i_octet_in' => 'sysIfxStatHcInOctets',
|
||||
'i_octet_out' => 'sysIfxStatHcOutOctets',
|
||||
'i_pkts_ucast_in' => 'sysIfxStatHcInUcastPkts',
|
||||
'i_pkts_ucast_out' => 'sysIfxStatHcOutUcastPkts',
|
||||
'i_octet_in64' => 'sysIfxStatHcInOctets',
|
||||
'i_octet_out64' => 'sysIfxStatHcOutOctets',
|
||||
'i_pkts_ucast_in64' => 'sysIfxStatHcInUcastPkts',
|
||||
'i_pkts_ucast_out64' => 'sysIfxStatHcOutUcastPkts',
|
||||
'i_pkts_mutli_in64' => 'sysIfxStatInMulticastPkts',
|
||||
'i_pkts_multi_out64' => 'sysIfxStatOutMulticastPkts',
|
||||
'i_pkts_bcast_in64' => 'sysIfxStatInBroadcastPkts',
|
||||
'i_pkts_bcast_out64' => 'sysIfxStatOutBroadcastPkts',
|
||||
|
||||
# sysInterfaceStatTable
|
||||
'i_discards_in' => 'sysInterfaceStatDropsIn',
|
||||
@@ -115,8 +119,8 @@ sub fan {
|
||||
my $ret = "";
|
||||
my $s = "";
|
||||
foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
|
||||
$ret .= $s . $i . ": " . $fan_state->{$i};
|
||||
$s = ", ";
|
||||
$ret .= $s . $i . ': ' . $fan_state->{$i};
|
||||
$s = ', ';
|
||||
}
|
||||
return if ( $s eq "" );
|
||||
return $ret;
|
||||
@@ -255,6 +259,37 @@ sub i_vlan_membership {
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
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 ) {
|
||||
|
||||
next unless $tagged->{$iid} eq 'false';
|
||||
# IID is length.vlan name index.length.interface index
|
||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
||||
my @iid_array = split /\./, $iid;
|
||||
my $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__
|
||||
|
||||
@@ -391,6 +426,12 @@ IDs.
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $f5->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $f5->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
@@ -43,7 +43,7 @@ use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -104,22 +104,6 @@ sub model {
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB
|
||||
|
||||
sub fw_mac {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $force10->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $force10->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
sub v_name {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
@@ -137,29 +121,25 @@ sub i_vlan {
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
# Apparently index doesn't use VLAN ID, so override the HOA private
|
||||
# method here to correct the mapping
|
||||
sub _vlan_hoa {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
my ( $v_ports, $partial ) = @_;
|
||||
|
||||
my $index = $force10->bp_index();
|
||||
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 = {};
|
||||
|
||||
my $vlan_hoa = {};
|
||||
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;
|
||||
|
||||
# Strip TimeFilter if we're using VlanCurrentTable
|
||||
( $vlan_ndx = $idx ) =~ s/^\d+\.//;
|
||||
|
||||
# Convert portlist bit array to bp_index array
|
||||
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
|
||||
push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
|
||||
@@ -176,11 +156,10 @@ sub i_vlan_membership {
|
||||
# the mapping from Q-BRIDGE-MIB::dot1qVlanFdbId
|
||||
my $mod = $vlan_tag % 4096;
|
||||
|
||||
push ( @{ $i_vlan_membership->{$ifindex} }, ($mod) );
|
||||
push ( @{ $vlan_hoa->{$ifindex} }, ($mod) );
|
||||
}
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
return $vlan_hoa;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -294,20 +273,6 @@ Returns the VLAN names.
|
||||
|
||||
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->fw_mac()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $force10->fw_port()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $force10->i_duplex_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
200
Info/Layer3/Fortinet.pm
Normal file
200
Info/Layer3/Fortinet.pm
Normal file
@@ -0,0 +1,200 @@
|
||||
# SNMP::Info::Layer3::Fortinet
|
||||
#
|
||||
# Copyright (c) 2014 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::Fortinet;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Fortinet::ISA
|
||||
= qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Fortinet::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'FORTINET-CORE-MIB' => 'fnSysSerial',
|
||||
'FORTINET-FORTIGATE-MIB' => 'fgVdMaxVdoms',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'fortinet';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $fortinet = shift;
|
||||
my $id = $fortinet->id() || '';
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^f[grsw][tfw]?//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'fortios';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $fortinet = shift;
|
||||
|
||||
my $ver = $fortinet->fgSysVersion() || '';
|
||||
|
||||
if ( $ver =~ /(\d+[\.\d]+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return $ver;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $fortinet = shift;
|
||||
|
||||
return $fortinet->fnSysSerial();
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Fortinet - SNMP Interface to Fortinet network devices.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $fortinet = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $fortinet->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Fortinet 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 $fortinet = new SNMP::Info::Layer3::Fortinet(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<FORTINET-CORE-MIB>
|
||||
|
||||
=item F<FORTINET-FORTIGATE-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 $fortinet->vendor()
|
||||
|
||||
Returns 'fortinet'
|
||||
|
||||
=item $fortinet->model()
|
||||
|
||||
Returns the chassis model.
|
||||
|
||||
=item $fortinet->os()
|
||||
|
||||
Returns 'fortios'
|
||||
|
||||
=item $fortinet->os_ver()
|
||||
|
||||
Returns the software version extracted from (C<systemVersion>).
|
||||
|
||||
=item $fortinet->serial()
|
||||
|
||||
Returns the chassis serial number.
|
||||
|
||||
(C<fnSysSerial>)
|
||||
|
||||
=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
|
||||
@@ -38,27 +38,36 @@ use SNMP::Info::Layer3;
|
||||
use SNMP::Info::FDP;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Foundry::ISA = qw/
|
||||
SNMP::Info::FDP
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::Layer3::Foundry::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::FDP::MIBS,
|
||||
|
||||
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
|
||||
'FOUNDRY-SN-AGENT-MIB' => 'snChasPwrSupplyDescription',
|
||||
'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode',
|
||||
'FOUNDRY-SN-STACKING-MIB' => 'snStackingOperUnitRole',
|
||||
'FOUNDRY-POE-MIB' => 'snAgentPoeGblPowerCapacityTotal',
|
||||
'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::FDP::GLOBALS,
|
||||
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'chassis' => 'entPhysicalDescr.1',
|
||||
'temp' => 'snChasActualTemperature',
|
||||
@@ -81,11 +90,45 @@ $VERSION = '3.04_001';
|
||||
'sw_duplex' => 'snSwPortInfoChnMode',
|
||||
'sw_type' => 'snSwPortInfoMediaType',
|
||||
'sw_speed' => 'snSwPortInfoSpeed',
|
||||
|
||||
# FOUNDRY-SN-AGENT-MIB::snAgentConfigModule2Table
|
||||
'ag_mod2_type' => 'snAgentConfigModule2Type',
|
||||
|
||||
# FOUNDRY-SN-AGENT-MIB::snAgentConfigModuleTable
|
||||
'ag_mod_type' => 'snAgentConfigModuleType',
|
||||
|
||||
# FOUNDRY-SN-AGENT-MIB::snVLanByPortTable
|
||||
'stp_i_id' => 'snVLanByPortVLanId',
|
||||
'stp_i_mac' => 'snVLanByPortBaseBridgeAddress',
|
||||
'stp_i_time' => 'snVLanByPortStpTimeSinceTopologyChange',
|
||||
'stp_i_ntop' => 'snVLanByPortStpTopChanges',
|
||||
'stp_i_root' => 'snVLanByPortStpDesignatedRoot',
|
||||
'stp_i_root_port' => 'snVLanByPortStpRootPort',
|
||||
'stp_i_priority' => 'snVLanByPortStpPriority',
|
||||
|
||||
# FOUNDRY-SN-AGENT-MIB::snPortStpTable
|
||||
'stp_p_id' => 'snPortStpPortNum',
|
||||
'stp_p_stg_id' => 'snPortStpVLanId',
|
||||
'stp_p_priority' => 'snPortStpPortPriority',
|
||||
'stp_p_state' => 'snPortStpPortState',
|
||||
'stp_p_cost' => 'snPortStpPortDesignatedCost',
|
||||
'stp_p_root' => 'snPortStpPortDesignatedRoot',
|
||||
'stp_p_bridge' => 'snPortStpPortDesignatedBridge',
|
||||
'stp_p_port' => 'snPortStpPortDesignatedPort',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::FDP::MUNGE,
|
||||
|
||||
'ag_mod2_type' => \&SNMP::Info::munge_e_type,
|
||||
'ag_mod_type' => \&SNMP::Info::munge_e_type,
|
||||
'stp_i_mac' => \&SNMP::Info::munge_mac,
|
||||
'stp_i_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_root' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_bridge' => \&SNMP::Info::munge_prio_mac,
|
||||
'stp_p_port' => \&SNMP::Info::munge_prio_port,
|
||||
);
|
||||
|
||||
sub i_ignore {
|
||||
@@ -152,6 +195,7 @@ sub model {
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^sn//;
|
||||
$model =~ s/Switch//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
@@ -256,18 +300,550 @@ sub interfaces {
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
# Reported hangs on a EdgeIron 24G
|
||||
sub stp_p_state {
|
||||
# Entity MIB is supported on the Brocade NetIron XMR, NetIron MLX, MLXe,
|
||||
# NetIron CES, NetIron CER, and older EdgeIron series devices.
|
||||
# Try Entity MIB methods first and fall back to Pseudo ENTITY-MIB methods for
|
||||
# other devices.
|
||||
# e_fwver, e_hwver, e_swver not supported in psuedo methods, no need to
|
||||
# override
|
||||
|
||||
sub e_index {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $descr = $foundry->description();
|
||||
if ( $descr =~ m/\bEdgeIron 24G\b/ ) {
|
||||
return;
|
||||
return $foundry->SUPER::e_index($partial)
|
||||
|| $foundry->brcd_e_index($partial);
|
||||
}
|
||||
|
||||
sub e_class {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $foundry->SUPER::e_class($partial)
|
||||
|| $foundry->brcd_e_class($partial);
|
||||
}
|
||||
|
||||
sub e_descr {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $foundry->SUPER::e_descr($partial)
|
||||
|| $foundry->brcd_e_descr($partial);
|
||||
}
|
||||
|
||||
sub e_name {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $foundry->SUPER::e_name($partial)
|
||||
|| $foundry->brcd_e_name($partial);
|
||||
}
|
||||
|
||||
sub e_parent {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $foundry->SUPER::e_parent($partial)
|
||||
|| $foundry->brcd_e_parent($partial);
|
||||
}
|
||||
|
||||
sub e_pos {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $foundry->SUPER::e_pos($partial) || $foundry->brcd_e_pos($partial);
|
||||
}
|
||||
|
||||
sub e_serial {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $foundry->SUPER::e_serial($partial)
|
||||
|| $foundry->brcd_e_serial($partial);
|
||||
}
|
||||
|
||||
sub e_type {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $foundry->SUPER::e_type($partial)
|
||||
|| $foundry->brcd_e_type($partial);
|
||||
}
|
||||
|
||||
sub e_vendor {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $foundry->SUPER::e_vendor($partial)
|
||||
|| $foundry->brcd_e_vendor($partial);
|
||||
}
|
||||
|
||||
# Pseudo ENTITY-MIB methods
|
||||
|
||||
# This class supports both stackable and chassis based switches, identify if
|
||||
# we have a stackable so that we return appropriate entPhysicalClass
|
||||
|
||||
# Identify if the stackable is actually a stack vs. single switch
|
||||
sub _brcd_stack_master {
|
||||
my $foundry = shift;
|
||||
|
||||
my $roles = $foundry->snStackingOperUnitRole() || {};
|
||||
|
||||
foreach my $iid ( keys %$roles ) {
|
||||
my $role = $roles->{$iid};
|
||||
next unless $role;
|
||||
if ( $role eq 'active' ) {
|
||||
return $iid;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub brcd_e_index {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stack_master = $foundry->_brcd_stack_master();
|
||||
my $brcd_e_idx
|
||||
= $foundry->snAgentConfigModule2Description($partial)
|
||||
|| $foundry->snAgentConfigModuleDescription($partial)
|
||||
|| {};
|
||||
|
||||
my %brcd_e_index;
|
||||
if ($stack_master) {
|
||||
|
||||
# Stack Entity
|
||||
$brcd_e_index{0} = 1;
|
||||
}
|
||||
|
||||
return $foundry->SUPER::stp_p_state($partial) || {};
|
||||
foreach my $iid ( keys %$brcd_e_idx ) {
|
||||
|
||||
my $index = $iid;
|
||||
|
||||
# Format into consistent integer format so that numeric sorting works
|
||||
if ( $iid =~ /(\d+)\.(\d+)/ ) {
|
||||
$index = "$1" . sprintf "%02d", $2;
|
||||
}
|
||||
$brcd_e_index{$iid} = $index;
|
||||
}
|
||||
return \%brcd_e_index;
|
||||
}
|
||||
|
||||
sub brcd_e_class {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $e_idx = $foundry->brcd_e_index($partial) || {};
|
||||
|
||||
my %e_class;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
if ( $iid == 0 ) {
|
||||
$e_class{$iid} = 'stack';
|
||||
}
|
||||
|
||||
# Were going to assume chassis at slot/index 1
|
||||
# If this turns out to be false in some cases we can check
|
||||
# snAgentConfigModuleNumberOfCpus as other modules won't have cpus?
|
||||
elsif ( $iid =~ /1$/ ) {
|
||||
$e_class{$iid} = 'chassis';
|
||||
}
|
||||
else {
|
||||
$e_class{$iid} = 'module';
|
||||
}
|
||||
}
|
||||
return \%e_class;
|
||||
}
|
||||
|
||||
sub brcd_e_descr {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $brcd_e_idx = $foundry->brcd_e_index($partial) || {};
|
||||
my $m_descrs
|
||||
= $foundry->snAgentConfigModule2Description($partial)
|
||||
|| $foundry->snAgentConfigModuleDescription($partial)
|
||||
|| {};
|
||||
|
||||
my %brcd_e_descr;
|
||||
foreach my $iid ( keys %$brcd_e_idx ) {
|
||||
|
||||
if ( $iid == 0 ) {
|
||||
$brcd_e_descr{$iid} = $foundry->description();
|
||||
}
|
||||
|
||||
my $descr = $m_descrs->{$iid};
|
||||
next unless defined $descr;
|
||||
|
||||
$brcd_e_descr{$iid} = $descr;
|
||||
}
|
||||
return \%brcd_e_descr;
|
||||
}
|
||||
|
||||
sub brcd_e_name {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stack_master = $foundry->_brcd_stack_master();
|
||||
my $e_idx = $foundry->brcd_e_index($partial) || {};
|
||||
|
||||
my %brcd_e_name;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
if ( $iid == 0 ) {
|
||||
$brcd_e_name{$iid} = 'Stack Master Unit';
|
||||
}
|
||||
|
||||
elsif ( $stack_master && $iid =~ /(\d+)\.1$/ ) {
|
||||
$brcd_e_name{$iid} = "Switch Stack Unit $1";
|
||||
}
|
||||
elsif ( $iid =~ /1$/ ) {
|
||||
$brcd_e_name{$iid} = "Switch";
|
||||
}
|
||||
else {
|
||||
$brcd_e_name{$iid} = 'Module';
|
||||
}
|
||||
}
|
||||
return \%brcd_e_name;
|
||||
}
|
||||
|
||||
sub brcd_e_vendor {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $e_idx = $foundry->brcd_e_index($partial) || {};
|
||||
|
||||
my %brcd_e_vendor;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
my $vendor = 'brocade';
|
||||
|
||||
$brcd_e_vendor{$iid} = $vendor;
|
||||
}
|
||||
return \%brcd_e_vendor;
|
||||
}
|
||||
|
||||
sub brcd_e_serial {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $e_idx = $foundry->brcd_e_index($partial) || {};
|
||||
my $serials
|
||||
= $foundry->snAgentConfigModule2SerialNumber($partial)
|
||||
|| $foundry->snAgentConfigModuleSerialNumber($partial)
|
||||
|| {};
|
||||
|
||||
my %brcd_e_serial;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
|
||||
if ( $iid == 0 ) {
|
||||
$brcd_e_serial{$iid} = $foundry->serial();
|
||||
}
|
||||
|
||||
my $serial = $serials->{$iid};
|
||||
next unless defined $serial;
|
||||
|
||||
$brcd_e_serial{$iid} = $serial;
|
||||
}
|
||||
return \%brcd_e_serial;
|
||||
}
|
||||
|
||||
sub brcd_e_type {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $e_idx = $foundry->brcd_e_index($partial) || {};
|
||||
my $types
|
||||
= $foundry->ag_mod2_type($partial)
|
||||
|| $foundry->ag_mod_type($partial)
|
||||
|| {};
|
||||
|
||||
my %brcd_e_type;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
|
||||
if ( $iid == 0 ) {
|
||||
$brcd_e_type{$iid} = $foundry->model();
|
||||
}
|
||||
|
||||
my $type = $types->{$iid};
|
||||
next unless defined $type;
|
||||
|
||||
$brcd_e_type{$iid} = $type;
|
||||
}
|
||||
return \%brcd_e_type;
|
||||
}
|
||||
|
||||
sub brcd_e_pos {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $e_idx = $foundry->brcd_e_index($partial) || {};
|
||||
|
||||
my %brcd_e_pos;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
|
||||
my $pos;
|
||||
if ( $iid == 0 ) {
|
||||
$pos = -1;
|
||||
}
|
||||
elsif ( $iid =~ /(\d+)\.1$/ ) {
|
||||
$pos = $1;
|
||||
}
|
||||
elsif ( $iid =~ /(\d+)$/ ) {
|
||||
$pos = $1;
|
||||
}
|
||||
|
||||
$brcd_e_pos{$iid} = $pos;
|
||||
}
|
||||
return \%brcd_e_pos;
|
||||
}
|
||||
|
||||
sub brcd_e_parent {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $stack_master = $foundry->_brcd_stack_master();
|
||||
my $e_idx = $foundry->brcd_e_index($partial) || {};
|
||||
|
||||
my %brcd_e_parent;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
|
||||
if ( $iid == 0 ) {
|
||||
$brcd_e_parent{$iid} = 0;
|
||||
}
|
||||
elsif ( $stack_master && $iid =~ /(\d+)\.1$/ ) {
|
||||
$brcd_e_parent{$iid} = 1;
|
||||
}
|
||||
elsif ( $iid =~ /1$/ ) {
|
||||
$brcd_e_parent{$iid} = 0;
|
||||
}
|
||||
elsif ( $iid =~ /(\d+).\d+/ ) {
|
||||
$brcd_e_parent{$iid} = "$1" . "01";
|
||||
}
|
||||
|
||||
# assume non-stacked and chassis at index 1
|
||||
else {
|
||||
$brcd_e_parent{$iid} = 1;
|
||||
}
|
||||
}
|
||||
return \%brcd_e_parent;
|
||||
}
|
||||
|
||||
# The index of snAgentPoePortTable is snAgentPoePortNumber which equals
|
||||
# ifIndex; however, to emulate POWER-ETHERNET-MIB we need a "module.port"
|
||||
# index. If ifDescr has the format x/x/x use it to determine the module
|
||||
# otherwise default to 1. Unfortunately, this means we can't map any
|
||||
# snAgentPoePortTable leafs directly and partials will not be supported.
|
||||
sub peth_port_ifindex {
|
||||
my $foundry = shift;
|
||||
|
||||
my $indexes = $foundry->snAgentPoePortNumber();
|
||||
my $descrs = $foundry->i_description();
|
||||
|
||||
my $peth_port_ifindex = {};
|
||||
foreach my $i ( keys %$indexes ) {
|
||||
my $descr = $descrs->{$i};
|
||||
next unless $descr;
|
||||
|
||||
my $new_idx = "1.$i";
|
||||
|
||||
if ( $descr =~ /(\d+)\/\d+\/\d+/ ) {
|
||||
$new_idx = "$1.$i";
|
||||
}
|
||||
$peth_port_ifindex->{$new_idx} = $i;
|
||||
}
|
||||
return $peth_port_ifindex;
|
||||
}
|
||||
|
||||
sub peth_port_admin {
|
||||
my $foundry = shift;
|
||||
|
||||
my $p_index = $foundry->peth_port_ifindex() || {};
|
||||
my $admin_states = $foundry->snAgentPoePortControl() || {};
|
||||
|
||||
my $peth_port_admin = {};
|
||||
foreach my $i ( keys %$p_index ) {
|
||||
my ( $module, $port ) = split( /\./, $i );
|
||||
my $state = $admin_states->{$port};
|
||||
|
||||
if ( $state =~ /enable/ ) {
|
||||
$peth_port_admin->{$i} = 'true';
|
||||
}
|
||||
else {
|
||||
$peth_port_admin->{$i} = 'false';
|
||||
}
|
||||
}
|
||||
return $peth_port_admin;
|
||||
}
|
||||
|
||||
sub peth_port_neg_power {
|
||||
my $foundry = shift;
|
||||
|
||||
my $p_index = $foundry->peth_port_ifindex() || {};
|
||||
my $peth_port_class = $foundry->snAgentPoePortClass() || {};
|
||||
|
||||
my $poemax = {
|
||||
'0' => 12950,
|
||||
'1' => 3840,
|
||||
'2' => 6490,
|
||||
'3' => 12950,
|
||||
'4' => 25500
|
||||
};
|
||||
|
||||
my $peth_port_neg_power = {};
|
||||
foreach my $i ( keys %$p_index ) {
|
||||
my ( $module, $port ) = split( /\./, $i );
|
||||
my $power = $poemax->{ $peth_port_class->{$port} };
|
||||
next unless $power;
|
||||
|
||||
$peth_port_neg_power->{$i} = $power;
|
||||
}
|
||||
return $peth_port_neg_power;
|
||||
}
|
||||
|
||||
sub peth_port_power {
|
||||
my $foundry = shift;
|
||||
|
||||
my $p_index = $foundry->peth_port_ifindex() || {};
|
||||
my $port_consumed = $foundry->snAgentPoePortConsumed() || {};
|
||||
|
||||
my $peth_port_power = {};
|
||||
foreach my $i ( keys %$p_index ) {
|
||||
my ( $module, $port ) = split( /\./, $i );
|
||||
my $power = $port_consumed->{$port};
|
||||
next unless $power;
|
||||
|
||||
$peth_port_power->{$i} = $power;
|
||||
}
|
||||
return $peth_port_power;
|
||||
}
|
||||
|
||||
sub peth_port_class {
|
||||
my $foundry = shift;
|
||||
|
||||
my $p_index = $foundry->peth_port_ifindex() || {};
|
||||
my $port_class = $foundry->snAgentPoePortClass() || {};
|
||||
|
||||
my $peth_port_class = {};
|
||||
foreach my $i ( keys %$p_index ) {
|
||||
my ( $module, $port ) = split( /\./, $i );
|
||||
my $power = $port_class->{$port};
|
||||
next unless $power;
|
||||
|
||||
$peth_port_class->{$i} = "class$power";
|
||||
}
|
||||
return $peth_port_class;
|
||||
}
|
||||
|
||||
sub peth_port_status {
|
||||
my $foundry = shift;
|
||||
|
||||
my $p_index = $foundry->peth_port_ifindex() || {};
|
||||
my $admin_states = $foundry->snAgentPoePortControl() || {};
|
||||
|
||||
my $peth_port_status = {};
|
||||
foreach my $i ( keys %$p_index ) {
|
||||
my ( $module, $port ) = split( /\./, $i );
|
||||
my $state = $admin_states->{$port};
|
||||
|
||||
if ( $state =~ /enable/ ) {
|
||||
$peth_port_status->{$i} = 'deliveringPower';
|
||||
}
|
||||
else {
|
||||
$peth_port_status->{$i} = 'disabled';
|
||||
}
|
||||
}
|
||||
return $peth_port_status;
|
||||
}
|
||||
|
||||
sub peth_power_status {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $watts = $foundry->snAgentPoeUnitPowerCapacityTotal($partial) || {};
|
||||
|
||||
my $peth_power_status = {};
|
||||
foreach my $i ( keys %$watts ) {
|
||||
$peth_power_status->{$i} = 'on';
|
||||
}
|
||||
return $peth_power_status;
|
||||
}
|
||||
|
||||
sub peth_power_watts {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $watts_total = $foundry->snAgentPoeUnitPowerCapacityTotal($partial)
|
||||
|| {};
|
||||
|
||||
my $peth_power_watts = {};
|
||||
foreach my $i ( keys %$watts_total ) {
|
||||
my $total = $watts_total->{$i};
|
||||
next unless $total;
|
||||
|
||||
$peth_power_watts->{$i} = $total / 1000;
|
||||
}
|
||||
return $peth_power_watts;
|
||||
}
|
||||
|
||||
sub peth_power_consumption {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $watts_total = $foundry->snAgentPoeUnitPowerCapacityTotal($partial)
|
||||
|| {};
|
||||
my $watts_free = $foundry->snAgentPoeUnitPowerCapacityFree($partial)
|
||||
|| {};
|
||||
|
||||
my $peth_power_consumed = {};
|
||||
foreach my $i ( keys %$watts_total ) {
|
||||
my $total = $watts_total->{$i};
|
||||
next unless $total;
|
||||
my $free = $watts_free->{$i} || 0;
|
||||
|
||||
$peth_power_consumed->{$i} = ( $total - $free ) / 1000;
|
||||
}
|
||||
return $peth_power_consumed;
|
||||
}
|
||||
|
||||
sub agg_ports {
|
||||
my $dev = shift;
|
||||
|
||||
# TODO: implement partial
|
||||
my $trunks = $dev->snMSTrunkPortList;
|
||||
my $ports = $dev->snSwPortIfIndex; # sw_index()
|
||||
|
||||
return {} unless
|
||||
ref {} eq ref $trunks and scalar keys %$trunks
|
||||
and ref {} eq ref $ports and scalar keys %$ports;
|
||||
|
||||
my $ret = {};
|
||||
foreach my $m (keys %$trunks) {
|
||||
my $skip = 0;
|
||||
while (my $s = unpack("x${skip}n2", $trunks->{$m})) {
|
||||
$ret->{ $ports->{$s} } = $ports->{$m};
|
||||
$skip += 2;
|
||||
}
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub i_stp_state {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $bp_index = $foundry->bp_index($partial);
|
||||
my $stp_p_state = $foundry->dot1dStpPortState($partial);
|
||||
|
||||
my %i_stp_state;
|
||||
|
||||
foreach my $index ( keys %$stp_p_state ) {
|
||||
my $state = $stp_p_state->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $state;
|
||||
$i_stp_state{$iid} = $state;
|
||||
}
|
||||
|
||||
return \%i_stp_state;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -329,6 +905,12 @@ after determining a more specific class using the method above.
|
||||
|
||||
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
|
||||
|
||||
=item F<FOUNDRY-SN-STACKING-MIB>
|
||||
|
||||
=item F<FOUNDRY-POE-MIB>
|
||||
|
||||
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
@@ -348,7 +930,8 @@ These are methods that return scalar value from SNMP
|
||||
=item $foundry->model()
|
||||
|
||||
Returns model type. Checks $foundry->id() against the F<FOUNDRY-SN-ROOT-MIB>
|
||||
and removes 'C<sn>'. EdgeIron models determined through F<ENTITY-MIB>.
|
||||
and removes 'C<sn>' and 'C<Switch>'. EdgeIron models determined
|
||||
through F<ENTITY-MIB>.
|
||||
|
||||
=item $foundry->vendor()
|
||||
|
||||
@@ -430,8 +1013,8 @@ 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.
|
||||
These are methods that return tables of information in the form of a
|
||||
reference to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
@@ -453,14 +1036,140 @@ Returns reference to hash of interface link duplex status.
|
||||
|
||||
Crosses $foundry->sw_duplex() with $foundry->sw_index()
|
||||
|
||||
=item $foundry->stp_p_state()
|
||||
=item $foundry->i_stp_state()
|
||||
|
||||
Returns the mapping of (C<dot1dStpPortState>) to the interface
|
||||
index (iid).
|
||||
|
||||
"The port's current state as defined by application of the Spanning Tree
|
||||
Protocol.
|
||||
=item $foundry->agg_ports()
|
||||
|
||||
Skipped if device is an EdgeIron 24G due to reports of hangs.
|
||||
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.
|
||||
|
||||
(C<dot1dStpPortState>)
|
||||
=back
|
||||
|
||||
=head2 F<ENTITY-MIB> Information
|
||||
|
||||
F<ENTITY-MIB> is supported on the Brocade NetIron XMR, NetIron MLX, MLXe,
|
||||
NetIron CES, NetIron CER, and older EdgeIron series devices. For other
|
||||
devices which do not support it, these methods emulate Physical Table methods
|
||||
using F<FOUNDRY-SN-AGENT-MIB>. See Pseudo F<ENTITY-MIB> information below
|
||||
for details on brcd_e_* methods.
|
||||
|
||||
=over
|
||||
|
||||
=item $foundry->e_index()
|
||||
|
||||
If the device doesn't support C<entPhysicalDescr>, this will
|
||||
try brcd_e_index().
|
||||
|
||||
Note that this is based on C<entPhysicalDescr> due to implementation
|
||||
details of SNMP::Info::Entity::e_index().
|
||||
|
||||
=item $foundry->e_class()
|
||||
|
||||
If the device doesn't support C<entPhysicalClass>, this will try
|
||||
brcd_e_class().
|
||||
|
||||
=item $foundry->e_descr()
|
||||
|
||||
If the device doesn't support C<entPhysicalDescr>, this will try
|
||||
brcd_e_descr().
|
||||
|
||||
=item $foundry->e_name()
|
||||
|
||||
If the device doesn't support C<entPhysicalName>, this will try
|
||||
brcd_e_name().
|
||||
|
||||
=item $foundry->e_parent()
|
||||
|
||||
If the device doesn't support C<entPhysicalContainedIn>, this will try
|
||||
brcd_e_parent().
|
||||
|
||||
=item $foundry->e_pos()
|
||||
|
||||
If the device doesn't support C<entPhysicalParentRelPos>, this will try
|
||||
brcd_e_pos().
|
||||
|
||||
=item $foundry->e_serial()
|
||||
|
||||
If the device doesn't support C<entPhysicalSerialNum>, this will try
|
||||
brcd_e_serial().
|
||||
|
||||
=item $foundry->e_type()
|
||||
|
||||
If the device doesn't support C<entPhysicalVendorType>, this will try
|
||||
brcd_e_type().
|
||||
|
||||
=item $foundry->e_vendor()
|
||||
|
||||
If the device doesn't support C<entPhysicalMfgName>, this will try
|
||||
brcd_e_vendor().
|
||||
|
||||
=back
|
||||
|
||||
=head2 Pseudo F<ENTITY-MIB> information
|
||||
|
||||
These methods emulate F<ENTITY-MIB> Physical Table methods using
|
||||
F<FOUNDRY-SN-AGENT-MIB>.
|
||||
|
||||
=over
|
||||
|
||||
=item $foundry->brcd_e_index()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Integer, Indices are combined
|
||||
into an integer, each index is two digits padded with leading zero if
|
||||
required.
|
||||
|
||||
=item $foundry->brcd_e_class()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: General hardware type.
|
||||
|
||||
Returns 'stack' for the stack master in an active stack, 'chassis' for
|
||||
base switches that contain modules, and 'module' for others.
|
||||
|
||||
=item $foundry->brcd_e_descr()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Human friendly name
|
||||
|
||||
(C<snAgentConfigModule2Description>) or
|
||||
(C<snAgentConfigModuleDescription>)
|
||||
|
||||
=item $foundry->brcd_e_name()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Human friendly name
|
||||
|
||||
=item $foundry->brcd_e_vendor()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: brocade
|
||||
|
||||
=item $foundry->brcd_e_serial()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Serial number
|
||||
|
||||
Serial number is $foundry->serial() for a stack master unit and
|
||||
(C<snAgentConfigModule2SerialNumber>) or
|
||||
(C<snAgentConfigModuleSerialNumber>) for all others.
|
||||
|
||||
=item $foundry->brcd_e_type()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Type of component/sub-component
|
||||
as defined under C<snAgentConfigModule2Type> or C<snAgentConfigModule2Type>
|
||||
in F<FOUNDRY-SN-AGENT-MIB>.
|
||||
|
||||
=item $foundry->brcd_e_pos()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: The relative position among all
|
||||
entities sharing the same parent.
|
||||
|
||||
(C<s5ChasComSubIndx>)
|
||||
|
||||
=item $foundry->brcd_e_parent()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: The value of brcd_e_index()
|
||||
for the entity which 'contains' this entity. A value of zero indicates
|
||||
this entity is not contained in any other entity.
|
||||
|
||||
=back
|
||||
|
||||
@@ -494,6 +1203,70 @@ Returns reference to hash. Current Port Speed.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Power Over Ethernet Port Table
|
||||
|
||||
These methods emulate the F<POWER-ETHERNET-MIB> Power Source Entity (PSE)
|
||||
Port Table C<pethPsePortTable> methods using the F<FOUNDRY-POE-MIB> Power
|
||||
over Ethernet Port Table C<snAgentPoePortTable>.
|
||||
|
||||
=over
|
||||
|
||||
=item $foundry->peth_port_ifindex()
|
||||
|
||||
Creates an index of module.port to align with the indexing of the
|
||||
C<pethPsePortTable> with a value of C<ifIndex>. The module defaults 1
|
||||
if otherwise unknown.
|
||||
|
||||
=item $foundry->peth_port_admin()
|
||||
|
||||
Administrative status: is this port permitted to deliver power?
|
||||
|
||||
C<pethPsePortAdminEnable>
|
||||
|
||||
=item $foundry->peth_port_status()
|
||||
|
||||
Current status: is this port delivering power.
|
||||
|
||||
=item $foundry->peth_port_class()
|
||||
|
||||
Device class: if status is delivering power, this represents the 802.3af
|
||||
class of the device being powered.
|
||||
|
||||
=item $foundry->peth_port_neg_power()
|
||||
|
||||
The power, in milliwatts, that has been committed to this port.
|
||||
This value is derived from the 802.3af class of the device being
|
||||
powered.
|
||||
|
||||
=item $foundry->peth_port_power()
|
||||
|
||||
The power, in milliwatts, that the port is delivering.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Power Over Ethernet Module Table
|
||||
|
||||
These methods emulate the F<POWER-ETHERNET-MIB> Main Power Source Entity
|
||||
(PSE) Table C<pethMainPseTable> methods using the F<FOUNDRY-POE-MIB> Power
|
||||
over Ethernet Port Table C<snAgentPoeModuleTable >.
|
||||
|
||||
=over
|
||||
|
||||
=item $foundry->peth_power_watts()
|
||||
|
||||
The power supply's capacity, in watts.
|
||||
|
||||
=item $foundry->peth_power_status()
|
||||
|
||||
The power supply's operational status.
|
||||
|
||||
=item $foundry->peth_power_consumption()
|
||||
|
||||
How much power, in watts, this power supply has been committed to
|
||||
deliver.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
@@ -33,17 +33,26 @@ use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
|
||||
|
||||
@SNMP::Info::Layer3::H3C::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::H3C::EXPORT_OK = qw//;
|
||||
@SNMP::Info::Layer3::H3C::ISA = qw/
|
||||
SNMP::Info::IEEE802dot3ad
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::Layer3::H3C::EXPORT_OK = qw/
|
||||
agg_ports
|
||||
/;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::IEEE802dot3ad::MIBS,
|
||||
'HH3C-LswDEVM-MIB' => 'hh3cDevMFanStatus',
|
||||
'HH3C-LswINF-MIB' => 'hh3cSlotPortMax',
|
||||
'HH3C-LSW-DEV-ADM-MIB' => 'hh3cLswSysVersion',
|
||||
@@ -73,7 +82,7 @@ $VERSION = '3.04_001';
|
||||
sub vendor {
|
||||
my $h3c = shift;
|
||||
my $mfg = $h3c->entPhysicalMfgName(1) || {};
|
||||
return $mfg->{1};
|
||||
return $mfg->{1} || "H3C";
|
||||
}
|
||||
|
||||
sub os {
|
||||
@@ -81,7 +90,7 @@ sub os {
|
||||
my $descr = $h3c->description();
|
||||
|
||||
return $1 if ( $descr =~ /(\S+)\s+Platform Software/ );
|
||||
return;
|
||||
return "H3C";
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
@@ -92,6 +101,7 @@ sub os_ver {
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = "$1 $2" if ( $descr =~ /Software Version ([^,]+),.*(Release\s\S+)/i );
|
||||
$os_ver = "$1" if ( $descr =~ /Product Version ([0-9.]+)/i );
|
||||
|
||||
return $ver_release->{2} || $os_ver;
|
||||
}
|
||||
@@ -113,21 +123,7 @@ sub i_ignore {
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB
|
||||
|
||||
sub fw_mac {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->qb_fw_port($partial);
|
||||
}
|
||||
sub agg_ports { return agg_ports_lag(@_) }
|
||||
|
||||
1;
|
||||
__END__
|
||||
@@ -235,13 +231,11 @@ Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback
|
||||
|
||||
=item $h3c->fw_mac()
|
||||
=item C<agg_ports>
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $h3c->fw_port()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
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
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
|
||||
232
Info/Layer3/Huawei.pm
Normal file
232
Info/Layer3/Huawei.pm
Normal file
@@ -0,0 +1,232 @@
|
||||
# SNMP::Info::Layer3::Huawei
|
||||
#
|
||||
# Copyright (c) 2015 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::Huawei;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
|
||||
|
||||
@SNMP::Info::Layer3::Huawei::ISA = qw/
|
||||
SNMP::Info::IEEE802dot3ad
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::Layer3::Huawei::EXPORT_OK = qw/
|
||||
agg_ports
|
||||
/;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::IEEE802dot3ad::MIBS,
|
||||
'HUAWEI-MIB' => 'quidway',
|
||||
);
|
||||
|
||||
%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 "Huawei";
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $huawei = shift;
|
||||
my $descr = $huawei->description();
|
||||
|
||||
return $1 if ( $descr =~ /\b(VRP)\b/ );
|
||||
return "huawei";
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $huawei = shift;
|
||||
my $descr = $huawei->description();
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = "$1" if ( $descr =~ /\bVersion ([0-9.]+)/i );
|
||||
|
||||
return $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} =~ /\b(inloopback|console)\d*\b/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub agg_ports { return agg_ports_lag(@_) }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Huawei - SNMP Interface to Huawei Layer 3 switches and routers.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $huawei = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $huawei->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Huawei Quidway switches
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::IEEE802dot3ad
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HUAWEI-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.
|
||||
|
||||
See L<SNMP::Info::IEEE802dot3ad> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $huawei->vendor()
|
||||
|
||||
Returns 'Huawei'.
|
||||
|
||||
=item $huawei->os()
|
||||
|
||||
Returns 'VRP' if contained in C<sysDescr>, 'huawei' otherwise.
|
||||
|
||||
=item $huawei->os_ver()
|
||||
|
||||
Returns the software 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 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $huawei->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores InLoopback and Console interfaces
|
||||
|
||||
=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
|
||||
|
||||
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
|
||||
407
Info/Layer3/IBMGbTor.pm
Normal file
407
Info/Layer3/IBMGbTor.pm
Normal 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.30';
|
||||
|
||||
%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
|
||||
@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -89,6 +89,20 @@ sub os {
|
||||
return 'junos';
|
||||
}
|
||||
|
||||
sub layers {
|
||||
my $juniper = shift;
|
||||
|
||||
my $layers = $juniper->SUPER::layers();
|
||||
# Some models don't report L2 properly
|
||||
my $macs = $juniper->fw_mac();
|
||||
|
||||
if (keys %$macs) {
|
||||
my $l = substr $layers, 6, 1, "1";
|
||||
}
|
||||
|
||||
return $layers;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $juniper = shift;
|
||||
|
||||
@@ -149,6 +163,13 @@ sub i_trunk {
|
||||
return \%i_trunk;
|
||||
}
|
||||
|
||||
sub qb_fdb_index {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $juniper->jnxExVlanTag($partial);
|
||||
}
|
||||
|
||||
# 'v_type' => 'jnxExVlanType',
|
||||
sub v_type {
|
||||
my $juniper = shift;
|
||||
@@ -200,22 +221,24 @@ sub i_vlan {
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
# Index doesn't use VLAN ID, so override the HOA private method here to
|
||||
# correct the mapping
|
||||
sub _vlan_hoa {
|
||||
my $juniper = shift;
|
||||
my ( $v_ports, $partial ) = @_;
|
||||
|
||||
my $index = $juniper->bp_index();
|
||||
my ($v_index) = $juniper->jnxExVlanTag($partial);
|
||||
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 ) {
|
||||
my $vlan_hoa = {};
|
||||
foreach my $idx ( keys %$v_ports ) {
|
||||
next unless ( defined $v_ports->{$idx} );
|
||||
my $portlist = $v_ports->{$idx}; # is an array reference
|
||||
my $portlist = $v_ports->{$idx};
|
||||
my $ret = [];
|
||||
my $vlan_ndx = $idx;
|
||||
my $vlan_ndx;
|
||||
|
||||
# Strip TimeFilter if we're using VlanCurrentTable
|
||||
( $vlan_ndx = $idx ) =~ s/^\d+\.//;
|
||||
|
||||
# Convert portlist bit array to bp_index array
|
||||
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
|
||||
@@ -227,26 +250,10 @@ sub i_vlan_membership {
|
||||
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} );
|
||||
push( @{ $vlan_hoa->{$ifindex} }, $v_index->{$vlan_ndx} );
|
||||
}
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB for bridge forwarding tables
|
||||
sub fw_mac {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $juniper->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $juniper->qb_fw_port($partial);
|
||||
return $vlan_hoa;
|
||||
}
|
||||
|
||||
# Pseudo ENTITY-MIB methods
|
||||
@@ -605,6 +612,11 @@ Returns 'juniper'
|
||||
|
||||
Returns 'junos'
|
||||
|
||||
=item $juniper->layers()
|
||||
|
||||
Checks forwarding table for Layer 2 support since some routers with switches
|
||||
do not report layers properly.
|
||||
|
||||
=item $juniper->os_ver()
|
||||
|
||||
Returns the software version extracted first from C<sysDescr> or
|
||||
@@ -651,6 +663,10 @@ to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->qb_fdb_index()
|
||||
|
||||
Returns reference to hash: key = VLAN ID, value = FDB ID.
|
||||
|
||||
=item $juniper->v_index()
|
||||
|
||||
(C<jnxExVlanTag>)
|
||||
@@ -671,32 +687,8 @@ to a hash.
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=item $juniper->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.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Forwarding Table (C<dot1dTpFdbEntry>)
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses
|
||||
|
||||
(C<dot1dTpFdbAddress>)
|
||||
|
||||
=item $juniper->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
(C<dot1dTpFdbPort>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Pseudo F<ENTITY-MIB> information
|
||||
|
||||
These methods emulate F<ENTITY-MIB> Physical Table methods using
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -50,17 +50,30 @@ $VERSION = '3.04_001';
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'hrSystemUptime' => 'hrSystemUptime',
|
||||
'os_level' => 'mtxrLicLevel',
|
||||
'os_ver' => 'mtxrLicVersion',
|
||||
'serial1' => 'mtxrSystem.3.0',
|
||||
'firmware' => 'mtxrSystem.4.0',
|
||||
'fan_type' => 'mtxrHlActiveFan',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'mikrotik';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $mikrotik = shift;
|
||||
return $mikrotik->serial1;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $mikrotik = shift;
|
||||
my $descr = $mikrotik->description() || '';
|
||||
@@ -73,6 +86,18 @@ sub os {
|
||||
return 'routeros';
|
||||
}
|
||||
|
||||
sub board_temp {
|
||||
my $mikrotik = shift;
|
||||
my $temp = $mikrotik->mtxrHlTemperature;
|
||||
return $temp / 10.0;
|
||||
}
|
||||
|
||||
sub cpu_temp {
|
||||
my $mikrotik = shift;
|
||||
my $temp = $mikrotik->mtxrHlProcessorTemperature;
|
||||
return $temp / 10.0;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -148,6 +173,23 @@ Tries to extract the device model from C<sysDescr>.
|
||||
|
||||
Returns the value of C<mtxrLicVersion>.
|
||||
|
||||
=item $mikrotik->os_level()
|
||||
|
||||
Returns the value of RouterOS level C<mtxrLicLevel>
|
||||
|
||||
=item $mikrotik->board_temp()
|
||||
=item $mikrotik->cpu_temp()
|
||||
|
||||
Returns the appropriate temperature values
|
||||
|
||||
=item $mikrotik->serial()
|
||||
|
||||
Returns the device serial.
|
||||
|
||||
=item $mikrotik->firmware()
|
||||
|
||||
Returns the firmware version of hardware.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::SONMP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
|
||||
@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
|
||||
@@ -40,7 +40,7 @@ use SNMP::Info::IEEE802dot11;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -69,17 +69,17 @@ $VERSION = '3.04_001';
|
||||
ns_i_up => 'nsIfStatus',
|
||||
ns_ip_table => 'nsIfIp',
|
||||
ns_ip_netmask => 'nsIfNetmask',
|
||||
at_index => 'nsIpArpIfIdx',
|
||||
at_paddr => 'nsIpArpMac',
|
||||
at_netaddr => 'nsIpArpIp',
|
||||
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,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
'ns_i_mac' => \&SNMP::Info::munge_mac,
|
||||
'ns_at_paddr' => \&SNMP::Info::munge_mac,
|
||||
'std_at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
sub layers {
|
||||
@@ -345,30 +345,47 @@ sub _mac_map {
|
||||
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 $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 $ip_index = $netscreen->ip_index() || {};
|
||||
my $if_mng_ip = $netscreen->nsIfMngIp() || {};
|
||||
|
||||
my %ip_table = ();
|
||||
foreach my $iid ( keys %$ip_index ) {
|
||||
$ip_table{$iid} = $iid;
|
||||
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;
|
||||
|
||||
@@ -461,6 +478,33 @@ sub i_80211channel {
|
||||
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__
|
||||
@@ -710,6 +754,33 @@ 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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# SNMP::Info::Layer3::Nexus
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# Copyright (c) 2014 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
@@ -30,38 +30,23 @@
|
||||
package SNMP::Info::Layer3::Nexus;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
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 SNMP::Info::Layer3::CiscoSwitch;
|
||||
|
||||
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::CiscoSwitch
|
||||
Exporter
|
||||
/;
|
||||
|
||||
@SNMP::Info::Layer3::Nexus::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
# NOTE: Order creates precedence
|
||||
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
|
||||
@@ -70,108 +55,170 @@ $VERSION = '3.04_001';
|
||||
# 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',
|
||||
%SNMP::Info::Layer3::CiscoSwitch::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',
|
||||
%SNMP::Info::Layer3::CiscoSwitch::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,
|
||||
);
|
||||
%FUNCS = ( %SNMP::Info::Layer3::CiscoSwitch::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';
|
||||
}
|
||||
%MUNGE = ( %SNMP::Info::Layer3::CiscoSwitch::MUNGE, );
|
||||
|
||||
sub os {
|
||||
return 'nx-os';
|
||||
return 'nx-os';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $nexus = shift;
|
||||
my $descr = $nexus->description();
|
||||
|
||||
return $1 if ( $descr =~ /\),\s+Version\s+(.+?),/ );
|
||||
return $descr;
|
||||
my $nexus = shift;
|
||||
my $descr = $nexus->description();
|
||||
|
||||
return $1 if ( $descr =~ /\),\s+Version\s+(.+?),/ );
|
||||
return $descr;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $nexus = shift;
|
||||
my $nexus = shift;
|
||||
|
||||
my $e_class = $nexus->e_class();
|
||||
my $e_parent = $nexus->e_parent();
|
||||
|
||||
foreach my $iid ( keys %$e_class ) {
|
||||
my $class = $e_class->{$iid} || '';
|
||||
if ($class =~ /chassis/) {
|
||||
my $serial = $nexus->e_serial($iid);
|
||||
return $serial->{$iid};
|
||||
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;
|
||||
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();
|
||||
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;
|
||||
}
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::Nexus::model() - Device does not support sysObjectID\n"
|
||||
if $nexus->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^cevChassis//i;
|
||||
return $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;
|
||||
}
|
||||
|
||||
my $local_addrs = $nexus->_local_addr();
|
||||
foreach my $addr (keys %$local_addrs) {
|
||||
$ip_table{$addr} = $addr unless exists $ip_table{$addr};
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
my $local_addrs = $nexus->_local_addr();
|
||||
foreach my $addr (keys %$local_addrs) {
|
||||
$ip_index{$addr} = 0 unless exists $ip_index{$addr};
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
my $local_addrs = $nexus->_local_addr();
|
||||
foreach my $addr (keys %$local_addrs) {
|
||||
$ip_netmask{$addr} = $local_addrs->{$addr} unless exists $ip_netmask{$addr};
|
||||
}
|
||||
|
||||
return \%ip_netmask;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
my $local_addrs = $nexus->_local_addr();
|
||||
foreach my $addr (keys %$local_addrs) {
|
||||
$ip_broadcast{$addr} = $addr unless exists $ip_broadcast{$addr};
|
||||
}
|
||||
|
||||
return \%ip_broadcast;
|
||||
}
|
||||
|
||||
sub _local_addr {
|
||||
my $nexus = shift;
|
||||
my $listen_addr = $nexus->udpLocalAddress() || {};
|
||||
my %local_addr;
|
||||
foreach my $sock (keys %$listen_addr) {
|
||||
my $addr = $listen_addr->{$sock};
|
||||
next if ($addr =~ /^127\./); # localhost
|
||||
next if ($addr eq '0.0.0.0'); # "any"
|
||||
next if ($addr =~ /^(\d+)\./ and $1 ge 224); # Class D or E space: Multicast or Experimental
|
||||
$local_addr{$addr} = '255.255.255.255'; # Fictional netmask
|
||||
}
|
||||
return \%local_addr;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -190,14 +237,14 @@ Eric Miller
|
||||
|
||||
# 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";
|
||||
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";
|
||||
@@ -215,23 +262,7 @@ after determining a more specific class using the method above.
|
||||
|
||||
=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
|
||||
=item SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
=back
|
||||
|
||||
@@ -247,25 +278,9 @@ after determining a more specific class using the method above.
|
||||
|
||||
=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
|
||||
See L<SNMP::Info::Layer3::CiscoSwitch/"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
|
||||
@@ -274,10 +289,6 @@ These are methods that return a scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $nexus->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $nexus->os()
|
||||
|
||||
Returns C<'nx-os'>
|
||||
@@ -300,92 +311,63 @@ Removes C<'cevChassis'> for readability.
|
||||
|
||||
C<dot1dBaseBridgeAddress>
|
||||
|
||||
=item $nexus->cisco_comm_indexing()
|
||||
=back
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
=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.
|
||||
|
||||
Also, the table is augmented with IP addresses in use by UDP sockets on the
|
||||
device, as determined by checking F<RFC1213-MIB::udpLocalAddress>. Valid
|
||||
addresses from this table (any IPv4 that is not localhost, 0.0.0.0, Class D
|
||||
(multicast) or Class E (experimental) are added as a /32 on interface ID 0.
|
||||
This is a workaround to determine possible VPC Keepalive IP addresses on the
|
||||
device, which are probably advertised by CDP/LLDP to neighbors.
|
||||
|
||||
=over
|
||||
|
||||
=item $nexus->ip_index()
|
||||
|
||||
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
|
||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
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.
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3::CiscoSwitch
|
||||
|
||||
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
|
||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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
|
||||
|
||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
@@ -108,6 +108,21 @@ sub i_ignore {
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub layers {
|
||||
my $pfront = shift;
|
||||
|
||||
my $layers = $pfront->SUPER::layers();
|
||||
# Some models or softwware versions don't report L2 properly
|
||||
# so add L2 capability to the output if the device has bridge ports.
|
||||
my $bports = $pfront->b_ports();
|
||||
|
||||
if ($bports) {
|
||||
my $l = substr $layers, 6, 1, "1";
|
||||
}
|
||||
|
||||
return $layers;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -210,6 +225,11 @@ Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback
|
||||
|
||||
=item $pfront->layers()
|
||||
|
||||
L2 capability isn't always reported correctly by the device itself; what the
|
||||
device reports is augmented with L2 capability if the device has bridge ports.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
@@ -43,7 +43,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::RapidCity::MIBS,
|
||||
@@ -127,8 +127,8 @@ sub i_index {
|
||||
# Get VLAN Virtual Router Interfaces
|
||||
if (!defined $partial
|
||||
|| (defined $model
|
||||
&& ( ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ )
|
||||
|| ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) )
|
||||
&& ( ( $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();
|
||||
@@ -177,14 +177,15 @@ sub interfaces {
|
||||
my $model = $passport->model();
|
||||
my $index_factor = $passport->index_factor();
|
||||
my $port_offset = $passport->port_offset();
|
||||
my $slot_offset = $passport->slot_offset();
|
||||
my $vlan_index = {};
|
||||
my %reverse_vlan;
|
||||
my $vlan_id = {};
|
||||
|
||||
if (!defined $partial
|
||||
|| (defined $model
|
||||
&& ( ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ )
|
||||
|| ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) )
|
||||
&& ( ( $partial > 2000 && $model =~ /^8[8631]|16|VSP/ )
|
||||
|| ( $partial > 256 && $model =~ /^1[012][05]0/ ) )
|
||||
)
|
||||
)
|
||||
{
|
||||
@@ -198,24 +199,28 @@ 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 ( ( $iid == 64 ) and ( $model =~ /^VSP[48]/ ) ) {
|
||||
$if{$index} = 'Mgmt.1';
|
||||
}
|
||||
|
||||
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|VSP)/ )
|
||||
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};
|
||||
@@ -227,7 +232,7 @@ sub interfaces {
|
||||
|
||||
else {
|
||||
my $port = ( $index % $index_factor ) + $port_offset;
|
||||
my $slot = int( $index / $index_factor );
|
||||
my $slot = int( $index / $index_factor ) + $slot_offset;
|
||||
|
||||
my $slotport = "$slot.$port";
|
||||
$if{$iid} = $slotport;
|
||||
@@ -256,8 +261,8 @@ sub i_mac {
|
||||
# Get VLAN Virtual Router Interfaces
|
||||
if (!defined $partial
|
||||
|| (defined $model
|
||||
&& ( ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ )
|
||||
|| ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) )
|
||||
&& ( ( $partial > 2000 && $model =~ /^8[8631]|16|VSP/ )
|
||||
|| ( $partial > 256 && $model =~ /^1[012][05]0/ ) )
|
||||
)
|
||||
)
|
||||
{
|
||||
@@ -276,7 +281,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';
|
||||
@@ -330,8 +335,8 @@ sub i_description {
|
||||
# Get VLAN Virtual Router Interfaces
|
||||
if (!defined $partial
|
||||
|| (defined $model
|
||||
&& ( ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ )
|
||||
|| ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) )
|
||||
&& ( ( $partial > 2000 && $model =~ /^8[8631]|16|VSP/ )
|
||||
|| ( $partial > 256 && $model =~ /^1[012][05]0/ ) )
|
||||
)
|
||||
)
|
||||
{
|
||||
@@ -366,8 +371,8 @@ sub i_name {
|
||||
|
||||
if (!defined $partial
|
||||
|| (defined $model
|
||||
&& ( ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ )
|
||||
|| ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) )
|
||||
&& ( ( $partial > 2000 && $model =~ /^8[8631]|16|VSP/ )
|
||||
|| ( $partial > 256 && $model =~ /^1[012][05]0/ ) )
|
||||
)
|
||||
)
|
||||
{
|
||||
@@ -379,27 +384,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 == 64 ) and ( $model =~ /^VSP[48]/ ) ) {
|
||||
$i_name{$iid} = 'Mgmt Port';
|
||||
}
|
||||
|
||||
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_idx = $reverse_vlan{$iid};
|
||||
@@ -433,12 +442,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 +460,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 +482,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 +493,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 +504,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 +531,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|VSP)/ ) {
|
||||
if ( defined $model and $model =~ /^8[86]|16|VSP/ ) {
|
||||
|
||||
# Return CLIP (CircuitLess IP)
|
||||
foreach my $iid ( keys %$rc_ip_type ) {
|
||||
@@ -560,11 +581,18 @@ 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;
|
||||
}
|
||||
|
||||
sub slot_offset {
|
||||
my $passport = shift;
|
||||
my $model = $passport->model();
|
||||
# Newer VSP 4K and 8K start at an index of 192 ~ slot 3 but really slot 1
|
||||
return -2
|
||||
if ( defined $model and $model =~ /^VSP[48]/ );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -583,9 +611,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 +718,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 +788,7 @@ sub e_descr {
|
||||
|
||||
my $model = $passport->model();
|
||||
my $rc_ps = $passport->rc_ps_detail() || {};
|
||||
my $rc_ch = $passport->chassis();
|
||||
my $rc_ch = $passport->chassis() || '';
|
||||
$rc_ch =~ s/a//;
|
||||
|
||||
my %rc_e_descr;
|
||||
@@ -701,7 +806,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;
|
||||
@@ -769,7 +874,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 +947,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 +983,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;
|
||||
@@ -953,7 +1058,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;
|
||||
@@ -1240,6 +1345,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
|
||||
|
||||
@@ -41,7 +41,7 @@ use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
|
||||
191
Info/Layer3/Pica8.pm
Normal file
191
Info/Layer3/Pica8.pm
Normal 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.30';
|
||||
|
||||
%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
|
||||
@@ -36,7 +36,7 @@ use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.04_001';
|
||||
$VERSION = '3.30';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
|
||||
|
||||
216
Info/Layer3/Steelhead.pm
Normal file
216
Info/Layer3/Steelhead.pm
Normal 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.30';
|
||||
|
||||
%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
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user