Compare commits

...

143 Commits

Author SHA1 Message Date
Oliver Gorwits
8e63954c3f release 3.16 2014-06-23 13:53:22 +01:00
Eric A. Miller
0fbcd5f8b1 Documentation updates for Cisco inheritance clean-up 2014-06-22 20:16:34 -04:00
Eric A. Miller
71f84d48dc Clean up inheritance for L3 Cisco classes. With this change all applicable classes will now support LLDP and aggregation methods. 2014-06-22 19:57:48 -04:00
Eric A. Miller
867a635ab8 Remove SNMP::Info inheritance from CiscoStack to prevent issues caused by multiple inheritance, documentation states that this class should not be used directly. 2014-06-22 19:53:53 -04:00
Eric A. Miller
3d2c9ceaf5 Add L3::CiscoSwitch base class for L3 Cisco switches 2014-06-22 19:31:00 -04:00
Eric A. Miller
47736b08ce FWSM and ASA only support methods in CiscoStats, don't inherit other Cisco classes which the devices don't support 2014-06-22 19:28:03 -04:00
Eric A. Miller
3f49e5f8ef Add LLDP and CiscoStpExtensions to L3::Cisco 2014-06-22 17:35:32 -04:00
Eric A. Miller
7c8575bfa5 Clarify CISCO-VLAN-IFTABLE-RELATION-MIB usage comment 2014-06-22 11:21:55 -04:00
Eric A. Miller
102a7e10cc L3::Cisco i_vlan() will now call SUPER and try interface description as a fallback 2014-06-22 11:21:02 -04:00
Eric A. Miller
9148764d20 Remove CiscoImage from all classes as its now included in CiscoStats class 2014-06-22 09:31:44 -04:00
Eric A. Miller
ce619415de Make L2::Cisco base class for L2::Catalyst and L2::C2900
Add CiscoPortSecurity, CiscoStpExtensions, CiscoAgg to L2::Cisco
Remove CiscoQOS and CiscoImage from L2::Cisco
2014-06-21 11:41:17 -04:00
Eric A. Miller
745807007f Remove CiscoImage class as its now included in CiscoStats class 2014-06-21 11:37:55 -04:00
Eric A. Miller
e85b3f70aa Consolidate CiscoImage class into CiscoStats class 2014-06-21 11:36:33 -04:00
Eric A. Miller
edc0fe4fbe Enterprise edition versions 8 and 9 of C1900 support aggregation and stp extensions 2014-06-21 11:35:03 -04:00
Oliver Gorwits
3cceec9044 add MRO synopsis and remove empty all_methods keys 2014-06-20 13:48:36 +01:00
Oliver Gorwits
18602855da use array instead of hash for key/val 2014-06-19 17:04:22 +01:00
Oliver Gorwits
72c223f72e make all_methods explicitly show all subs/globals/funcs 2014-06-19 16:51:12 +01:00
Oliver Gorwits
c6b3c45412 version of all_methods using positional array for sub/global/func 2014-06-19 16:42:36 +01:00
Oliver Gorwits
c60a04f530 Add method resolution discovery in SNMP::Info::MRO helper module 2014-06-19 15:46:42 +01:00
Oliver Gorwits
f7430ab1a6 Add method resolution discovery in SNMP::Info::MRO helper module 2014-06-19 15:44:51 +01:00
Oliver Gorwits
827398228c Add superclass discovery methods 2014-06-18 13:22:09 +01:00
Oliver Gorwits
a264bb36cb release 3.15 2014-06-10 13:17:33 +01:00
Oliver Gorwits
c24e63ec4c Return serial number for Cisco 3850 from entPhysicalSerialNum 2014-06-10 13:12:08 +01:00
Oliver Gorwits
6519570839 Offline mode and Cache export/priming 2014-06-09 22:30:30 +01:00
Oliver Gorwits
2c88544158 implement cache and offline mode 2014-06-09 21:21:26 +01:00
Oliver Gorwits
d0722d3677 release 3.14 2014-06-07 12:35:18 +01:00
Oliver Gorwits
d2b404763b fix pod 2014-06-07 12:34:08 +01:00
Oliver Gorwits
88fb9e4df3 802.3ad LAG support in Layer3::H3C 2014-06-07 12:26:43 +01:00
Jeroen van Ingen
440ec276d3 Fallback in determination whether a device is LLDP capable 2014-06-06 09:41:13 +02:00
Jeroen van Ingen
6e91b90c48 Add LLDP capabilities to Layer2::HPVC class 2014-06-06 09:41:13 +02:00
Jeroen van Ingen
0bfc8c5ed6 Return correct VLAN info with qb_fw_table() on Layer2::HP 2014-06-06 09:41:13 +02:00
Oliver Gorwits
63547c2ea1 Don't unshift length from broken lldpRemManAddrTable implementations (G. Shtern) 2014-05-08 20:02:11 +01:00
Oliver Gorwits
efecf1bbb7 Improvements to Mikrotik module (Alex Z) 2014-04-18 17:08:01 +01:00
Oliver Gorwits
682b8c2a9c release 3.13 2014-03-27 23:22:13 +00:00
Oliver Gorwits
88295e8c1e Cisco PAgP support added to LAG method
Squashed commit of the following:

commit 5cb2d637c7e990bbb8f789b6878f4bcb99778157
Author: Brian De Wolf <git@bldewolf.com>
Date:   Wed Feb 26 18:31:22 2014 -0800

    Implement agg_ports_pagp

    This function was a stub that is now filled out.  Also filled out the function
    that merges PAgP and LAG groups and did minimal testing of the PAgP side (no
    LAG in use in my env).
2014-03-27 23:08:53 +00:00
Jeroen van Ingen
6764f15fd0 HP ProCurve LAG support by inheriting Info::Aggregate class 2014-03-25 11:32:43 +01:00
Oliver Gorwits
8b8ee8693e release 3.12 2014-02-10 21:08:24 +00:00
Oliver Gorwits
fe89001166 Foundry/Brocade aggreate port master ifIndex resolved properly 2014-02-09 12:41:46 +00:00
Eric A. Miller
416a18377c Modify L3::Passport to obtain forwarding table information from RAPID-CITY if information is not available in either Q-BRIDGE-MIB or BRIDGE-MIB. Needed for VSP 9000 prior to version 4.x (Tobias Gerlach) 2014-01-29 20:40:19 -05:00
Eric A. Miller
8fda38184c [#52] NETSCREEN-IP-ARP-MIB considered harmful 2014-01-28 23:06:53 -05:00
Oliver Gorwits
280e9260f7 release 3.11 2014-01-26 13:47:38 +00:00
Eric A. Miller
22642c1095 Skip default CPU management addresses on VSP and 8800/8600 series in L3::Passport to prevent erroneous duplicate addresses 2014-01-20 21:59:53 -05:00
Oliver Gorwits
d68b2047b0 rename IEEE802dot3ag to IEEE802dot3ad 2014-01-19 17:11:42 +00:00
Eric A. Miller
7240f034e5 Regex cleanup for additional support of Avaya 8800 series in L3::Passport 2014-01-19 12:03:50 -05:00
Eric A. Miller
97ce41e363 Additional documentation for new LAG support 2014-01-19 11:00:50 -05:00
Eric A. Miller
31a8abc3b8 Squashed commit of the following:
commit 9be20cd3e24b401d5bfeb2bcb40d61a7b33ffe2c
Author: Eric A. Miller <emiller@cpan.org>
Date:   Sun Jan 19 10:13:41 2014 -0500

    Re-organize part 2

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

    Re-organize

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

    Add MLT agg_ports() support for Avaya

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

    implement LAG support for Foundry

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

    implement LAG support for Arista

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

    update gitignore to ignore SNMP dir

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

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

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

We welcome reports from others, either success or failure.
2013-08-02 10:44:58 -05:00
Jeroen van Ingen
22dd49c1dc Add HP 2530 and 2920 models to Layer2::HP MODEL_MAP & re-sort the list 2013-08-02 15:34:54 +02:00
Oliver Gorwits
fd5812aefc version bump - 3.03 2013-07-11 12:36:58 +01:00
Oliver Gorwits
f4e37cdabe Add missing =back to POD (A. Hartmaier) 2013-07-11 12:34:51 +01:00
Oliver Gorwits
5324760463 version bump - 3.02 2013-07-08 21:25:14 +01:00
Oliver Gorwits
27120045d2 [RT#86725] - Identify Cisco Catalyst 3850 as Layer3::C6500 (C. Causer) 2013-07-08 21:19:32 +01:00
Oliver Gorwits
abfd93ea1b remove evil tabs 2013-07-08 21:15:06 +01:00
Jeroen van Ingen
070d911c60 Add support for Aruba LAN switches.
Known issue with Aruba AOS 7.2.0.0: nodes on "trusted" LAN ports in "access"
mode point to non-existing bp_index values; they will be mapped to the wrong
interface or not be mapped to an interface at all.
2013-06-24 10:42:58 +02:00
Jeroen van Ingen
8b14776c9a Add release date to headings for version 3.01 and 3.02 2013-06-24 10:35:30 +02:00
Oliver Gorwits
2d62372c7f Identify Cisco Aironet 1140 APs as Layer2::Aironet 2013-05-25 01:25:59 +01:00
Oliver Gorwits
3eae0b9d5c Support Alcatel devices with layer3 features. 2013-05-21 09:35:38 +01:00
Nic Bernstein
9a722bb2f8 Properly pull os_ver from Netgear GS series switches. 2013-04-15 16:30:32 -05:00
Oliver Gorwits
d3e39a4132 bump version for stable release 2013-04-13 11:05:26 +01:00
Oliver Gorwits
d82d495dcf final patch from Nic to fix arrayism 2013-04-11 17:07:47 +01:00
Oliver Gorwits
198df7cee4 update changelog 2013-04-11 17:06:52 +01:00
Oliver Gorwits
46cdb4c166 update manifest 2013-04-11 17:01:37 +01:00
Oliver Gorwits
62005c52d2 update VERSION 2013-04-11 17:00:28 +01:00
Oliver Gorwits
ca7651628d bug fix for Class name typos 2013-04-11 16:59:02 +01:00
Alexander Hartmaier
6358b7ad70 override i_description for Cisco ASA firewalls to return the configured interface name 2013-04-10 18:46:39 +02:00
Alexander Hartmaier
8aca1d97c0 fixed Cisco ASA detection for newer versions that return has_layer(3) 2013-04-10 18:27:08 +02:00
Moe Kraus
275a533843 added subclass for Cisco ASA firewalls which filters bad mac addresses in b_mac method 2013-04-10 18:26:31 +02:00
116 changed files with 7529 additions and 2085 deletions

2
.gitignore vendored Normal file
View File

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

220
ChangeLog
View File

@@ -1,6 +1,223 @@
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
version 3.00
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
andL3::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]
* [#47] Add model info on HP 2530 and HP 2920 series
* Add support for Cisco Small Business series
Layer2/CiscoSB class
* Add proper LLDP support to Netgear.pm
* Change $netgear->interfaces() to use ifName rather than ifDescr
as the former is unique per interface while the latter is not.
If ifName is not present, concatenate ifDescr and ifIndex
to achieve a unique value.
* Properly report hardware version, Serial No. and OS Version for
Netgear.
version 3.03 (2013-07-11)
[BUG FIXES]
* Add missing =back to POD (A. Hartmaier)
version 3.02 (2013-07-08)
[ENHANCEMENTS]
* Properly pull os_ver from Netgear GS series switches.
* Support Alcatel devices with layer3 features.
* Identify Cisco Aironet 1140 APs as Layer2::Aironet
* LAN switch support added to Layer3::Aruba class
* [RT#86725] - Identify Cisco Catalyst 3850 as Layer3::C6500 (C. Causer)
version 3.01 (2013-04-13)
[API Changes]
@@ -24,6 +241,7 @@ version 3.00
* [3033731] - Alcatel-Lucent OmniSwich AMAP Support in new AMAP class
* [3598896] - Lantronix device support (J R Binks)
* [3598337] - Lantronix SLC support
* Support for Cisco ASA in L3::CiscoASA (Kraus/Hartmaier/Bernstein)
* Support for Avaya VSP 9000 series in L3::Passport
* Support for Avaya VSP 7000 series in L2::Baystack
* Support Avaya (Trapeze) Wireless Controllers in new class L2::NWSS2300

View File

@@ -101,8 +101,11 @@ portmac: yes
duplex: no
class: Layer3::Aruba
device-family: Aruba Wireless Controllers
device-family: Aruba Wireless Controllers and LAN switches
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
note: On LAN switches, hosts connected to "trusted" switch ports in "access" mode may be mapped to incorrect ports.
device: 3500
device: 5000
@@ -381,6 +384,10 @@ class: Layer3::Altiga
device: VPN3000
note: The Cisco 3000 device can return duplicate interface names, while Netdisco expects unique interface names. To ensure unique device names I append numbers only when an interface name would not be unique without one. Interfaces with unique names keep their ifDescr name.
device: ASA
note: The Cisco ASA is the successor of the PIX which was bought from Altiga Networks.
class: Layer3::CiscoASA
device-family: 1000
duplex: no
ver: 1
@@ -650,6 +657,12 @@ note: !Arpnip only available for 4.x software releases.
class: Layer3::CiscoFWSM
arpnip: yes
device: Sx300, Sx500 series
device-family: Small Business switches
class: Layer2::CiscoSB
arpnip: no
macsuck: yes
#
# Citrix
#

424
Info.pm
View File

@@ -24,15 +24,15 @@ use vars
qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG %SPEED_MAP
$NOSUCH $BIGINT $REPEATERS/;
$VERSION = '3.00_003';
$VERSION = '3.16';
=head1 NAME
SNMP::Info - Object Oriented Perl5 Interface to Network devices and MIBs through SNMP.
SNMP::Info - OO Interface to Network devices and MIBs through SNMP
=head1 VERSION
SNMP::Info - Version 3.00_003
SNMP::Info - Version 3.16
=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
@@ -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
@@ -535,11 +547,19 @@ 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.
=item SNMP::Info::Layer2::CiscoSB
Subclass for Cisco's "Small Business" product line, acquired from
Linksys. This currently comprises the Sx300/500 line of switches.
See documentation in L<SNMP::Info::Layer2::CiscoSB> for details.
=item SNMP::Info::Layer2::HP
Subclass for more recent HP Procurve Switches
@@ -686,16 +706,28 @@ 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.
=item SNMP::Info::Layer3::CiscoASA
Subclass for Cisco Adaptive Security Appliances.
See documentation in L<SNMP::Info::Layer3::CiscoASA> for details.
=item SNMP::Info::Layer3::CiscoFWSM
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.
@@ -753,6 +785,13 @@ 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::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
@@ -820,11 +859,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.
@@ -1004,6 +1054,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.
@@ -1093,6 +1157,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};
@@ -1217,6 +1291,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
@@ -1265,6 +1342,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.
@@ -1342,6 +1463,7 @@ sub device_type {
}
my $id = $info->id() || 'undef';
my $soid = $id;
# Hash for generic fallback to a device class if unable to determine using
# the sysDescr regex.
@@ -1376,8 +1498,11 @@ sub device_type {
12325 => 'SNMP::Info::Layer3::Pf',
14525 => 'SNMP::Info::Layer2::Trapeze',
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',
);
my %l2sysoidmap = (
@@ -1396,10 +1521,13 @@ sub device_type {
3375 => 'SNMP::Info::Layer3::F5',
4526 => 'SNMP::Info::Layer2::Netgear',
5624 => 'SNMP::Info::Layer3::Enterasys',
6486 => 'SNMP::Info::Layer3::AlcatelLucent',
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 %l7sysoidmap = (
@@ -1437,10 +1565,10 @@ sub device_type {
$objtype = 'SNMP::Info::Layer3::Aironet'
if ( $desc =~ /Aironet/ and $desc =~ /\D(AP4800)\D/ );
# Cat6k with older SUPs (hybrid CatOS/IOS?)
# Cat6k with older SUPs (hybrid CatOS/IOS?)
$objtype = 'SNMP::Info::Layer3::C6500' if $desc =~ /(c6sup2|c6sup1)/;
# Cat6k with Sup720, Sup720 or Sup2T (and Sup2 running native IOS?)
# Cat6k with Sup720, Sup720 or Sup2T (and Sup2 running native IOS?)
$objtype = 'SNMP::Info::Layer3::C6500'
if $desc =~ /(s72033_rp|s3223_rp|s32p3_rp|s222_rp|s2t54)/;
@@ -1448,6 +1576,10 @@ sub device_type {
$objtype = 'SNMP::Info::Layer3::C6500'
if ( $desc =~ /cisco/i and $desc =~ /3750/ );
# IOS 15.x on Catalyst 3850
$objtype = 'SNMP::Info::Layer3::C6500'
if ( $desc =~ /cisco/i and $desc =~ /CAT3K/ );
# Cisco 2970
$objtype = 'SNMP::Info::Layer3::C6500'
if ( $desc =~ /(C2970|C2960)/ );
@@ -1491,6 +1623,11 @@ sub device_type {
$objtype = 'SNMP::Info::Layer2::Allied'
if ( $desc =~ /Allied.*AT-80\d{2}\S*/i );
# Cisco ASA, newer versions which report layer 3 functionality
# version >= 8.2 are known to do this
$objtype = 'SNMP::Info::Layer3::CiscoASA'
if ( $desc =~ /Cisco Adaptive Security Appliance/i );
# Cisco FWSM
$objtype = 'SNMP::Info::Layer3::CiscoFWSM'
if ( $desc =~ /Cisco Firewall Services Module/i );
@@ -1503,6 +1640,13 @@ 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)\b/
and $desc =~ /\bIOS\b/ );
# Generic device classification based upon sysObjectID
if ( ( $objtype eq 'SNMP::Info::Layer3' )
and ( defined($id) )
@@ -1544,6 +1688,11 @@ sub device_type {
$objtype = 'SNMP::Info::Layer3::C6500'
if ( $desc =~ /(C2970|C2960)/ );
# Cisco Small Business (300 500) series override
# This is for enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1)
$objtype = 'SNMP::Info::Layer2::CiscoSB'
if ( $soid =~ /^\.1\.3\.6\.1\.4\.1\.9\.6\.1/ );
# HP, older ProCurve models (1600, 2400, 2424m, 4000, 8000)
$objtype = 'SNMP::Info::Layer2::HP4000'
if $desc =~ /\b(J4093A|J4110A|J4120A|J4121A|J4122A|J4122B)\b/;
@@ -1592,7 +1741,7 @@ sub device_type {
# Aironet - IOS
$objtype = 'SNMP::Info::Layer2::Aironet'
if ($desc =~ /\b(C1100|C1130|AP1200|C350|C1200|C1240|C1250)\b/
if ($desc =~ /\b(C1100|C1130|C1140|AP1200|C350|C1200|C1240|C1250)\b/
and $desc =~ /\bIOS\b/ );
# Aironet - non IOS
@@ -1657,8 +1806,8 @@ sub device_type {
$objtype = 'SNMP::Info::Layer3::Cisco'
if ( $desc =~ /Cisco PIX Security Appliance/i );
# Cisco ASA
$objtype = 'SNMP::Info::Layer3::Cisco'
# Cisco ASA, older version which doesn't report layer 3 functionality
$objtype = 'SNMP::Info::Layer3::CiscoASA'
if ( $desc =~ /Cisco Adaptive Security Appliance/i );
# HP Virtual Connect blade switches
@@ -2418,7 +2567,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) {
@@ -2573,7 +2722,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
@@ -2595,6 +2745,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
@@ -2648,6 +2826,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 :
@@ -3188,21 +3398,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
@@ -3263,15 +3459,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;
}
@@ -3512,22 +3708,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) || '';
@@ -3555,12 +3754,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;
@@ -3837,7 +4035,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$/;
@@ -3854,6 +4051,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
@@ -4017,24 +4220,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;
}
}
@@ -4043,11 +4236,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 {
@@ -4057,20 +4245,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};
@@ -4089,6 +4266,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
@@ -4144,6 +4322,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
@@ -4256,14 +4494,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;
@@ -4330,7 +4561,7 @@ subclass.
=cut
sub AUTOLOAD {
my $self = shift;
my $self = shift;
my ($sub_name) = $AUTOLOAD =~ /::(\w+)$/;
return if $sub_name =~ /DESTROY$/;
@@ -4348,10 +4579,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

View File

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

View File

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

View File

@@ -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.00_003';
$VERSION = '3.16';
%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

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%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

View File

@@ -42,7 +42,7 @@ use SNMP::Info;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
'BRIDGE-MIB' => 'dot1dBaseBridgeAddress',
@@ -189,6 +189,35 @@ sub qb_i_vlan_t {
return $i_vlan;
}
# Most devices now support Q-BRIDGE-MIB, fall back to
# BRIDGE-MIB for those that don't.
sub fw_mac {
my $bridge = shift;
my $qb = $bridge->qb_fw_mac();
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
return $bridge->SUPER::fw_mac();
}
sub fw_port {
my $bridge = shift;
my $qb = $bridge->qb_fw_port();
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
return $bridge->SUPER::fw_port();
}
sub fw_status {
my $bridge = shift;
my $qb = $bridge->qb_fw_status();
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
return $bridge->SUPER::fw_status();
}
sub i_stp_state {
my $bridge = shift;
my $partial = shift;
@@ -308,6 +337,8 @@ sub i_vlan {
return $i_vlan;
}
sub i_untagged { goto &i_vlan }
sub i_vlan_membership {
my $bridge = shift;
my $partial = shift;
@@ -365,6 +396,8 @@ sub set_i_vlan {
return;
}
sub set_i_untagged { goto &set_i_vlan }
sub set_add_i_vlan_tagged {
my $bridge = shift;
@@ -597,6 +630,10 @@ to a hash.
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=item $vtp->i_untagged()
An alias for C<i_vlan>.
=item $bridge->i_vlan_membership()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
@@ -893,6 +930,10 @@ operations.
Currently unsupported. Throws an error and returns.
=item $bridge->set_i_untagged(vlan, ifIndex)
An alias for C<set_i_vlan>.
=item $bridge->set_i_pvid(pvid, ifIndex)
Currently unsupported. Throws an error and returns.
@@ -905,4 +946,6 @@ Currently unsupported. Throws an error and returns.
Currently unsupported. Throws an error and returns.
=back
=cut

View File

@@ -40,9 +40,10 @@ use SNMP::Info;
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CDP::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
use vars
qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT %CDP_CAPABILITIES/;
$VERSION = '3.00_003';
$VERSION = '3.16';
# Five data structures required by SNMP::Info
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
@@ -76,7 +77,7 @@ $VERSION = '3.00_003';
);
%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,
@@ -87,6 +88,20 @@ $VERSION = '3.00_003';
);
%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 +175,41 @@ 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;
}
1;
__END__
@@ -283,39 +333,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 +486,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
View 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.16';
%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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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.00_003';
$VERSION = '3.16';
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );

View File

@@ -42,7 +42,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
'SNMPv2-MIB' => 'sysDescr',
@@ -88,6 +88,9 @@ $VERSION = '3.00_003';
# 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

View File

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

View File

@@ -41,7 +41,7 @@ use SNMP::Info;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
'CISCO-VTP-MIB' => 'vtpVlanName',
@@ -172,8 +172,7 @@ sub i_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 +190,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;
@@ -306,6 +321,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 +571,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
@@ -835,6 +870,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

View File

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

View File

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

View File

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

View File

@@ -42,7 +42,7 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
@@ -68,7 +68,7 @@ $VERSION = '3.00_003';
);
%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>)

View File

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

141
Info/IEEE802dot3ad.pm Normal file
View File

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

View File

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

View File

@@ -39,7 +39,7 @@ use SNMP::Info;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
'LLDP-MIB' => 'lldpLocSysCapEnabled',
@@ -67,6 +67,7 @@ $VERSION = '3.00_003';
'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.00_003';
'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;
}
@@ -168,10 +174,15 @@ sub lldp_port {
my %lldp_port;
foreach my $key ( sort keys %$pid ) {
my $port = $pdesc->{$key};
my $type = $ptype->{$key};
if ( $type and $type eq 'interfaceName' ) {
# If the pid claims to be an interface name,
# believe it.
$port = $pid->{$key};
}
unless ($port) {
$port = $pid->{$key};
next unless $port;
my $type = $ptype->{$key};
next unless $type;
# May need to format other types in the future, i.e. Network address
@@ -222,6 +233,50 @@ 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,7 +302,7 @@ sub _lldp_addr_index {
my @oids = split( /\./, $idx );
my $index = join( '.', splice( @oids, 0, 3 ) );
my $proto = shift(@oids);
my $length = shift(@oids);
my $length = shift(@oids) if scalar @oids > 4;
# IPv4
if ( $proto == 1 ) {
@@ -435,6 +490,17 @@ Currently only returns IPv4 or MAC addresses.
Returns remote port ID
=item $lldp->lldp_platform()
Tries to return something useful from C<lldp_rem_sysdesc()> or
C<lldp_rem_sysname()>.
=item $lldp->lldp_cap()
Returns hash of arrays with each array containing the system capabilities
supported by the remote system. Possible elements in the array are
enumerated from C<LldpSystemCapabilitiesMap>.
=back
=head2 LLDP Remote Table (C<lldpRemTable>)
@@ -498,9 +564,9 @@ Nulls are removed before the value is returned.
=item $lldp->lldp_rem_sys_cap()
Returns which system capabilities are enabled on the local system. Results
are munged into an ascii binary string, LSB. Each digit
represents a bit from the table below:
Returns which system capabilities are enabled on the remote system. Results
are munged into an ascii binary string, LSB. Each digit represents a bit
from the table below:
=over

View File

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

View File

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

View File

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

View File

@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%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;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -46,12 +46,13 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%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.00_003';
%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;
}
@@ -393,6 +396,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.
@@ -509,10 +520,16 @@ revisions of Baystack firmware report all zeros for each port mac.
Crosses C<ifName> with C<ifAlias> and returns the human set port name if
exists.
=item $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

View File

@@ -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.00_003';
$VERSION = '3.16';
%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.00_003';
%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.00_003';
%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.00_003';
);
%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';
@@ -258,7 +268,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 +322,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 +350,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 +412,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.
@@ -513,6 +539,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.

View File

@@ -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.00_003';
$VERSION = '3.16';
%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.00_003';
);
%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

View File

@@ -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.00_003';
$VERSION = '3.16';
%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

View File

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

View File

@@ -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.00_003';
$VERSION = '3.16';
%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.

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

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

View File

@@ -38,21 +38,28 @@ 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::LLDP
SNMP::Info::CDP
Exporter
/;
@SNMP::Info::Layer2::HP::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%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',
@@ -69,6 +76,7 @@ $VERSION = '3.00_003';
%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',
@@ -87,6 +95,7 @@ $VERSION = '3.00_003';
%SNMP::Info::MAU::FUNCS,
%SNMP::Info::LLDP::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::Aggregate::FUNCS,
'i_type2' => 'ifType',
# RFC1271
@@ -112,6 +121,7 @@ $VERSION = '3.00_003';
%SNMP::Info::MAU::MUNGE,
%SNMP::Info::LLDP::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::Aggregate::MUNGE,
'c_id' => \&munge_hp_c_id,
);
@@ -167,6 +177,10 @@ $VERSION = '3.00_003';
'J4905A' => '3400cl-24G',
'J4815A' => '3324XL',
'J4851A' => '3124',
'J9729A' => '2920-48G-PoE+',
'J9728A' => '2920-48G',
'J9727A' => '2920-24G-PoE+',
'J9726A' => '2920-24G',
'J9562A' => '2915-8G-PoE',
'J9148A' => '2910al-48G-PoE+',
'J9147A' => '2910al-48G',
@@ -178,26 +192,30 @@ $VERSION = '3.00_003';
'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',
'J9624A' => '2620-24-PPoE+',
'J9626A' => '2620-48',
'J9625A' => '2620-24-PoE+',
'J9624A' => '2620-24-PPoE+',
'J9623A' => '2620-24',
'J9565A' => '2615-8-PoE',
'J9089A' => '2610-48-PWR',
'J9088A' => '2610-48',
'J9087A' => '2610-24-PWR',
'J9086A' => '2610-24/12PWR',
'J9087A' => '2610-24-PWR',
'J9085A' => '2610-24',
'J8762A' => '2600-8-PWR',
'J9772A' => '2530-48G-PoE+',
'J9775A' => '2530-48G',
'J9773A' => '2530-24G-PoE+',
'J9776A' => '2530-24G',
'J4813A' => '2524',
'J9298A' => '2520G-8-PoE',
'J9299A' => '2520G-24-PoE',
@@ -516,6 +534,32 @@ sub set_i_vlan_tagged {
return;
}
sub agg_ports { return agg_ports_ifstack(@_) }
sub qb_fw_vlan {
my $hp = shift;
my $partial = shift;
my $qb_fw_vlan = $hp->SUPER::qb_fw_vlan($partial);
my $fdb_to_dot1q = {};
my $fdb_id = $hp->dot1qVlanFdbId(0);
foreach my $fdb_entry (keys %$fdb_id) {
my ($timemark, $vlan_id) = split(/\./, $fdb_entry);
$fdb_to_dot1q->{$fdb_id->{$fdb_entry}} = $vlan_id;
}
foreach my $learn (keys %$qb_fw_vlan) {
my $fdb_idx = $qb_fw_vlan->{$learn};
if (exists $fdb_to_dot1q->{$fdb_idx}) {
$qb_fw_vlan->{$learn} = $fdb_to_dot1q->{$fdb_idx};
}
}
return $qb_fw_vlan;
}
1;
__END__
@@ -702,7 +746,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',
@@ -783,6 +827,12 @@ Power supplied by PoE ports, in milliwatts
Returns what version of STP the device is running.
(C<hpicfBridgeRstpForceVersion> with fallback to inherited stp_ver())
=item $hp->qb_fw_vlan()
Returns reference to hash of forwarding table entries VLAN ID
(C<dot1qFdbId>), (C<rcBridgeTpFdbVlanId>)
=back
=head2 Globals imported from SNMP::Info::Layer2
@@ -804,7 +854,7 @@ to a hash.
=head2 Overrides
=over
=over 4
=item $hp->interfaces()
@@ -832,6 +882,12 @@ 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
@@ -869,4 +925,6 @@ operations.
=item set_i_vlan_tagged()
=back
=cut

View File

@@ -44,7 +44,7 @@ use SNMP::Info::CDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -719,4 +719,6 @@ operations.
=item set_i_vlan_tagged()
=back
=cut

View File

@@ -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.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::LLDP::MIBS,
'HPVC-MIB' => 'vcDomainName',
'CPQSINFO-MIB' => 'cpqSiSysSerialNum',
'HPVCMODULE-MIB' => 'vcModuleDomainName',
@@ -51,6 +53,7 @@ $VERSION = '3.00_003';
%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.00_003';
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::LLDP::FUNCS,
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::LLDP::MUNGE,
);

View File

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

View File

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

View File

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

View File

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

View File

@@ -33,26 +33,32 @@ package SNMP::Info::Layer2::Netgear;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::Entity;
use SNMP::Info::LLDP;
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Entity SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::LLDP::MIBS, );
# 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, );
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
ng_serial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
ng_osver => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Entity::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
ng_fsosver => '.1.3.6.1.4.1.4526.11.11.1.0',
ng_gsmserial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
ng_gsmosver => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
);
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::LLDP::FUNCS, );
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Entity::FUNCS, %SNMP::Info::LLDP::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Entity::MUNGE, %SNMP::Info::LLDP::MUNGE, );
sub vendor {
return 'netgear';
@@ -62,47 +68,216 @@ sub os {
return 'netgear';
}
# Wish the OID-based method worked, but netgear scatters
# the sysObjectID values across all the device MIBs, and
# makes the device MIBs state secrets.
# They seem to set sysDescr to the model number, though,
# so we'll use that.
# We will attempt to use Entity-MIB if present. In that case, we will
# also set the shared variable $index, which is used by other functions
# to index within Entity-MIB tables. This assumes, of course, that there
# is only one serial number (entPhysicalSerialNum) present in the table.
sub serial {
my $netgear = shift;
my $serial = undef;
my $e_serial = $netgear->e_serial();
if (defined($e_serial)) { # This unit sports the Entity-MIB
# Find entity table entry for this unit
foreach my $e ( keys %$e_serial ) {
if (defined ($e_serial->{$e}) and $e_serial->{$e} !~ /^\s*$/) {
$index = $e;
last;
}
}
return $e_serial->{$index} if defined $index;
}
# Without Enitity-MIB, we've got to work our way through a bunch of
# different locales...
return $netgear->ng_gsmserial() if defined $netgear->model and $netgear->model =~ m/GSM\d/i;;
return 'none';
}
# If device supports Entity-MIB, index into that to divine model and
# hardware version, otherwise default to sysDescr.
sub model {
my $netgear = shift;
if (defined($index)) {
my $model = $netgear->e_descr();
my $e_hwver = $netgear->e_hwver();
$model = "$model->{$index} $e_hwver->{$index}";
return $model;
}
return $netgear->description();
}
#
# This is model-dependent. Some netgear brand devices don't implement
# the bridge MIB forwarding table, so we use the Q-BRIDGE-MIB forwarding
# table. Fall back to the orig functions if the qb versions don't
# return anything.
sub fw_mac {
# ifDescr is the same for all interfaces in a class, but the ifName is
# unique, so let's use that for port name. If all else fails,
# concatentate ifDesc and ifIndex.
sub interfaces {
my $netgear = shift;
my $ret = $netgear->qb_fw_mac();
$ret = $netgear->orig_fw_mac() if ( !defined($ret) );
return $ret;
}
my $partial = shift;
sub fw_port {
my $netgear = shift;
my $ret = $netgear->qb_fw_port();
$ret = $netgear->orig_fw_port() if ( !defined($ret) );
return $ret;
my $interfaces = $netgear->i_index($partial) || {};
my $i_descr = $netgear->i_description($partial) || {};
my $i_name = $netgear->i_name($partial);
my $i_isset = ();
# Replace the description with the ifName field, if set
foreach my $iid ( keys %$i_name ) {
my $name = $i_name->{$iid};
next unless defined $name;
if (defined $name and $name !~ /^\s*$/) {
$interfaces->{$iid} = $name;
$i_isset->{$iid} = 1;
}
}
# Replace the Index with the ifDescr field, appended with index
# number, to deal with devices with non-unique ifDescr.
foreach my $iid ( keys %$i_descr ) {
my $port = $i_descr->{$iid} . '-' . $iid;
next unless defined $port;
next if (defined $i_isset->{$iid} and $i_isset->{$iid} == 1);
$interfaces->{$iid} = $port;
}
return $interfaces;
}
# these seem to work for GSM models but not GS
# https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529
sub os_ver {
my $self = shift;
return if $self->model and $self->model =~ m/GS\d/i;
return $self->ng_osver();
my $netgear = shift;
my $serial = $netgear->serial(); # Make sure that index gets primed
if (defined($index)) {
my $os_ver = $netgear->e_swver();
return $os_ver->{$index} if defined $os_ver;
}
return $netgear->ng_gsmosver() if defined $netgear->model and $netgear->model =~ m/GSM\d/i;
return $netgear->ng_fsosver() if defined $netgear->model and $netgear->model =~ m/FS\d/i;
}
sub serial {
my $self = shift;
return if $self->model and $self->model =~ m/GS\d/i;
return $self->ng_serial();
# 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;
@@ -145,6 +320,7 @@ inherited methods.
=over
=item SNMP::Info::Layer2
=item SNMP::Info::Entity
=item SNMP::Info::LLDP
=back
@@ -158,6 +334,8 @@ inherited methods.
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
classes.
See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
=back
@@ -180,7 +358,8 @@ Returns 'netgear'
=item $netgear->model()
Returns description()
Returns concatenation of $e_model and $e_hwver if Entity MIB present,
otherwise returns description()
=item $netgear->os_ver()
@@ -188,7 +367,8 @@ Returns OS Version.
=item $netgear->serial()
Returns Serial Number.
Returns Serial Number if available (older FS switches have no accessible
serial number).
=back
@@ -196,6 +376,10 @@ Returns Serial Number.
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Entity
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
@@ -209,22 +393,52 @@ a reference to a hash.
=over
=item $netgear->fw_mac()
=item $netgear->interfaces()
Returns reference to hash of forwarding table MAC Addresses.
Uses the i_name() field.
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=back
=item $netgear->fw_port()
=head2 Topology information
Returns reference to hash of forwarding table entries port interface
identifier (iid)
Based upon the software version devices may support Link Layer Discovery
Protocol (LLDP).
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=over
=item $netgear->hasCDP()
Returns true if the device is running LLDP.
=item $netgear->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $netgear->c_ip()
Returns reference to hash. Key: iid Value: remote IPv4 address
If multiple entries exist with the same local port, c_if(), with the same IPv4
address, c_ip(), it may be a duplicate entry.
If multiple entries exist with the same local port, c_if(), with different
IPv4 addresses, c_ip(), there is either a non-LLDP device in between two or
more devices or multiple devices which are not directly connected.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $netgear->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $netgear->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $netgear->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
@@ -232,6 +446,10 @@ C<Q-BRIDGE-MIB> doesn't return anything.
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Entity
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.

View File

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

View File

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

View File

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

View File

@@ -51,7 +51,7 @@ use SNMP::Info::AdslLine;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::MIBS,
@@ -132,11 +132,11 @@ $VERSION = '3.00_003';
'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',
);
@@ -152,7 +152,7 @@ $VERSION = '3.00_003';
%SNMP::Info::IPv6::MUNGE,
'old_at_paddr' => \&SNMP::Info::munge_mac,
'at_paddr' => \&SNMP::Info::munge_mac,
'n2p_paddr' => \&SNMP::Info::munge_mac,
'n2p_paddr' => \&SNMP::Info::munge_mac,
);
# Method OverRides
@@ -163,12 +163,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)
@@ -205,18 +205,26 @@ sub i_ignore {
sub serial {
my $l3 = shift;
my $serial1 = $l3->serial1();
my $e_descr = $l3->e_descr() || {};
my $e_serial = $l3->e_serial() || {};
my $serial1 = $l3->serial1();
my $e_parent = $l3->e_parent() || {};
my $serial2 = $e_serial->{1} || undef;
my $chassis = $e_descr->{1} || undef;
foreach my $iid ( keys %$e_parent ) {
my $parent = $e_parent->{$iid};
if ( $parent eq '0' ) {
my $serial = $l3->e_serial($iid);
if ( $serial ) {
return $serial->{$iid};
}
else {
my $descr = $l3->e_descr($iid);
if ( $descr and $descr =~ /serial#?:\s*([a-z0-9]+)/i )
{
return $1;
}
}
}
}
# precedence
# serial2,chassis parse,serial1
return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
return $1
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
return;
@@ -293,30 +301,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 );

View File

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

View File

@@ -49,7 +49,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%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

View File

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

View File

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

View File

@@ -36,19 +36,25 @@ use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
use SNMP::Info::LLDP;
use SNMP::Info::Aggregate;
@SNMP::Info::Layer3::Arista::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Arista::ISA = qw/
SNMP::Info::Aggregate
SNMP::Info::LLDP
SNMP::Info::MAU
SNMP::Info::Layer3 Exporter
/;
@SNMP::Info::Layer3::Arista::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%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

File diff suppressed because it is too large Load Diff

View File

@@ -43,7 +43,7 @@ use SNMP::Info::Bridge;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE %MODEL_MAP
%MODID_MAP %PROCID_MAP/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::MIBS,
@@ -1635,11 +1635,11 @@ See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=over
=item $extreme->munge_hw_rev()
=item $bayrs->munge_hw_rev()
Converts octets to a decimal major.minor string.
=item $extreme->munge_wf_serial()
=item $bayrs->munge_wf_serial()
Coverts octets to a decimal string.

View File

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

View File

@@ -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.00_003';
$VERSION = '3.16';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
@@ -72,46 +55,23 @@ $VERSION = '3.00_003';
# 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

View File

@@ -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.00_003';
$VERSION = '3.16';
%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.00_003';
);
%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.00_003';
*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

View File

@@ -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.00_003';
$VERSION = '3.16';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
@@ -75,52 +60,50 @@ $VERSION = '3.00_003';
# 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

View File

@@ -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.00_003';
$VERSION = '3.16';
%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,36 @@ $VERSION = '3.00_003';
%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 ) {
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;
}
1;
@@ -127,7 +141,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 +167,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 +176,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 +190,8 @@ Subclass for Generic Cisco Routers running IOS
=item SNMP::Info::Power
=item SNMP::Info::CiscoStpExtensions
=item SNMP::Info::Layer3
=back
@@ -187,12 +206,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 +220,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,10 +232,6 @@ These are methods that return scalar value from SNMP
=over
=item $cisco->vendor()
Returns 'cisco'
=item $cisco->eigrp_id()
(C<cEigrpAsRouterId>)
@@ -225,6 +242,10 @@ These are methods that return scalar value from SNMP
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 +254,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 +270,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 +301,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 +313,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 +329,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.

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

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

View File

@@ -31,34 +31,31 @@
package SNMP::Info::Layer3::CiscoFWSM;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer3::Cisco;
use SNMP::Info::CiscoStack;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::Layer3::Cisco
Exporter/;
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::CiscoStack
SNMP::Info::Layer3
Exporter/;
@SNMP::Info::Layer3::CiscoFWSM::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::Layer3::Cisco::MIBS,
);
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStack::MIBS, );
%GLOBALS = (
%SNMP::Info::Layer3::Cisco::GLOBALS,
);
%GLOBALS
= ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStack::GLOBALS, );
%FUNCS = (
%SNMP::Info::Layer3::Cisco::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::Cisco::MUNGE,
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoStack::FUNCS,
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoStack::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.00_003';
# 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::CiscoStack
=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::CiscoStack/"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::CiscoStack
See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details.
See documentation in L<SNMP::Info::CiscoStack/"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::CiscoStack
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::CiscoStack/"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
View 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.16';
%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

View File

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

View File

@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -193,25 +193,6 @@ sub i_duplex_admin {
return \%i_duplex_admin;
}
# Use same methods as netgear. Some device didn't implement the bridge MIB
# forwarding table and some don't return MACs for VLANs other than default yet
# don't support community indexing, so we use the Q-BRIDGE-MIB forwarding
# table. Fall back to the orig functions if the qb versions don't
# return anything.
sub fw_mac {
my $dell = shift;
my $ret = $dell->qb_fw_mac();
$ret = $dell->orig_fw_mac() if ( !defined($ret) );
return $ret;
}
sub fw_port {
my $dell = shift;
my $ret = $dell->qb_fw_port();
$ret = $dell->orig_fw_port() if ( !defined($ret) );
return $ret;
}
sub _vendor {
my $dell = shift;
@@ -406,23 +387,6 @@ sometimes not unique.
Returns reference to hash of iid to current link administrative duplex
setting.
=item $dell->fw_mac()
Returns reference to hash of forwarding table MAC Addresses.
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=item $dell->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid)
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=back
=head2 Table Methods imported from SNMP::Info::Layer3

View File

@@ -44,7 +44,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS,
@@ -149,22 +149,6 @@ 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
# and we may never reach the end of the table. This behavior can be
# modified with the "set snmp timefilter break disable" command,
@@ -373,17 +357,6 @@ 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

View File

@@ -46,7 +46,7 @@ use SNMP::Info::EDP;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -290,9 +290,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 +298,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 +308,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 +496,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;

View File

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

View File

@@ -43,7 +43,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%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;
@@ -300,14 +284,6 @@ 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>

View File

@@ -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.00_003';
$VERSION = '3.16';
%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,22 @@ $VERSION = '3.00_003';
'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',
);
%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,
);
sub i_ignore {
@@ -152,6 +172,7 @@ sub model {
return $id unless defined $model;
$model =~ s/^sn//;
$model =~ s/Switch//;
return $model;
}
@@ -270,6 +291,532 @@ 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;
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;
}
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;
}
1;
__END__
@@ -329,6 +876,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 +901,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 +984,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
@@ -462,6 +1016,136 @@ Skipped if device is an EdgeIron 24G due to reports of hangs.
(C<dot1dStpPortState>)
=item $foundry->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 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
=head2 Foundry Switch Port Information Table (C<snSwPortIfTable>)
@@ -494,6 +1178,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.

View File

@@ -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.00_003';
$VERSION = '3.16';
%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',
@@ -113,21 +122,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 +230,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

View File

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

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

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

View File

@@ -40,7 +40,7 @@ use SNMP::Info::LLDP;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -234,21 +234,6 @@ sub i_vlan_membership {
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);
}
# Pseudo ENTITY-MIB methods
# This class supports both virtual chassis (stackable) and physical chassis
@@ -678,25 +663,6 @@ 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

View File

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

View File

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

View File

@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -50,17 +50,30 @@ $VERSION = '3.00_003';
%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

View File

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

View File

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

View File

@@ -40,7 +40,7 @@ use SNMP::Info::IEEE802dot11;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
@@ -69,17 +69,17 @@ $VERSION = '3.00_003';
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

View File

@@ -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.00_003';
$VERSION = '3.16';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
@@ -70,108 +55,132 @@ $VERSION = '3.00_003';
# 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;
}
return \%ip_table;
}
sub ip_index {
my $nexus = shift;
my $orig_ip_table = $nexus->orig_ip_table();
my $orig_ip_index = $nexus->orig_ip_index();
my %ip_index;
foreach my $iid ( keys %$orig_ip_table ) {
my $ip = $orig_ip_table->{$iid};
my $index = $orig_ip_index->{$iid};
next unless ( defined $ip && defined $index );
$ip_index{$ip} = $index;
}
return \%ip_index;
}
sub ip_netmask {
my $nexus = shift;
my $orig_ip_table = $nexus->orig_ip_table();
my $orig_ip_netmask = $nexus->orig_ip_netmask();
my %ip_netmask;
foreach my $iid ( keys %$orig_ip_table ) {
my $ip = $orig_ip_table->{$iid};
my $netmask = $orig_ip_netmask->{$iid};
next unless ( defined $ip && defined $netmask );
$ip_netmask{$ip} = $netmask;
}
return \%ip_netmask;
}
sub ip_broadcast {
my $nexus = shift;
my $orig_ip_table = $nexus->orig_ip_table();
my $orig_ip_broadcast = $nexus->orig_ip_broadcast();
my %ip_broadcast;
foreach my $iid ( keys %$orig_ip_table ) {
my $ip = $orig_ip_table->{$iid};
my $broadcast = $orig_ip_broadcast->{$iid};
next unless ( defined $ip && defined $broadcast );
$ip_broadcast{$ip} = $broadcast;
}
return \%ip_broadcast;
}
1;
@@ -190,14 +199,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 +224,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 +240,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 +251,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 +273,56 @@ 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.
=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

View File

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

View File

@@ -43,7 +43,7 @@ use SNMP::Info::Layer3;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '3.00_003';
$VERSION = '3.16';
%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();
@@ -183,8 +183,8 @@ sub 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/ ) )
)
)
{
@@ -198,24 +198,24 @@ sub interfaces {
my $index = $i_index->{$iid};
next unless defined $index;
if ( ( $index == 1 ) and ( $model =~ /(86)/ ) ) {
if ( ( $index == 1 ) and ( $model =~ /^8[86]/ ) ) {
$if{$index} = 'Cpu.Virtual';
}
elsif ( ( $index == 192 ) and ( $model eq '8603' ) ) {
elsif ( ( $index == 192 ) and ( $model =~ /^8[86]03/ ) ) {
$if{$index} = 'Cpu.3';
}
elsif ( ( $index == 320 ) and ( $model =~ /(8606|8610|8610co)/ ) ) {
elsif ( ( $index == 320 ) and ( $model =~ /^8[86][10][06]/ ) ) {
$if{$index} = 'Cpu.5';
}
elsif ( ( $index == 384 ) and ( $model =~ /(8606|8610|8610co)/ ) ) {
elsif ( ( $index == 384 ) and ( $model =~ /^8[86][10][06]/ ) ) {
$if{$index} = 'Cpu.6';
}
elsif (( $index > 2000 and $model =~ /(86|83|81|16|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};
@@ -256,8 +256,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 +276,7 @@ sub i_mac {
}
}
if ( defined $model and $model =~ /(86)/ ) {
if ( defined $model and $model =~ /^8[86]/ ) {
my $cpu_mac = $passport->rc_cpu_mac($partial) || {};
my $virt_ip = $passport->rc_virt_ip() || '0.0.0.0';
@@ -330,8 +330,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 +366,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 +379,27 @@ sub i_name {
my %i_name;
foreach my $iid ( keys %$i_index ) {
if ( ( $iid == 1 ) and ( $model =~ /(86)/ ) ) {
if ( ( $iid == 1 ) and ( $model =~ /^8[86]/ ) ) {
$i_name{$iid} = 'CPU Virtual Management IP';
}
elsif ( ( $iid == 192 ) and ( $model eq '8603' ) ) {
elsif ( ( $iid == 192 ) and ( $model =~ /^8[86]03/ ) ) {
$i_name{$iid} = 'CPU 3 Ethernet Port';
}
elsif ( ( $iid == 320 ) and ( $model =~ /(8606|8610|8610co)/ ) ) {
elsif ( ( $iid == 320 ) and ( $model =~ /^8[86][10][06]/ ) ) {
$i_name{$iid} = 'CPU 5 Ethernet Port';
}
elsif ( ( $iid == 384 ) and ( $model =~ /(8606|8610|8610co)/ ) ) {
elsif ( ( $iid == 384 ) and ( $model =~ /^8[86][10][06]/ ) ) {
$i_name{$iid} = 'CPU 6 Ethernet Port';
}
elsif (
( $iid > 2000 and defined $model and $model =~ /(86|83|81|16)/ )
( $iid > 2000 and defined $model and $model =~ /^8[8631]|16|VSP/ )
or ( $iid > 256
and defined $model
and $model =~ /(105|11[05]0|12[05])/ )
and $model =~ /^1[012][05]0/ )
)
{
my $vlan_idx = $reverse_vlan{$iid};
@@ -433,12 +433,16 @@ sub ip_index {
foreach my $ip ( keys %$ip_index ) {
my $iid = $ip_index->{$ip};
next unless defined $iid;
# Skip VSP default CPU addresses
next if ($ip =~ /^192\.168\.1\.1/);
# Skip default CPU addresses
next if ($ip =~ /^192\.168\.168\.16[89]/);
$ip_index{$ip} = $iid;
}
# Only 8600 has CPU and Virtual Management IP
if ( defined $model and $model =~ /(86)/ ) {
if ( defined $model and $model =~ /^8[86]/ ) {
my $cpu_ip = $passport->rc_cpu_ip($partial) || {};
my $virt_ip = $passport->rc_virt_ip($partial);
@@ -447,6 +451,8 @@ sub ip_index {
foreach my $cid ( keys %$cpu_ip ) {
my $c_ip = $cpu_ip->{$cid};
next unless defined $c_ip;
# Skip default CPU addresses
next if ($c_ip =~ /192\.168\.168\.16[89]/);
$ip_index{$c_ip} = $cid;
}
@@ -467,6 +473,10 @@ sub ip_netmask {
my %ip_index;
foreach my $iid ( keys %$ip_mask ) {
# Skip VSP default CPU addresses
next if ($iid =~ /^192\.168\.1\./);
# Skip default CPU addresses
next if ($iid =~ /^192\.168\.168\.16[89]/);
my $mask = $ip_mask->{$iid};
next unless defined $mask;
@@ -474,7 +484,7 @@ sub ip_netmask {
}
# Only 8600 has CPU and Virtual Management IP
if ( defined $model and $model =~ /(86)/ ) {
if ( defined $model and $model =~ /^8[86]/ ) {
my $cpu_ip = $passport->rc_cpu_ip($partial) || {};
my $cpu_mask = $passport->rc_cpu_mask($partial) || {};
@@ -485,6 +495,8 @@ sub ip_netmask {
foreach my $iid ( keys %$cpu_mask ) {
my $c_ip = $cpu_ip->{$iid};
next unless defined $c_ip;
# Skip default CPU addresses
next if ($c_ip =~ /192\.168\.168\.16[89]/);
my $c_mask = $cpu_mask->{$iid};
next unless defined $c_mask;
@@ -510,7 +522,7 @@ sub root_ip {
my $sonmp_topo_ip = $passport->sonmp_topo_ip();
# Only 8600 and 1600 have CLIP or Management Virtual IP
if ( defined $model and $model =~ /(86|16|VSP)/ ) {
if ( defined $model and $model =~ /^8[86]|16|VSP/ ) {
# Return CLIP (CircuitLess IP)
foreach my $iid ( keys %$rc_ip_type ) {
@@ -560,7 +572,7 @@ sub index_factor {
# Older Accelar models use base 16 instead of 64
$index_factor = 16
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ );
if ( defined $model and $model =~ /^1[012][05]0/ );
return $index_factor;
}
@@ -583,9 +595,86 @@ sub bp_index {
foreach my $iid ( keys %$if_index ) {
$bp_index{$iid} = $iid;
}
# If we have MLT's map them to the designated port
my $trunks = $passport->rc_mlt_index;
my $dps = $passport->rc_mlt_dp || {};
if ( ref {} eq ref $trunks and scalar keys %$trunks ) {
foreach my $m ( keys %$trunks ) {
my $m_idx = $trunks->{$m};
next unless $m_idx;
my $i_idx = $dps->{$m} ? $dps->{$m} : $m_idx;
$bp_index{$m_idx} = $i_idx;
}
}
return \%bp_index;
}
# We have devices which support BRIDGE-MIB, Q-BRIDGE-MIB, and RAPID-CITY
# exclusively. Use standards-based first and fall back to RAPID-CITY.
sub fw_mac {
my $passport = shift;
my $partial = shift;
my $qb = $passport->SUPER::fw_mac($partial);
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
my $qb_fw_port = $passport->rcBridgeTpFdbPort($partial);
my $qb_fw_mac = {};
foreach my $idx ( keys %$qb_fw_port ) {
my ( $fdb_id, $mac ) = _rc_fdbtable_index($idx);
$qb_fw_mac->{$idx} = $mac;
}
return $qb_fw_mac;
}
sub fw_port {
my $passport = shift;
my $partial = shift;
my $qb = $passport->SUPER::fw_port($partial);
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
return $passport->rcBridgeTpFdbPort($partial);
}
sub fw_status {
my $passport = shift;
my $partial = shift;
my $qb = $passport->SUPER::fw_status($partial);
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
return $passport->rcBridgeTpFdbStatus($partial);
}
sub qb_fw_vlan {
my $passport = shift;
my $partial = shift;
my $qb = $passport->SUPER::qb_fw_vlan($partial);
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
my $qb_fw_port = $passport->rcBridgeTpFdbPort($partial);
my $qb_fw_vlan = {};
foreach my $idx ( keys %$qb_fw_port ) {
my ( $fdb_id, $mac ) = _rc_fdbtable_index($idx);
$qb_fw_vlan->{$idx} = $fdb_id;
}
return $qb_fw_vlan;
}
# break up the rcBridgeTpFdbEntry INDEX into FDB ID and MAC Address.
sub _rc_fdbtable_index {
my $idx = shift;
my @values = split( /\./, $idx );
my $fdb_id = shift(@values);
return ( $fdb_id, join( ':', map { sprintf "%02x", $_ } @values ) );
}
# Pseudo ENTITY-MIB methods
sub e_index {
@@ -613,7 +702,7 @@ sub e_index {
}
# Older Accelars use RAPID-CITY::rcCardTable
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ ) {
if ( defined $model and $model =~ /^1[012][05]0/ ) {
my $rc_c_t = $passport->rc_c_type() || {};
foreach my $idx ( keys %$rc_c_t ) {
next unless $idx;
@@ -683,7 +772,7 @@ sub e_descr {
my $model = $passport->model();
my $rc_ps = $passport->rc_ps_detail() || {};
my $rc_ch = $passport->chassis();
my $rc_ch = $passport->chassis() || '';
$rc_ch =~ s/a//;
my %rc_e_descr;
@@ -701,7 +790,7 @@ sub e_descr {
}
# Older Accelars use RAPID-CITY::rcCardTable
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ ) {
if ( defined $model and $model =~ /^1[012][05]0/ ) {
my $rc_c_t = $passport->rc_c_type() || {};
foreach my $idx ( keys %$rc_c_t ) {
next unless $idx;
@@ -769,7 +858,7 @@ sub e_type {
}
# Older Accelars use RAPID-CITY::rcCardTable
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ ) {
if ( defined $model and $model =~ /^1[012][05]0/ ) {
my $rc_c_t = $passport->rc_c_type() || {};
foreach my $idx ( keys %$rc_c_t ) {
next unless $idx;
@@ -842,7 +931,7 @@ sub e_name {
$rc_e_name{$iid} = "Card $slot, MDA $mod";
}
elsif ( defined $model
and $model =~ /(105|11[05]0|12[05])/
and $model =~ /^1[012][05]0/
and $iid =~ /1$/ )
{
$rc_e_name{$iid} = "Card $slot";
@@ -878,7 +967,7 @@ sub e_hwver {
}
# Older Accelars use RAPID-CITY::rcCardTable
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ ) {
if ( defined $model and $model =~ /^1[012][05]0/ ) {
my $rc_c_t = $passport->rc_c_rev() || {};
foreach my $idx ( keys %$rc_c_t ) {
next unless $idx;
@@ -953,7 +1042,7 @@ sub e_serial {
}
# Older Accelars use RAPID-CITY::rcCardTable
if ( defined $model and $model =~ /(105|11[05]0|12[05])/ ) {
if ( defined $model and $model =~ /^1[012][05]0/ ) {
my $rc_c_t = $passport->rc_c_serial() || {};
foreach my $idx ( keys %$rc_c_t ) {
next unless $idx;
@@ -1240,6 +1329,40 @@ problems with F<BRIDGE-MIB>
=back
=head2 Forwarding Table
These methods utilize, in order; F<Q-BRIDGE-MIB>, F<BRIDGE-MIB>, and
F<RAPID-CITY> to obtain the forwarding table information.
=over
=item $passport->fw_mac()
Returns reference to hash of forwarding table MAC Addresses
(C<dot1qTpFdbAddress>), (C<dot1dTpFdbAddress>), (C<rcBridgeTpFdbAddress>)
=item $passport->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid)
(C<dot1qTpFdbPort>), (C<dot1dTpFdbPort>), (C<rcBridgeTpFdbPort>)
=item $passport->fw_status()
Returns reference to hash of forwarding table entries status
(C<dot1qTpFdbStatus>), (C<dot1dTpFdbStatus>), (C<rcBridgeTpFdbStatus>)
=item $passport->qb_fw_vlan()
Returns reference to hash of forwarding table entries VLAN ID
(C<dot1qFdbId>), (C<rcBridgeTpFdbVlanId>)
=back
=head2 Pseudo F<ENTITY-MIB> information
These devices do not support F<ENTITY-MIB>. These methods emulate Physical

View File

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

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

@@ -0,0 +1,191 @@
# SNMP::Info::Layer3::Pica8
#
# Copyright (c) 2013 Jeroen van Ingen
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the University of California, Santa Cruz nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::Layer3::Pica8;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::Pica8::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Pica8::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '3.16';
%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

View File

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

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

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

View File

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

View File

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

View File

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

View File

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

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