Compare commits
	
		
			179 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 667cdbea13 | ||
|  | f5fb4dd3b0 | ||
|  | 5a2722d049 | ||
|  | f3b6cfbd01 | ||
|  | e239a6057c | ||
|  | 9b1c439e15 | ||
|  | 074f2e7c8f | ||
|  | 4b1533e925 | ||
|  | 6812a60668 | ||
|  | 6f0cb846f0 | ||
|  | c79307692b | ||
|  | 08b2f50ac7 | ||
|  | 3577fa1e42 | ||
|  | cb6630582a | ||
|  | ca5fff31a7 | ||
|  | 69b1f1e29e | ||
|  | 4e2b642ed1 | ||
|  | 3c26ce2a55 | ||
|  | 7d2cf97c06 | ||
|  | cfce6296fb | ||
|  | 1601703ff2 | ||
|  | 905ad3e2b7 | ||
|  | 15b7e95545 | ||
|  | 247f6f038d | ||
|  | 7c6df7cce3 | ||
|  | 1a92306d51 | ||
|  | 59e9fae1d5 | ||
|  | 998094241d | ||
|  | d6c3313138 | ||
|  | b7e252b91a | ||
|  | 6071beb15d | ||
|  | cda830686d | ||
|  | a29b888620 | ||
|  | ae5a4d413d | ||
|  | 03c4d1e81f | ||
|  | 4efa0fd509 | ||
|  | c3a727ce10 | ||
|  | afa97d845b | ||
|  | 8671f65bfd | ||
|  | 37737a6494 | ||
|  | 0ce8a55b88 | ||
|  | 22dd49c1dc | ||
|  | fd5812aefc | ||
|  | f4e37cdabe | ||
|  | 5324760463 | ||
|  | 27120045d2 | ||
|  | abfd93ea1b | ||
|  | 070d911c60 | ||
|  | 8b14776c9a | ||
|  | 2d62372c7f | ||
|  | 3eae0b9d5c | ||
|  | 9a722bb2f8 | ||
|  | d3e39a4132 | ||
|  | d82d495dcf | ||
|  | 198df7cee4 | ||
|  | 46cdb4c166 | ||
|  | 62005c52d2 | ||
|  | ca7651628d | ||
|  | 6358b7ad70 | ||
|  | 8aca1d97c0 | ||
|  | 275a533843 | ||
|  | 21bd4c662d | ||
|  | 47d9d091d1 | ||
|  | da2ea09e84 | ||
|  | 9c71bdbcef | ||
|  | 318f9518b1 | ||
|  | 19e9fb5f67 | ||
|  | 41833c1f29 | ||
|  | 4e2f950e41 | ||
|  | ebe3f39ea1 | ||
|  | c6521d0b48 | ||
|  | 74b5c9f0e3 | ||
|  | 4bfebe1563 | ||
|  | 2ac4e65827 | ||
|  | b7a135db10 | ||
|  | d4c460fd3d | ||
|  | 8f0ac35381 | ||
|  | a9a3229c22 | ||
|  | 5da622ff88 | ||
|  | 32f33f5150 | ||
|  | 242013f3b0 | ||
|  | e46deb505f | ||
|  | 5d443fd1be | ||
|  | d53152858c | ||
|  | aefb31fb58 | ||
|  | 0be8219b9c | ||
|  | cbb8bc5d77 | ||
|  | 6969dcbfec | ||
|  | 9e463ddddf | ||
|  | 5ec034c475 | ||
|  | 1694e648fc | ||
|  | 16aa96ebf4 | ||
|  | 43d06e184d | ||
|  | 3ff432034a | ||
|  | 0325bb1f25 | ||
|  | b9aebf7e9e | ||
|  | e1e693a7c8 | ||
|  | c8c548fe97 | ||
|  | ddf971ed54 | ||
|  | 61e8f47986 | ||
|  | 3ce9f403e6 | ||
|  | 3741010044 | ||
|  | badfb12243 | ||
|  | 0713a6457c | ||
|  | 9abe744dac | ||
|  | b4974aeacd | ||
|  | 688a0de498 | ||
|  | 7cef8465fa | ||
|  | 532279d2b8 | ||
|  | d67ffc3a6c | ||
|  | c6776b1755 | ||
|  | 49566977ad | ||
|  | daf512e33e | ||
|  | 74816fc043 | ||
|  | c88e37e9b5 | ||
|  | c1c448f3df | ||
|  | 4f168a538b | ||
|  | d94630af35 | ||
|  | 999dd1f468 | ||
|  | c3d5631c3c | ||
|  | 9dae6b20d7 | ||
|  | 4005640a2b | ||
|  | ca446faacf | ||
|  | 240539bd24 | ||
|  | 08e335f39c | ||
|  | a9cc14b265 | ||
|  | 9505f119b3 | ||
|  | 683edf1668 | ||
|  | d9c52c1a88 | ||
|  | 0f1a76a564 | ||
|  | 15cd354bae | ||
|  | 91d67ed0ae | ||
|  | 0740a7bd5e | ||
|  | 84493a99b4 | ||
|  | f730fa3325 | ||
|  | 4b1007cb66 | ||
|  | 436f7442b6 | ||
|  | 3af05ebba5 | ||
|  | c7db0371aa | ||
|  | 53860aaa46 | ||
|  | 829a4bf16a | ||
|  | a83bc1bcb2 | ||
|  | af65bb3a2b | ||
|  | f2d9f6be27 | ||
|  | ecea4ef4a4 | ||
|  | e4e099510a | ||
|  | de28ff96c2 | ||
|  | 6692ddcf1f | ||
|  | ba7a105eb1 | ||
|  | b9fb232859 | ||
|  | 6f54cb429e | ||
|  | ae3398b11a | ||
|  | e97693d12d | ||
|  | 435bb7dbe2 | ||
|  | 70bc5e78e9 | ||
|  | a163e5b82c | ||
|  | 5eb66fe442 | ||
|  | b6cf462b16 | ||
|  | ead15a1cde | ||
|  | 9c19c70029 | ||
|  | 0862047241 | ||
|  | 6cfce1916d | ||
|  | 1e37bfa8ce | ||
|  | 87197067a0 | ||
|  | 8264f68f6c | ||
|  | 3e21357e8d | ||
|  | ee5953d743 | ||
|  | 46f941b416 | ||
|  | 225e12e979 | ||
|  | 912ba274a6 | ||
|  | 18f59db2b9 | ||
|  | f0ca1a5fa3 | ||
|  | 446e5a13f7 | ||
|  | e8a9d18445 | ||
|  | 6256f33079 | ||
|  | b5c4bd99bf | ||
|  | 56dae91c8a | ||
|  | 0661b1307a | ||
|  | cd112f4925 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| *.db | ||||
							
								
								
									
										176
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										176
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -1,5 +1,181 @@ | ||||
| SNMP::Info - Friendly OO-style interface to Network devices using SNMP. | ||||
|  | ||||
| version 3.08 (2013-10-22) | ||||
|  | ||||
|    [ENHANCEMENTS] | ||||
|  | ||||
|     * Rewrite of L3::Aruba, now supports pseudo ENTITY-MIB methods to gather | ||||
|       module information, more interface information for APs, more | ||||
|       wireless information to include client stats, and arpnip information | ||||
|       from wireless clients.  WARNING: AP device interfaces are now based on | ||||
|       AP MAC and radio versus BSSID to align with other wireless classes. | ||||
|     * [#64] Add i_speed_admin() to L2::2900 (psychiatric) | ||||
|     * [#66] Support for VSS via CISCO-VIRTUAL-SWITCH-MIB in L3::6500 | ||||
|     * [#67] Add the possibility to set speed for Layer3::C4000 (psychiatric) | ||||
|     * [#69] set speed and duplex on Cisco VSS system (psychiatric) | ||||
|     * munge_null() now removes all non-printable control characters | ||||
|     * Support Aironet standalone access points (Layer2::Aironet) running IOS15 | ||||
|     * lldp_port() returns port ID instead of port description if the port ID | ||||
|       subtype is "interface name".  This improves the ability to correlate | ||||
|       ports by name when a port description is also set. | ||||
|     * Add docs note about make_snmpdata.pl under EXTENDING SNMP::Info | ||||
|     * [#46] Brocade (Foundry) Module Support | ||||
|     * Brocade (Foundry) POE Support | ||||
|     * Support peth_port_power() power supplied by PoE ports in L2::Baystack | ||||
|     * Update test_class.pl utility to allow ignore of snmp.conf and test | ||||
|       summarize more standard class methods | ||||
|     * On EOS, the LLDP port ID is a dot1d port | ||||
|     * Use LLDP in Layer3::Aruba, for switches | ||||
|     * Clean up more model names in L2::Baystack | ||||
|  | ||||
|    [BUG FIXES] | ||||
|  | ||||
|     * [#68] Fix device_port entries for switches with non-unique | ||||
|       ifDesc (Nic Bernstein) | ||||
|     * Don't try to munge undef values | ||||
|     * [#49] Perl 5.18 UNIVERSAL::can change could cause infinite loop  | ||||
|     * Silence warning from uninitialized variable in L3::Passport e_descr() | ||||
|  | ||||
| version 3.07 (2013-10-01) | ||||
|  | ||||
|    [ENHANCEMENTS] | ||||
|  | ||||
|     * Support for Pica8 switches in L3::Pica8 | ||||
|     * Factor out cache/munge code from global/attr methods | ||||
|  | ||||
|    [BUG FIXES] | ||||
|  | ||||
|    * [#48] Switch duplicate J9624A for J9626A in Layer2/HP (R. Kerr) | ||||
|    * Correct device serial number reporting for Nexus devices | ||||
|    * Override ipAddrTable methods in L3::Nexus as some versions do not | ||||
|      index the table with the IPv4 address in accordance with the MIB | ||||
|      definition. | ||||
|  | ||||
| version 3.05 (2013-08-16) | ||||
|  | ||||
|    [ENHANCEMENTS] | ||||
|  | ||||
|     * [#47] Add model info on HP 2530 and HP 2920 series | ||||
|     * Add support for Cisco Small Business series | ||||
|       Layer2/CiscoSB class | ||||
|     * Add proper LLDP support to Netgear.pm | ||||
|     * Change $netgear->interfaces() to use ifName rather than ifDescr | ||||
|       as the former is unique per interface while the latter is not.   | ||||
|       If ifName is not present, concatenate ifDescr and ifIndex | ||||
|       to achieve a unique value. | ||||
|     * Properly report hardware version, Serial No. and OS Version for | ||||
|       Netgear. | ||||
|      | ||||
|  | ||||
| version 3.03 (2013-07-11) | ||||
|  | ||||
|     [BUG FIXES] | ||||
|  | ||||
|     * Add missing =back to POD (A. Hartmaier) | ||||
|  | ||||
| version 3.02 (2013-07-08) | ||||
|  | ||||
|     [ENHANCEMENTS] | ||||
|  | ||||
|     * Properly pull os_ver from Netgear GS series switches. | ||||
|     * Support Alcatel devices with layer3 features. | ||||
|     * Identify Cisco Aironet 1140 APs as Layer2::Aironet | ||||
|     * LAN switch support added to Layer3::Aruba class | ||||
|     * [RT#86725] - Identify Cisco Catalyst 3850 as Layer3::C6500 (C. Causer) | ||||
|  | ||||
| version 3.01 (2013-04-13) | ||||
|  | ||||
|     [API Changes] | ||||
|  | ||||
|     * The methods c_ip(), c_if(), c_port(), c_id(), and c_platform() now | ||||
|       represent common topology methods and will try to return a combined | ||||
|       hash of data from all L2 topology protocols either running on the | ||||
|       device or specified in the method call.  The topology specific methods | ||||
|       have been been prefixed with the protocol name in lowercase so that | ||||
|       they can be called directly, sonmp_ip(), cdp_ip(), etc. | ||||
|     * L2::Bay and L2::Foundry have been removed from the distribution.  Both | ||||
|       classes were depreciated and all functionality is available through | ||||
|       L2::Baystack and L3::Foundry.  | ||||
|  | ||||
|     [NEW FEATURES] | ||||
|  | ||||
|     * [3160037] - Support _raw suffix on methods to skip munging | ||||
|     * [3185391] - Support for F5 devices in new class L3::F5 | ||||
|     * [3323814] - Arp support for Netscreen (David Baldwin) | ||||
|     * [3323821] - Support for Netscreen w/ WLAN (eg SSG5) (David Baldwin) | ||||
|     * [3599277] - Q-BRIDGE Support to collect VLAN in macsuck | ||||
|     * [3033731] - Alcatel-Lucent OmniSwich AMAP Support in new AMAP class | ||||
|     * [3598896] - Lantronix device support (J R Binks) | ||||
|     * [3598337] - Lantronix SLC support | ||||
|     * Support for Cisco ASA in L3::CiscoASA (Kraus/Hartmaier/Bernstein) | ||||
|     * Support for Avaya VSP 9000 series in L3::Passport | ||||
|     * Support for Avaya VSP 7000 series in L2::Baystack | ||||
|     * Support Avaya (Trapeze) Wireless Controllers in new class L2::NWSS2300 | ||||
|     * Support Juniper (Trapeze) Wireless Controllers in new class L2::Trapeze | ||||
|     * Support for newer Radware Alteon ADC switches 4408/4416/5412/5224 and | ||||
|       older AWS 2000/3000 series in existing L3::AlteonAD | ||||
|     * Support for H3C & HP A-series in new class L3::H3C | ||||
|     * Support for Citrix Netscaler appliances in new class L7::Netscaler | ||||
|     * New configuration option IgnoreNetSNMPConf will ignore Net-SNMP | ||||
|       configuration files on object initialization | ||||
|     * Two new utilities added in t/util to assist in developing device | ||||
|       support; make_snmpdata.pl gathers SNMP data (snmpwalk) in a format that | ||||
|       can be used with test_class_mocked.pl which mocks an SNMP agent to | ||||
|       enable testing with no network access to a device. | ||||
|  | ||||
|     [ENHANCEMENTS] | ||||
|  | ||||
|     * UNIVERSAL::can() now works with dynamic methods  | ||||
|     * Dynamically generated methods are added to symbol table to avoid | ||||
|       AUTOLOAD on subsequent calls | ||||
|     * L2::Airespace now supports 802.11n client tx rates | ||||
|     * L2::Airespace now reports AP Ethernet MAC as port MAC for radio ports | ||||
|     * CiscoStats improvements to determine os versions, eg IOS XE ver on Sup7L-E | ||||
|     * CiscoStats now reports 'ios-xe' if the device runs IOS XE (used to be 'ios') | ||||
|     * Improved support of XOS based Extreme devices | ||||
|  | ||||
|     [BUG FIXES] | ||||
|  | ||||
|     * [3564920] - lldp_if gives wrong data for Enterasys | ||||
|  | ||||
| version 2.11 (2012-12-09) | ||||
|  | ||||
|     [BUG FIXES] | ||||
|  | ||||
|     * Add fall-back for sysDescr on Force10 | ||||
|  | ||||
| version 2.10 (2012-12-08) | ||||
|  | ||||
|     [NEW FEATURES] | ||||
|  | ||||
|     * Support for Force10 devices (W. Bulley) | ||||
|  | ||||
| version 2.09 (2012-11-28) | ||||
|  | ||||
|     [NEW FEATURES] | ||||
|  | ||||
|     * New method i_ssidmac() to get BSSID's from AP's with initial support | ||||
|       in L2::Aironet and Airespace classes | ||||
|     * Support for Avaya Secure Routers in new class L3::Tasman | ||||
|     * Add EDP and LLDP L2 Topology to L3::Extreme  | ||||
|     * [3185393] Support for Juniper SSL VPN in new class L7::Neoteris | ||||
|     * [3381027] Support for Cisco Nexus in new class L3::Nexus    | ||||
|     * [1424336] Support for Extreme Discovery Protocol (EDP) | ||||
|      | ||||
|     [ENHANCEMENTS] | ||||
|  | ||||
|     * [3017571] Add LLDP support for NetSNMP device class (begemot)  | ||||
|     * [3418918] Extreme devices now report OS as either extremeware or xos | ||||
|     * [2809045] Strip preceding netscreen from model name in L3::Netscreen | ||||
|     * [] Classify Linksys 2024 as L3::Dell (Rogier Krieger) | ||||
|      | ||||
|     [BUG FIXES] | ||||
|      | ||||
|     * Fixed logic to return cached data for table methods when available and | ||||
|       not a partial fetch | ||||
|     * Fix typo in PoD for Bridge.pm and CiscoConfig.pm (William Bulley) | ||||
|     * Fix/improve IPv6 neighbor cache handling, especially for Cisco Nexus | ||||
|  | ||||
| version 2.08 (2012-07-15) | ||||
|  | ||||
|     [NEW FEATURES] | ||||
|   | ||||
							
								
								
									
										672
									
								
								DeviceMatrix.txt
									
									
									
									
									
								
							
							
						
						
									
										672
									
								
								DeviceMatrix.txt
									
									
									
									
									
								
							| @@ -4,26 +4,25 @@ | ||||
| # This file is meant to detail the cababilities | ||||
| # of network devices to supply data via SNMP.   | ||||
|  | ||||
| # $Id$ | ||||
|  | ||||
| # | ||||
| # Airespace (pre-Cisco) | ||||
| # | ||||
| device-vendor: Airespace | ||||
| cdp:no | ||||
| arpnip: no | ||||
| macsuck: yes | ||||
| portmac: yes | ||||
| arpnip: yes | ||||
| topo:no | ||||
| duplex: both | ||||
| vlan: yes | ||||
| macsuck: yes | ||||
| modules: yes | ||||
| portmac: yes | ||||
| vlan: yes | ||||
| class: Layer2::Airespace | ||||
|  | ||||
| device-family: Airespace Wireless Controllers | ||||
| note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports. | ||||
| note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping. | ||||
| note: Device will only communicate with SNMP version configured in the controller. | ||||
|  | ||||
| device: 3500, 4101, 4102 | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Alcatel-Lucent | ||||
| @@ -46,7 +45,7 @@ device: All | ||||
| # Allied | ||||
| # | ||||
| device-vendor: Allied Telesis | ||||
| cdp:no | ||||
| topo:no | ||||
| class: Layer1::Allied | ||||
| ver: 1 | ||||
| arpnip: no | ||||
| @@ -63,13 +62,27 @@ ver: 2 | ||||
| macsuck: yes | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Alteon | ||||
| # | ||||
| device-vendor: Alteon | ||||
| note: See Radware | ||||
|  | ||||
| # | ||||
| # Altiga | ||||
| # | ||||
| device-vendor: Altiga | ||||
| class: Layer3::Altiga | ||||
| note: See Cisco/Altiga | ||||
|  | ||||
| # | ||||
| # APC | ||||
| # | ||||
| device-vendor: APC | ||||
| class: Layer7::APC | ||||
| device-family: UPS | ||||
| device: All | ||||
| note:  Must be SNMP management enabled. | ||||
|  | ||||
| # | ||||
| # Arista | ||||
| # | ||||
| @@ -88,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 | ||||
|  | ||||
| @@ -109,17 +125,242 @@ device-family: Asante Hubs | ||||
|  | ||||
| device: 1012 | ||||
|  | ||||
| # | ||||
| # Avaya | ||||
| # | ||||
| device-vendor: Avaya | ||||
| macsuck: yes | ||||
| topo: yes | ||||
|  | ||||
| device-family: BayStack Hub | ||||
| duplex: both | ||||
| ver: 1 | ||||
| modules: yes | ||||
| class: Layer1::Bayhub | ||||
| note: Uses proprietary MIBs to provide MAC to port mapping. | ||||
| note: !Requires Advanced or Advanced Analyzer NMM | ||||
|  | ||||
| device: 102 | ||||
|  | ||||
| device: System 5000 | ||||
|  | ||||
| device-family: Ethernet Switch/Baystack Switch | ||||
| macsuck: yes | ||||
| duplex: both | ||||
| vlan: write | ||||
| modules: yes | ||||
| class: Layer2::Baystack | ||||
|  | ||||
| device: 303, 304, 350, 380, 410, 420, 425, 460, 470 | ||||
|  | ||||
| device: 450 | ||||
| note: !Some versions > 4.X in stacked configuration have SNMP timeout issues.  | ||||
| note: Labels full duplex as 20Mbit connection. | ||||
|  | ||||
| device: Business Policy Switch (BPS) | ||||
|  | ||||
| device-family: Ethernet Routing Switch | ||||
| arpnip: yes | ||||
| duplex: write | ||||
| vlan: write | ||||
| modules: yes | ||||
| class: Layer2::Baystack | ||||
|  | ||||
| device: 2500, 3500, 4500, 4800, 5500, and 5600 series | ||||
|  | ||||
| device-family: Virtual Services Platform (VSP) 7000  | ||||
| arpnip: yes | ||||
| duplex: write | ||||
| vlan: write | ||||
| modules: yes | ||||
| class: Layer2::Baystack | ||||
|  | ||||
| device: 7024 | ||||
|  | ||||
| device-family: Business Ethernet Switch | ||||
| arpnip: yes | ||||
| duplex: write | ||||
| vlan: write | ||||
| modules: yes | ||||
| class: Layer2::Baystack | ||||
|  | ||||
| device: All  | ||||
|  | ||||
| device-family: Centillion | ||||
| duplex: both | ||||
| vlan: yes | ||||
| class: Layer2::Centillion | ||||
| note: !Must be on version 4.x or 5.x (VLAN based) software. | ||||
|  | ||||
| device: C50, C100, 5000BH, and 5005BH | ||||
|  | ||||
| device-family: AP222x | ||||
| duplex: both | ||||
| modules: no | ||||
| class: Layer2::NAP222x | ||||
| note: !Upgrade to version 1.3 or higher. | ||||
| note: Sends out topology packets if enabled but does not build neighbor table. | ||||
|  | ||||
| device: AP-2220, AP-2221 | ||||
|  | ||||
| device-family: Multiprotocol Router/BayRS | ||||
| arpnip: yes | ||||
| portmac: yes | ||||
| duplex: both | ||||
| topo: no | ||||
| vlan: yes | ||||
| modules: yes | ||||
| class: Layer3::BayRS | ||||
|  | ||||
| device: AN, ARN, ASN, BLN, BCN, 2430, and 5430 | ||||
|  | ||||
| device-family: Secure Router | ||||
| arpnip: yes | ||||
| portmac: yes | ||||
| duplex: no | ||||
| topo: no | ||||
| vlan: no | ||||
| modules: no | ||||
| class: Layer3::Tasman | ||||
|  | ||||
| device: 1001/1001S,1002,1004,2330,3120,4134 | ||||
|  | ||||
| device-family: VPN Router/Contivity | ||||
| arpnip: yes | ||||
| macsuck: no | ||||
| portmac: yes | ||||
| duplex: no | ||||
| topo: no | ||||
| modules: yes | ||||
| class: Layer3::Contivity | ||||
|  | ||||
| device: All | ||||
|  | ||||
| device-family: Ethernet Routing Switch/Passport/Accelar LAN | ||||
| arpnip: yes | ||||
| portmac: yes | ||||
| duplex: write | ||||
| vlan: write | ||||
| modules: yes | ||||
| class: Layer3::Passport | ||||
| note: !8600 Code versions < 3.2 vlan based mac-suck and are unsupported.  Upgrade code. | ||||
| note: !8600 3.2 code versions < 3.2.2.2 have Bridge MIB loop.  Upgrade code. | ||||
|  | ||||
| device: 8100, 8300, 8600, and 8800 series  | ||||
|  | ||||
| device: Passport 1600 series | ||||
| note: Software >= 2.1 | ||||
|  | ||||
| device: Accelar 1050,1100,1150,1200 | ||||
|  | ||||
| device-family: Virtual Services Platform (VSP) 9000 | ||||
| arpnip: yes | ||||
| portmac: yes | ||||
| duplex: write | ||||
| vlan: write | ||||
| modules: yes | ||||
| class: Layer3::Passport | ||||
|  | ||||
| device: 9000 | ||||
|  | ||||
| device-family: Ethernet Routing Switch/Passport 1600 (Software < 2.1) | ||||
| arpnip: yes | ||||
| portmac: yes | ||||
| duplex: both | ||||
| vlan: write | ||||
| class: Layer3::N1600 | ||||
|  | ||||
| device: 1612,1624,1648 | ||||
|  | ||||
| device-family: Synoptics | ||||
| duplex: both | ||||
| ver: 1 | ||||
| class: Layer1::S3000 | ||||
| note: Uses proprietary MIBs to provide MAC to port mapping. | ||||
| note: !Requires Advanced or Advanced Analyzer NMM | ||||
|  | ||||
| device: 281X | ||||
|  | ||||
| device: System 3000 | ||||
|  | ||||
| device-family: Wireless Switch 2270 | ||||
| arpnip: yes | ||||
| duplex: both | ||||
| modules: yes | ||||
| portmac: yes | ||||
| vlan: yes | ||||
| class: Layer2::N2270 | ||||
| note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports. | ||||
| note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping. | ||||
|  | ||||
| device: 2270 | ||||
|  | ||||
| device-family: Wireless Security Switches 2300 Series  | ||||
| arpnip: yes | ||||
| portmac: yes | ||||
| duplex: both | ||||
| topo: no | ||||
| modules: yes | ||||
| class: Layer2::NWSS2300 | ||||
| note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports. | ||||
| note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping. | ||||
|  | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Bay | ||||
| # | ||||
| device-vendor: Bay | ||||
| note: See Nortel | ||||
| note: See Avaya | ||||
|  | ||||
| # | ||||
| # Brocade | ||||
| # | ||||
| device-vendor: Brocade | ||||
| arpnip: yes | ||||
| topo: yes | ||||
| duplex: link | ||||
| macsuck: yes | ||||
| modules: no | ||||
| portmac: yes | ||||
| vlan: yes | ||||
| class: Layer3::Foundry | ||||
|  | ||||
| device-family: EdgeIron | ||||
| device: EdgeIron 24G | ||||
| note: Bug where spanning tree stuff loops forever when polled by SNMP. | ||||
|  | ||||
| device-family: FastIron | ||||
| ver: 1 | ||||
| note: Support very limited | ||||
| device: FastIron 4802 | ||||
|  | ||||
| device-family: FastIron CX (ICX) series | ||||
| device: 6430,6450,6610 | ||||
|  | ||||
| device-family: FastIron LS (FLS) series | ||||
| device: All | ||||
|  | ||||
| device-family: FastIron WorkGroup Switch (FWS) series | ||||
| device: All | ||||
|  | ||||
| device-family: ServerIron GT series | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Bluecoat | ||||
| # | ||||
| device-vendor: Bluecoat | ||||
| class: Layer3::Bluecoat | ||||
|  | ||||
| device-family: BlueCoat SG Series | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # CISCO | ||||
| # | ||||
| device-vendor: Cisco | ||||
| cdp: yes | ||||
| topo: yes | ||||
| ver: 2 | ||||
| modules: yes | ||||
|  | ||||
| @@ -143,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 | ||||
| @@ -391,15 +636,16 @@ device: VG200 | ||||
|  | ||||
| device-family: Wireless Controllers | ||||
| class: Layer2::Airespace | ||||
| cdp:no | ||||
| arpnip: no | ||||
| arpnip: yes | ||||
| duplex: both | ||||
| macsuck: yes | ||||
| portmac: yes | ||||
| duplex: both | ||||
| vlan: yes | ||||
| note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports. | ||||
| note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping. | ||||
| note: Device will only communicate with SNMP version configured in the controller. | ||||
|  | ||||
| device: 2006, 4112, 4124, 4136, 4402, 4404 | ||||
| device: 2000, 2100, 2500, 4100, 4400, and 5500 series | ||||
|  | ||||
| device-family: Firewall | ||||
| class: Layer3::Cisco | ||||
| @@ -411,6 +657,28 @@ note: !Arpnip only available for 4.x software releases. | ||||
| class: Layer3::CiscoFWSM | ||||
| arpnip: yes | ||||
|  | ||||
| device: Sx300, Sx500 series | ||||
| device-family: Small Business switches | ||||
| class: Layer2::CiscoSB | ||||
| arpnip: no | ||||
| macsuck: yes | ||||
|  | ||||
| # | ||||
| # Citrix | ||||
| # | ||||
| device-vendor: Citrix | ||||
| arpnip: no | ||||
| topo: no | ||||
| duplex: no | ||||
| macsuck: no | ||||
| modules: no | ||||
| portmac: yes | ||||
| vlan: no | ||||
| class: Layer7::Netscaler | ||||
|  | ||||
| device-family: Netscaler | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Cyclades | ||||
| # | ||||
| @@ -427,7 +695,7 @@ arpnip: no | ||||
| macsuck: yes | ||||
| duplex: both | ||||
| vlan: yes | ||||
| cdp: no | ||||
| topo: yes | ||||
| modules: yes | ||||
| class: Layer3::Dell | ||||
|  | ||||
| @@ -455,7 +723,7 @@ arpnip: yes | ||||
| macsuck: yes | ||||
| duplex: both | ||||
| vlan: yes | ||||
| cdp: yes | ||||
| topo: yes | ||||
| modules: yes | ||||
| class: Layer3::Enterasys | ||||
|  | ||||
| @@ -472,62 +740,37 @@ device: Matrix N-Series DFE | ||||
| # | ||||
| device-vendor: Extreme Networks | ||||
| arpnip: yes | ||||
| macsuck: yes | ||||
| topo: yes | ||||
| duplex: both | ||||
| vlan: yes | ||||
| cdp: no | ||||
| macsuck: yes | ||||
| modules: yes | ||||
| portmac: yes | ||||
| vlan: yes | ||||
| class: Layer3::Extreme | ||||
|  | ||||
| device-family: Alpine and Summit | ||||
| device-family: ExtremeWare based devices | ||||
| device: All | ||||
|  | ||||
| device: Alpine 3808 | ||||
| device: Summit 7i, 48si | ||||
| device-family: XOS based devices | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # FreeBSD | ||||
| # | ||||
| device-vendor: FreeBSD | ||||
| device-famly: Pf | ||||
| class: Layer3::Pf | ||||
| arpnip: yes | ||||
| cdp: no | ||||
| topo: no | ||||
| class: Layer3::Pf | ||||
|  | ||||
| note: LLDP support might be available. See note in Layer3::Pf | ||||
| device-family: Pf | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Foundry | ||||
| # | ||||
| device-vendor: Foundry Networks | ||||
| vlan: yes | ||||
| modules: no | ||||
|  | ||||
| device-family: FastIron | ||||
| class: Layer3::Foundry | ||||
| ver: 1 | ||||
| note: Support very limited | ||||
|  | ||||
| device: FastIron 4802 | ||||
|  | ||||
| device-family: EdgeIron | ||||
| ver: 2 | ||||
| class: Layer3::Foundry | ||||
| cdp: yes | ||||
| duplex: yes | ||||
| macsuck: yes | ||||
| device: EdgeIron 24G | ||||
| note: Bug where spanning tree stuff loops forever when polled by SNMP. | ||||
|  | ||||
| device-family: IronWare | ||||
| class: Layer3::Foundry | ||||
| ver: 2 | ||||
| cdp: yes | ||||
| note: FDP enabled. | ||||
| duplex: yes | ||||
| macsuck: yes | ||||
| arpnip: yes | ||||
| device: FWSX424  | ||||
| device: ServerIronGT | ||||
| device: FLS624, FLS648 | ||||
| note: See Brocade | ||||
|  | ||||
| # | ||||
| # HP | ||||
| @@ -542,7 +785,7 @@ class:  Layer2::HP4000 | ||||
| duplex: both | ||||
| macsuck: yes | ||||
| arpnip: no | ||||
| cdp: yes | ||||
| topo: yes | ||||
| vlan: write | ||||
| note: devices in this class only have CDP support | ||||
| note: VLAN info in HP-VLAN MIB | ||||
| @@ -556,7 +799,7 @@ class:  Layer2::HP | ||||
| duplex: both | ||||
| macsuck: yes | ||||
| arpnip: no | ||||
| cdp: yes | ||||
| topo: yes | ||||
| vlan: write | ||||
| note: old firmware versions only have CDP support, more recent have LLDP | ||||
| note: VLAN info in Q-BRIDGE-MIB | ||||
| @@ -569,21 +812,74 @@ device: 3124,3324XL,3400cl,3500,3500yl | ||||
| device: 4100GL,4200vl,5300XL,5400yy,5400zl | ||||
| device: 6108,6200yl,6400cl,6410cl,6600,6600ml,8200zl | ||||
|  | ||||
|  | ||||
| # | ||||
| # Juniper | ||||
| # | ||||
| device-vendor: Juniper | ||||
| arpnip: yes | ||||
| topo: yes | ||||
| duplex: link | ||||
| macsuck: yes | ||||
| modules: yes | ||||
| portmac: yes | ||||
| vlan: yes | ||||
| class: Layer3::Juniper | ||||
|  | ||||
| device-family: EX-series switches | ||||
| device: All | ||||
|  | ||||
| device-family: J-series router | ||||
| device: All | ||||
|  | ||||
| device-family: M-series router | ||||
| class: Layer3::Juniper | ||||
| device: All | ||||
|  | ||||
| device-family: NetScreen | ||||
| topo: no | ||||
| duplex: no | ||||
| modules: no | ||||
| vlan: no | ||||
| class: Layer3::Netscreen | ||||
| device: All | ||||
|  | ||||
| device-family: SA-series SSL VPN appliances | ||||
| arpnip: no | ||||
| topo: no | ||||
| duplex: no | ||||
| modules: no | ||||
| vlan: no | ||||
| class: Layer7::Neoteris | ||||
| device: All | ||||
|  | ||||
| device-family: SRX-series router | ||||
| device: All | ||||
|  | ||||
| device-family: Wireless LAN Controllers (Trapeze) | ||||
| duplex: both | ||||
| class: Layer2::Trapeze | ||||
| note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports. | ||||
| note: Arpnip is emulated by gathering the MAC to IP mappings from controller snooping. | ||||
|  | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Kentrox | ||||
| # | ||||
| device-vendor: Kentrox | ||||
| class: Layer2::Kentrox | ||||
|  | ||||
| device-family: Kentrox DataSMART DSU/CSU | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Lantronix | ||||
| # | ||||
| device-vendor: Lantronix | ||||
| class: Layer3::Lantronix | ||||
|  | ||||
| device-family: Terminal Servers | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Linksys | ||||
| # | ||||
| @@ -600,21 +896,31 @@ device-family: 2048 | ||||
| class: Layer3::Dell | ||||
| device: All | ||||
|  | ||||
|  | ||||
| # | ||||
| # Microsoft | ||||
| # | ||||
| device-vendor: Microsoft | ||||
| device-family: Windows | ||||
| class: Layer3::Microsoft | ||||
|  | ||||
| device-family: Windows | ||||
| device: Windows Router | ||||
|  | ||||
| # | ||||
| # Mikrotik | ||||
| # | ||||
| device-vendor: Mikrotik | ||||
| class: Layer3::Mikrotik | ||||
|  | ||||
| device-family: RouterOS | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Netgear | ||||
| # | ||||
| device-vendor: NetGear | ||||
| device-family: Switches | ||||
| class: Layer2::Netgear | ||||
|  | ||||
| device-family: Switches | ||||
| device: All | ||||
|  | ||||
| # | ||||
| @@ -623,6 +929,12 @@ device: All | ||||
| device-vendor: NetScreen | ||||
| note: See Juniper | ||||
|  | ||||
| # | ||||
| # Neoteris | ||||
| # | ||||
| device-vendor: Neoteris | ||||
| note: See Juniper | ||||
|  | ||||
| # | ||||
| # Net-SNMP | ||||
| # | ||||
| @@ -637,198 +949,20 @@ device:  Linux routers | ||||
| device-family: BSD | ||||
| device:  BSD routers | ||||
|  | ||||
| # | ||||
| # Kentrox | ||||
| # | ||||
| device-vendor: Kentrox | ||||
| note: MIB not yet shipped | ||||
|  | ||||
| device: Kentrox DataSMART DSU/CSU | ||||
|  | ||||
| # | ||||
| # NORTEL | ||||
| # | ||||
| device-vendor: Nortel | ||||
| macsuck: yes | ||||
| cdp: proprietary | ||||
| note: SONMP Discovery Protocol Supported | ||||
| note: See Avaya | ||||
|  | ||||
| device-family: BayStack Hub | ||||
| duplex: both | ||||
| ver: 1 | ||||
| modules: yes | ||||
| class: Layer1::Bayhub | ||||
| note: Uses proprietary MIBs to provide MAC to port mapping. | ||||
| note: !Requires Advanced or Advanced Analyzer NMM | ||||
| # | ||||
| # PacketFront | ||||
| # | ||||
| device-vendor: PacketFront | ||||
| class: Layer3::PacketFront | ||||
|  | ||||
| device: 102 | ||||
|  | ||||
| device: System 5000 | ||||
|  | ||||
| device-family: Ethernet Switch/Baystack Switch | ||||
| macsuck: yes | ||||
| duplex: both | ||||
| vlan: write | ||||
| modules: yes | ||||
| class: Layer2::Baystack | ||||
|  | ||||
| device: 303, 304, 350, 380, 410, 420, 425, 460, 470 | ||||
|  | ||||
| device: 450 | ||||
| note: !Some versions > 4.X in stacked configuration have SNMP timeout issues.  | ||||
| note: Labels full duplex as 20Mbit connection. | ||||
|  | ||||
| device: Business Policy Switch (BPS) | ||||
|  | ||||
| device-family: Ethernet Routing Switch/Baystack Switch | ||||
| arpnip: yes | ||||
| duplex: write | ||||
| vlan: write | ||||
| modules: yes | ||||
| class: Layer2::Baystack | ||||
|  | ||||
| device: 3510 | ||||
|  | ||||
| device: 2526,2550 | ||||
|  | ||||
| device: 4524,4526,4548,4550 | ||||
|  | ||||
| device: 5510,5520,5530 | ||||
|  | ||||
| device-family: Business Ethernet Switch | ||||
| arpnip: yes | ||||
| duplex: write | ||||
| vlan: write | ||||
| modules: yes | ||||
| class: Layer2::Baystack | ||||
|  | ||||
| device: 50,110,120,210,220,1010,1020  | ||||
|  | ||||
| device-family: Centillion | ||||
| duplex: both | ||||
| vlan: yes | ||||
| class: Layer2::Centillion | ||||
| note: !Must be on version 4.x or 5.x (VLAN based) software. | ||||
|  | ||||
| device: 5000BH, 5005BH | ||||
| device: C50,C100 | ||||
|  | ||||
| device-family: AP222x | ||||
| duplex: both | ||||
| modules: no | ||||
| class: Layer2::NAP222x | ||||
| note: !Upgrade to version 1.3 or higher. | ||||
| note: Sends out topology packets if enabled but does not build neighbor table. | ||||
|  | ||||
| device: AP-2220, AP-2221 | ||||
|  | ||||
| device-family: Alteon AD | ||||
| arpnip: yes | ||||
| duplex: both | ||||
| cdp: no | ||||
| vlan: yes | ||||
| modules: no | ||||
| class: Layer3::AlteonAD | ||||
| note: !Some versions have issues with continuous SNMP polling. Upgrade to 10.0.30.7 or higher. | ||||
|  | ||||
| device: AD2,AD3,AD4 | ||||
|  | ||||
| device: 180,183,184 | ||||
|  | ||||
| device-family: Multiprotocol Router/BayRS | ||||
| arpnip: yes | ||||
| portmac: yes | ||||
| duplex: both | ||||
| cdp: no | ||||
| vlan: yes | ||||
| modules: yes | ||||
| class: Layer3::BayRS | ||||
|  | ||||
| device: AN,ARN,ASN,BLN,BCN | ||||
|  | ||||
| device: 2430,5430 | ||||
|  | ||||
| device-family: VPN Router/Contivity | ||||
| arpnip: yes | ||||
| macsuck: no | ||||
| portmac: yes | ||||
| duplex: no | ||||
| cdp: no | ||||
| modules: yes | ||||
| class: Layer3::Contivity | ||||
|  | ||||
| device: 100,400,600 | ||||
|  | ||||
| device: 1000,1010,1050 | ||||
|  | ||||
| device: 1500,1600,1700,1740,1750 | ||||
|  | ||||
| device: 2500,2600,2700 | ||||
|  | ||||
| device: 4500,4600,5000 | ||||
|  | ||||
| device-family: Ethernet Routing Switch/Passport/Accelar LAN | ||||
| arpnip: yes | ||||
| macsuck: yes | ||||
| portmac: yes | ||||
| duplex: write | ||||
| cdp: proprietary | ||||
| vlan: write | ||||
| modules: yes | ||||
| class: Layer3::Passport | ||||
| note: !8600 Code versions < 3.2 vlan based mac-suck and are unsupported.  Upgrade code. | ||||
| note: !8600 3.2 code versions < 3.2.2.2 have Bridge MIB loop.  Upgrade code. | ||||
|  | ||||
| device: 8603,8606,8610, 8610co, 8106, 8110 | ||||
|  | ||||
| device: 1050,1100,1150,1200 | ||||
|  | ||||
| device-family: Ethernet Routing Switch/Passport 1600 (Software < 2.1) | ||||
| arpnip: yes | ||||
| macsuck: yes | ||||
| portmac: yes | ||||
| duplex: both | ||||
| cdp: proprietary | ||||
| vlan: write | ||||
| class: Layer3::N1600 | ||||
|  | ||||
| device: 1612,1624,1648 | ||||
|  | ||||
| device-family: Ethernet Routing Switch/Passport 1600 (Software >= 2.1) | ||||
| arpnip: yes | ||||
| macsuck: yes | ||||
| portmac: yes | ||||
| duplex: write | ||||
| cdp: proprietary | ||||
| vlan: write | ||||
| class: Layer3::Passport | ||||
|  | ||||
| device: 1612,1624,1648 | ||||
|  | ||||
| device-family: Synoptics | ||||
| macsuck: yes | ||||
| duplex: both | ||||
| cdp: proprietary | ||||
| ver: 1 | ||||
| class: Layer1::S3000 | ||||
| note: Uses proprietary MIBs to provide MAC to port mapping. | ||||
| note: !Requires Advanced or Advanced Analyzer NMM | ||||
|  | ||||
| device: 281X | ||||
|  | ||||
| device: System 3000 | ||||
|  | ||||
| device-family: Wireless Switch 2270 | ||||
| arpnip: no | ||||
| macsuck: yes | ||||
| portmac: yes | ||||
| duplex: both | ||||
| cdp: proprietary | ||||
| modules: yes | ||||
| class: Layer2::N2270 | ||||
| note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports. | ||||
|  | ||||
| device: 2270 | ||||
| device-family: DRG | ||||
| device: All | ||||
|  | ||||
| # | ||||
| # Proxim | ||||
| @@ -836,7 +970,7 @@ device: 2270 | ||||
| device-vendor: Proxim | ||||
| macsuck: yes | ||||
| duplex: no | ||||
| cdp: no | ||||
| topo: no | ||||
| class: Layer2::Orinoco | ||||
|  | ||||
| device-family: Orinoco | ||||
| @@ -845,6 +979,32 @@ device: AP-1000,AP-2000,AP-4000 | ||||
|  | ||||
| device: WavePOINT-II | ||||
|  | ||||
| # | ||||
| # Radware | ||||
| # | ||||
| device-vendor: Radware | ||||
| arpnip: yes | ||||
| topo: no | ||||
| duplex: both | ||||
| macsuck: yes | ||||
| modules: no | ||||
| portmac: yes | ||||
| vlan: yes | ||||
| class: Layer3::AlteonAD | ||||
|  | ||||
| device-family: Alteon AceDirector and AceSwitch series | ||||
| note: !Some versions have issues with continuous SNMP polling. Upgrade to 10.0.30.7 or higher. | ||||
| device: All | ||||
|  | ||||
| device-family: Web Switch Module for IBM L2/L3 BladeCenter  | ||||
| device: All | ||||
|  | ||||
| device-family: Radware Alteon Application switches (AWS 2000 and 3000 series) | ||||
| device: All | ||||
|  | ||||
| device-family: Radware Alteon switches | ||||
| device: 4408,4416,5412,5224 | ||||
|  | ||||
| #  | ||||
| # SonicWALL | ||||
| #  | ||||
| @@ -865,7 +1025,13 @@ device: Sun routers | ||||
| # Synoptics | ||||
| # | ||||
| device-vendor: Synoptics | ||||
| note: See Nortel | ||||
| note: See Avaya | ||||
|  | ||||
| # | ||||
| # Trapeze | ||||
| # | ||||
| device-vendor: Trapeze | ||||
| note: See Juniper | ||||
|  | ||||
| # | ||||
| # Zyxel | ||||
|   | ||||
							
								
								
									
										341
									
								
								Info/AMAP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										341
									
								
								Info/AMAP.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,341 @@ | ||||
| # SNMP::Info::AMAP | ||||
| # | ||||
| # Copyright (c) 2013 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::AMAP; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::LLDP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS | ||||
|     = ( 'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|  | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|  | ||||
|     # EXTREME-EDP-MIB::extremeEdpTable | ||||
|     'amap_rem_sysname' => 'aipAMAPRemHostname', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( 'amap_rem_sysname' => \&SNMP::Info::munge_null, ); | ||||
|  | ||||
| sub hasAMAP { | ||||
|     my $amap = shift; | ||||
|  | ||||
|     my $amap_ip = $amap->aipAMAPIpAddr() || {}; | ||||
|  | ||||
|     return 1 if ( scalar( keys %$amap_ip ) ); | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| # Break up the aipAMAPhostsTable INDEX into MAC and IP address. | ||||
| sub _hosts_table_index { | ||||
|     my $idx  = shift; | ||||
|     my @oids = split( /\./, $idx ); | ||||
|     my $mac  = join( '.', splice( @oids, 0, 6 ) ); | ||||
|  | ||||
|     return ( $mac, join( '.', @oids ) ); | ||||
| } | ||||
|  | ||||
| # Break up the aipAMAPportConnectionTable INDEX and return MAC | ||||
| sub _conn_table_mac { | ||||
|     my $idx       = shift; | ||||
|     my @oids      = split( /\./, $idx ); | ||||
|     my $local_idx = shift @oids; | ||||
|     my $mac       = join( '.', splice( @oids, 0, 6 ) ); | ||||
|  | ||||
|     return ($mac); | ||||
| } | ||||
|  | ||||
| # Since we need to get IP Addresses from the aipAMAPhostsTable which has | ||||
| # a different index (MAC, IP) than the aipAMAPportConnectionTable which holds | ||||
| # the remote device details we create a combined index and skip any | ||||
| # IPs which have an address of 0.0.0.0.  Would like to include only one | ||||
| # address since they should all originate from the same device, but we don't | ||||
| # know if they would all be reachable from the network management application. | ||||
| # | ||||
| # We don't inplement partials since this is private index function | ||||
| sub _amap_index { | ||||
|     my $amap = shift; | ||||
|  | ||||
|     my $amap_ip    = $amap->aipAMAPIpAddr()    || {}; | ||||
|     my $amap_rport = $amap->aipAMAPLocalPort() || {}; | ||||
|  | ||||
|     my %amap_index; | ||||
|     foreach my $key ( keys %$amap_ip ) { | ||||
|         my ( $mac, $ip ) = _hosts_table_index($key); | ||||
|  | ||||
|         next if ( $ip eq '0.0.0.0' ); | ||||
|         next unless $ip; | ||||
|  | ||||
|         foreach my $idx ( keys %$amap_rport ) { | ||||
|             my $c_mac = _conn_table_mac($idx); | ||||
|  | ||||
|             if ( $mac eq $c_mac ) { | ||||
|                 my $index = "$idx.$ip"; | ||||
|                 $amap_index{$index} = $index; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return \%amap_index; | ||||
| } | ||||
|  | ||||
| # Break up _amap_index INDEX into local index, MAC, remote index, and | ||||
| # IP address | ||||
| sub _amap_index_parts { | ||||
|     my $idx       = shift; | ||||
|     my @oids      = split( /\./, $idx ); | ||||
|     my $local_idx = shift @oids; | ||||
|     my $mac       = join( '.', splice( @oids, 0, 6 ) ); | ||||
|     my $rem_idx   = shift @oids; | ||||
|  | ||||
|     return ( $local_idx, $mac, $rem_idx, join( '.', @oids ) ); | ||||
| } | ||||
|  | ||||
| sub amap_if { | ||||
|     my $amap = shift; | ||||
|  | ||||
|     my $index  = $amap->_amap_index()         || {}; | ||||
|     my $if_idx = $amap->aipAMAPLocalIfindex() || {}; | ||||
|  | ||||
|     my %amap_if; | ||||
|     foreach my $key ( keys %$index ) { | ||||
|         my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key); | ||||
|         my $if_key = "$local_idx.$mac.$rem_idx"; | ||||
|  | ||||
|         if ( $key =~ /^$if_key/ ) { | ||||
|             my $if = $if_idx->{$if_key}; | ||||
|             $amap_if{$key} = $if; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return \%amap_if; | ||||
| } | ||||
|  | ||||
| sub amap_ip { | ||||
|     my $amap = shift; | ||||
|  | ||||
|     my $index = $amap->_amap_index() || {}; | ||||
|  | ||||
|     my %amap_ip; | ||||
|     foreach my $key ( keys %$index ) { | ||||
|         my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key); | ||||
|  | ||||
|         # MIB says should only be IPv4 | ||||
|         next unless ( $ip =~ /\d+(\.\d+){3}/ ); | ||||
|         $amap_ip{$key} = $ip; | ||||
|     } | ||||
|     return \%amap_ip; | ||||
| } | ||||
|  | ||||
| sub amap_port { | ||||
|     my $amap = shift; | ||||
|  | ||||
|     my $index      = $amap->_amap_index()      || {}; | ||||
|     my $amap_rport = $amap->aipAMAPLocalPort() || {}; | ||||
|     my $amap_rslot = $amap->aipAMAPLocalSlot() || {}; | ||||
|  | ||||
|     my %amap_port; | ||||
|     foreach my $key ( sort keys %$index ) { | ||||
|         my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key); | ||||
|         my $p_key = "$local_idx.$mac.$rem_idx"; | ||||
|  | ||||
|         if ( $key =~ /^$p_key/ ) { | ||||
|             my $port = $amap_rport->{$p_key}; | ||||
|             my $slot = $amap_rslot->{$p_key} || 0; | ||||
|             next unless $port; | ||||
|             $amap_port{$key} = defined $slot ? "$slot\/$port" : $port; | ||||
|         } | ||||
|     } | ||||
|     return \%amap_port; | ||||
| } | ||||
|  | ||||
| sub amap_id { | ||||
|     my $amap = shift; | ||||
|  | ||||
|     my $index     = $amap->_amap_index()      || {}; | ||||
|     my $amap_name = $amap->amap_rem_sysname() || {}; | ||||
|  | ||||
|     my %amap_name; | ||||
|     foreach my $key ( sort keys %$index ) { | ||||
|         my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key); | ||||
|         my $id_key = "$local_idx.$mac.$rem_idx"; | ||||
|  | ||||
|         if ( $key =~ /^$id_key/ ) { | ||||
|             my $name = $amap_name->{$id_key} || 0; | ||||
|             next unless $name; | ||||
|             $amap_name{$key} = $name; | ||||
|         } | ||||
|     } | ||||
|     return \%amap_name; | ||||
| } | ||||
|  | ||||
| sub amap_platform { | ||||
|     my $amap = shift; | ||||
|  | ||||
|     my $index              = $amap->_amap_index()          || {}; | ||||
|     my $amap_topo_platform = $amap->aipAMAPRemDeviceType() || {}; | ||||
|  | ||||
|     my %amap_platform; | ||||
|     foreach my $key ( keys %$index ) { | ||||
|         my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key); | ||||
|         my $pf_key = "$local_idx.$mac.$rem_idx"; | ||||
|  | ||||
|         if ( $key =~ /^$pf_key/ ) { | ||||
|             my $platform = $amap_topo_platform->{$pf_key}; | ||||
|             next unless $platform; | ||||
|             $amap_platform{$key} = $platform; | ||||
|         } | ||||
|     } | ||||
|     return \%amap_platform; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::AMAP - SNMP Interface to Alcatel Mapping Adjacency Protocol (AMAP) | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $amap = new SNMP::Info (  | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
|  | ||||
|  my $class = $amap->class(); | ||||
|  print " Using device sub class : $class\n"; | ||||
|  | ||||
|  $hasamap   = $amap->hasAMAP() ? 'yes' : 'no'; | ||||
|  | ||||
|  # Print out a map of device ports with LLDP neighbors: | ||||
|  my $interfaces    = $amap->interfaces(); | ||||
|  my $amap_if       = $amap->amap_if(); | ||||
|  my $amap_ip       = $amap->amap_ip(); | ||||
|  my $amap_port     = $amap->amap_port(); | ||||
|  | ||||
|  foreach my $amap_key (keys %$amap_ip){ | ||||
|     my $iid           = $amap_if->{$amap_key}; | ||||
|     my $port          = $interfaces->{$iid}; | ||||
|     my $neighbor      = $amap_ip->{$amap_key}; | ||||
|     my $neighbor_port = $amap_port->{$amap_key}; | ||||
|     print "Port : $port connected to $neighbor / $neighbor_port\n"; | ||||
|  } | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented  | ||||
| interface to Alcatel Mapping Adjacency Protocol (AMAP) information through | ||||
| SNMP. | ||||
|  | ||||
| AMAP is a Layer 2 protocol that allows a network device to advertise its | ||||
| identity and capabilities on the local network providing topology information. | ||||
|  | ||||
| Create or use a device subclass that inherits this class.  Do not use | ||||
| directly. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBAL METHODS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $amap->hasAMAP() | ||||
|  | ||||
| Is AMAP is active in this device?   | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $amap->amap_id() | ||||
|  | ||||
| Returns the string value used to identify the remote system. | ||||
|  | ||||
| =item $amap->amap_if() | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table. | ||||
|  | ||||
| =item  $amap->amap_ip() | ||||
|  | ||||
| Returns remote IPv4 addresses.  Note: AMAP returns all IP addresses associated | ||||
| with the remote device.  It would be preferable to include only one address | ||||
| since they should all originate from the same device, but amap_ip() can not  | ||||
| determine if all addresses are reachable from the network management | ||||
| application therefore all addresses are returned and the calling application | ||||
| must determine which address to use and if they are in fact from the same | ||||
| device. | ||||
|  | ||||
| =item $amap->amap_port() | ||||
|  | ||||
| Returns remote port ID | ||||
|  | ||||
| =item $amap->amap_platform() | ||||
|  | ||||
| Returns remote platform ID | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
| @@ -38,7 +38,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' ); | ||||
|  | ||||
| @@ -65,7 +65,7 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::AdslLine - SNMP Interface to the ADSL-LINE-MIB | ||||
| SNMP::Info::AdslLine - SNMP Interface to the F<ADSL-LINE-MIB> | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -120,7 +120,7 @@ MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| =head2 ATUC channel table (C<adslAtucChanTable>) | ||||
|  | ||||
| This table provides one row for each ATUC channel. | ||||
| ADSL channel interfaces are those ifEntries where ifType | ||||
| ADSL channel interfaces are those C<ifEntries> where C<ifType> | ||||
| is equal to adslInterleave(124) or adslFast(125). | ||||
|  | ||||
| =over | ||||
| @@ -146,7 +146,7 @@ is equal to adslInterleave(124) or adslFast(125). | ||||
| =head2 ATUR channel table (C<adslAturChanTable>) | ||||
|  | ||||
| This table provides one row for each ATUR channel. | ||||
| ADSL channel interfaces are those ifEntries where ifType | ||||
| ADSL channel interfaces are those C<ifEntries> where C<ifType> | ||||
| is equal to adslInterleave(124) or adslFast(125). | ||||
|  | ||||
| =over | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -148,6 +148,16 @@ $VERSION = '2.08'; | ||||
|     # AIRESPACE-SWITCHING-MIB::agentPortConfigTable | ||||
|     'airespace_duplex_admin' => 'agentPortPhysicalMode', | ||||
|     'airespace_duplex'       => 'agentPortPhysicalStatus', | ||||
|  | ||||
|     # This needs to be cleaned up, but for now we pretend to | ||||
|     # have the CISCO-DOT11-MIB for signal strengths, etc. | ||||
|     'cd11_sigstrength' => 'bsnMobileStationRSSI', # kinda | ||||
|     'cd11_sigqual'     => 'bsnMobileStationSnr',  # kinda | ||||
|     'cd11_rxbyte'      => 'bsnMobileStationBytesReceived', | ||||
|     'cd11_txbyte'      => 'bsnMobileStationBytesSent', | ||||
|     'cd11_rxpkt'       => 'bsnMobileStationPacketsReceived', | ||||
|     'cd11_txpkt'       => 'bsnMobileStationPacketsSent', | ||||
|     'cd11_ssid'        => 'bsnMobileStationSsid', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
| @@ -158,6 +168,8 @@ $VERSION = '2.08'; | ||||
|     'airespace_bl_mac'      => \&SNMP::Info::munge_mac, | ||||
|     'airespace_if_mac'      => \&SNMP::Info::munge_mac, | ||||
|     'airespace_sta_mac'     => \&SNMP::Info::munge_mac, | ||||
|     'cd11_rxpkt'            => \&munge_64bits, | ||||
|     'cd11_txpkt'            => \&munge_64bits, | ||||
| ); | ||||
|  | ||||
| sub layers { | ||||
| @@ -421,11 +433,12 @@ sub i_mac { | ||||
|             next unless defined $mac; | ||||
|             $i_mac{$iid} = $mac; | ||||
|         } | ||||
|  | ||||
|         # Don't grab AP MACs - we want the AP to show up on edge switch | ||||
|         # ports | ||||
|         elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) { | ||||
|             $index =~ s/\.\d+$//; | ||||
|             next unless defined $index; | ||||
|             $i_mac{$iid} = $index; | ||||
|         } | ||||
|         # Some switch interfaces have MACs, virtuals report 00:00:00:00:00:00 | ||||
|  | ||||
|         else { | ||||
|             my $mac = $if_mac->{$iid}; | ||||
|             next unless defined $mac; | ||||
| @@ -659,6 +672,60 @@ sub i_ssidbcast { | ||||
|     return \%i_ssidbcast; | ||||
| } | ||||
|  | ||||
| # Secret decoder ring for BSSID: https://supportforums.cisco.com/docs/DOC-2935 | ||||
| # We need radio base MAC, SSID index, radio band, and whether AP is | ||||
| # VxWorks or IOS based then we can do the arithmetic | ||||
|  | ||||
| sub i_ssidmac { | ||||
|     my $airespace = shift; | ||||
|     my $partial   = shift; | ||||
|  | ||||
|     my $ssidlist  = $airespace->i_ssidlist($partial)  || {}; | ||||
|     my $apif_type = $airespace->airespace_apif_type() || {}; | ||||
|     my $ap_ios    = $airespace->bsnAPIOSVersion()     || {}; | ||||
|  | ||||
|     my %i_ssidmac; | ||||
|     foreach my $oid ( keys %$ssidlist ) { | ||||
|  | ||||
|         my @parts    = split( /\./, $oid ); | ||||
|         my $ssid_idx = pop (@parts); | ||||
|         my $slot     = pop (@parts); | ||||
|         my $last     = pop (@parts); | ||||
|  | ||||
|         my $iid = $oid; | ||||
|         # Get radio band | ||||
|         $iid =~ s/\.\d+$//; | ||||
|         my $ap_type = $apif_type->{$iid}; | ||||
|         # Determine if IOS based | ||||
|         $iid =~ s/\.\d+$//; | ||||
|         my $ios = $ap_ios->{$iid} || ''; | ||||
|          | ||||
|         # Four cases: | ||||
|         # IOS and 2.4Ghz count up, starts at zero | ||||
|         if ($ios and $ap_type =~ /b$/) { | ||||
|             $last = $last + ($ssid_idx - 1); | ||||
|         } | ||||
|         # IOS and 5Ghz - count down from maximum of 16 | ||||
|         elsif ($ios and $ap_type =~ /a$/) { | ||||
|             $last = $last + (16 - $ssid_idx); | ||||
|         } | ||||
|         # VxWorks and 5Ghz - count up, starts at zero | ||||
|         elsif ($ios and $ap_type =~ /a$/) { | ||||
|             $last = $last + ($ssid_idx - 1); | ||||
|         } | ||||
|         # VxWorks and 2.4Ghz - count down from maximum of 16 | ||||
|         else { | ||||
|             $last = $last + (16 - $ssid_idx); | ||||
|         } | ||||
|          | ||||
|        push (@parts, $last); | ||||
|        my $bssid = join( ':', map { sprintf( "%02x", $_ ) } @parts ); | ||||
|        $i_ssidmac{$oid} = $bssid; | ||||
|     } | ||||
|  | ||||
|    return \%i_ssidmac; | ||||
| } | ||||
|  | ||||
| sub i_80211channel { | ||||
|     my $airespace = shift; | ||||
|     my $partial   = shift; | ||||
| @@ -976,6 +1043,13 @@ sub at_netaddr { | ||||
|     return $ret; | ||||
| } | ||||
|  | ||||
| sub munge_64bits { | ||||
|     # The controller sometimes hands off a ridiculous value for packets. | ||||
|     # Just truncate it to 32 bits. | ||||
|     my $value = shift; | ||||
|     return $value & 0xffffffff; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| @@ -1025,7 +1099,7 @@ Do not use directly. | ||||
|  | ||||
| =over | ||||
|  | ||||
| None. | ||||
| =item None. | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -1151,12 +1225,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>) | ||||
| @@ -1183,11 +1254,16 @@ 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. | ||||
|  | ||||
| =item $airespace->i_ssidmac() | ||||
|  | ||||
| With the same keys as i_ssidlist, returns the Basic service set | ||||
| identification (BSSID), MAC address, the AP is using for the SSID.  | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Dot11 Ess Table  (C<bsnDot11EssTable>) | ||||
| @@ -1599,15 +1675,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() | ||||
|  | ||||
| @@ -1730,4 +1806,32 @@ entity which 'contains' this entity. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Arp Cache Table Augmentation | ||||
|  | ||||
| The controller has knowledge of MAC->IP mappings for wireless clients. | ||||
| Augmenting the arp cache data with these MAC->IP mappings enables visibility | ||||
| for stations that only communicate locally. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $airespace->at_paddr() | ||||
|  | ||||
| Adds MAC addresses extracted from the index of C<bsnMobileStationIpAddress>. | ||||
|  | ||||
| =item $airespace->at_netaddr() | ||||
|  | ||||
| Adds IP addresses from C<bsnMobileStationIpAddress>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 Data Munging Callback Subroutines | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item munge_64bits() | ||||
|  | ||||
| Truncate packet values to 32 bits. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'BRIDGE-MIB'   => 'dot1dBaseBridgeAddress', | ||||
| @@ -158,6 +158,19 @@ sub qb_fw_mac { | ||||
|     return $qb_fw_mac; | ||||
| } | ||||
|  | ||||
| sub qb_fw_vlan { | ||||
|     my $bridge  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $qb_fw_port = $bridge->qb_fw_port($partial); | ||||
|     my $qb_fw_vlan = {}; | ||||
|     foreach my $idx ( keys %$qb_fw_port ) { | ||||
|         my ( $fdb_id, $mac ) = _qb_fdbtable_index($idx); | ||||
|         $qb_fw_vlan->{$idx} = $fdb_id; | ||||
|     } | ||||
|     return $qb_fw_vlan; | ||||
| } | ||||
|  | ||||
| sub qb_i_vlan_t { | ||||
|     my $bridge  = shift; | ||||
|     my $partial = shift; | ||||
| @@ -631,7 +644,7 @@ identifier (iid) | ||||
|  | ||||
| Returns reference to hash of forwarding table entries status | ||||
|  | ||||
| (C<dot2dTpFdbStatus>) | ||||
| (C<dot1dTpFdbStatus>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -855,6 +868,10 @@ identifier (iid) | ||||
|  | ||||
| (C<dot1qTpFdbPort>) | ||||
|  | ||||
| =item $bridge->qb_fw_vlan() | ||||
|  | ||||
| Returns reference to hash of forwarding table entries VLAN ID | ||||
|  | ||||
| =item $bridge->qb_fw_status() | ||||
|  | ||||
| Returns reference to hash of forwarding table entries status | ||||
| @@ -888,4 +905,6 @@ Currently unsupported.  Throws an error and returns. | ||||
|  | ||||
| Currently unsupported.  Throws an error and returns. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
|   | ||||
							
								
								
									
										160
									
								
								Info/CDP.pm
									
									
									
									
									
								
							
							
						
						
									
										160
									
								
								Info/CDP.pm
									
									
									
									
									
								
							| @@ -42,7 +42,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| # Five data structures required by SNMP::Info | ||||
| %MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' ); | ||||
| @@ -53,37 +53,37 @@ $VERSION = '2.08'; | ||||
|     'cdp_run'      => 'cdpGlobalRun', | ||||
|     'cdp_interval' => 'cdpGlobalMessageInterval', | ||||
|     'cdp_holdtime' => 'cdpGlobalHoldTime', | ||||
|     'cdp_id'       => 'cdpGlobalDeviceId', | ||||
|     'cdp_gid'       => 'cdpGlobalDeviceId', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     'c_index'        => 'cdpCacheIfIndex', | ||||
|     'c_proto'        => 'cdpCacheAddressType', | ||||
|     'c_addr'         => 'cdpCacheAddress', | ||||
|     'c_ver'          => 'cdpCacheVersion', | ||||
|     'c_id'           => 'cdpCacheDeviceId', | ||||
|     'c_port'         => 'cdpCacheDevicePort', | ||||
|     'c_platform'     => 'cdpCachePlatform', | ||||
|     'c_capabilities' => 'cdpCacheCapabilities', | ||||
|     'c_domain'       => 'cdpCacheVTPMgmtDomain', | ||||
|     'c_vlan'         => 'cdpCacheNativeVLAN', | ||||
|     'c_duplex'       => 'cdpCacheDuplex', | ||||
|     'c_power'        => 'cdpCachePowerConsumption', | ||||
|     'c_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType', | ||||
|     'c_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr', | ||||
|     'c_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType', | ||||
|     'c_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr', | ||||
|     'cdp_index'        => 'cdpCacheIfIndex', | ||||
|     'cdp_proto'        => 'cdpCacheAddressType', | ||||
|     'cdp_addr'         => 'cdpCacheAddress', | ||||
|     'cdp_ver'          => 'cdpCacheVersion', | ||||
|     'cdp_id'           => 'cdpCacheDeviceId', | ||||
|     'cdp_port'         => 'cdpCacheDevicePort', | ||||
|     'cdp_platform'     => 'cdpCachePlatform', | ||||
|     'cdp_capabilities' => 'cdpCacheCapabilities', | ||||
|     'cdp_domain'       => 'cdpCacheVTPMgmtDomain', | ||||
|     'cdp_vlan'         => 'cdpCacheNativeVLAN', | ||||
|     'cdp_duplex'       => 'cdpCacheDuplex', | ||||
|     'cdp_power'        => 'cdpCachePowerConsumption', | ||||
|     'cdp_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType', | ||||
|     'cdp_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr', | ||||
|     'cdp_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType', | ||||
|     'cdp_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     'c_capabilities' => \&SNMP::Info::munge_caps, | ||||
|     'c_platform'     => \&SNMP::Info::munge_null, | ||||
|     'c_domain'       => \&SNMP::Info::munge_null, | ||||
|     'c_port'         => \&SNMP::Info::munge_null, | ||||
|     'c_id'           => \&SNMP::Info::munge_null, | ||||
|     'c_ver'          => \&SNMP::Info::munge_null, | ||||
|     'c_ip'           => \&SNMP::Info::munge_ip, | ||||
|     'c_power'        => \&munge_power, | ||||
|     'cdp_capabilities' => \&SNMP::Info::munge_caps, | ||||
|     'cdp_platform'     => \&SNMP::Info::munge_null, | ||||
|     'cdp_domain'       => \&SNMP::Info::munge_null, | ||||
|     'cdp_port'         => \&SNMP::Info::munge_null, | ||||
|     'cdp_id'           => \&SNMP::Info::munge_null, | ||||
|     'cdp_ver'          => \&SNMP::Info::munge_null, | ||||
|     'cdp_ip'           => \&SNMP::Info::munge_ip, | ||||
|     'cdp_power'        => \&munge_power, | ||||
|  | ||||
| ); | ||||
|  | ||||
| @@ -101,63 +101,63 @@ sub hasCDP { | ||||
|  | ||||
|     # SNMP v1 clients dont have the globals | ||||
|     if ( defined $ver and $ver == 1 ) { | ||||
|         my $c_ip = $cdp->c_ip(); | ||||
|         my $cdp_ip = $cdp->cdp_ip(); | ||||
|  | ||||
|         # See if anything in cdp cache, if so we have cdp | ||||
|         return 1 if ( defined $c_ip and scalar( keys %$c_ip ) ); | ||||
|         return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) ); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     return $cdp->cdp_run(); | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
| sub cdp_if { | ||||
|     my $cdp = shift; | ||||
|  | ||||
|     # See if by some miracle Cisco implemented the cdpCacheIfIndex entry | ||||
|     my $c_index = $cdp->c_index(); | ||||
|     return $c_index if defined $c_index; | ||||
|     my $cdp_index = $cdp->cdp_index(); | ||||
|     return $cdp_index if defined $cdp_index; | ||||
|  | ||||
|     # Nope, didn't think so. Now we fake it. | ||||
|     my $c_ip = $cdp->c_ip(); | ||||
|     unless ( defined $c_ip ) { | ||||
|     my $cdp_ip = $cdp->cdp_ip(); | ||||
|     unless ( defined $cdp_ip ) { | ||||
|         $cdp->error_throw( | ||||
|             "SNMP::Info::CDP:c_if() - Device doesn't have cdp_ip() data.  Can't fake cdp_index()" | ||||
|             "SNMP::Info::CDP:cdp_if() - Device doesn't have cdp_ip() data.  Can't fake cdp_index()" | ||||
|         ); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     my %c_if; | ||||
|     foreach my $key ( keys %$c_ip ) { | ||||
|     my %cdp_if; | ||||
|     foreach my $key ( keys %$cdp_ip ) { | ||||
|         next unless defined $key; | ||||
|         my $iid = $key; | ||||
|  | ||||
|         # Truncate .1 from cdp cache entry | ||||
|         $iid =~ s/\.\d+$//; | ||||
|         $c_if{$key} = $iid; | ||||
|         $cdp_if{$key} = $iid; | ||||
|     } | ||||
|  | ||||
|     return \%c_if; | ||||
|     return \%cdp_if; | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
| sub cdp_ip { | ||||
|     my $cdp     = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $c_addr  = $cdp->c_addr($partial)  || {}; | ||||
|     my $c_proto = $cdp->c_proto($partial) || {}; | ||||
|     my $cdp_addr  = $cdp->cdp_addr($partial)  || {}; | ||||
|     my $cdp_proto = $cdp->cdp_proto($partial) || {}; | ||||
|  | ||||
|     my %c_ip; | ||||
|     foreach my $key ( keys %$c_addr ) { | ||||
|         my $addr  = $c_addr->{$key}; | ||||
|         my $proto = $c_proto->{$key}; | ||||
|     my %cdp_ip; | ||||
|     foreach my $key ( keys %$cdp_addr ) { | ||||
|         my $addr  = $cdp_addr->{$key}; | ||||
|         my $proto = $cdp_proto->{$key}; | ||||
|         next unless defined $addr; | ||||
|         next if ( defined $proto and $proto ne 'ip' ); | ||||
|  | ||||
|         my $ip = join( '.', unpack( 'C4', $addr ) ); | ||||
|         $c_ip{$key} = $ip; | ||||
|         $cdp_ip{$key} = $ip; | ||||
|     } | ||||
|     return \%c_ip; | ||||
|     return \%cdp_ip; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| @@ -188,15 +188,15 @@ Max Baker | ||||
|  | ||||
|  # Print out a map of device ports with CDP neighbors: | ||||
|  my $interfaces = $cdp->interfaces(); | ||||
|  my $c_if       = $cdp->c_if(); | ||||
|  my $c_ip       = $cdp->c_ip(); | ||||
|  my $c_port     = $cdp->c_port(); | ||||
|  my $cdp_if       = $cdp->cdp_if(); | ||||
|  my $cdp_ip       = $cdp->cdp_ip(); | ||||
|  my $cdp_port     = $cdp->cdp_port(); | ||||
|  | ||||
|  foreach my $cdp_key (keys %$c_ip){ | ||||
|     my $iid           = $c_if->{$cdp_key}; | ||||
|  foreach my $cdp_key (keys %$cdp_ip){ | ||||
|     my $iid           = $cdp_if->{$cdp_key}; | ||||
|     my $port          = $interfaces->{$iid}; | ||||
|     my $neighbor      = $c_ip->{$cdp_key}; | ||||
|     my $neighbor_port = $c_port->{$cdp_key}; | ||||
|     my $neighbor      = $cdp_ip->{$cdp_key}; | ||||
|     my $neighbor_port = $cdp_port->{$cdp_key}; | ||||
|     print "Port : $port connected to $neighbor / $neighbor_port\n"; | ||||
|  } | ||||
|  | ||||
| @@ -260,7 +260,7 @@ Time in seconds that CDP messages are kept. | ||||
|  | ||||
| (C<cdpGlobalHoldTime>) | ||||
|  | ||||
| =item  $cdp->cdp_id()  | ||||
| =item  $cdp->cdp_gid()  | ||||
|  | ||||
| Returns CDP device ID.   | ||||
|  | ||||
| @@ -280,7 +280,7 @@ to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cdp->c_capabilities() | ||||
| =item $cdp->cdp_capabilities() | ||||
|  | ||||
| Returns Device Functional Capabilities.  Results are munged into an ascii | ||||
| binary string, 7 digits long, MSB.  Each digit represents a bit from the | ||||
| @@ -319,108 +319,108 @@ information. | ||||
|  | ||||
| (C<cdpCacheCapabilities>) | ||||
|  | ||||
| =item $cdp->c_domain() | ||||
| =item $cdp->cdp_domain() | ||||
|  | ||||
| Returns remote VTP Management Domain as defined in | ||||
| C<CISCO-VTP-MIB::managementDomainName> | ||||
|  | ||||
| (C<cdpCacheVTPMgmtDomain>) | ||||
|  | ||||
| =item $cdp->c_duplex()  | ||||
| =item $cdp->cdp_duplex()  | ||||
|  | ||||
| Returns the port duplex status from remote devices. | ||||
|  | ||||
| (C<cdpCacheDuplex>) | ||||
|  | ||||
| =item $cdp->c_id() | ||||
| =item $cdp->cdp_id() | ||||
|  | ||||
| Returns remote device id string | ||||
|  | ||||
| (C<cdpCacheDeviceId>) | ||||
|  | ||||
| =item $cdp->c_if() | ||||
| =item $cdp->cdp_if() | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table. | ||||
|  | ||||
| Note that a lot devices don't implement $cdp->c_index(),  So if it isn't | ||||
| Note that a lot devices don't implement $cdp->cdp_index(),  So if it isn't | ||||
| around, we fake it.  | ||||
|  | ||||
| In order to map the cdp table entry back to the interfaces() entry, we | ||||
| truncate the last number off of it : | ||||
|  | ||||
|   # it exists, yay. | ||||
|   my $c_index     = $device->c_index(); | ||||
|   return $c_index if defined $c_index; | ||||
|   my $cdp_index     = $device->cdp_index(); | ||||
|   return $cdp_index if defined $cdp_index; | ||||
|  | ||||
|   # if not, let's fake it | ||||
|   my $c_ip       = $device->c_ip(); | ||||
|   my $cdp_ip       = $device->cdp_ip(); | ||||
|      | ||||
|   my %c_if | ||||
|   foreach my $key (keys %$c_ip){ | ||||
|   my %cdp_if | ||||
|   foreach my $key (keys %$cdp_ip){ | ||||
|       $iid = $key; | ||||
|       ## Truncate off .1 from cdp response | ||||
|       $iid =~ s/\.\d+$//; | ||||
|       $c_if{$key} = $iid; | ||||
|       $cdp_if{$key} = $iid; | ||||
|   } | ||||
|   | ||||
|   return \%c_if; | ||||
|   return \%cdp_if; | ||||
|  | ||||
|  | ||||
| =item $cdp->c_index() | ||||
| =item $cdp->cdp_index() | ||||
|  | ||||
| Returns the mapping to the SNMP2 Interface table for CDP Cache Entries.  | ||||
|  | ||||
| Most devices don't implement this, so you probably want to use $cdp->c_if() | ||||
| Most devices don't implement this, so you probably want to use $cdp->cdp_if() | ||||
| instead. | ||||
|  | ||||
| See c_if() entry. | ||||
| See cdp_if() entry. | ||||
|  | ||||
| (C<cdpCacheIfIndex>) | ||||
|  | ||||
| =item  $cdp->c_ip() | ||||
| =item  $cdp->cdp_ip() | ||||
|  | ||||
| If $cdp->c_proto() is supported, returns remote IPV4 address only.  Otherwise | ||||
| If $cdp->cdp_proto() is supported, returns remote IPV4 address only.  Otherwise | ||||
| it will return all addresses. | ||||
|  | ||||
| (C<cdpCacheAddress>) | ||||
|  | ||||
| =item  $cdp->c_addr() | ||||
| =item  $cdp->cdp_addr() | ||||
|  | ||||
| Returns remote address | ||||
|  | ||||
| (C<cdpCacheAddress>) | ||||
|  | ||||
| =item $cdp->c_platform()  | ||||
| =item $cdp->cdp_platform()  | ||||
|  | ||||
| Returns remote platform id  | ||||
|  | ||||
| (C<cdpCachePlatform>) | ||||
|  | ||||
| =item $cdp->c_port() | ||||
| =item $cdp->cdp_port() | ||||
|  | ||||
| Returns remote port ID | ||||
|  | ||||
| (C<cdpDevicePort>) | ||||
|  | ||||
| =item  $cdp->c_proto() | ||||
| =item  $cdp->cdp_proto() | ||||
|  | ||||
| Returns remote address type received.  Usually IP. | ||||
|  | ||||
| (C<cdpCacheAddressType>) | ||||
|  | ||||
| =item $cdp->c_ver()  | ||||
| =item $cdp->cdp_ver()  | ||||
|  | ||||
| Returns remote hardware version | ||||
|  | ||||
| (C<cdpCacheVersion>) | ||||
|  | ||||
| =item $cdp->c_vlan() | ||||
| =item $cdp->cdp_vlan() | ||||
|  | ||||
| Returns the remote interface native VLAN. | ||||
|  | ||||
| (C<cdpCacheNativeVLAN>) | ||||
|  | ||||
| =item $cdp->c_power() | ||||
| =item $cdp->cdp_power() | ||||
|  | ||||
| Returns the amount of power consumed by remote device in milliwatts munged | ||||
| for decimal placement. | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable', | ||||
| @@ -449,7 +449,7 @@ devices running older code revisions. | ||||
|  | ||||
|  Example: | ||||
|  $ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig')  | ||||
|     or die Couldn't save config. ",$ciscoconfig->error(1); | ||||
|     or die "Couldn't save config. ",$ciscoconfig->error(1); | ||||
|  | ||||
| =item $ciscoconfig->copy_run_start() | ||||
|  | ||||
|   | ||||
| @@ -38,7 +38,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-IMAGE-MIB' => 'ciscoImageString', ); | ||||
|  | ||||
|   | ||||
| @@ -38,7 +38,7 @@ use Exporter; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB', | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex', | ||||
|           'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' ); | ||||
| @@ -175,7 +175,7 @@ Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>. | ||||
| =item $poe->peth_port_power() | ||||
|  | ||||
| Power supplied by PoE ports, in milliwatts | ||||
| ("cpeExtPsePortPwrConsumption") | ||||
| (C<cpeExtPsePortPwrConsumption>) | ||||
|   | ||||
| =back | ||||
|  | ||||
| @@ -185,8 +185,8 @@ Power supplied by PoE ports, in milliwatts | ||||
|  | ||||
| =item $poe->peth_port_neg_power() | ||||
|  | ||||
| Power negotiated using CDP, in milliwats | ||||
| ("cdpCachePowerConsumption") | ||||
| Power negotiated using CDP, in milliwatts | ||||
| (C<cdpCachePowerConsumption>) | ||||
|  | ||||
| =back | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', ); | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', ); | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', ); | ||||
|  | ||||
| @@ -215,9 +215,8 @@ sub i_speed_admin { | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my %i_speed_admin; | ||||
|     my $p_port  = $stack->p_port() || {}; | ||||
|     my %mapping = reverse %$p_port; | ||||
|     my $p_speed = $stack->p_speed( $mapping{$partial} ); | ||||
|     my $p_port  = $stack->p_port()  || {}; | ||||
|     my $p_speed = $stack->p_speed() || {}; | ||||
|  | ||||
|     my %speeds = ( | ||||
|         'autoDetect'      => 'auto', | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'SNMPv2-MIB'            => 'sysDescr', | ||||
| @@ -51,6 +51,7 @@ $VERSION = '2.08'; | ||||
|     'OLD-CISCO-SYSTEM-MIB'  => 'writeMem', | ||||
|     'CISCO-PRODUCTS-MIB'    => 'sysName', | ||||
|     'ENTITY-MIB'            => 'entPhysicalSoftwareRev', | ||||
|     'CISCO-IMAGE-MIB'       => 'ciscoImageString', | ||||
|  | ||||
|     # some older catalysts live here | ||||
|     'CISCO-STACK-MIB'                 => 'wsc1900sysID', | ||||
| @@ -100,13 +101,15 @@ sub os { | ||||
|     my $descr = $l2->description() || ''; | ||||
|  | ||||
|     # order here matters - there are Catalysts that run IOS and have catalyst | ||||
|     # in their description field. | ||||
|     # in their description field, as well as Catalysts that run IOS-XE. | ||||
|     return 'ios-xe'   if ( $descr =~ /IOS-XE/ ); | ||||
|     return 'ios'      if ( $descr =~ /IOS/ ); | ||||
|     return 'catalyst' if ( $descr =~ /catalyst/i ); | ||||
|     return 'css'      if ( $descr =~ /Content Switch SW/ ); | ||||
|     return 'css-sca'  if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ ); | ||||
|     return 'pix'      if ( $descr =~ /Cisco PIX Security Appliance/ ); | ||||
|     return 'asa'      if ( $descr =~ /Cisco Adaptive Security Appliance/ ); | ||||
|     return 'san-os'   if ( $descr =~ /Cisco SAN-OS/ ); | ||||
|  | ||||
|     if ( $descr =~ /Application Control Engine Service Module/ ) { | ||||
|         # Only the admin context implements the entity MIB | ||||
| @@ -203,6 +206,15 @@ sub os_ver { | ||||
|         return $1; | ||||
|     } | ||||
|  | ||||
|     # Generic fallback: try to determine running image from CISCO-IMAGE-MIB | ||||
|     my $image_info = $l2->ciscoImageString() || {}; | ||||
|     foreach my $row (keys %$image_info) { | ||||
|         my $info_string = $image_info->{$row}; | ||||
|         if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) { | ||||
|             return $1; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| @@ -358,6 +370,8 @@ None. | ||||
|  | ||||
| =item F<ENTITY-MIB> | ||||
|  | ||||
| =item F<CISCO-IMAGE-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| @@ -388,58 +402,34 @@ Returns mem_free() + mem_used() | ||||
|  | ||||
| =item $ciscostats->os() | ||||
|  | ||||
| Tries to parse if device is running IOS or CatOS from description() | ||||
| Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else | ||||
| from description() | ||||
|  | ||||
| Available values : | ||||
| Available values: | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item pix | ||||
|  | ||||
| Cisco PIX | ||||
|  | ||||
| =item asa | ||||
|  | ||||
| Cisco ASA | ||||
|  | ||||
| =item fwsm | ||||
|  | ||||
| Single-mode FWSM | ||||
|  | ||||
| =item fwsm-admin | ||||
|  | ||||
| Admin context of multi-context FWSM | ||||
|  | ||||
| =item fwsm-context | ||||
|  | ||||
| Standard context of multi-context FWSM | ||||
|  | ||||
| =item ace-admin | ||||
|  | ||||
| Admin context of ACE module | ||||
|  | ||||
| =item ace-context | ||||
|  | ||||
| Standard context of ACE module (NB: No OS version detection | ||||
| is available, but will be the same as it's 'ace admin') | ||||
|  | ||||
| =item css | ||||
|  | ||||
| Cisco Content Switch | ||||
|  | ||||
| =item css-sca | ||||
|  | ||||
| Cisco Content Switch Secure Content Acceleration | ||||
|  | ||||
| =back | ||||
|  'ios'          for Cisco IOS | ||||
|  'ios-xe'       for Cisco IOS XE | ||||
|  'pix'          for Cisco PIX | ||||
|  'asa'          for Cisco ASA | ||||
|  'fwsm'         for Single-mode FWSM | ||||
|  'fwsm-admin'   for Admin context of multi-context FWSM | ||||
|  'fwsm-context' for Standard context of multi-context FWSM | ||||
|  'ace-admin'    for Admin context of ACE module | ||||
|  'ace-context'  for Standard context of ACE module (NB: No OS version | ||||
|                      detection is available, but will be the same as it's | ||||
|                      'ace admin') | ||||
|  'css'          for Cisco Content Switch | ||||
|  'css-sca'      for Cisco Content Switch Secure Content Acceleration | ||||
|  'san-os'       for Cisco SAN-OS | ||||
|  | ||||
| =item $ciscostats->os_ver() | ||||
|  | ||||
| Tries to parse device operating system version from description() | ||||
| Tries to parse device operating system version from description(), falls back | ||||
| to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed | ||||
|  | ||||
| =item $ciscostats->os_bin() | ||||
|  | ||||
| Tries to parse ROMMON version from rom_id() string | ||||
| Tries to parse C<ROMMON> version from rom_id() string | ||||
|  | ||||
| =item $ciscostats->ios_cpu() | ||||
|  | ||||
|   | ||||
| @@ -35,7 +35,9 @@ use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/; | ||||
| $VERSION = '2.08'; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| @SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//; | ||||
|  | ||||
| @@ -75,7 +77,7 @@ $VERSION = '2.08'; | ||||
| sub stp_ver { | ||||
|      my $self = shift; | ||||
|      my $stp_ver = $self->SUPER::stp_ver(); | ||||
|      if ( $stp_ver eq 'unknown' ){ | ||||
|      if ( !defined($stp_ver) || $stp_ver eq 'unknown' ){ | ||||
|          if ( defined $self->stpx_stp_type() ){ | ||||
|              $stp_ver = $self->stpx_stp_type(); | ||||
|          } | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'CISCO-VTP-MIB'                       => 'vtpVlanName', | ||||
|   | ||||
							
								
								
									
										295
									
								
								Info/EDP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								Info/EDP.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,295 @@ | ||||
| # SNMP::Info::EDP | ||||
| # | ||||
| # Copyright (c) 2012 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
|  | ||||
| package SNMP::Info::EDP; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::LLDP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'EXTREME-EDP-MIB'   => 'extremeEdpPortIfIndex', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|  | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     # EXTREME-EDP-MIB::extremeEdpTable | ||||
|     'edp_rem_sysname'  => 'extremeEdpNeighborName', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     'edp_rem_sysname'   => \&SNMP::Info::munge_null, | ||||
| ); | ||||
|  | ||||
| sub hasEDP { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {}; | ||||
|  | ||||
|     return 1 if ( scalar( keys %$edp_ip ) ); | ||||
|      | ||||
|     return; | ||||
| } | ||||
|  | ||||
| # Since we need to get IP Addresses from the extremeEdpNeighborTable which has | ||||
| # a different index (adds VLAN name) than the extremeEdpTable which holds | ||||
| # the remote device details use the index from extremeEdpNeighborTable but skip | ||||
| # indexes which have an address of 0.0.0.0.  Would like to include only one | ||||
| # address since they should all originate from the same device, but we don't | ||||
| # know if they would all be reachable from the network management application. | ||||
| # | ||||
| # We don't inplement partials since this is private index function | ||||
| sub _edp_index { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $edp_ip  = $edp->extremeEdpNeighborVlanIpAddress() || {}; | ||||
|      | ||||
|     my %edp_index; | ||||
|     foreach my $key ( keys %$edp_ip ) { | ||||
|         my $ip = $edp_ip->{$key}; | ||||
|         next if ($ip eq '0.0.0.0'); | ||||
|         next unless $ip; | ||||
|         $edp_index{$key} = $key; | ||||
|     } | ||||
|     return \%edp_index; | ||||
| } | ||||
|  | ||||
| sub edp_if { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $index = $edp->_edp_index() || {}; | ||||
|  | ||||
|     my %edp_if; | ||||
|     foreach my $key (keys %$index) { | ||||
|         my $iid = $key; | ||||
|         # ifIndex is first part of the iid | ||||
|         $iid = $1 if $iid =~ /^(\d+)\./; | ||||
|         $edp_if{$key} = $iid; | ||||
|     } | ||||
|   | ||||
|   return \%edp_if; | ||||
| } | ||||
|  | ||||
| sub edp_ip { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $index  = $edp->_edp_index() || {}; | ||||
|     my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {}; | ||||
|  | ||||
|     my %edp_ip; | ||||
|     foreach my $key ( keys %$index ) { | ||||
|         my $ip = $edp_ip->{$key}; | ||||
|         # MIB says should only be IPv4 | ||||
|         next unless ($ip =~ /\d+(\.\d+){3}/); | ||||
|         $edp_ip{$key} = $ip; | ||||
|     } | ||||
|     return \%edp_ip; | ||||
| } | ||||
|  | ||||
| sub edp_port { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $index    = $edp->_edp_index() || {}; | ||||
|     my $edp_rport = $edp->extremeEdpNeighborPort() || {}; | ||||
|     my $edp_rslot = $edp->extremeEdpNeighborSlot() || {}; | ||||
|  | ||||
|     my %edp_port; | ||||
|     foreach my $key ( sort keys %$edp_rport ) { | ||||
|         my $port = $edp_rport->{$key}; | ||||
|         my $slot = $edp_rslot->{$key} || 0; | ||||
|         next unless $port; | ||||
|         my $slotport = defined $slot ?  "$slot\/$port" : $port; | ||||
|  | ||||
|         foreach my $iid ( sort keys %$index ) { | ||||
|             $edp_port{$iid} = $slotport if ($iid =~ /^$key/); | ||||
|         } | ||||
|     } | ||||
|     return \%edp_port; | ||||
| } | ||||
|  | ||||
| sub edp_id { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $index    = $edp->_edp_index() || {}; | ||||
|     my $edp_name = $edp->edp_rem_sysname() || {}; | ||||
|  | ||||
|     my %edp_name; | ||||
|     foreach my $key ( sort keys %$edp_name ) { | ||||
|         my $name = $edp_name->{$key} || 0; | ||||
|         next unless $name; | ||||
|  | ||||
|         foreach my $iid ( sort keys %$index ) { | ||||
|             $edp_name{$iid} = $name if ($iid =~ /^$key/); | ||||
|         } | ||||
|     } | ||||
|     return \%edp_name; | ||||
| } | ||||
|  | ||||
| sub edp_ver { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $index   = $edp->_edp_index() || {}; | ||||
|     my $edp_ver = $edp->extremeEdpNeighborSoftwareVersion() || {}; | ||||
|  | ||||
|     my %edp_ver; | ||||
|     foreach my $key ( sort keys %$edp_ver ) { | ||||
|         my $ver = $edp_ver->{$key} || 0; | ||||
|         next unless $ver; | ||||
|  | ||||
|         foreach my $iid ( sort keys %$index ) { | ||||
|             $edp_ver{$iid} = $ver if ($iid =~ /^$key/); | ||||
|         } | ||||
|     } | ||||
|     return \%edp_ver; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::EDP - SNMP Interface to the Extreme Discovery Protocol (EDP) | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $edp = new SNMP::Info (  | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
|  | ||||
|  my $class = $edp->class(); | ||||
|  print " Using device sub class : $class\n"; | ||||
|  | ||||
|  $haslldp   = $edp->hasLLDP() ? 'yes' : 'no'; | ||||
|  | ||||
|  # Print out a map of device ports with LLDP neighbors: | ||||
|  my $interfaces    = $edp->interfaces(); | ||||
|  my $edp_if       = $edp->edp_if(); | ||||
|  my $edp_ip       = $edp->edp_ip(); | ||||
|  my $edp_port     = $edp->edp_port(); | ||||
|  | ||||
|  foreach my $edp_key (keys %$edp_ip){ | ||||
|     my $iid           = $edp_if->{$edp_key}; | ||||
|     my $port          = $interfaces->{$iid}; | ||||
|     my $neighbor      = $edp_ip->{$edp_key}; | ||||
|     my $neighbor_port = $edp_port->{$edp_key}; | ||||
|     print "Port : $port connected to $neighbor / $neighbor_port\n"; | ||||
|  } | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented  | ||||
| interface to EDP information through SNMP. | ||||
|  | ||||
| EDP is a Layer 2 protocol that allows a network device to advertise its | ||||
| identity and capabilities on the local network providing topology information. | ||||
|  | ||||
| Create or use a device subclass that inherits this class.  Do not use | ||||
| directly. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<EXTREME-EDP-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBAL METHODS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $edp->hasEDP() | ||||
|  | ||||
| Is EDP is active in this device?   | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $edp->edp_id() | ||||
|  | ||||
| Returns the string value used to identify the chassis component associated | ||||
| with the remote system. | ||||
|  | ||||
| (C<extremeEdpNeighborName>) | ||||
|  | ||||
| =item $edp->edp_if() | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table. | ||||
|  | ||||
| =item  $edp->edp_ip() | ||||
|  | ||||
| Returns remote IPv4 address. | ||||
|  | ||||
| =item $edp->edp_port() | ||||
|  | ||||
| Returns remote port ID | ||||
|  | ||||
| =item $edp->edp_ver() | ||||
|  | ||||
| Returns the operating system version of the remote system. | ||||
|  | ||||
| Nulls are removed before the value is returned.  | ||||
|  | ||||
| (C<extremeEdpNeighborSoftwareVersion>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
|  | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' ); | ||||
|  | ||||
| @@ -138,7 +138,7 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| F<ENTITY-MIB> is used by Layer 2 devices from HP, Aironet, Foundry, Cisco, | ||||
| F<ENTITY-MIB> is used by Layer 2 devices from Brocade, Cisco, HP, | ||||
| and more. | ||||
|  | ||||
| See RFC 2737 for full details. | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( 'EtherLike-MIB' => 'etherMIB' ); | ||||
|  | ||||
|   | ||||
							
								
								
									
										78
									
								
								Info/FDP.pm
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								Info/FDP.pm
									
									
									
									
									
								
							| @@ -42,18 +42,11 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|  | ||||
|     # CDP-Compatibility | ||||
|     'cdp_interval' => 'snFdpGlobalMessageInterval', | ||||
|     'cdp_holdtime' => 'snFdpGlobalHoldTime', | ||||
|     'cdp_id'       => 'snFdpGlobalDeviceId', | ||||
|  | ||||
|     # | ||||
|     'fdp_run'      => 'snFdpGlobalRun', | ||||
|     'fdp_interval' => 'snFdpGlobalMessageInterval', | ||||
|     'fdp_holdtime' => 'snFdpGlobalHoldTime', | ||||
| @@ -61,27 +54,27 @@ $VERSION = '2.08'; | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     'c_index'        => 'snFdpCacheIfIndex', | ||||
|     'c_proto'        => 'snFdpCacheAddressType', | ||||
|     'c_ip'           => 'snFdpCacheAddress', | ||||
|     'c_ver'          => 'snFdpCacheVersion', | ||||
|     'c_id'           => 'snFdpCacheDeviceId', | ||||
|     'c_port'         => 'snFdpCacheDevicePort', | ||||
|     'c_platform'     => 'snFdpCachePlatform', | ||||
|     'c_capabilities' => 'snFdpCacheCapabilities', | ||||
|     'c_domain'       => 'snFdpCacheVTPMgmtDomain', | ||||
|     'c_vlan'         => 'snFdpCacheNativeVLAN', | ||||
|     'c_duplex'       => 'snFdpCacheDuplex', | ||||
|     'fdp_index'        => 'snFdpCacheIfIndex', | ||||
|     'fdp_proto'        => 'snFdpCacheAddressType', | ||||
|     'fdp_ip'           => 'snFdpCacheAddress', | ||||
|     'fdp_ver'          => 'snFdpCacheVersion', | ||||
|     'fdp_id'           => 'snFdpCacheDeviceId', | ||||
|     'fdp_port'         => 'snFdpCacheDevicePort', | ||||
|     'fdp_platform'     => 'snFdpCachePlatform', | ||||
|     'fdp_capabilities' => 'snFdpCacheCapabilities', | ||||
|     'fdp_domain'       => 'snFdpCacheVTPMgmtDomain', | ||||
|     'fdp_vlan'         => 'snFdpCacheNativeVLAN', | ||||
|     'fdp_duplex'       => 'snFdpCacheDuplex', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     'c_capabilities' => \&SNMP::Info::munge_caps, | ||||
|     'c_ip'           => \&SNMP::Info::munge_ip | ||||
|     'fdp_capabilities' => \&SNMP::Info::munge_caps, | ||||
|     'fdp_ip'           => \&SNMP::Info::munge_ip | ||||
| ); | ||||
|  | ||||
| sub cdp_run { | ||||
| sub fdp_run { | ||||
|     my $fdp     = shift; | ||||
|     my $fdp_run = $fdp->fdp_run(); | ||||
|     my $fdp_run = $fdp->orig_fdp_run(); | ||||
|  | ||||
|     # if fdp_run isn't implemented on device, assume FDP is on | ||||
|     return $fdp_run if defined $fdp_run; | ||||
| @@ -107,7 +100,7 @@ sub hasFDP { | ||||
|     return $fdp->fdp_run(); | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
| sub fdp_if { | ||||
|     my $fdp = shift; | ||||
|  | ||||
|     # See if by some miracle Cisco implemented the fdpCacheIfIndex entry | ||||
| @@ -115,7 +108,7 @@ sub c_if { | ||||
|     return $fdp_index if defined $fdp_index; | ||||
|  | ||||
|     # Nope, didn't think so. Now we fake it. | ||||
|     my $fdp_ip = $fdp->c_ip(); | ||||
|     my $fdp_ip = $fdp->fdp_ip(); | ||||
|     unless ( defined $fdp_ip ) { | ||||
|         $fdp->error_throw( | ||||
|             "SNMP::Info::FDP:fdp_if() - Device doesn't have fdp_ip() data.  Can't fake fdp_index()" | ||||
| @@ -185,8 +178,7 @@ interface to FDP information through SNMP. | ||||
| FDP is a Layer 2 protocol that supplies topology information of | ||||
| devices that also speak FDP, mostly switches and routers.  It has | ||||
| similar functionality to Cisco's CDP, and the SNMP interface is | ||||
| virtually identical.  FDP is implemented in Foundry devices, including | ||||
| the Bigiron and Fastiron range. | ||||
| virtually identical.  FDP is implemented in Brocade (Foundry) devices. | ||||
|  | ||||
| Create or use a device subclass that inherits this class.  Do not use | ||||
| directly. | ||||
| @@ -256,19 +248,19 @@ CDP compatibility | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $fdp->c_interval() | ||||
| =item $fdp->fdp_interval() | ||||
|  | ||||
| Interval in seconds at which FDP messages are generated. | ||||
|  | ||||
| (C<fdpGlobalMessageInterval>) | ||||
|  | ||||
| =item $fdp->c_holdtime() | ||||
| =item $fdp->fdp_holdtime() | ||||
|  | ||||
| Time in seconds that FDP messages are kept.  | ||||
|  | ||||
| (C<fdpGlobalHoldTime>) | ||||
|  | ||||
| =item  $fdp->c_id()  | ||||
| =item  $fdp->fdp_id()  | ||||
|  | ||||
| Returns FDP device ID.   | ||||
|  | ||||
| @@ -277,7 +269,7 @@ retrieved from remote devices with $fdp->id(). | ||||
|  | ||||
| (C<fdpGlobalDeviceId>) | ||||
|  | ||||
| =item $cdp->cdp_run() | ||||
| =item $fdp->fdp_run() | ||||
|  | ||||
| Is FDP enabled on this device? | ||||
|  | ||||
| @@ -294,7 +286,7 @@ CDP compatibility | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $fdp->c_capabilities() | ||||
| =item $fdp->fdp_capabilities() | ||||
|  | ||||
| Returns Device Functional Capabilities.  Results are munged into an ascii | ||||
| binary string, 7 digits long, MSB.  Each digit represents a bit from the | ||||
| @@ -333,26 +325,26 @@ this information. | ||||
|  | ||||
| (C<fdpCacheCapabilities>) | ||||
|  | ||||
| =item $fdp->c_domain() | ||||
| =item $fdp->fdp_domain() | ||||
|  | ||||
| The CDP version of this returns remote VTP Management Domain as defined | ||||
| in C<CISCO-VTP-MIB::managementDomainName> | ||||
|  | ||||
| (C<fdpCacheVTPMgmtDomain>) | ||||
|  | ||||
| =item $fdp->c_duplex()  | ||||
| =item $fdp->fdp_duplex()  | ||||
|  | ||||
| Returns the port duplex status from remote devices. | ||||
|  | ||||
| (C<fdpCacheDuplex>) | ||||
|  | ||||
| =item $fdp->c_id() | ||||
| =item $fdp->fdp_id() | ||||
|  | ||||
| Returns remote device id string | ||||
|  | ||||
| (C<fdpCacheDeviceId>) | ||||
|  | ||||
| =item $fdp->c_if() | ||||
| =item $fdp->fdp_if() | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table. | ||||
|  | ||||
| @@ -380,7 +372,7 @@ truncate the last number off of it : | ||||
|   return \%fdp_if; | ||||
|  | ||||
|  | ||||
| =item $fdp->c_index() | ||||
| =item $fdp->fdp_index() | ||||
|  | ||||
| Returns the mapping to the SNMP2 Interface table for FDP Cache Entries.  | ||||
|  | ||||
| @@ -391,37 +383,37 @@ See fdp_if() entry. | ||||
|  | ||||
| (C<fdpCacheIfIndex>) | ||||
|  | ||||
| =item  $fdp->c_ip() | ||||
| =item  $fdp->fdp_ip() | ||||
|  | ||||
| Returns remote IP address | ||||
|  | ||||
| (C<fdpCacheAddress>) | ||||
|  | ||||
| =item $fdp->c_platform()  | ||||
| =item $fdp->fdp_platform()  | ||||
|  | ||||
| Returns remote platform id  | ||||
|  | ||||
| (C<fdpCachePlatform>) | ||||
|  | ||||
| =item $fdp->c_port() | ||||
| =item $fdp->fdp_port() | ||||
|  | ||||
| Returns remote port ID | ||||
|  | ||||
| (C<fdpDevicePort>) | ||||
|  | ||||
| =item  $fdp->c_proto() | ||||
| =item  $fdp->fdp_proto() | ||||
|  | ||||
| Returns remote address type received.  Usually IP. | ||||
|  | ||||
| (C<fdpCacheAddressType>) | ||||
|  | ||||
| =item $fdp->c_ver()  | ||||
| =item $fdp->fdp_ver()  | ||||
|  | ||||
| Returns remote hardware version | ||||
|  | ||||
| (C<fdpCacheVersion>) | ||||
|  | ||||
| =item $fdp->c_vlan() | ||||
| =item $fdp->fdp_vlan() | ||||
|  | ||||
| Returns the remote interface native VLAN. | ||||
|  | ||||
|   | ||||
| @@ -38,7 +38,7 @@ use Exporter; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', ); | ||||
|  | ||||
|   | ||||
							
								
								
									
										22
									
								
								Info/IPv6.pm
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								Info/IPv6.pm
									
									
									
									
									
								
							| @@ -44,7 +44,7 @@ use constant { | ||||
|     IPV6MIB => 3, | ||||
| }; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -59,7 +59,7 @@ $VERSION = '2.08'; | ||||
| %FUNCS = (  | ||||
|     'ip_n2p_phys_addr'  => 'ipNetToPhysicalPhysAddress',    # IP-MIB | ||||
|     'c_inet_phys_addr'  => 'cInetNetToMediaPhysAddress',    # CISCO-IETF-IP-MIB | ||||
|     'i6_n2p_phys_addr'  => 'ipv6NetToMediaNetAddress',      # IPV6-MIB | ||||
|     'i6_n2p_phys_addr'  => 'ipv6NetToMediaPhysAddress',     # IPV6-MIB | ||||
|  | ||||
|     'ip_n2p_phys_type'  => 'ipNetToPhysicalType',           # IP-MIB | ||||
|     'c_inet_phys_type'  => 'cInetNetToMediaType',           # CISCO-IETF-IP-MIB | ||||
| @@ -137,8 +137,17 @@ sub ipv6_n2p_addr { | ||||
|             } | ||||
|             if ($addrtype == 2) { # IPv6 | ||||
|                 my $v6_packed = pack("C*", split(/\./, $v6addr)); | ||||
|                 $v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) ); | ||||
|                 $return->{$row} = $v6addr; | ||||
|                 if (length($v6_packed) == 15) { | ||||
|                     # Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize,  | ||||
|                     # so what we've collected in that variable is actually the first byte of the address. | ||||
|                     $v6_packed = pack('C', $addrsize) . $v6_packed; | ||||
|                 } | ||||
|                 if (length($v6_packed) == 16) { | ||||
|                     $v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) ); | ||||
|                     $return->{$row} = $v6addr; | ||||
|                 } else { | ||||
|                     printf("Invalid size for IPv6 address: expected 16 bytes, got %d (%s = %s)\n", length($v6_packed), $row, $net_addr->{$row}); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -385,8 +394,9 @@ Jeroen van Ingen and Carlos Vicente | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses  | ||||
| to MAC addresses, interfaces and more. It will use data from the IP-MIB, IPV6-MIB  | ||||
| or the CISCO-IETF-IP-MIB, whichever is supported by the device. | ||||
| to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>, | ||||
| F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the | ||||
| device. | ||||
|  | ||||
| This class is inherited by Info::Layer3 to provide IPv6 node tracking across   | ||||
| device classes. | ||||
|   | ||||
							
								
								
									
										41
									
								
								Info/LLDP.pm
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								Info/LLDP.pm
									
									
									
									
									
								
							| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'LLDP-MIB'          => 'lldpLocSysCapEnabled', | ||||
| @@ -95,24 +95,30 @@ sub hasLLDP { | ||||
|  | ||||
| sub lldp_if { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift || 0; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $addr    = $lldp->lldp_rem_pid($partial) || {}; | ||||
|     my $i_descr = $lldp->i_description() || {}; | ||||
|     my $i_alias = $lldp->i_alias() || {}; | ||||
|     my %r_i_descr = reverse %$i_descr; | ||||
|     my %r_i_alias = reverse %$i_alias; | ||||
|      | ||||
|     my %lldp_if; | ||||
|     foreach my $key ( keys %$addr ) { | ||||
|         my @aOID = split( '\.', $key ); | ||||
|         my $port = $aOID[1]; | ||||
|         next unless $port; | ||||
|         # Local LLDP port may not equate to ifIndex | ||||
|         # Cross reference lldpLocPortDesc with ifDescr to get ifIndex | ||||
|         # Local LLDP port may not equate to ifIndex, see LldpPortNumber TEXTUAL-CONVENTION in LLDP-MIB. | ||||
|         # Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex, | ||||
|         # prefer ifDescr over ifAlias because using cross ref with description is correct behavior  | ||||
|         # according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though. | ||||
|         my $lldp_desc = $lldp->lldpLocPortDesc($port); | ||||
|         my $desc = $lldp_desc->{$port}; | ||||
|         # If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum | ||||
|         if ( exists $r_i_descr{$desc} ) { | ||||
|             $port = $r_i_descr{$desc}; | ||||
|         } elsif ( exists $r_i_alias{$desc} ) { | ||||
|             $port = $r_i_alias{$desc}; | ||||
|         } | ||||
|          | ||||
|         $lldp_if{$key} = $port; | ||||
| @@ -122,7 +128,7 @@ sub lldp_if { | ||||
|  | ||||
| sub lldp_ip { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift || 0; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $rman_addr = $lldp->lldp_rman_addr($partial) || {}; | ||||
|  | ||||
| @@ -138,7 +144,7 @@ sub lldp_ip { | ||||
|  | ||||
| sub lldp_addr { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift || 0; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $rman_addr = $lldp->lldp_rman_addr($partial) || {}; | ||||
|  | ||||
| @@ -153,7 +159,7 @@ sub lldp_addr { | ||||
|  | ||||
| sub lldp_port { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift || 0; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $pdesc = $lldp->lldp_rem_desc($partial)     || {}; | ||||
|     my $pid   = $lldp->lldp_rem_pid($partial)      || {}; | ||||
| @@ -162,10 +168,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 | ||||
| @@ -175,7 +186,7 @@ sub lldp_port { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         # Nortel lldpRemPortDesc doesn't match ifDescr, but we can still | ||||
|         # Avaya/Nortel lldpRemPortDesc doesn't match ifDescr, but we can still | ||||
|         # figure out slot.port based upon lldpRemPortDesc | ||||
|         if ( $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ ) { | ||||
|             $port = defined $1 ? "$2.$3" : "$3"; | ||||
| @@ -188,7 +199,7 @@ sub lldp_port { | ||||
|  | ||||
| sub lldp_id { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift || 0; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $ch_type = $lldp->lldp_rem_id_type($partial) || {}; | ||||
|     my $ch      = $lldp->lldp_rem_id($partial)      || {}; | ||||
| @@ -400,10 +411,6 @@ capability and nothing else." | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| Methods accessing the (C<lldpRemTable>) table use a partial value of zero if  | ||||
| not provided to set the (C<lldpRemTimeMark>) TimeMark instance to a known value | ||||
| as per RFC 2021. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $lldp->lldp_id() | ||||
| @@ -415,9 +422,9 @@ with the remote system. | ||||
|  | ||||
| =item $lldp->lldp_if() | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table.  Trys to cross reference  | ||||
| (C<lldpLocPortDesc>) with (C<ifDescr>) to get (C<ifIndex>), if unable  | ||||
| defaults to (C<lldpRemLocalPortNum>). | ||||
| Returns the mapping to the SNMP Interface Table. Tries to cross reference  | ||||
| (C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>),  | ||||
| if unable defaults to (C<lldpRemLocalPortNum>). | ||||
|  | ||||
| =item  $lldp->lldp_ip() | ||||
|  | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' ); | ||||
|  | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::Layer1; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', ); | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::Layer1; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, ); | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -93,7 +93,7 @@ sub os { | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'nortel'; | ||||
|     return 'avaya'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
| @@ -469,7 +469,7 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay / Nortel Hubs | ||||
| SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay/Nortel/Avaya Hubs | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -541,7 +541,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $bayhub->vendor() | ||||
|  | ||||
| Returns 'nortel' | ||||
| Returns 'avaya' | ||||
|  | ||||
| =item $bayhub->os() | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Layer1; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer1::MIBS, | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|   | ||||
| @@ -45,7 +45,7 @@ use SNMP::Info::PowerEthernet; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %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; | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Airespace | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # | ||||
| @@ -41,13 +40,14 @@ use SNMP::Info::Airespace; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,      %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::CDP::MIBS, %SNMP::Info::Airespace::MIBS, | ||||
|     'AIRESPACE-SWITCHING-MIB' => 'agentInterfaceVlanId', | ||||
|     'CISCO-LWAPP-DOT11-CLIENT-MIB' => 'cldcClientCurrentTxRateSet', | ||||
|     'CISCO-LWAPP-DOT11-MIB'        => 'cldHtDot11nChannelBandwidth', | ||||
|     'CISCO-LWAPP-AP-MIB'           => 'cLApIfMacAddress', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| @@ -58,28 +58,68 @@ $VERSION = '2.08'; | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS,      %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::CDP::FUNCS, %SNMP::Info::Airespace::FUNCS, | ||||
|  | ||||
|     # This needs to be cleaned up, but for now we pretend to | ||||
|     # have the CISCO-DOT11-MIB for signal strengths, etc. | ||||
|     'cd11_sigstrength' => 'bsnMobileStationRSSI',	# kinda | ||||
|     'cd11_sigqual'     => 'bsnMobileStationSnr',	# kinda | ||||
|     'cd11_rxbyte'      => 'bsnMobileStationBytesReceived', | ||||
|     'cd11_txbyte'      => 'bsnMobileStationBytesSent', | ||||
|     'cd11_rxpkt'       => 'bsnMobileStationPacketsReceived', | ||||
|     'cd11_txpkt'       => 'bsnMobileStationPacketsSent', | ||||
|     'cd11_txrate'      => 'cldcClientCurrentTxRateSet', | ||||
|     # CISCO-LWAPP-AP-MIB::cLApTable | ||||
|     'ap_if_mac'        => 'cLApIfMacAddress', | ||||
|     # CISCO-LWAPP-DOT11-CLIENT-MIB::cldcClientTable | ||||
|     'client_txrate'    => 'cldcClientCurrentTxRateSet', | ||||
|     'cd11_proto'       => 'cldcClientProtocol', | ||||
|     'cd11_rateset'     => 'cldcClientDataRateSet', | ||||
|     # CISCO-LWAPP-DOT11-MIB::cldHtMacOperationsTable | ||||
|     'cd11n_ch_bw'      => 'cldHtDot11nChannelBandwidth', | ||||
|  | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::MUNGE,      %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::CDP::MUNGE, %SNMP::Info::Airespace::MUNGE, | ||||
|     'cd11_rxpkt'	=> \&munge_64bits, | ||||
|     'cd11_txpkt'	=> \&munge_64bits, | ||||
|     'cd11_txrate'       => \&munge_cd11_txrate, | ||||
|     'ap_if_mac'         => \&SNMP::Info::munge_mac, | ||||
|     'cd11n_ch_bw'       => \&munge_cd11n_ch_bw, | ||||
|     'cd11_rateset'      => \&munge_cd11_rateset, | ||||
|     'cd11_proto'        => \&munge_cd11_proto, | ||||
| ); | ||||
|  | ||||
| # 802.11n Modulation and Coding Scheme (MCS) | ||||
| my $mcs_index = { | ||||
|     20 => { | ||||
| 	m0  => '6.5', | ||||
| 	m1  => '13', | ||||
| 	m2  => '19.5', | ||||
| 	m3  => '26', | ||||
| 	m4  => '39', | ||||
| 	m5  => '52', | ||||
| 	m6  => '58.5', | ||||
| 	m7  => '65', | ||||
| 	m8  => '13', | ||||
| 	m9  => '26', | ||||
| 	m10 => '39', | ||||
| 	m11 => '52', | ||||
| 	m12 => '78', | ||||
| 	m13 => '104', | ||||
| 	m14 => '117', | ||||
| 	m15 => '130', | ||||
| 	# This is a cheat for 802.11a bonded | ||||
| 	m108 => '108', | ||||
|     }, | ||||
|     40 => { | ||||
| 	m0  => '15', | ||||
| 	m1  => '30', | ||||
| 	m2  => '45', | ||||
| 	m3  => '60', | ||||
| 	m4  => '90', | ||||
| 	m5  => '120', | ||||
| 	m6  => '135', | ||||
| 	m7  => '157.5', | ||||
| 	m8  => '30', | ||||
| 	m9  => '60', | ||||
| 	m10 => '90', | ||||
| 	m11 => '120', | ||||
| 	m12 => '180', | ||||
| 	m13 => '240', | ||||
| 	m14 => '270', | ||||
| 	m15 => '300', | ||||
|     } | ||||
| }; | ||||
|  | ||||
| sub os { | ||||
|     return 'cisco'; | ||||
| } | ||||
| @@ -96,9 +136,6 @@ sub model { | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| # vlan: | ||||
| # AIRESPACE-SWITCHING-MIB::agentInterfaceVlanId | ||||
|  | ||||
| sub cd11_mac { | ||||
|     my $airespace = shift; | ||||
|     my $cd11_sigstrength = $airespace->cd11_sigstrength(); | ||||
| @@ -111,13 +148,47 @@ sub cd11_mac { | ||||
|     return $ret; | ||||
| } | ||||
|  | ||||
| sub munge_cd11_txrate { | ||||
|     my $rate = shift; | ||||
|     if ( $rate ) { | ||||
|         return [ $rate * 1.0 ]; | ||||
|     } else { | ||||
|         return [ 0.0 ]; | ||||
| sub cd11_txrate { | ||||
|     my $airespace = shift; | ||||
|      | ||||
|     my $rates  = $airespace->client_txrate() || {}; | ||||
|     my $protos = $airespace->cd11_proto()    || {}; | ||||
|     my $bws    = $airespace->cd11n_ch_bw()   || {}; | ||||
|      | ||||
|     my $cd11_txrate = {}; | ||||
|     foreach my $idx ( keys %$rates ) { | ||||
| 	my $rate = $rates->{$idx} || '0.0'; | ||||
| 	 | ||||
| 	if ( $rate =~ /^\d+/ ) { | ||||
|             $cd11_txrate->{$idx} = [ $rate * 1.0 ]; | ||||
| 	} | ||||
| 	elsif ( $rate =~ /^m/ ) { | ||||
| 	    my $band = $protos->{$idx}; | ||||
| 	    my $bw   = $bws->{$band}; | ||||
| 	    $cd11_txrate->{$idx} = [ $mcs_index->{$bw}->{$rate} || '0.0' ]; | ||||
| 	} | ||||
| 	else { | ||||
| 	    $cd11_txrate->{$idx} = [ $rate ]; | ||||
| 	} | ||||
|     } | ||||
|     return $cd11_txrate; | ||||
| } | ||||
|  | ||||
| sub munge_cd11n_ch_bw { | ||||
|     my $bw = shift; | ||||
|      | ||||
|     if ( $bw =~ /forty/ ) { | ||||
| 	return 40; | ||||
|     } | ||||
|     return 20; | ||||
| } | ||||
|  | ||||
| sub munge_cd11_proto { | ||||
|     my $bw = shift; | ||||
|      | ||||
|     return 2 if ( $bw eq 'dot11n5' ); | ||||
|  | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| sub munge_cd11_rateset { | ||||
| @@ -125,11 +196,29 @@ sub munge_cd11_rateset { | ||||
|     return [ map { $_ * 1.0 } split /,/, $rates ]; | ||||
| } | ||||
|  | ||||
| sub munge_64bits { | ||||
|     # The controller sometimes hands off a ridiculous value for packets. | ||||
|     # Just truncate it to 32 bits. | ||||
|     my $value = shift; | ||||
|     return $value & 0xffffffff; | ||||
| # Cisco provides the AP's Ethernet MAC via | ||||
| # CISCO-LWAPP-AP-MIB::cLApIfMacAddress this was not available pre-Cisco | ||||
| sub i_mac { | ||||
|     my $airespace = shift; | ||||
|     my $partial   = shift; | ||||
|  | ||||
|     my $i_index = $airespace->i_index($partial)  || {}; | ||||
|     my $ap_mac  = $airespace->ap_if_mac()        || {}; | ||||
|  | ||||
|     my $i_mac = $airespace->SUPER::i_mac() || {}; | ||||
|     foreach my $iid ( keys %$i_index ) { | ||||
| 	my $index = $i_index->{$iid}; | ||||
| 	next unless defined $index; | ||||
|  | ||||
| 	if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) { | ||||
| 	    $index =~ s/\.\d+$//; | ||||
| 	    next unless defined $index; | ||||
| 	    my $sys_mac = join( '.', map { hex($_) } split( ':', $index ) ); | ||||
| 	    my $mac = $ap_mac->{$sys_mac}; | ||||
| 	    $i_mac->{$iid} = $mac; | ||||
| 	} | ||||
|     } | ||||
|     return $i_mac; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| @@ -187,6 +276,12 @@ my $airespace = new SNMP::Info::Layer2::Airespace(...); | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<CISCO-LWAPP-DOT11-CLIENT-MIB> | ||||
|  | ||||
| =item F<CISCO-LWAPP-DOT11-MIB> | ||||
|  | ||||
| =item F<CISCO-LWAPP-AP-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements. | ||||
| @@ -238,10 +333,24 @@ to a hash. | ||||
|  | ||||
| =item cd11_mac() | ||||
|  | ||||
| Returns client radio interface MAC addresses. | ||||
|  | ||||
| =item cd11_txrate() | ||||
|  | ||||
| Returns client transmission speed in Mbs. | ||||
|  | ||||
| =back  | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item i_mac() | ||||
|  | ||||
| Adds AP Ethernet MAC as port mac on radio ports from C<CISCO-LWAPP-AP-MIB>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Airespace | ||||
|  | ||||
| See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details. | ||||
| @@ -254,15 +363,22 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head1 MUNGES | ||||
| =head1 Data Munging Callback Subroutines | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item munge_64bits() | ||||
| =item munge_cd11n_ch_bw() | ||||
|  | ||||
| Converts 802.11n channel bandwidth to either 20 or 40. | ||||
|  | ||||
| =item munge_cd11_proto() | ||||
|  | ||||
| Converts 802.11n 2.4Ghz to 1 and 5Ghz to 2 to correspond to the | ||||
| (C<cldHtMacOperationsTable>) index. | ||||
|  | ||||
| =item munge_cd11_rateset() | ||||
|  | ||||
| =item munge_cd11_txrate() | ||||
| Converts rate set to array. | ||||
|  | ||||
| =back | ||||
|  | ||||
|   | ||||
| @@ -49,7 +49,7 @@ use SNMP::Info::IEEE802dot11; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::IEEE802dot11::GLOBALS, | ||||
| @@ -437,6 +437,26 @@ sub i_ssidbcast { | ||||
|     return $i_ssidbcast; | ||||
| } | ||||
|  | ||||
| sub i_ssidmac { | ||||
|     my $aironet    = shift; | ||||
|     my $partial    = shift; | ||||
|     my $mbss_mac_addr = $aironet->mbss_mac_addr(); | ||||
|  | ||||
|     # Same logic as i_ssidbcast to return same indexes as i_ssidlist  | ||||
|     my $map = {}; | ||||
|     foreach my $key ( keys %$mbss_mac_addr ) { | ||||
|         my ( $interface, @idx ) = split( /\./, $key ); | ||||
|         $map->{ pack( "C*", @idx ) } = $mbss_mac_addr->{$key}; | ||||
|     } | ||||
|  | ||||
|     my $i_ssidlist  = $aironet->i_ssidlist(); | ||||
|     my $i_ssidmac = {}; | ||||
|     foreach my $key ( keys %$i_ssidlist ) { | ||||
|         $i_ssidmac->{$key} = $map->{ $i_ssidlist->{$key} }; | ||||
|     } | ||||
|     return $i_ssidmac; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| @@ -556,7 +576,7 @@ Returns radio interfaces. | ||||
|  | ||||
| =item $aironet->cd11_mac() | ||||
|  | ||||
| Returns radio interface MAC addresses. | ||||
| Returns client radio interface MAC addresses. | ||||
|  | ||||
| =item $aironet->cd11_ssid() | ||||
|  | ||||
| @@ -623,6 +643,11 @@ to which they belong. | ||||
| With the same keys as i_ssidlist, returns whether the given SSID is | ||||
| being broadcast. | ||||
|  | ||||
| =item $aironet->i_ssidmac() | ||||
|  | ||||
| With the same keys as i_ssidlist, returns the Basic service set | ||||
| identification (BSSID), MAC address, the AP is using for the SSID.  | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|   | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::Layer1; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %GLOBALS = ( %SNMP::Info::Layer2::GLOBALS ); | ||||
|  | ||||
|   | ||||
| @@ -1,492 +0,0 @@ | ||||
| # SNMP::Info::Layer2::Bay | ||||
| # $Id$ | ||||
| # This module depricated.  See Layer2::BayStack | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| # Copyright (c) 2002,2003 Regents of the University of California | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Bay; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Bay::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Bay::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
|  | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     'cdp_id'  => 's5EnMsTopIpAddr', | ||||
|     'cdp_run' => 's5EnMsTopStatus', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     'imac2' => 'ifPhysAddress', | ||||
|  | ||||
|     # S5-ETH-MULTISEG-TOPOLOGY-MIB::s5EnMsTopNmmTable | ||||
|     'bay_topo_slot'     => 's5EnMsTopNmmSlot', | ||||
|     'bay_topo_port'     => 's5EnMsTopNmmPort', | ||||
|     'bay_topo_ip'       => 's5EnMsTopNmmIpAddr', | ||||
|     'bay_topo_seg'      => 's5EnMsTopNmmSegId', | ||||
|     'bay_topo_mac'      => 's5EnMsTopNmmMacAddr', | ||||
|     'bay_topo_platform' => 's5EnMsTopNmmChassisType', | ||||
|     'bay_topo_localseg' => 's5EnMsTopNmmLocalSeg', | ||||
| ); | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'SYNOPTICS-ROOT-MIB'           => 'synoptics', | ||||
|     'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop' | ||||
| ); | ||||
|  | ||||
| delete $MIBS{'CISCO-CDP-MIB'}; | ||||
|  | ||||
| # 450's report full duplex as speed = 20mbps?! | ||||
| $SNMP::Info::SPEED_MAP{20_000_000}  = '10 Mbps'; | ||||
| $SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps'; | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, 'i_mac2' => \&SNMP::Info::munge_mac, ); | ||||
|  | ||||
| sub os { | ||||
|     return 'bay'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $bay   = shift; | ||||
|     my $descr = $bay->description(); | ||||
|     return unless defined $descr; | ||||
|  | ||||
|     # 303 / 304 | ||||
|     if ( $descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|  | ||||
|     # 450 | ||||
|     if ( $descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub os_bin { | ||||
|     my $bay   = shift; | ||||
|     my $descr = $bay->description(); | ||||
|     return unless defined $descr; | ||||
|  | ||||
|     # 303 / 304 | ||||
|     if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|  | ||||
|     # 450 | ||||
|     if ( $descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|  | ||||
|     # or nortel, or synopsis? | ||||
|     return 'bay'; | ||||
| } | ||||
|  | ||||
| sub i_ignore { | ||||
|     my $bay   = shift; | ||||
|     my $descr = $bay->description(); | ||||
|  | ||||
|     my $i_type = $bay->i_type(); | ||||
|  | ||||
|     my %i_ignore; | ||||
|     foreach my $if ( keys %$i_type ) { | ||||
|         my $type = $i_type->{$if}; | ||||
|         $i_ignore{$if}++ if $type =~ /(loopback|propvirtual|cpu)/i; | ||||
|     } | ||||
|  | ||||
|     return \%i_ignore; | ||||
| } | ||||
|  | ||||
| sub interfaces { | ||||
|     my $bay     = shift; | ||||
|     my $i_index = $bay->i_index(); | ||||
|  | ||||
|     return $i_index; | ||||
| } | ||||
|  | ||||
| sub i_mac { | ||||
|     my $bay   = shift; | ||||
|     my $i_mac = $bay->i_mac2(); | ||||
|  | ||||
|     # Bay 303's with a hw rev < 2.11.4.5 report the mac as all zeros | ||||
|     foreach my $iid ( keys %$i_mac ) { | ||||
|         my $mac = $i_mac->{$iid}; | ||||
|         delete $i_mac->{$iid} if $mac eq '00:00:00:00:00:00'; | ||||
|     } | ||||
|     return $i_mac; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $bay = shift; | ||||
|     my $id  = $bay->id(); | ||||
|     return unless defined $id; | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|     return $id unless defined $model; | ||||
|     $model =~ s/^sreg-//i; | ||||
|  | ||||
|     my $descr = $bay->description(); | ||||
|  | ||||
|     return '303' if ( $descr =~ /\D303\D/ ); | ||||
|     return '304' if ( $descr =~ /\D304\D/ ); | ||||
|     return '450' if ( $model =~ /BayStack450/ ); | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| # Hack in some CDP type stuff | ||||
|  | ||||
| sub c_if { | ||||
|     my $bay           = shift; | ||||
|     my $bay_topo_port = $bay->bay_topo_port(); | ||||
|  | ||||
|     my %c_if; | ||||
|     foreach my $entry ( keys %$bay_topo_port ) { | ||||
|         my $port = $bay_topo_port->{$entry}; | ||||
|         next unless defined $port; | ||||
|         next if $port == 0; | ||||
|         $c_if{"$port.1"} = $port; | ||||
|     } | ||||
|     return \%c_if; | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $bay           = shift; | ||||
|     my $bay_topo_ip   = $bay->bay_topo_ip(); | ||||
|     my $bay_topo_port = $bay->bay_topo_port(); | ||||
|     my $ip            = $bay->cdp_ip(); | ||||
|  | ||||
|     # Count the number of devices seen on each port. | ||||
|     #   more than one device seen means connected to a non-bay | ||||
|     #   device, but other bay devices are squawking further away. | ||||
|     my %ip_port; | ||||
|     foreach my $entry ( keys %$bay_topo_ip ) { | ||||
|         my $port = $bay_topo_port->{$entry}; | ||||
|         next unless defined $port; | ||||
|         next if ( $port =~ /^[\d\.]+$/ and $port == 0 ); | ||||
|         my $ip = $bay_topo_ip->{$entry}; | ||||
|         push( @{ $ip_port{$port} }, $ip ); | ||||
|     } | ||||
|  | ||||
|     my %c_ip; | ||||
|     foreach my $port ( keys %ip_port ) { | ||||
|         my $ips = $ip_port{$port}; | ||||
|         if ( scalar @$ips == 1 ) { | ||||
|             $c_ip{"$port.1"} = $ips->[0]; | ||||
|         } | ||||
|         else { | ||||
|             $c_ip{"$port.1"} = $ips; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return \%c_ip; | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
|     my $bay           = shift; | ||||
|     my $bay_topo_port = $bay->bay_topo_port(); | ||||
|     my $bay_topo_seg  = $bay->bay_topo_seg(); | ||||
|  | ||||
|     my %c_port; | ||||
|     foreach my $entry ( keys %$bay_topo_seg ) { | ||||
|         my $port = $bay_topo_port->{$entry}; | ||||
|         next unless defined $port; | ||||
|         next if $port == 0; | ||||
|  | ||||
|         # For fake remotes (multiple IPs for a c_ip), use first found | ||||
|         next if defined $c_port{"$port.1"}; | ||||
|  | ||||
|         my $seg = $bay_topo_seg->{$entry}; | ||||
|  | ||||
|         # Segment id is (256 * remote slot_num) + (remote_port) | ||||
|         my $remote_port = $seg % 256; | ||||
|  | ||||
|         $c_port{"$port.1"} = $remote_port; | ||||
|     } | ||||
|  | ||||
|     return \%c_port; | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $bay               = shift; | ||||
|     my $bay_topo_port     = $bay->bay_topo_port(); | ||||
|     my $bay_topo_platform = $bay->bay_topo_platform(); | ||||
|  | ||||
|     my %c_platform; | ||||
|     foreach my $entry ( keys %$bay_topo_platform ) { | ||||
|         my $port = $bay_topo_port->{$entry} || 0; | ||||
|         next if $port == 0; | ||||
|  | ||||
|         # For fake remotes (multiple IPs for a c_ip), use first found | ||||
|         next if defined $c_platform{"$port.1"}; | ||||
|  | ||||
|         my $platform = $bay_topo_platform->{$entry}; | ||||
|  | ||||
|         $c_platform{"$port.1"} = $platform; | ||||
|     } | ||||
|  | ||||
|     return \%c_platform; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Bay - SNMP Interface to old Bay Network BayStack Switches | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
| This module is Deprecated.  Please use Layer2::BayStack instead. | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Bay device through SNMP.  | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $bay = new SNMP::Info::Layer2::Bay(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<SYNOPTICS-ROOT-MIB> | ||||
|  | ||||
| =item F<S5-ETH-MULTISEG-TOPOLOGY-MIB> | ||||
|  | ||||
| =item Inherited classes | ||||
|  | ||||
| MIBs required by L<SNMP::Info::Layer2/"Required MIBs"> and its superclasses. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $bay->vendor() | ||||
|  | ||||
| Returns 'bay' :) | ||||
|  | ||||
| =item $bay->model() | ||||
|  | ||||
| Cross references $bay->id() to the F<SYNOPTICS-MIB> and returns | ||||
| the results.  303s and 304s have the same ID, so we have a hack | ||||
| to return depending on which it is.  | ||||
|  | ||||
| Removes C<sreg-> from the model name | ||||
|  | ||||
| =item $baystack->os() | ||||
|  | ||||
| Returns 'bay'. | ||||
|  | ||||
| =item $bay->os_ver() | ||||
|  | ||||
| Returns the os version extracted from C<sysDescr>. | ||||
|  | ||||
| =item $bay->os_bin() | ||||
|  | ||||
| Returns the firmware version extracted from C<sysDescr>. | ||||
|  | ||||
| =item $bay->cdp_id() | ||||
|  | ||||
| Returns the IP that the device is sending out for its Nmm topology info. | ||||
|  | ||||
| (C<s5EnMsTopIpAddr>) | ||||
|  | ||||
| =item $bay->cdp_run() | ||||
|  | ||||
| Returns if the F<S5-ETH-MULTISEG-TOPOLOGY> info is on for this device.  | ||||
|  | ||||
| (C<s5EnMsTopStatus>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $bay->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to physical ports.  | ||||
|  | ||||
| Currently simply returns the C<ifIndex> | ||||
|  | ||||
| =item $bay->i_ignore() | ||||
|  | ||||
| Returns reference to hash of IIDs to ignore. | ||||
|  | ||||
| Simply calls the SNMP::Info::Layer2::i_ignore() for this. | ||||
|  | ||||
| =item $bay->i_mac() | ||||
|  | ||||
| Returns the C<ifPhysAddress> table entries.  | ||||
|  | ||||
| Removes all entries matching '00:00:00:00:00:00' -- Certain  | ||||
| older revisions of Bay 303 and 304 firmware report all zeros | ||||
| for each port mac. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Pseudo CDP information | ||||
|  | ||||
| All entries with port=0 are local and ignored. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $bay->c_if() | ||||
|  | ||||
| Returns reference to hash.  Key: port.1 Value: port (iid) | ||||
|  | ||||
| =item $bay->c_ip() | ||||
|  | ||||
| Returns reference to hash.  Key: port.1  | ||||
|  | ||||
| The value of each hash entry can either be a scalar or an array. | ||||
| A scalar value is most likely a direct neighbor to that port.  | ||||
| It is possible that there is a non-bay device in between this device and the | ||||
| remote device. | ||||
|  | ||||
| An array value represents a list of seen devices.  The only time you will get | ||||
| an array of neighbors, is if there is a non-bay device in between two or more | ||||
| devices.  | ||||
|  | ||||
| Use the data from the Layer2 Topology Table below to dig deeper. | ||||
|  | ||||
| =item $bay->c_port() | ||||
|  | ||||
| Returns reference to hash. Key: IID, Value: Remote port (interfaces) | ||||
|  | ||||
| =item $bay->c_platform() | ||||
|  | ||||
| Returns reference to hash. Key: IID, Value: Remote device type | ||||
|  | ||||
| =item $bay->port() | ||||
|  | ||||
| Returns reference to hash. Key: port.1 Value: port | ||||
|  | ||||
| =item $bay->platform() | ||||
|  | ||||
| Returns reference to hash. Key: port.1 Value: Remote Device Type | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Layer2 Topology info (C<s5EnMsTopNmmTable>) | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $bay->bay_topo_slot() | ||||
|  | ||||
| Returns reference to hash.  Key: Table entry, Value:slot number | ||||
|  | ||||
| (C<s5EnMsTopNmmSlot>) | ||||
|  | ||||
| =item $bay->bay_topo_port() | ||||
|  | ||||
| Returns reference to hash.  Key: Table entry, Value:Port Number | ||||
| (interface iid) | ||||
|  | ||||
| (C<s5EnMsTopNmmPort>) | ||||
|  | ||||
| =item $bay->bay_topo_ip() | ||||
|  | ||||
| Returns reference to hash.  Key: Table entry, Value:Remote IP address of entry | ||||
|  | ||||
| (C<s5EnMsTopNmmIpAddr>) | ||||
|  | ||||
| =item $bay->bay_topo_seg() | ||||
|  | ||||
| Returns reference to hash.  Key: Table entry, Value:Remote Segment ID | ||||
|  | ||||
| (C<s5EnMsTopNmmSegId>) | ||||
|  | ||||
| =item $bay->bay_topo_mac | ||||
| (C<s5EnMsTopNmmMacAddr>) | ||||
|  | ||||
| Returns reference to hash.  Key: Table entry, Value:Remote MAC address | ||||
|  | ||||
| =item $bay->bay_topo_platform | ||||
|  | ||||
| Returns reference to hash.  Key: Table entry, Value:Remote Device Type | ||||
|  | ||||
| (C<s5EnMsTopNmmChassisType>) | ||||
|  | ||||
| =item $bay->bay_topo_localseg | ||||
|  | ||||
| Returns reference to hash.  Key: Table entry, Value:Boolean, if bay_topo_seg() | ||||
| is local | ||||
|  | ||||
| (C<s5EnMsTopNmmLocalSeg>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -46,12 +46,13 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS,    %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS, | ||||
|     %SNMP::Info::SONMP::MIBS, | ||||
|     'BAY-STACK-PETH-EXT-MIB' => 'bspePethPsePortExtMeasuredPower', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| @@ -64,6 +65,7 @@ $VERSION = '2.08'; | ||||
|     %SNMP::Info::Layer3::FUNCS,    %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS, | ||||
|     %SNMP::Info::SONMP::FUNCS, | ||||
|     'peth_port_power' => 'bspePethPsePortExtMeasuredPower', | ||||
| ); | ||||
|  | ||||
| # 450's report full duplex as speed = 20mbps?! | ||||
| @@ -79,27 +81,20 @@ $SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps'; | ||||
|  | ||||
| sub os { | ||||
|     my $baystack = shift; | ||||
|     my $descr    = $baystack->description(); | ||||
|     my $model    = $baystack->model(); | ||||
|     my $descr    = $baystack->description() || ""; | ||||
|     my $model    = $baystack->model() || ""; | ||||
|  | ||||
|     if ( ( defined $descr and $descr =~ /Business Ethernet Switch.*SW:v/i ) ) | ||||
|     { | ||||
|     if ( $descr =~ /Business Ethernet Switch.*SW:v/i ) { | ||||
|         return 'bes'; | ||||
|     } | ||||
|     if ( | ||||
|         ( | ||||
|            (defined $model and $model =~ /(420|425|BPS)/ ) | ||||
|         and | ||||
|            (defined $descr and $descr =~ m/SW:v[1-2]/i ) | ||||
|         ) | ||||
|         or | ||||
|         ( | ||||
|             (defined $model and $model =~ /(410|450|380)/ ) | ||||
|         ) | ||||
|        ) | ||||
|     if (   ( ( $model =~ /(420|425|BPS)/ ) and ( $descr =~ m/SW:v[1-2]/i ) ) | ||||
|         or ( ( $model =~ /(410|450|380)/ ) ) ) | ||||
|     { | ||||
|         return 'baystack'; | ||||
|     } | ||||
|     if ( $model =~ /VSP/ ) { | ||||
|         return 'vsp'; | ||||
|     } | ||||
|  | ||||
|     return 'boss'; | ||||
| } | ||||
| @@ -126,7 +121,7 @@ sub os_bin { | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'nortel'; | ||||
|     return 'avaya'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
| @@ -141,9 +136,12 @@ sub model { | ||||
|     return '303' if ( defined $descr and $descr =~ /\D303\D/ ); | ||||
|     return '304' if ( defined $descr and $descr =~ /\D304\D/ ); | ||||
|     return 'BPS' if ( $model =~ /BPS2000/i ); | ||||
|     return $2 | ||||
|         if ( $model | ||||
|         =~ /(ES|ERS|BayStack|EthernetRoutingSwitch|EthernetSwitch)-?(\d+)/ ); | ||||
|      | ||||
|     # Pull sreg- from all | ||||
|     $model =~ s/^sreg-//; | ||||
|     # Strip ES/ERS/BayStack etc. from those families | ||||
|     $model =~ s/^(E(R)?S|BayStack|Ethernet(Routing)?Switch)-?//; | ||||
|     $model =~ s/-ethSwitchNMM//; | ||||
|  | ||||
|     return $model; | ||||
| } | ||||
| @@ -214,7 +212,7 @@ sub i_name { | ||||
|  | ||||
| sub index_factor { | ||||
|     my $baystack = shift; | ||||
|     my $model    = $baystack->model(); | ||||
|     my $model    = $baystack->model() || ""; | ||||
|     my $os       = $baystack->os(); | ||||
|     my $os_ver   = $baystack->os_ver(); | ||||
|     my $op_mode  = $baystack->ns_op_mode(); | ||||
| @@ -228,142 +226,16 @@ sub index_factor { | ||||
|  | ||||
|     my $index_factor = 32; | ||||
|     $index_factor = 64 | ||||
|         if ( ( defined $model and $model =~ /(470)/ ) | ||||
|         if ( ( $model =~ /(470)/ ) | ||||
|         or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) ); | ||||
|     $index_factor = 128 | ||||
|         if ( ( defined $model and $model =~ /(5[56]\d\d)/ ) | ||||
|         if ( ( $model =~ /(5[56]\d\d)|VSP/ ) | ||||
|         and ( $os_ver >= 6 ) ); | ||||
|  | ||||
|     return $index_factor; | ||||
| } | ||||
|  | ||||
| #  Use SONMP and/or LLDP | ||||
|  | ||||
| sub hasCDP { | ||||
|     my $baystack = shift; | ||||
|  | ||||
|     return $baystack->hasLLDP() || $baystack->SUPER::hasCDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $baystack = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $cdp  = $baystack->SUPER::c_ip($partial) || {}; | ||||
|     my $lldp = $baystack->lldp_ip($partial)     || {}; | ||||
|  | ||||
|     my %c_ip; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $ip = $cdp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $ip = $lldp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|     } | ||||
|     return \%c_ip; | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
|     my $baystack = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $lldp = $baystack->lldp_if($partial)     || {}; | ||||
|     my $cdp  = $baystack->SUPER::c_if($partial) || {}; | ||||
|  | ||||
|     my %c_if; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $if = $cdp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $if = $lldp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|     return \%c_if; | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
|     my $baystack = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $lldp = $baystack->lldp_port($partial)     || {}; | ||||
|     my $cdp  = $baystack->SUPER::c_port($partial) || {}; | ||||
|  | ||||
|     my %c_port; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $port = $cdp->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $port = $lldp->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|     return \%c_port; | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
|     my $baystack = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $lldp = $baystack->lldp_id($partial)     || {}; | ||||
|     my $cdp  = $baystack->SUPER::c_id($partial) || {}; | ||||
|  | ||||
|     my %c_id; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $id = $cdp->{$iid}; | ||||
|         next unless defined $id; | ||||
|  | ||||
|         $c_id{$iid} = $id; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $id = $lldp->{$iid}; | ||||
|         next unless defined $id; | ||||
|  | ||||
|         $c_id{$iid} = $id; | ||||
|     } | ||||
|     return \%c_id; | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $baystack = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $lldp = $baystack->lldp_rem_sysdesc($partial)  || {}; | ||||
|     my $cdp  = $baystack->SUPER::c_platform($partial) || {}; | ||||
|  | ||||
|     my %c_platform; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $platform = $cdp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $platform = $lldp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|     return \%c_platform; | ||||
| } | ||||
|  | ||||
| # Newer devices support ENTITY-MIB, use if available otherwise use proprietary | ||||
| # methods. | ||||
| @@ -475,8 +347,8 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Baystack - SNMP Interface to Nortel Ethernet (Baystack) | ||||
| Switches | ||||
| SNMP::Info::Layer2::Baystack - SNMP Interface to Avaya Ethernet Switch | ||||
| (Baystack) and VSP 7000 series switches | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -499,8 +371,9 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a Nortel  | ||||
| Ethernet Switch (Baystack) through SNMP.  | ||||
| Provides abstraction to the configuration information obtainable from an | ||||
| Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series | ||||
| through SNMP.  | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| @@ -527,6 +400,8 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...); | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<BAY-STACK-PETH-EXT-MIBB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
| @@ -549,7 +424,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $baystack->vendor() | ||||
|  | ||||
| Returns 'nortel' | ||||
| Returns 'avaya' | ||||
|  | ||||
| =item $baystack->model() | ||||
|  | ||||
| @@ -645,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 | ||||
| @@ -719,54 +600,6 @@ ns_e_vendor(). | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Topology information | ||||
|  | ||||
| Based upon the software version devices may support SynOptics Network | ||||
| Management Protocol (SONMP) and Link Layer Discovery Protocol (LLDP). These | ||||
| methods will query both and return the combination of all information. As a | ||||
| result, there may be identical topology information returned from the two | ||||
| protocols causing duplicate entries.  It is the calling program's | ||||
| responsibility to identify any duplicate entries and remove duplicates if | ||||
| necessary. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $baystack->hasCDP() | ||||
|  | ||||
| Returns true if the device is running either SONMP or LLDP. | ||||
|  | ||||
| =item $baystack->c_if() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: local device port (interfaces) | ||||
|  | ||||
| =item $baystack->c_ip() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: remote IPv4 address | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with the same IPv4 | ||||
| address, c_ip(), it may be a duplicate entry. | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with different | ||||
| IPv4 addresses, c_ip(), there is either a non-SONMP/LLDP device in between two or | ||||
| more devices or multiple devices which are not directly connected.   | ||||
|  | ||||
| Use the data from the Layer2 Topology Table below to dig deeper. | ||||
|  | ||||
| =item $baystack->c_port() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: remote port (interfaces) | ||||
|  | ||||
| =item $baystack->c_id() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: string value used to identify the | ||||
| chassis component associated with the remote system. | ||||
|  | ||||
| =item $baystack->c_platform() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: Remote Device Type | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::SONMP | ||||
|  | ||||
| See L<SNMP::Info::SONMP/"TABLE METHODS"> for details. | ||||
|   | ||||
| @@ -46,7 +46,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|   | ||||
| @@ -47,7 +47,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS,     %SNMP::Info::CiscoConfig::GLOBALS, | ||||
| @@ -139,6 +139,32 @@ sub i_duplex_admin { | ||||
|     return \%i_duplex_admin; | ||||
| } | ||||
|  | ||||
| sub i_speed_admin { | ||||
|     my $c2900   = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my %i_speed_admin; | ||||
|     my $p_port        = $c2900->p_port() || {}; | ||||
|     my $interfaces    = $c2900->interfaces($partial); | ||||
|     my $c2900_p_index = $c2900->c2900_p_index() || {}; | ||||
|  | ||||
|     my %reverse_2900 = reverse %$c2900_p_index; | ||||
|     my $c2900_p_speed | ||||
|         = $c2900->c2900_p_speed_admin( $reverse_2900{$partial} ); | ||||
|  | ||||
|     my %speeds = ( | ||||
|         'autoDetect' => 'auto', | ||||
|         's10000000'  => '10 Mbps', | ||||
|         's100000000' => '100 Mbps', | ||||
|     ); | ||||
|  | ||||
|     %i_speed_admin | ||||
|         = map { $c2900_p_index->{$_} => $speeds{ $c2900_p_speed->{$_} } } | ||||
|         keys %$c2900_p_index; | ||||
|  | ||||
|     return \%i_speed_admin; | ||||
| } | ||||
|  | ||||
| sub set_i_speed_admin { | ||||
|     my $c2900 = shift; | ||||
|     my ( $speed, $iid ) = @_; | ||||
| @@ -349,6 +375,10 @@ Returns reference to hash of IIDs to admin duplex setting | ||||
|  | ||||
| Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin() | ||||
|  | ||||
| =item $c2900->i_speed_admin() | ||||
|  | ||||
| Returns reference to hash of IIDs to admin speed setting. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 F<C2900-MIB> Port Entry Table  | ||||
|   | ||||
| @@ -49,7 +49,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS,     %SNMP::Info::CiscoPortSecurity::MIBS, | ||||
|   | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info::SONMP; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|   | ||||
| @@ -50,7 +50,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS,     %SNMP::Info::CiscoConfig::MIBS, | ||||
|   | ||||
							
								
								
									
										268
									
								
								Info/Layer2/CiscoSB.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								Info/Layer2/CiscoSB.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,268 @@ | ||||
| # SNMP::Info::Layer2::CiscoSB | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2013 Nic Bernstein | ||||
| # | ||||
| # Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| # Copyright (c) 2003 Regents of the University of California | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::CiscoSB; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::Entity; | ||||
| use SNMP::Info::EtherLike; | ||||
| use SNMP::Info::CiscoStats; | ||||
| use SNMP::Info::CiscoConfig; | ||||
| use SNMP::Info::CDP; | ||||
|  | ||||
| @SNMP::Info::Layer2::CiscoSB::ISA | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike | ||||
|     SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/; | ||||
| @SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| # This will be filled in with the device's index into the EntPhysicalEntry | ||||
| # table by the serial() function. | ||||
| our $index = undef; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::Entity::GLOBALS, | ||||
|     %SNMP::Info::EtherLike::GLOBALS, | ||||
|     %SNMP::Info::CiscoStats::GLOBALS, | ||||
|     %SNMP::Info::CiscoConfig::GLOBALS, | ||||
|     %SNMP::Info::CDP::GLOBALS, | ||||
|     'descr'  => 'sysDescr' | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::Entity::FUNCS, | ||||
|     %SNMP::Info::EtherLike::FUNCS, | ||||
|     %SNMP::Info::CiscoStats::FUNCS, | ||||
|     %SNMP::Info::CiscoConfig::FUNCS, | ||||
|     %SNMP::Info::CDP::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::Entity::MIBS, | ||||
|     %SNMP::Info::EtherLike::MIBS, | ||||
|     %SNMP::Info::CiscoStats::MIBS, | ||||
|     %SNMP::Info::CiscoConfig::MIBS, | ||||
|     %SNMP::Info::CDP::MIBS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     %SNMP::Info::Entity::MUNGE, | ||||
|     %SNMP::Info::EtherLike::MUNGE, | ||||
|     %SNMP::Info::CiscoStats::MUNGE, | ||||
|     %SNMP::Info::CiscoConfig::MUNGE, | ||||
|     %SNMP::Info::CDP::MUNGE, | ||||
| ); | ||||
|  | ||||
|  | ||||
| sub vendor { | ||||
|     return 'cisco'; | ||||
| } | ||||
|  | ||||
| # Walk the entPhysicalSerialNum table and return both the first serial | ||||
| # number found as well as the index of that entry. | ||||
| sub serial { | ||||
|     my $ciscosb  = shift; | ||||
|     my $serial   = undef;   | ||||
|     my $e_serial = $ciscosb->e_serial(); | ||||
|  | ||||
|     # Find entity table entry for this unit | ||||
|     foreach my $e ( keys %$e_serial ) { | ||||
|         if (defined ($e_serial->{$e}) and $e_serial->{$e} !~ /^\s*$/) { | ||||
|             $index = $e; | ||||
|             last; | ||||
|         } | ||||
|     } | ||||
|     return $e_serial->{$index} if defined $index; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $ciscosb = shift; | ||||
|     my $os_ver  = $ciscosb->e_swver(); | ||||
|  | ||||
|     return $os_ver->{$index} if defined $index; | ||||
| } | ||||
|    | ||||
| # Grab e_model from Entity and tag on e_hwver | ||||
| sub model { | ||||
|     my $ciscosb = shift; | ||||
|     my $e_model   = $ciscosb->e_model(); | ||||
|     my $e_hwver = $ciscosb->e_hwver(); | ||||
|  | ||||
|     if (defined ($index)) { | ||||
|         my $model = "$e_model->{$index} $e_hwver->{$index}"; | ||||
|         return $model; | ||||
|     } | ||||
|     return $ciscosb->description(); | ||||
| } | ||||
|  | ||||
| # ifDescr is the same for all interfaces in a class, but the ifName is | ||||
| # unique, so let's use that for port name. | ||||
| sub interfaces { | ||||
|     my $ciscosb = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $ciscosb->i_name($partial); | ||||
|  | ||||
|     return $interfaces; | ||||
| } | ||||
|  | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::CiscoSB - SNMP Interface to Cisco Small Business series | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Nic Bernstein (shamelessly stolen from Max Baker's Aironet code) | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $ciscosb = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $ciscosb->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides interface to SNMP Data available on Cisco Small Business (nee LinkSys) | ||||
| managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1)] | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =item SNMP::Info::Entity | ||||
|  | ||||
| =item SNMP::Info::EtherLike | ||||
|  | ||||
| =item SNMP::Info::CiscoStats | ||||
|  | ||||
| =item SNMP::Info::CiscoConfig | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item Inherited Classes | ||||
|  | ||||
| MIBs required by the inherited classes listed above. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ciscosb->vendor() | ||||
|  | ||||
| Returns 'cisco' | ||||
|  | ||||
| =item $ciscosb->os_ver() | ||||
|  | ||||
| Returns software version (C<entPhysicalSoftwareRev>) | ||||
|  | ||||
| =item $ciscosb->serial() | ||||
|  | ||||
| Returns serial number of unit (C<entPhysicalSerialNum>) | ||||
|  | ||||
| =item $ciscosb->model() | ||||
|  | ||||
| Returns model and hardware revision of unit | ||||
| (C<entPhysicalModelName+entPhysicalHardwareRev>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::EtherLike | ||||
|  | ||||
| See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ciscosb->interfaces() | ||||
|  | ||||
| Uses the i_name() field. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::EtherLike | ||||
|  | ||||
| See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -1,349 +0,0 @@ | ||||
| # SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry Switches | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Foundry; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::FDP; | ||||
| use SNMP::Info::EtherLike; | ||||
| use SNMP::Info::MAU; | ||||
|  | ||||
| @SNMP::Info::Layer2::Foundry::ISA | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::FDP SNMP::Info::EtherLike | ||||
|     SNMP::Info::MAU    Exporter/; | ||||
| @SNMP::Info::Layer2::Foundry::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS,    %SNMP::Info::FDP::MIBS, | ||||
|     %SNMP::Info::EtherLike::MIBS, %SNMP::Info::MAU::MIBS, | ||||
|     'FOUNDRY-SN-ROOT-MIB' => 'foundry', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS,    %SNMP::Info::FDP::GLOBALS, | ||||
|     %SNMP::Info::EtherLike::GLOBALS, %SNMP::Info::MAU::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS,    %SNMP::Info::FDP::FUNCS, | ||||
|     %SNMP::Info::EtherLike::FUNCS, %SNMP::Info::MAU::FUNCS, | ||||
|     'test' => 'dot1dStpPortState', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE,    %SNMP::Info::FDP::MUNGE, | ||||
|     %SNMP::Info::EtherLike::MUNGE, %SNMP::Info::MAU::MUNGE, | ||||
| ); | ||||
|  | ||||
| # Method OverRides | ||||
|  | ||||
| #sub bulkwalk_no { 1;} | ||||
|  | ||||
| *SNMP::Info::Layer2::Foundry::i_duplex = \&SNMP::Info::MAU::mau_i_duplex; | ||||
| *SNMP::Info::Layer2::Foundry::i_duplex_admin | ||||
|     = \&SNMP::Info::MAU::mau_i_duplex_admin; | ||||
| *SNMP::Info::Layer2::Foundry::i_vlan = \&SNMP::Info::Bridge::qb_i_vlan_t; | ||||
|  | ||||
| # todo doc these | ||||
|  | ||||
| sub os_ver { | ||||
|     my $foundry = shift; | ||||
|  | ||||
|     my $e_name = $foundry->e_name(); | ||||
|  | ||||
|     # find entity table entry for "stackmanaget.1" | ||||
|     my $unit_iid = undef; | ||||
|     foreach my $e ( keys %$e_name ) { | ||||
|         my $name = $e_name->{$e} || ''; | ||||
|         $unit_iid = $e if $name eq 'stackmanaget.1'; | ||||
|     } | ||||
|  | ||||
|     # Default to OID method if no dice. | ||||
|     unless ( defined $unit_iid ) { | ||||
|         return $foundry->SUPER::model(); | ||||
|     } | ||||
|  | ||||
|     # Find Model Name | ||||
|     my $e_fwver = $foundry->e_fwver(); | ||||
|     if ( defined $e_fwver->{$unit_iid} ) { | ||||
|         return $e_fwver->{$unit_iid}; | ||||
|     } | ||||
|  | ||||
|     # Not found in ENTITY-MIB, go up a level. | ||||
|     return $foundry->SUPER::os_ver(); | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $foundry = shift; | ||||
|  | ||||
|     my $e_name = $foundry->e_name(); | ||||
|  | ||||
|     # find entity table entry for "unit.1" | ||||
|     my $unit_iid = undef; | ||||
|     foreach my $e ( keys %$e_name ) { | ||||
|         my $name = $e_name->{$e} || ''; | ||||
|         $unit_iid = $e if $name eq 'unit.1'; | ||||
|     } | ||||
|  | ||||
|     # Default to OID method if no dice. | ||||
|     unless ( defined $unit_iid ) { | ||||
|         return $foundry->SUPER::model(); | ||||
|     } | ||||
|  | ||||
|     # Find Model Name | ||||
|     my $e_model = $foundry->e_model(); | ||||
|     if ( defined $e_model->{$unit_iid} ) { | ||||
|         return $e_model->{$unit_iid}; | ||||
|     } | ||||
|  | ||||
|     # Not found in ENTITY-MIB, go up a level. | ||||
|     return $foundry->SUPER::model(); | ||||
|  | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $foundry = shift; | ||||
|  | ||||
|     my $e_name = $foundry->e_name(); | ||||
|  | ||||
|     # find entity table entry for "unit.1" | ||||
|     my $unit_iid = undef; | ||||
|     foreach my $e ( keys %$e_name ) { | ||||
|         my $name = $e_name->{$e} || ''; | ||||
|         $unit_iid = $e if $name eq 'unit.1'; | ||||
|     } | ||||
|     return unless defined $unit_iid; | ||||
|  | ||||
|     # Look up serial of found entry. | ||||
|     my $e_serial = $foundry->e_serial(); | ||||
|     return $e_serial->{$unit_iid} if defined $e_serial->{$unit_iid}; | ||||
|  | ||||
|     return $foundry->SUPER::serial(); | ||||
| } | ||||
|  | ||||
| sub interfaces { | ||||
|     my $foundry = shift; | ||||
|     my $i_descr = $foundry->i_description; | ||||
|     my $i_name  = $foundry->i_name; | ||||
|  | ||||
|     # use ifName only if it is in portn | ||||
|     #   format.  For EdgeIrons | ||||
|     # else use ifDescr | ||||
|     foreach my $iid ( keys %$i_name ) { | ||||
|         my $name = $i_name->{$iid}; | ||||
|         next unless defined $name; | ||||
|         $i_descr->{$iid} = $name | ||||
|             if $name =~ /^port\d+/i; | ||||
|     } | ||||
|  | ||||
|     return $i_descr; | ||||
| } | ||||
|  | ||||
| sub i_ignore { | ||||
|     my $foundry = shift; | ||||
|     my $i_type  = $foundry->i_type(); | ||||
|  | ||||
|     my %i_ignore = (); | ||||
|  | ||||
|     foreach my $iid ( keys %$i_type ) { | ||||
|         my $type = $i_type->{$iid} || ''; | ||||
|         $i_ignore{$iid}++ | ||||
|  | ||||
|             # 33 is the console port | ||||
|             if $type =~ /(loopback|propvirtual|other|cpu|33)/i; | ||||
|     } | ||||
|     return \%i_ignore; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'foundry'; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'foundry'; | ||||
| } | ||||
|  | ||||
| # this hangs on a edgeiron24g | ||||
| # TODO: check by devicetype and deferr to SUPER if not bad device | ||||
| sub stp_p_state { return; } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry FastIron Network | ||||
| Devices | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
| This module is Deprecated.  Please use Layer3::Foundry instead. | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $foundry = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $foundry->class(); | ||||
|  | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| This module is Deprecated.  Please use Layer3::Foundry instead. | ||||
|  | ||||
| This module provides support for Foundry EdgeIron Switches | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =item SNMP::Info::FDP | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<FOUNDRY-SN-ROOT-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See classes listed above for their required MIBs. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $foundry->model() | ||||
|  | ||||
| Returns model type. | ||||
|  | ||||
| =item $foundry->vendor() | ||||
|  | ||||
| Returns 'foundry' | ||||
|  | ||||
| =item $foundry->os() | ||||
|  | ||||
| Returns 'foundry' | ||||
|  | ||||
| =item $foundry->os_ver() | ||||
|  | ||||
| Returns the software version | ||||
|  | ||||
| =item $foundry->serial() | ||||
|  | ||||
| Returns the serial number | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::FDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $foundry->interfaces() | ||||
|  | ||||
| Returns reference to hash of interface names to iids. | ||||
|  | ||||
| =item $foundry->i_ignore() | ||||
|  | ||||
| Returns reference to hash of interfaces to be ignored. | ||||
|  | ||||
| Ignores interfaces with descriptions of  tunnel,loopback,null  | ||||
|  | ||||
| =item $foundry->i_duplex() | ||||
|  | ||||
| Returns reference to hash of interface link duplex status.  | ||||
|  | ||||
| Crosses $foundry->sw_duplex() with $foundry->sw_index() | ||||
|  | ||||
| =item $foundry->i_duplex_admin() | ||||
|  | ||||
| Returns reference to hash of interface administrative duplex status.  | ||||
|  | ||||
| =item $foundry->stp_p_state() | ||||
|  | ||||
| "The port's current state as defined by application of the Spanning Tree | ||||
| Protocol. | ||||
|  | ||||
| Skipped if device is an EdgeIron 24G due to reports of hangs. | ||||
|  | ||||
| (C<dot1dStpPortState>) | ||||
|  | ||||
| =item $foundry->i_vlan() | ||||
|  | ||||
| Returns a mapping between C<ifIndex> and the PVID or default VLAN. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::FDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -46,7 +46,7 @@ use SNMP::Info::CDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -167,6 +167,10 @@ $VERSION = '2.08'; | ||||
|     '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 +182,30 @@ $VERSION = '2.08'; | ||||
|     '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', | ||||
| @@ -413,108 +421,6 @@ sub _sensor { | ||||
|     return $result; | ||||
| } | ||||
|  | ||||
| #  Use CDP and/or LLDP | ||||
| sub hasCDP { | ||||
|     my $hp = shift; | ||||
|  | ||||
|     return $hp->hasLLDP() || $hp->SUPER::hasCDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $hp      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $cdp  = $hp->SUPER::c_ip($partial) || {}; | ||||
|     my $lldp = $hp->lldp_ip($partial)     || {}; | ||||
|  | ||||
|     my %c_ip; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $ip = $cdp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $ip = $lldp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|     } | ||||
|     return \%c_ip; | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
|     my $hp      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $hp->lldp_if($partial)     || {}; | ||||
|     my $cdp  = $hp->SUPER::c_if($partial) || {}; | ||||
|  | ||||
|     my %c_if; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $if = $cdp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $if = $lldp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|     return \%c_if; | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
|     my $hp      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $hp->lldp_port($partial)     || {}; | ||||
|     my $cdp  = $hp->SUPER::c_port($partial) || {}; | ||||
|  | ||||
|     my %c_port; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $port = $cdp->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $port = $lldp->{$iid}; | ||||
|         next unless defined $port; | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|     return \%c_port; | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
|     my $hp      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $hp->lldp_id($partial)     || {}; | ||||
|     my $cdp  = $hp->SUPER::c_id($partial) || {}; | ||||
|  | ||||
|     my %c_id; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $id = $cdp->{$iid}; | ||||
|         next unless defined $id; | ||||
| 	 | ||||
|         $c_id{$iid} = $id; | ||||
|     } | ||||
|      | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
| 	my $id = $lldp->{$iid}; | ||||
| 	next unless defined $id; | ||||
| 	 | ||||
| 	$c_id{$iid} = $id; | ||||
|     } | ||||
|     return \%c_id; | ||||
| } | ||||
|  | ||||
| sub munge_hp_c_id { | ||||
|     my ($v) = @_; | ||||
|     if ( length(unpack('H*', $v)) == 12 ){ | ||||
| @@ -528,30 +434,6 @@ sub munge_hp_c_id { | ||||
|     } | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $hp      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $hp->lldp_rem_sysdesc($partial)  || {}; | ||||
|     my $cdp  = $hp->SUPER::c_platform($partial) || {}; | ||||
|  | ||||
|     my %c_platform; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $platform = $cdp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $platform = $lldp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|     return \%c_platform; | ||||
| } | ||||
|  | ||||
| # POWER-ETHERNET-MIB doesn't define a mapping of its | ||||
| # "module"/"port" index to ifIndex.  Different vendors | ||||
| # do this in different ways. | ||||
| @@ -759,7 +641,7 @@ Returns bytes of used memory | ||||
| Returns the model number of the HP Switch.  Will translate between the HP Part | ||||
| number and the common model number with this map : | ||||
|  | ||||
| %MODEL_MAP = ( | ||||
|  %MODEL_MAP = ( | ||||
|     'J8131A' => 'WAP-420-WW', | ||||
|     'J8130A' => 'WAP-420-NA', | ||||
|     'J8133A' => 'AP520WL', | ||||
| @@ -828,7 +710,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', | ||||
| @@ -856,7 +738,7 @@ number and the common model number with this map : | ||||
|     'J9450A' => '1810G-24', | ||||
|     'J9029A' => '1800-8G', | ||||
|     'J9028A' => '1800-24G', | ||||
| ); | ||||
|  ); | ||||
|  | ||||
| =item $hp->os() | ||||
|  | ||||
| @@ -902,12 +784,12 @@ Power supply 2 status | ||||
| =item $hp->peth_port_power() | ||||
|  | ||||
| Power supplied by PoE ports, in milliwatts | ||||
| ("hpicfPoePethPsePortPower") | ||||
| (C<hpicfPoePethPsePortPower>) | ||||
|  | ||||
| =item $hp->stp_ver() | ||||
|  | ||||
| Returns what version of STP the device is running. | ||||
| ("hpicfBridgeRstpForceVersion" with fallback to inherited stp_ver()) | ||||
| (C<hpicfBridgeRstpForceVersion> with fallback to inherited stp_ver()) | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -946,7 +828,8 @@ Returns reference to hash of IIDs to admin duplex setting. | ||||
|  | ||||
| =item $hp->vendor_i_type() | ||||
|  | ||||
| Returns reference to hash of IIDs to HP specific port type (hpSwitchPortType). | ||||
| Returns reference to hash of IIDs to HP specific port type | ||||
| (C<hpSwitchPortType>). | ||||
|  | ||||
| =item $hp->i_name() | ||||
|  | ||||
| @@ -959,53 +842,6 @@ interface index (c<ifIndex>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Topology information | ||||
|  | ||||
| Based upon the firmware version HP devices may support Cisco Discovery | ||||
| Protocol (CDP), Link Layer Discovery Protocol (LLDP), or both.  These methods | ||||
| will query both and return the combination of all information.  As a result, | ||||
| there may be identical topology information returned from the two protocols | ||||
| causing duplicate entries.  It is the calling program's responsibility to | ||||
| identify any duplicate entries and remove duplicates if necessary. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $hp->hasCDP() | ||||
|  | ||||
| Returns true if the device is running either CDP or LLDP. | ||||
|  | ||||
| =item $hp->c_if() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: local device port (interfaces) | ||||
|  | ||||
| =item $hp->c_ip() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: remote IPv4 address | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with the same IPv4 | ||||
| address, c_ip(), it may be a duplicate entry. | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with different | ||||
| IPv4 addresses, c_ip(), there is either a non-CDP/LLDP device in between two | ||||
| or more devices or multiple devices which are not directly connected.   | ||||
|  | ||||
| Use the data from the Layer2 Topology Table below to dig deeper. | ||||
|  | ||||
| =item $hp->c_port() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: remote port (interfaces) | ||||
|  | ||||
| =item $hp->c_id() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: string value used to identify the | ||||
| chassis component associated with the remote system. | ||||
|  | ||||
| =item $hp->c_platform() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: Remote Device Type | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| @@ -1041,4 +877,6 @@ operations. | ||||
|  | ||||
| =item set_i_vlan_tagged() | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -44,7 +44,7 @@ use SNMP::Info::CDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -652,7 +652,8 @@ Returns reference to hash of IIDs to admin duplex setting. | ||||
|  | ||||
| =item $hp->vendor_i_type() | ||||
|  | ||||
| Returns reference to hash of IIDs to HP specific port type (hpSwitchPortType). | ||||
| Returns reference to hash of IIDs to HP specific port type | ||||
| (C<hpSwitchPortType>). | ||||
|  | ||||
| =item $hp->i_name() | ||||
|  | ||||
| @@ -718,4 +719,6 @@ operations. | ||||
|  | ||||
| =item set_i_vlan_tagged() | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -89,7 +89,7 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches | ||||
| SNMP::Info::Layer2::HPVC - SNMP Interface to HP Virtual Connect Switches | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -113,7 +113,7 @@ Jeroen van Ingen | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| HP VirtualConnect Switch via SNMP.  | ||||
| HP Virtual Connect Switch via SNMP.  | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| @@ -150,7 +150,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $hp->os() | ||||
|  | ||||
| Returns hpvc | ||||
| Returns C<'hpvc'> | ||||
|  | ||||
| =item $hp->os_bin() | ||||
|  | ||||
|   | ||||
| @@ -36,7 +36,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|   | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info::Airespace; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,        %SNMP::Info::Bridge::MIBS, | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS, | ||||
|   | ||||
							
								
								
									
										1299
									
								
								Info/Layer2/NWSS2300.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1299
									
								
								Info/Layer2/NWSS2300.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -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 = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %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,17 +68,79 @@ 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(); | ||||
| } | ||||
|  | ||||
| # | ||||
| # 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 $partial = shift; | ||||
|  | ||||
|     my $interfaces = $netgear->i_index($partial)       || {}; | ||||
|     my $i_descr    = $netgear->i_description($partial) || {}; | ||||
|     my $i_name     = $netgear->i_name($partial); | ||||
|     my $i_isset    = (); | ||||
|     # Replace the description with the ifName field, if set | ||||
|     foreach my $iid ( keys %$i_name ) { | ||||
|         my $name = $i_name->{$iid}; | ||||
|         next unless defined $name; | ||||
|         if (defined $name and $name !~ /^\s*$/) { | ||||
|             $interfaces->{$iid} = $name; | ||||
|             $i_isset->{$iid} = 1; | ||||
|         } | ||||
|     } | ||||
|     # Replace the Index with the ifDescr field, appended with index | ||||
|     # number, to deal with devices with non-unique ifDescr. | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|         my $port = $i_descr->{$iid} . '-' . $iid; | ||||
|         next unless defined $port; | ||||
|         next if (defined $i_isset->{$iid} and $i_isset->{$iid} == 1); | ||||
|         $interfaces->{$iid} = $port; | ||||
|     } | ||||
|  | ||||
|     return $interfaces; | ||||
| } | ||||
|  | ||||
|  | ||||
| # 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 | ||||
| @@ -94,57 +162,141 @@ sub fw_port { | ||||
| # these seem to work for GSM models but not GS | ||||
| # https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529 | ||||
| sub os_ver { | ||||
|     my $self = shift; | ||||
|     return if $self->model and $self->model =~ m/GS\d/i; | ||||
|     return $self->ng_osver(); | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $self = shift; | ||||
|     return if $self->model and $self->model =~ m/GS\d/i; | ||||
|     return $self->ng_serial(); | ||||
|     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; | ||||
| } | ||||
|  | ||||
| #  Use LLDP | ||||
|  | ||||
| sub hasCDP { | ||||
|     my $netgear = shift; | ||||
|     return $netgear->hasLLDP(); | ||||
|     return $netgear->hasLLDP() || $netgear->SUPER::hasCDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $netgear = shift; | ||||
|     my $partial  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $netgear->lldp_ip($partial); | ||||
|     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; | ||||
|  | ||||
|     return $netgear->lldp_if($partial); | ||||
|     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; | ||||
|  | ||||
|     return $netgear->lldp_port($partial); | ||||
|     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; | ||||
|  | ||||
|     return $netgear->lldp_id($partial); | ||||
|     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; | ||||
|  | ||||
|     return $netgear->lldp_rem_sysdesc($partial); | ||||
|     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; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -158,8 +310,8 @@ SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Bill Fenner and Zoltan Erszenyi,  | ||||
| Hacked in LLDP support from Baystack.pm by  | ||||
|  Bill Fenner and Zoltan Erszenyi,  | ||||
|  Hacked in LLDP support from Baystack.pm by  | ||||
|  Nic Bernstein <nic@onlight.com> | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
| @@ -188,6 +340,7 @@ inherited methods. | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
| =item SNMP::Info::Entity | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =back | ||||
| @@ -201,6 +354,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 | ||||
| @@ -223,7 +378,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() | ||||
|  | ||||
| @@ -231,7 +387,8 @@ Returns OS Version. | ||||
|  | ||||
| =item $netgear->serial() | ||||
|  | ||||
| Returns Serial Number. | ||||
| Returns Serial Number if available (older FS switches have no accessible | ||||
| serial number). | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -239,6 +396,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. | ||||
| @@ -269,6 +430,10 @@ Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use | ||||
| the C<Q-BRIDGE-MIB> forwarding table.  Fall back to the C<BRIDGE-MIB> if | ||||
| C<Q-BRIDGE-MIB> doesn't return anything. | ||||
|  | ||||
| =item $netgear->interfaces() | ||||
|  | ||||
| Uses the i_name() field. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Topology information | ||||
| @@ -318,4 +483,12 @@ Returns reference to hash.  Key: iid Value: Remote Device Type | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|   | ||||
							
								
								
									
										1303
									
								
								Info/Layer2/Trapeze.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1303
									
								
								Info/Layer2/Trapeze.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -39,7 +39,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer2::GLOBALS ); | ||||
|   | ||||
| @@ -51,7 +51,7 @@ use SNMP::Info::AdslLine; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -132,11 +132,11 @@ $VERSION = '2.08'; | ||||
|     '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 = '2.08'; | ||||
|     %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) | ||||
| @@ -215,8 +215,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; | ||||
| @@ -293,32 +296,37 @@ sub interfaces { | ||||
|     my $l3      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces   = $l3->i_index($partial); | ||||
|     my $descriptions = $l3->i_description($partial); | ||||
|     my $interfaces = $l3->i_index($partial); | ||||
|     my $i_descr    = $l3->i_description($partial); | ||||
|  | ||||
|     my %interfaces = (); | ||||
|     foreach my $iid ( keys %$interfaces ) { | ||||
|         my $desc = $descriptions->{$iid}; | ||||
|         next unless defined $desc; | ||||
|  | ||||
|         $interfaces{$iid} = $desc; | ||||
|     # Check for duplicates in ifDescr, if so uniquely identify by adding | ||||
|     # ifIndex to repeated values | ||||
|     my %seen; | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|         my $port = $i_descr->{$iid}; | ||||
|         next unless defined $port; | ||||
|         if ( $seen{$port}++ ) { | ||||
|             $interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid ); | ||||
|         } | ||||
|         else { | ||||
|             $interfaces->{$iid} = $port; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return \%interfaces; | ||||
|     return $interfaces; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     my $l3 = shift; | ||||
|  | ||||
|     my $descr = $l3->description(); | ||||
|     my $id = $l3->id(); | ||||
|     my $id    = $l3->id(); | ||||
|  | ||||
|     # .1.3.6.1.4.1.9.1 is the CISCO-PRODUCTS-MIB | ||||
|     # .1.3.6.1.4.1.9.9.368.4 is an old tree that Cisco CSSs were numbered from | ||||
|     return 'cisco'   if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/; | ||||
|     return 'cisco'   if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/; | ||||
|     return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/; | ||||
|     return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/; | ||||
|     return 'cisco'   if ( $descr =~ /(cisco|\bios\b)/i ); | ||||
|     return 'foundry' if ( $descr =~ /foundry/i ); | ||||
|     return 'brocade' if ( $descr =~ /foundry/i ); | ||||
|  | ||||
|     return 'unknown'; | ||||
|  | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -34,20 +34,28 @@ use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::MAU; | ||||
| use SNMP::Info::AMAP; | ||||
| # Use LLDP | ||||
| # (or at least try.  The versions I've seen have two problems: | ||||
| # 1. they report ifIndex values as 'local'; we don't support ifIndex | ||||
| #    but *could* | ||||
| # 2. They report 0.0.0.0 as the management address | ||||
| # ) | ||||
| use SNMP::Info::LLDP; | ||||
|  | ||||
| @SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU | ||||
|     SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::AMAP SNMP::Info::LLDP | ||||
|     SNMP::Info::MAU SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::AlcatelLucent::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::AMAP::MIBS, | ||||
|     'ALCATEL-IND1-DEVICES'     => 'familyOmniSwitch7000', | ||||
|     'ALCATEL-IND1-CHASSIS-MIB' => 'chasEntPhysOperStatus', | ||||
|     'ALU-POWER-ETHERNET-MIB'   => 'pethPsePortDetectionStatus', | ||||
| @@ -64,17 +72,17 @@ delete $MIBS{'POWER-ETHERNET-MIB'}; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::MAU::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, %SNMP::Info::AMAP::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, %SNMP::Info::MAU::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, %SNMP::Info::AMAP::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, %SNMP::Info::AMAP::MUNGE, | ||||
| ); | ||||
|  | ||||
| # use MAU-MIB for admin. duplex and admin. speed | ||||
| @@ -285,53 +293,6 @@ sub bp_index { | ||||
| #    return $i_vlan; | ||||
| #} | ||||
|  | ||||
| # Use LLDP | ||||
| # (or at least try.  The versions I've seen have two problems: | ||||
| # 1. they report ifIndex values as 'local'; we don't support ifIndex | ||||
| #    but *could* | ||||
| # 2. They report 0.0.0.0 as the management address | ||||
| # ) | ||||
| sub hasCDP { | ||||
|     my $alu = shift; | ||||
|  | ||||
|     return $alu->hasLLDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $alu     = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $alu->lldp_ip($partial); | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
|     my $alu     = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $alu->lldp_if($partial); | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
|     my $alu     = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $alu->lldp_port($partial); | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
|     my $alu     = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $alu->lldp_id($partial); | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $alu     = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $alu->lldp_rem_sysdesc($partial); | ||||
| } | ||||
|  | ||||
| # Power-Ethernet ifIndex mapping.  I've only seen this from a | ||||
| # fixed-config single-module system, so this is only a plausible | ||||
| # guess as to the mapping on a stack or modular system. | ||||
| @@ -428,10 +389,6 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
|     Returns 'alcatel-lucent' | ||||
|  | ||||
| =item $alu->hasCDP() | ||||
|  | ||||
|     Returns whether LLDP is enabled. | ||||
|  | ||||
| =item $alu->model() | ||||
|  | ||||
| Tries to reference $alu->id() to one of the product MIBs listed above | ||||
| @@ -502,26 +459,6 @@ Work around various bugs in the F<BRIDGE-MIB> and | ||||
| F<Q-BRIDGE-MIB> implementations, by returning both | ||||
| C<ifIndex> and C<dot1dBasePort> mappings to C<ifIndex> values. | ||||
|  | ||||
| =item $alu->c_id() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $alu->c_if() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $alu->c_ip() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $alu->c_platform() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $alu->c_port() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $alu->i_duplex_admin() | ||||
|  | ||||
| Returns info from F<MAU-MIB> | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -66,6 +66,10 @@ $VERSION = '2.08'; | ||||
|     'new_tftp_result' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpLastActionStatus', | ||||
|     'old_ip_max'      => 'ALTEON_TS_NETWORK_MIB__ipInterfaceTableMax', | ||||
|     'new_ip_max'      => 'ALTEON_CHEETAH_NETWORK_MIB__ipInterfaceTableMax', | ||||
|     'fan'             => 'ALTEON_CHEETAH_SWITCH_MIB__hwFanStatus', | ||||
|     'old_ps1_stat'    => 'ALTEON_TIGON_SWITCH_MIB__hwPowerSupplyStatus', | ||||
|     'old_ps2_stat'    => 'ALTEON_TIGON_SWITCH_MIB__hwRedundantPSStatus', | ||||
|     'new_ps_stat'     => 'ALTEON_CHEETAH_SWITCH_MIB__hwPowerSupplyStatus', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
| @@ -132,7 +136,7 @@ sub model { | ||||
|  | ||||
|     return $id unless defined $model; | ||||
|  | ||||
|     $model =~ s/^aceswitch//; | ||||
|     $model =~ s/^(aceswitch|aws|ods)//; | ||||
|     $model =~ s/^acedirector/AD/; | ||||
|     $model =~ s/^(copper|fiber)Module/BladeCenter GbESM/; | ||||
|  | ||||
| @@ -140,7 +144,7 @@ sub model { | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'nortel'; | ||||
|     return 'radware'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
| @@ -155,6 +159,36 @@ sub os_ver { | ||||
|     return $version; | ||||
| } | ||||
|  | ||||
| sub ps1_status { | ||||
|     my $alteon = shift; | ||||
|     my $old_ps = $alteon->old_ps1_stat(); | ||||
|     my $new_ps = $alteon->new_ps_stat(); | ||||
|      | ||||
|     return $old_ps if $old_ps; | ||||
|      | ||||
|     if ($new_ps) { | ||||
|         return 'ok' if ($new_ps eq 'singlePowerSupplyOk'); | ||||
|         return 'failed' if ($new_ps eq 'firstPowerSupplyFailed'); | ||||
|     } | ||||
|      | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub ps2_status { | ||||
|     my $alteon = shift; | ||||
|     my $old_ps = $alteon->old_ps2_stat(); | ||||
|     my $new_ps = $alteon->new_ps_stat(); | ||||
|      | ||||
|     return $old_ps if $old_ps; | ||||
|      | ||||
|     if ($new_ps) { | ||||
|         return 'ok' if ($new_ps eq 'doublePowerSupplyOk'); | ||||
|         return 'failed' if ($new_ps eq 'secondPowerSupplyFailed'); | ||||
|     } | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub interfaces { | ||||
|     my $alteon       = shift; | ||||
|     my $interfaces   = $alteon->i_index(); | ||||
| @@ -174,6 +208,7 @@ sub interfaces { | ||||
|         # varies by switch model | ||||
|         elsif ( defined $ip_max and $iid > $ip_max ) { | ||||
|             $desc = ( $iid % $ip_max ); | ||||
|             $desc = 'mgmt' if $desc == 231; | ||||
|         } | ||||
|         $interfaces{$iid} = $desc; | ||||
|     } | ||||
| @@ -207,39 +242,48 @@ sub i_duplex { | ||||
| sub i_duplex_admin { | ||||
|     my $alteon = shift; | ||||
|  | ||||
|     my $ag_pref = $alteon->new_ag_p_cfg_pref() | ||||
|     my $ag_pref  | ||||
|         = $alteon->new_ag_p_cfg_pref() | ||||
|         || $alteon->old_ag_p_cfg_pref() | ||||
|         || {}; | ||||
|     my $ag_fe_auto = $alteon->new_ag_p_cfg_fe_auto() | ||||
|     my $ag_fe_auto  | ||||
|         = $alteon->new_ag_p_cfg_fe_auto() | ||||
|         || $alteon->old_ag_p_cfg_fe_auto() | ||||
|         || {}; | ||||
|     my $ag_fe_mode = $alteon->new_ag_p_cfg_fe_mode() | ||||
|     my $ag_fe_mode  | ||||
|         = $alteon->new_ag_p_cfg_fe_mode() | ||||
|         || $alteon->old_ag_p_cfg_fe_mode() | ||||
|         || {}; | ||||
|     my $ag_ge_auto = $alteon->new_ag_p_cfg_ge_auto() | ||||
|     my $ag_ge_auto  | ||||
|         = $alteon->new_ag_p_cfg_ge_auto() | ||||
|         || $alteon->old_ag_p_cfg_ge_auto() | ||||
|         || {}; | ||||
|     my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max(); | ||||
|     my $ip_max  = $alteon->new_ip_max() || $alteon->old_ip_max(); | ||||
|     my $i_speed = $alteon->i_speed()    || {}; | ||||
|  | ||||
|     my %i_duplex_admin; | ||||
|     foreach my $if ( keys %$ag_pref ) { | ||||
|         my $pref = $ag_pref->{$if}; | ||||
|         next unless defined $pref; | ||||
|     foreach my $if ( keys %$ag_ge_auto ) { | ||||
|         my $pref    = $ag_pref->{$if}    || ''; | ||||
|         my $speed   = $i_speed->{$if}    || ''; | ||||
|         my $ge_auto = $ag_ge_auto->{$if} || ''; | ||||
|         my $fe_auto = $ag_fe_auto->{$if} || ''; | ||||
|         my $fe_mode = $ag_fe_mode->{$if} || ''; | ||||
|  | ||||
|         my $string = 'other'; | ||||
|         if ( $pref =~ /gigabit/i ) { | ||||
|             my $ge_auto = $ag_ge_auto->{$if}; | ||||
|             $string = 'full' if ( $ge_auto =~ /off/i ); | ||||
|             $string = 'auto' if ( $ge_auto =~ /on/i ); | ||||
|         # Default to auto | ||||
|         my $string = 'auto'; | ||||
|  | ||||
|         if ( $ge_auto =~ /off/i | ||||
|             && ( $pref =~ /gigabit/i || $speed eq '1.0 Gbps' ) ) | ||||
|         { | ||||
|             $string = 'full'; | ||||
|         } | ||||
|         elsif ( $pref =~ /fast/i ) { | ||||
|             my $fe_auto = $ag_fe_auto->{$if}; | ||||
|             my $fe_mode = $ag_fe_mode->{$if}; | ||||
|         if ( $fe_auto =~ /off/i | ||||
|             && ( $pref =~ /fast/i || $speed =~ /100?\sMbps/ ) ) | ||||
|         { | ||||
|             $string = 'half' | ||||
|                 if ( $fe_mode =~ /half/i and $fe_auto =~ /off/i ); | ||||
|                 if ( $fe_mode =~ /half/i ); | ||||
|             $string = 'full' | ||||
|                 if ( $fe_mode =~ /full/i and $fe_auto =~ /off/i ); | ||||
|             $string = 'auto' if $fe_auto =~ /on/i; | ||||
|                 if ( $fe_mode =~ /full/i ); | ||||
|         } | ||||
|  | ||||
|         my $idx; | ||||
| @@ -365,7 +409,7 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::AlteonAD - SNMP Interface to Nortel Alteon Layer 2-7 | ||||
| SNMP::Info::Layer3::AlteonAD - SNMP Interface to Radware Alteon ADC | ||||
| Switches. | ||||
|  | ||||
| =head1 AUTHOR | ||||
| @@ -389,8 +433,8 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for Nortel Alteon Series Layer 2-7 load balancing | ||||
| switches and Nortel BladeCenter Layer2-3 GbE Switch Modules. | ||||
| Abstraction subclass for Radware Alteon Series ADC switches and | ||||
| Nortel BladeCenter Layer2-3 GbE Switch Modules. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| @@ -438,12 +482,12 @@ These are methods that return scalar value from SNMP | ||||
| =item $alteon->model() | ||||
|  | ||||
| Returns model type.  Checks $alteon->id() against the F<ALTEON-ROOT-MIB> and | ||||
| then parses out C<aceswitch>, replaces C<acedirector> with AD, and replaces | ||||
| copperModule/fiberModule with BladeCenter GbESM. | ||||
| then parses out C<aceswitch>, C<aws>, and C<ods> replaces C<acedirector> | ||||
| with AD, and replaces copperModule/fiberModule with BladeCenter GbESM. | ||||
|  | ||||
| =item $alteon->vendor() | ||||
|  | ||||
| Returns 'nortel' | ||||
| Returns 'radware' | ||||
|  | ||||
| =item $alteon->os() | ||||
|  | ||||
| @@ -469,6 +513,18 @@ Returns the software version reported by C<agSoftwareVersion> | ||||
|  | ||||
| (C<agTftpLastActionStatus>) | ||||
|  | ||||
| =item $alteon->fan() | ||||
|  | ||||
| (C<hwFanStatus>) | ||||
|  | ||||
| =item $alteon->ps1_status() | ||||
|  | ||||
| Returns status of primary power supply | ||||
|  | ||||
| =item $alteon->ps2_status() | ||||
|  | ||||
| Returns status of redundant power supply | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
| @@ -477,8 +533,8 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
| These are methods that return tables of information in the form of a | ||||
| reference to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
|   | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::Layer3; | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE  | ||||
|             $int_include_vpn $fake_idx $type_class/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|             %SNMP::Info::Layer3::MIBS, | ||||
| @@ -152,10 +152,6 @@ sub os { | ||||
|     return 'altiga'; | ||||
| } | ||||
|  | ||||
| sub hasCDP { | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| # $altiga->interfaces() - Map the Interfaces to their physical names | ||||
| # Add interface number to interface name to prevent duplicate ifDescr | ||||
| # Included statically configured VPN tunnels if ($int_include_vpn) | ||||
| @@ -350,10 +346,6 @@ Tries to determine OS version from the C<sysDescr.0> field. Returns version or C | ||||
|  | ||||
| Combines results from C<fan1_alarm>, C<fan2_alarm>, and C<fam3_alarm> methods. | ||||
|  | ||||
| =item $altiga->hasCDP() | ||||
|  | ||||
| No. | ||||
|  | ||||
| =item $altiga->ps1_status() | ||||
|  | ||||
| Combines C<ps1_3v_alarm> and C<ps1_5v_alarm> methods. | ||||
|   | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -120,47 +120,25 @@ sub fw_port { | ||||
|     return $arista->qb_fw_port($partial); | ||||
| } | ||||
|  | ||||
| # Use LLDP | ||||
|  | ||||
| sub hasCDP { | ||||
|     my $arista = shift; | ||||
|  | ||||
|     return $arista->hasLLDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
| # 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->lldp_ip($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() || {}; | ||||
|  | ||||
| sub c_if { | ||||
|     my $arista  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $arista->lldp_if($partial); | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
|     my $arista  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $arista->lldp_port($partial); | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
|     my $arista  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $arista->lldp_id($partial); | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $arista  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $arista->lldp_rem_sysdesc($partial); | ||||
|     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; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| @@ -232,10 +210,6 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
|     Returns 'Arista Networks, Inc.' | ||||
|  | ||||
| =item $arista->hasCDP() | ||||
|  | ||||
|     Returns whether LLDP is enabled. | ||||
|  | ||||
| =item $arista->model() | ||||
|  | ||||
| Tries to reference $arista->id() to one of the product MIBs listed above | ||||
| @@ -279,26 +253,6 @@ Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB> | ||||
|  | ||||
| Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB> | ||||
|  | ||||
| =item $arista->c_id() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $arista->c_if() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $arista->c_ip() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $arista->c_platform() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $arista->c_port() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $arista->i_duplex_admin() | ||||
|  | ||||
| Returns info from F<MAU-MIB> | ||||
| @@ -307,6 +261,10 @@ Returns info from F<MAU-MIB> | ||||
|  | ||||
| Returns info from F<MAU-MIB> | ||||
|  | ||||
| =item $arista->lldp_if() | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|   | ||||
							
								
								
									
										1406
									
								
								Info/Layer3/Aruba.pm
									
									
									
									
									
								
							
							
						
						
									
										1406
									
								
								Info/Layer3/Aruba.pm
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -43,7 +43,7 @@ use SNMP::Info::Bridge; | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE %MODEL_MAP | ||||
|     %MODID_MAP %PROCID_MAP/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -545,7 +545,7 @@ sub model { | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'nortel'; | ||||
|     return 'avaya'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
| @@ -1191,7 +1191,7 @@ sub e_vendor { | ||||
|  | ||||
|     my %wf_e_vendor; | ||||
|     foreach my $iid ( keys %$wf_e_idx ) { | ||||
|         $wf_e_vendor{$iid} = 'nortel'; | ||||
|         $wf_e_vendor{$iid} = 'avaya'; | ||||
|     } | ||||
|     return \%wf_e_vendor; | ||||
| } | ||||
| @@ -1378,7 +1378,8 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::BayRS - SNMP Interface to Nortel routers running BayRS. | ||||
| SNMP::Info::Layer3::BayRS - SNMP Interface to Avaya/Nortel routers running | ||||
| BayRS. | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -1401,7 +1402,7 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for routers running Nortel BayRS.   | ||||
| Abstraction subclass for routers running Avaya/Nortel BayRS.   | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| @@ -1474,7 +1475,7 @@ and the common model with this map : | ||||
|  | ||||
| =item $bayrs->vendor() | ||||
|  | ||||
| Returns 'nortel' | ||||
| Returns 'avaya' | ||||
|  | ||||
| =item $bayrs->os() | ||||
|  | ||||
| @@ -1583,7 +1584,7 @@ Returns reference to hash.  Key: IID, Value: Hardware version. | ||||
|  | ||||
| =item $bayrs->e_vendor() | ||||
|  | ||||
| Returns reference to hash.  Key: IID, Value: nortel. | ||||
| Returns reference to hash.  Key: IID, Value: avaya. | ||||
|  | ||||
| =item $bayrs->e_serial() | ||||
|  | ||||
| @@ -1634,11 +1635,11 @@ See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $extreme->munge_hw_rev() | ||||
| =item $bayrs->munge_hw_rev() | ||||
|  | ||||
| Converts octets to a decimal major.minor string. | ||||
|  | ||||
| =item $extreme->munge_wf_serial() | ||||
| =item $bayrs->munge_wf_serial() | ||||
|  | ||||
| Coverts octets to a decimal string. | ||||
|  | ||||
|   | ||||
| @@ -36,7 +36,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS, | ||||
| @@ -113,7 +113,7 @@ Subclass for Blue Coat SG Series proxy devices | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| BLUECOAT-SG-PROXY-MIB | ||||
|  BLUECOAT-SG-PROXY-MIB | ||||
|  | ||||
| =over | ||||
|  | ||||
| @@ -141,7 +141,7 @@ Returns C<'sgos'> | ||||
|  | ||||
| =item $router->os_ver() | ||||
|  | ||||
| Tries to resolve version string from "sgProxyVersion" | ||||
| Tries to resolve version string from C<"sgProxyVersion">. | ||||
|  | ||||
| =back | ||||
|  | ||||
|   | ||||
| @@ -64,7 +64,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| @SNMP::Info::Layer3::C3550::EXPORT_OK = qw//; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| # NOTE: Order creates precedence | ||||
| #       Example: v_name exists in Bridge.pm and CiscoVTP.pm | ||||
| @@ -236,141 +236,6 @@ sub cisco_comm_indexing { | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| #  Use CDP and/or LLDP | ||||
| sub hasCDP { | ||||
|     my $c3550 = shift; | ||||
|     return $c3550->hasLLDP() || $c3550->SUPER::hasCDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $c3550      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $cdp  = $c3550->SUPER::c_ip($partial) || {}; | ||||
|     my $lldp = $c3550->lldp_ip($partial)     || {}; | ||||
|  | ||||
|     my %c_ip; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $ip = $cdp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $ip = $lldp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|     } | ||||
|     return \%c_ip; | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
|     my $c3550      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $cdp  = $c3550->SUPER::c_if($partial)  || {}; | ||||
|  | ||||
|     my %c_if; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $if = $cdp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|  | ||||
|     # We need to match the lldp key with the ifIndex | ||||
|     # via lldpLocPortId and ifName | ||||
|     my $i_name = $c3550->ifName($partial) || {}; | ||||
|     my $i_name_rev = {}; | ||||
|     while ( my($key,$val) = each %$i_name ){ | ||||
| 	$i_name_rev->{$val} = $key; | ||||
|     } | ||||
|     my $loc_port_id = $c3550->lldpLocPortId($partial) || {}; | ||||
|     my $lldp = $c3550->lldp_if($partial) || {}; | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $if = $lldp->{$iid} || next; | ||||
| 	my $name = $loc_port_id->{$if} || next; | ||||
| 	my $i_index = $i_name_rev->{$name} || next; | ||||
|         $c_if{$iid} = $i_index; | ||||
|     } | ||||
|     return \%c_if; | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
|     my $c3550   = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $c3550->lldp_port($partial)     || {}; | ||||
|     my $cdp  = $c3550->SUPER::c_port($partial) || {}; | ||||
|  | ||||
|     my %c_port; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $port = $cdp->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $port = $lldp->{$iid}; | ||||
|         next unless defined $port; | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|     return \%c_port; | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
|     my $c3550   = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $c3550->lldp_id($partial)     || {}; | ||||
|     my $cdp  = $c3550->SUPER::c_id($partial) || {}; | ||||
|  | ||||
|     my %c_id; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $id = $cdp->{$iid}; | ||||
|         next unless defined $id; | ||||
| 	 | ||||
|         $c_id{$iid} = $id; | ||||
|     } | ||||
|      | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
| 	my $id = $lldp->{$iid}; | ||||
| 	next unless defined $id; | ||||
| 	 | ||||
| 	$c_id{$iid} = $id; | ||||
|     } | ||||
|     return \%c_id; | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $c3550      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $c3550->lldp_rem_sysdesc($partial)  || {}; | ||||
|     my $cdp  = $c3550->SUPER::c_platform($partial) || {}; | ||||
|  | ||||
|     my %c_platform; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $platform = $cdp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $platform = $lldp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|     return \%c_platform; | ||||
| } | ||||
|  | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| @@ -494,23 +359,6 @@ Returns 1.  Use vlan indexing. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Topology information | ||||
|  | ||||
| Based upon the firmware version Cisco devices may support Link Layer Discovery  | ||||
| Protocol (LLDP) in addition to Cisco Discovery Protocol (CDP).  These methods | ||||
| will query both and return the combination of all information.  As a result, | ||||
| there may be identical topology information returned from the two protocols | ||||
| causing duplicate entries.  It is the calling program's responsibility to | ||||
| identify any duplicate entries and remove duplicates if necessary. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $c3550->hasCDP() | ||||
|  | ||||
| Returns true if the device is running either CDP or LLDP. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| @@ -556,40 +404,6 @@ See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over  | ||||
|  | ||||
| =item $c3550->c_if() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: local device port (interfaces) | ||||
|  | ||||
| =item $c3550->c_ip() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: remote IPv4 address | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with the same IPv4 | ||||
| address, c_ip(), it may be a duplicate entry. | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with different | ||||
| IPv4 addresses, c_ip(), there is either a non-CDP/LLDP device in between two | ||||
| or more devices or multiple devices which are not directly connected.   | ||||
|  | ||||
| Use the data from the Layer2 Topology Table below to dig deeper. | ||||
|  | ||||
| =item $c3550->c_port() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: remote port (interfaces) | ||||
|  | ||||
| =item $c3550->c_id() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: string value used to identify the | ||||
| chassis component associated with the remote system. | ||||
|  | ||||
| =item $c3550->c_platform() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: Remote Device Type | ||||
|  | ||||
| =back  | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|   | ||||
| @@ -50,7 +50,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -106,6 +106,12 @@ $VERSION = '2.08'; | ||||
| *SNMP::Info::Layer3::C4000::i_speed_admin | ||||
|     = \&SNMP::Info::MAU::mau_i_speed_admin; | ||||
|  | ||||
| *SNMP::Info::Layer3::C4000::set_i_duplex_admin | ||||
|     = \&SNMP::Info::MAU::mau_set_i_duplex_admin; | ||||
| *SNMP::Info::Layer3::C4000::set_i_speed_admin | ||||
|     = \&SNMP::Info::MAU::mau_set_i_speed_admin; | ||||
|  | ||||
|  | ||||
| sub fan { | ||||
|     my $c4000     = shift; | ||||
|     my $fan_state = $c4000->fan_state(); | ||||
| @@ -281,6 +287,18 @@ Returns either (auto,full,half). | ||||
|  | ||||
| Returns administrative speed for interfaces. | ||||
|  | ||||
| =item $c4000->set_i_speed_admin(speed, ifIndex) | ||||
|  | ||||
| Sets port speed, must be supplied with speed and port C<ifIndex>. | ||||
|  | ||||
| Speed choices are '10', '100', '1000', 'auto'. | ||||
|  | ||||
| =item $c4000->set_i_duplex_admin(duplex, ifIndex) | ||||
|  | ||||
| Sets port duplex, must be supplied with duplex and port C<ifIndex>. | ||||
|  | ||||
| Duplex choices are 'auto', 'half', 'full'. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoVTP | ||||
|   | ||||
| @@ -43,6 +43,7 @@ use SNMP::Info::CiscoPower; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::CiscoStpExtensions; | ||||
| use SNMP::Info::CiscoVTP; | ||||
| use SNMP::Info::MAU; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| @@ -59,6 +60,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|     SNMP::Info::CiscoConfig | ||||
|     SNMP::Info::CiscoPower | ||||
|     SNMP::Info::Layer3 | ||||
|     SNMP::Info::MAU | ||||
|     Exporter | ||||
| /; | ||||
|  | ||||
| @@ -66,7 +68,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| # NOTE: Order creates precedence | ||||
| #       Example: v_name exists in Bridge.pm and CiscoVTP.pm | ||||
| @@ -75,15 +77,23 @@ $VERSION = '2.08'; | ||||
| # 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::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, | ||||
|     'CISCO-VIRTUAL-SWITCH-MIB' => 'cvsSwitchMode', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::MAU::GLOBALS, | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::CiscoPower::GLOBALS, | ||||
|     %SNMP::Info::CiscoConfig::GLOBALS, | ||||
| @@ -98,22 +108,21 @@ $VERSION = '2.08'; | ||||
| ); | ||||
|  | ||||
| %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::FUNCS, | ||||
|     %SNMP::Info::CiscoPower::FUNCS,         %SNMP::Info::CiscoConfig::FUNCS, | ||||
|     %SNMP::Info::CiscoPortSecurity::FUNCS,  %SNMP::Info::CiscoImage::FUNCS, | ||||
|     %SNMP::Info::CiscoStats::FUNCS,         %SNMP::Info::CDP::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS,               %SNMP::Info::CiscoStack::FUNCS, | ||||
|     %SNMP::Info::CiscoStpExtensions::FUNCS, %SNMP::Info::CiscoVTP::FUNCS, | ||||
| ); | ||||
|  | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE,             %SNMP::Info::CiscoPower::MUNGE, | ||||
|     %SNMP::Info::CiscoConfig::MUNGE,        %SNMP::Info::CiscoPortSecurity::MUNGE, | ||||
|     %SNMP::Info::CiscoImage::MUNGE,         %SNMP::Info::CiscoStats::MUNGE, | ||||
|     %SNMP::Info::CDP::MUNGE,                %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::CiscoStack::MUNGE,         %SNMP::Info::CiscoStpExtensions::MUNGE,  | ||||
|     %SNMP::Info::CiscoVTP::MUNGE,     | ||||
|     %SNMP::Info::MAU::MUNGE,                %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::CiscoPower::MUNGE,         %SNMP::Info::CiscoConfig::MUNGE, | ||||
|     %SNMP::Info::CiscoPortSecurity::MUNGE,  %SNMP::Info::CiscoImage::MUNGE, | ||||
|     %SNMP::Info::CiscoStats::MUNGE,         %SNMP::Info::CDP::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE,               %SNMP::Info::CiscoStack::MUNGE, | ||||
|     %SNMP::Info::CiscoStpExtensions::MUNGE, %SNMP::Info::CiscoVTP::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
| @@ -179,6 +188,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 +205,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,137 +236,34 @@ 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 ); | ||||
|     } | ||||
| } | ||||
|  | ||||
| #  Use CDP and/or LLDP | ||||
| sub hasCDP { | ||||
|     my $c6500 = shift; | ||||
|  | ||||
|     return $c6500->hasLLDP() || $c6500->SUPER::hasCDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
| sub set_i_speed_admin { | ||||
|     my $c6500   = shift; | ||||
|     my $partial = shift; | ||||
|     my ( $speed, $iid ) = @_; | ||||
|  | ||||
|     my $cdp  = $c6500->SUPER::c_ip($partial) || {}; | ||||
|     my $lldp = $c6500->lldp_ip($partial)     || {}; | ||||
|     if ( $c6500->is_virtual_switch() ) { | ||||
|  | ||||
|     my %c_ip; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $ip = $cdp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|         # 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). | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|         return $c6500->mau_set_i_speed_admin( $speed, $iid ); | ||||
|     } | ||||
|     else { | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $ip = $lldp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|         # normal behavior using the CiscoStack method | ||||
|         return $c6500->SUPER::set_i_speed_admin( $speed, $iid ); | ||||
|     } | ||||
|     return \%c_ip; | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
|     my $c6500   = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $c6500->lldp_if($partial)     || {}; | ||||
|     my $cdp  = $c6500->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 $c6500   = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $c6500->lldp_port($partial)     || {}; | ||||
|     my $cdp  = $c6500->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 $c6500   = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $c6500->lldp_id($partial)     || {}; | ||||
|     my $cdp  = $c6500->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 $c6500   = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $c6500->lldp_rem_sysdesc($partial)  || {}; | ||||
|     my $cdp  = $c6500->SUPER::c_platform($partial) || {}; | ||||
|  | ||||
|     my %c_platform; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $platform = $cdp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $platform = $lldp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|     return \%c_platform; | ||||
| } | ||||
|  | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| @@ -444,6 +374,14 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| Returns 1.  Use vlan indexing. | ||||
|  | ||||
| =item $c6500->cvsSwitchMode() | ||||
|  | ||||
| Returns the Switch status: multiNode or standalone. | ||||
|  | ||||
| =item $c6500->is_virtual_switch() | ||||
|  | ||||
| Return 1 if the switch (C<cvsSwitchMode>) is in multimode (VSS). | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::CiscoVTP | ||||
| @@ -529,52 +467,13 @@ 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); | ||||
|  | ||||
| =back | ||||
| =item $c6500->set_i_speed_admin(speed, ifIndex) | ||||
|  | ||||
| =head2 Topology information | ||||
| Sets port speed, must be supplied with speed and port C<ifIndex>. | ||||
|  | ||||
| Based upon the firmware version Cisco devices may support Link Layer Discover | ||||
| Protocol (LLDP) in addition to the Cisco-proprietary CDP.  These methods | ||||
| will query both and return the combination of all information.  As a result, | ||||
| there may be identical topology information returned from the two protocols | ||||
| causing duplicate entries.  It is the calling program's responsibility to | ||||
| identify any duplicate entries and remove duplicates if necessary. | ||||
| Speed choices are '10', '100', '1000'. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $c6500->hasCDP() | ||||
|  | ||||
| Returns true if the device is running either CDP or LLDP. | ||||
|  | ||||
| =item $c6500->c_if() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: local device port (interfaces) | ||||
|  | ||||
| =item $c6500->c_ip() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: remote IPv4 address | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with the same IPv4 | ||||
| address, c_ip(), it may be a duplicate entry. | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with different | ||||
| IPv4 addresses, c_ip(), there is either a non-CDP/LLDP device in between two | ||||
| or more devices or multiple devices which are not directly connected.   | ||||
|  | ||||
| Use the data from the Layer2 Topology Table below to dig deeper. | ||||
|  | ||||
| =item $c6500->c_port() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: remote port (interfaces) | ||||
|  | ||||
| =item $c6500->c_id() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: string value used to identify the | ||||
| chassis component associated with the remote system. | ||||
|  | ||||
| =item $c6500->c_platform() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: Remote Device Type | ||||
| Crosses $c6500->p_port() with $c6500->p_speed() to utilize port C<ifIndex>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -613,11 +512,12 @@ See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoStpExtensions | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for | ||||
| details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
|  | ||||
|   | ||||
| @@ -52,7 +52,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
							
								
								
									
										252
									
								
								Info/Layer3/CiscoASA.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								Info/Layer3/CiscoASA.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,252 @@ | ||||
| # SNMP::Info::Layer3::CiscoASA | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2013 Moe Kraus | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR | ||||
| # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer3::CiscoASA; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::CiscoVTP; | ||||
| use SNMP::Info::CDP; | ||||
| use SNMP::Info::CiscoStats; | ||||
| use SNMP::Info::CiscoImage; | ||||
| use SNMP::Info::CiscoRTT; | ||||
| use SNMP::Info::CiscoQOS; | ||||
| use SNMP::Info::CiscoConfig; | ||||
| use SNMP::Info::CiscoPower; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::Layer3::Cisco; | ||||
|  | ||||
| @SNMP::Info::Layer3::CiscoASA::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP | ||||
|     SNMP::Info::CiscoStats SNMP::Info::CiscoImage | ||||
|     SNMP::Info::CiscoRTT  SNMP::Info::CiscoQOS | ||||
|     SNMP::Info::CiscoConfig SNMP::Info::CiscoPower | ||||
|     SNMP::Info::Layer3::Cisco | ||||
|     SNMP::Info::Layer3 | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer3::CiscoASA::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|        %SNMP::Info::Layer3::Cisco::MIBS, | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|        %SNMP::Info::Layer3::Cisco::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|        %SNMP::Info::Layer3::Cisco::FUNCS, | ||||
|     'mac_table' => 'ifPhysAddress', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|        %SNMP::Info::Layer3::Cisco::MUNGE, | ||||
|     'mac_table'  => \&SNMP::Info::munge_mac, ); | ||||
|  | ||||
| sub b_mac { | ||||
|        my ($asa) = shift; | ||||
|        my $macs = $asa->mac_table(); | ||||
|        my @macs; | ||||
|        # gather physical addresses | ||||
|        foreach my $i ( keys %$macs ) { | ||||
|                my $mac = $macs->{$i}; | ||||
|                # don't catch the bad macs with zeroed OUI | ||||
|                if ( $mac !~ m/(0{1,2}:){3}/ ) { | ||||
|                        push( @macs, $mac); | ||||
|                } | ||||
|                @macs = sort( @macs ); | ||||
|        } | ||||
|        # return the least mac | ||||
|        return $macs[0]; | ||||
| } | ||||
|  | ||||
| sub i_description { | ||||
|     my $self = shift; | ||||
|     my $partial   = shift; | ||||
|  | ||||
|     my $i_descr = $self->orig_i_description($partial) || {}; | ||||
|  | ||||
|     foreach my $ifindex ( keys %$i_descr ) { | ||||
|         $i_descr->{$ifindex} =~ /'(.*)'/; | ||||
|         $i_descr->{$ifindex} = $1 | ||||
|             if defined $1; | ||||
|     } | ||||
|  | ||||
|     return $i_descr; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::CiscoASA - Cisco Adaptive Security Appliance | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Moe Kraus | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $cisco = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
|                         # These arguments are passed directly to SNMP::Session | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $asa->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass: $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Cisco ASA Devices | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3::Cisco | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<CISCO-EIGRP-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $asa->b_mac() | ||||
|  | ||||
| Returns base mac. | ||||
| Overrides base mac function in L<SNMP::Info::Layer3>. | ||||
|  | ||||
| =item $asa->i_description() | ||||
|  | ||||
| Overrides base interface description function in L<SNMP::Info> to return the | ||||
| configured interface name instead of "Adaptive Security Appliance | ||||
| '$configured interface name' interface". | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::CiscoVTP | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoStats | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoImage | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoRTT | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoQOS | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoConfig | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoPower | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3::Cisco | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a | ||||
| reference to a hash. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoVTP | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoStats | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoImage | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoRTT | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoQOS | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3::Cisco | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::Layer3::Cisco; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::Cisco::MIBS, | ||||
| @@ -202,17 +202,17 @@ to a hash. | ||||
| =item $fwsm->at_paddr() | ||||
|  | ||||
| This function derives the at_paddr information from the n2p_paddr() table as | ||||
| the MIB to provide that information isn't supported on FWSMs. | ||||
| the MIB to provide that information isn't supported on FWSM. | ||||
|  | ||||
| =item $fwsm->at_netaddr() | ||||
|  | ||||
| This function derives the at_netaddr information from the n2p_paddr() table as | ||||
| the MIB to provide that information isn't supported on FWSMs. | ||||
| the MIB to provide that information isn't supported on FWSM. | ||||
|  | ||||
| =item $fwsm->at_ifaddr() | ||||
|  | ||||
| This function derives the at_ifaddr information from the n2p_paddr() table as | ||||
| the MIB to provide that information isn't supported on FWSMs. | ||||
| the MIB to provide that information isn't supported on FWSM. | ||||
|  | ||||
| =back | ||||
|  | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info::Entity; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS, | ||||
| @@ -68,7 +68,7 @@ sub layers { | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'nortel'; | ||||
|     return 'avaya'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
| @@ -162,8 +162,8 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::Contivity - SNMP Interface to Nortel VPN Routers | ||||
| (Contivity Extranet Switches). | ||||
| SNMP::Info::Layer3::Contivity - SNMP Interface to Avaya/Nortel VPN Routers | ||||
| (formerly Contivity Extranet Switches). | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -186,7 +186,8 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for Nortel VPN Routers (Contivity Extranet Switch).   | ||||
| Abstraction subclass for Avaya/Nortel VPN Routers (formerly Contivity | ||||
| Extranet Switch).   | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| @@ -227,7 +228,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $contivity->vendor() | ||||
|  | ||||
| Returns 'Nortel' | ||||
| Returns 'avaya' | ||||
|  | ||||
| =item $contivity->model() | ||||
|  | ||||
|   | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -232,47 +232,6 @@ sub _vendor { | ||||
|     } | ||||
| } | ||||
|  | ||||
| # lldp support | ||||
| sub hasCDP { | ||||
|     my $dell = shift; | ||||
|     return $dell->hasLLDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $dell    = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $dell->lldp_ip($partial); | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
|     my $dell    = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $dell->lldp_if($partial); | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
|     my $dell    = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $dell->lldp_port($partial); | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
|     my $dell    = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $dell->lldp_id($partial); | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $dell    = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $dell->lldp_rem_sysdesc($partial); | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| @@ -368,10 +327,6 @@ id().  Defaults to 'dlink'. | ||||
| Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in | ||||
| id().  Defaults to 'dlink'. | ||||
|  | ||||
| =item $dell->hasCDP() | ||||
|  | ||||
| Returns whether LLDP is enabled. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
| @@ -389,6 +344,10 @@ otherwise uses the Layer3 serial method. | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| @@ -464,30 +423,14 @@ 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->c_id() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $dell->c_if() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $dell->c_ip() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $dell->c_platform() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $dell->c_port() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -44,7 +44,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS, | ||||
| @@ -165,132 +165,67 @@ sub fw_port { | ||||
|     return $enterasys->qb_fw_port($partial); | ||||
| } | ||||
|  | ||||
| #  Use CDP and/or LLDP | ||||
| #  LLDP table timefilter implementation continuously increments when walked | ||||
| #  and we may never reach the end of the table.  This behavior can be | ||||
| #  modified with the "set snmp timefilter break disable" command, | ||||
| #  unfortunately it is not the default.  Query with a partial value of zero | ||||
| #  which means no time filter. | ||||
|  | ||||
| sub hasCDP { | ||||
| sub lldp_ip { | ||||
|     my $enterasys = shift; | ||||
|     my $partial   = shift || 0; | ||||
|  | ||||
|     return $enterasys->hasLLDP() || $enterasys->SUPER::hasCDP(); | ||||
|     return $enterasys->SUPER::lldp_ip($partial); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $enterasys = shift; | ||||
|     my $partial   = shift; | ||||
| # [3564920] LLDP-MIB::lldpLocPortDesc isn't always unique, | ||||
| # use LLDP-MIB::lldpLocPortId this cross references to ifName | ||||
| sub lldp_if { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift || 0; | ||||
|  | ||||
|     my $cdp  = $enterasys->SUPER::c_ip($partial) || {}; | ||||
|     my $lldp = $enterasys->lldp_ip($partial)     || {}; | ||||
|  | ||||
|     my %c_ip; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $ip = $cdp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|     my $addr    = $lldp->lldp_rem_pid($partial) || {}; | ||||
|     my $i_descr = $lldp->ifName() || {}; | ||||
|     my %r_i_descr = reverse %$i_descr; | ||||
|      | ||||
|     my %lldp_if; | ||||
|     foreach my $key ( keys %$addr ) { | ||||
|         my @aOID = split( '\.', $key ); | ||||
|         my $port = $aOID[1]; | ||||
|         next unless $port; | ||||
|         # Local LLDP port may not equate to ifIndex | ||||
|         # Cross reference lldpLocPortId with ifName to get ifIndex | ||||
|         my $lldp_desc = $lldp->lldpLocPortId($port); | ||||
|         my $desc = $lldp_desc->{$port}; | ||||
|         # If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum | ||||
|         if ( exists $r_i_descr{$desc} ) { | ||||
|             $port = $r_i_descr{$desc}; | ||||
|         } | ||||
|          | ||||
|         $lldp_if{$key} = $port; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $ip = $lldp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|     } | ||||
|     return \%c_ip; | ||||
|     return \%lldp_if; | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
| sub lldp_port { | ||||
|     my $enterasys = shift; | ||||
|     my $partial   = shift; | ||||
|     my $partial   = shift || 0; | ||||
|  | ||||
|     my $lldp = $enterasys->lldp_if($partial)     || {}; | ||||
|     my $cdp  = $enterasys->SUPER::c_if($partial) || {}; | ||||
|  | ||||
|     my %c_if; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $if = $cdp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $if = $lldp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|     return \%c_if; | ||||
|     return $enterasys->SUPER::lldp_port($partial); | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
| sub lldp_id { | ||||
|     my $enterasys = shift; | ||||
|     my $partial   = shift; | ||||
|     my $partial   = shift || 0; | ||||
|  | ||||
|     my $lldp = $enterasys->lldp_port($partial)     || {}; | ||||
|     my $cdp  = $enterasys->SUPER::c_port($partial) || {}; | ||||
|  | ||||
|     my %c_port; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $port = $cdp->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $port = $lldp->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|     return \%c_port; | ||||
|     return  $enterasys->SUPER::lldp_id($partial); | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
| sub lldp_platform { | ||||
|     my $enterasys = shift; | ||||
|     my $partial   = shift; | ||||
|     my $partial   = shift || 0; | ||||
|  | ||||
|     my $lldp = $enterasys->lldp_id($partial)     || {}; | ||||
|     my $cdp  = $enterasys->SUPER::c_id($partial) || {}; | ||||
|  | ||||
|     my %c_id; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $id = $cdp->{$iid}; | ||||
|         next unless defined $id; | ||||
|  | ||||
|         $c_id{$iid} = $id; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $id = $lldp->{$iid}; | ||||
|         next unless defined $id; | ||||
|  | ||||
|         $c_id{$iid} = $id; | ||||
|     } | ||||
|     return \%c_id; | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $enterasys = shift; | ||||
|     my $partial   = shift; | ||||
|  | ||||
|     my $lldp = $enterasys->lldp_rem_sysdesc($partial)  || {}; | ||||
|     my $cdp  = $enterasys->SUPER::c_platform($partial) || {}; | ||||
|  | ||||
|     my %c_platform; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $platform = $cdp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $platform = $lldp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|     return \%c_platform; | ||||
|     return  $enterasys->SUPER::lldp_rem_sysdesc($partial); | ||||
| } | ||||
|  | ||||
| 1; | ||||
| @@ -393,12 +328,6 @@ Returns base mac | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::MAU | ||||
|  | ||||
| See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details. | ||||
| @@ -457,52 +386,25 @@ identifier (iid). | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Topology information | ||||
| =head2 Link Layer Discovery Protocol (LLDP) Overrides | ||||
|  | ||||
| Based upon the firmware version Enterasys devices may support Cabletron | ||||
| Discovery Protocol (CTRON CDP), Cisco Discovery Protocol (CDP), Link Layer | ||||
| Discovery Protocol (LLDP), or all.  This module currently supports CDP and | ||||
| LLDP, but not CTRON CDP.  These methods will query both CDP and LLDP and | ||||
| return the combination of all information.  As a result, there may be | ||||
| identical topology information returned from the two protocols | ||||
| causing duplicate entries.  It is the calling program's responsibility to | ||||
| identify any duplicate entries and remove duplicates if necessary. | ||||
| The LLDP table time filter implementation continuously increments when | ||||
| walked and we may never reach the end of the table.  This behavior can be | ||||
| modified with the C<"set snmp timefilter break disable"> command, | ||||
| unfortunately it is not the default.  These methods are overridden to | ||||
| supply a partial value of zero which means no time filter. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $enterasys->hasCDP() | ||||
| =item $enterasys->lldp_if() | ||||
|  | ||||
| Returns true if the device is running either CDP or LLDP. | ||||
| =item $enterasys->lldp_ip() | ||||
|  | ||||
| =item $enterasys->c_if() | ||||
| =item $enterasys->lldp_port() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: local device port (interfaces) | ||||
| =item $enterasys->lldp_id() | ||||
|  | ||||
| =item $enterasys->c_ip() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: remote IPv4 address | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with the same IPv4 | ||||
| address, c_ip(), it may be a duplicate entry. | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with different | ||||
| IPv4 addresses, c_ip(), there is either a non-CDP/LLDP device in between two | ||||
| or more devices or multiple devices which are not directly connected.   | ||||
|  | ||||
| Use the data from the Layer2 Topology Table below to dig deeper. | ||||
|  | ||||
| =item $enterasys->c_port() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: remote port (interfaces) | ||||
|  | ||||
| =item $enterasys->c_id() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: string value used to identify the | ||||
| chassis component associated with the remote system. | ||||
|  | ||||
| =item $enterasys->c_platform() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: Remote Device Type | ||||
| =item $enterasys->lldp_platform() | ||||
|  | ||||
| =back | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| # SNMP::Info::Layer3::Extreme - SNMP Interface to Extreme devices | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # Copyright (c) 2012 Eric Miller | ||||
| # | ||||
| # Copyright (c) 2002,2003 Regents of the University of California | ||||
| # All rights reserved. | ||||
| @@ -36,18 +36,23 @@ use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::MAU; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::EDP; | ||||
|  | ||||
| @SNMP::Info::Layer3::Extreme::ISA | ||||
|     = qw/SNMP::Info::Layer3 SNMP::Info::MAU Exporter/; | ||||
|     = qw/SNMP::Info::Layer3 SNMP::Info::MAU SNMP::Info::LLDP | ||||
|     SNMP::Info::EDP Exporter/; | ||||
| @SNMP::Info::Layer3::Extreme::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::EDP::MIBS, | ||||
|     'EXTREME-BASE-MIB'   => 'extremeAgent', | ||||
|     'EXTREME-SYSTEM-MIB' => 'extremeSystem', | ||||
|     'EXTREME-FDB-MIB'    => 'extremeSystem', | ||||
| @@ -58,6 +63,8 @@ $VERSION = '2.08'; | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::MAU::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::EDP::GLOBALS, | ||||
|     'serial1'        => 'extremeSystemID.0', | ||||
|     'temp'           => 'extremeCurrentTemperature', | ||||
|     'ps1_status_old' => 'extremePrimaryPowerOperational.0', | ||||
| @@ -70,20 +77,25 @@ $VERSION = '2.08'; | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::MAU::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::EDP::FUNCS, | ||||
|     'fan_state' => 'extremeFanOperational', | ||||
|  | ||||
|     # EXTREME-FDB-MIB:extremeFdbMacFdbTable | ||||
|     'ex_fw_mac'    => 'extremeFdbMacFdbMacAddress', | ||||
|     'ex_fw_port'   => 'extremeFdbMacFdbPortIfIndex', | ||||
|     'ex_fw_status' => 'extremeFdbMacFdbStatus', | ||||
|  | ||||
|     # EXTREME-VLAN-MIB:extremeVlanIfTable | ||||
|     'ex_vlan_descr'     => 'extremeVlanIfDescr', | ||||
|     'ex_vlan_global_id' => 'extremeVlanIfGlobalIdentifier', | ||||
|  | ||||
|     'ex_vlan_id'        => 'extremeVlanIfVlanId', | ||||
|     # EXTREME-VLAN-MIB:extremeVlanEncapsIfTable | ||||
|     'ex_vlan_encap_tag' => 'extremeVlanEncapsIfTag', | ||||
|  | ||||
|     # EXTREME-VLAN-MIB:extremeVlanOpaqueTable | ||||
|     'ex_vlan_untagged'  => 'extremeVlanOpaqueUntaggedPorts', | ||||
|     'ex_vlan_tagged'    => 'extremeVlanOpaqueTaggedPorts', | ||||
|     # EXTREME-POE-MIB::extremePethPseSlotTable | ||||
|     'peth_power_watts'  => 'extremePethSlotPowerLimit', | ||||
|     # EXTREME-POE-MIB::extremePethPsePortTable | ||||
|     'peth_port_power'   => 'extremePethPortMeasuredPower', | ||||
| ); | ||||
|  | ||||
| @@ -92,12 +104,16 @@ $VERSION = '2.08'; | ||||
|     # Inherit all the built in munging | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::MAU::MUNGE, | ||||
|     'ex_fw_mac'      => \&SNMP::Info::munge_mac, | ||||
|     'ps1_status_old' => \&munge_true_ok, | ||||
|     'ps1_status_new' => \&munge_power_stat, | ||||
|     'ps2_status_old' => \&munge_power_stat, | ||||
|     'ps2_status_new' => \&munge_power_stat, | ||||
|     'fan_state'      => \&munge_true_ok, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::EDP::MUNGE, | ||||
|     'ex_fw_mac'        => \&SNMP::Info::munge_mac, | ||||
|     'ps1_status_old'   => \&munge_true_ok, | ||||
|     'ps1_status_new'   => \&munge_power_stat, | ||||
|     'ps2_status_old'   => \&munge_power_stat, | ||||
|     'ps2_status_new'   => \&munge_power_stat, | ||||
|     'fan_state'        => \&munge_true_ok, | ||||
|     'ex_vlan_untagged' => \&SNMP::Info::munge_port_list, | ||||
|     'ex_vlan_tagged'   => \&SNMP::Info::munge_port_list, | ||||
| ); | ||||
|  | ||||
| # Method OverRides | ||||
| @@ -129,15 +145,24 @@ sub vendor { | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'extreme'; | ||||
|     my $extreme = shift; | ||||
|  | ||||
|     my $desc = $extreme->description(); | ||||
|  | ||||
|     if ( $desc =~ /xos/i ) { | ||||
|         return 'xos'; | ||||
|     } | ||||
|  | ||||
|     return 'extremeware'; | ||||
| } | ||||
|  | ||||
|  | ||||
| sub os_ver { | ||||
|     my $extreme = shift; | ||||
|     my $descr   = $extreme->description(); | ||||
|     return unless defined $descr; | ||||
|  | ||||
|     if ( $descr =~ m/Version\s+([^ ]+)/ ) { | ||||
|     if ( $descr =~ m/Version\s+([^ ]+)/i ) { | ||||
|         return $1; | ||||
|     } | ||||
|  | ||||
| @@ -178,7 +203,7 @@ sub i_ignore { | ||||
|     my %i_ignore; | ||||
|     foreach my $if ( keys %$i_description ) { | ||||
|         if ( $i_description->{$if} | ||||
|             =~ /^(802.1Q Encapsulation Tag \d+|VLAN \d+|lo\d+)/i ) | ||||
|             =~ /^(802.1Q Encapsulation Tag \d+|VLAN \d+|lo\d+|VirtualRouter\d+)/i ) | ||||
|         { | ||||
|             $i_ignore{$if}++; | ||||
|         } | ||||
| @@ -191,6 +216,10 @@ sub i_ignore { | ||||
| # ifIndex. | ||||
| sub bp_index { | ||||
|     my $extreme  = shift; | ||||
|  | ||||
|     my $bindex = $extreme->SUPER::bp_index(); | ||||
|     return $bindex if (keys %$bindex); | ||||
|  | ||||
|     my $if_index = $extreme->i_index(); | ||||
|  | ||||
|     my %bp_index; | ||||
| @@ -241,28 +270,54 @@ sub fan { | ||||
|     return $ret; | ||||
| } | ||||
|  | ||||
| # Newer versions of the Extreme firmware have vendor-specific tables | ||||
| # for this; those are ex_fw_*().  Older firmware versions don't have | ||||
| # these tables, so we use the BRIDGE-MIB tables. | ||||
| # For xos based VLAN functions we need to know how the ports are indexed | ||||
| # default is slot * 1000, but some older switches start at 1 | ||||
| sub _slot_factor { | ||||
|     my $extreme = shift; | ||||
|      | ||||
|     my $index = $extreme->i_index(); | ||||
|      | ||||
|     return 1 if (exists $index->{1} && $index->{1} == 1); | ||||
|     return 1000; | ||||
| } | ||||
|  | ||||
| # Some versions of the Extreme firmware have vendor-specific tables | ||||
| # for this; those are ex_fw_*().  Some don't have these tables, | ||||
| # we use the BRIDGE-MIB tables if available then the ex_fw_*() methods. | ||||
| sub fw_mac { | ||||
|     my $extreme = shift; | ||||
|     my $fw_mac  = $extreme->ex_fw_mac; | ||||
|     return $fw_mac if defined($fw_mac); | ||||
|     return $extreme->orig_fw_mac(); | ||||
|      | ||||
|     my $b = $extreme->SUPER::fw_mac(); | ||||
|     return $b if (keys %$b); | ||||
|  | ||||
|     my $qb = $extreme->qb_fw_mac(); | ||||
|     return $qb if (keys %$qb); | ||||
|      | ||||
|     return $extreme->ex_fw_mac(); | ||||
| } | ||||
|  | ||||
| sub fw_port { | ||||
|     my $extreme = shift; | ||||
|     my $fw_port = $extreme->ex_fw_port; | ||||
|     return $fw_port if defined($fw_port); | ||||
|     return $extreme->orig_fw_port(); | ||||
|      | ||||
|     my $b = $extreme->SUPER::fw_port(); | ||||
|     return $b if (keys %$b); | ||||
|  | ||||
|     my $qb = $extreme->qb_fw_port(); | ||||
|     return $qb if (keys %$qb); | ||||
|      | ||||
|     return $extreme->ex_fw_port(); | ||||
| } | ||||
|  | ||||
| sub fw_status { | ||||
|     my $extreme   = shift; | ||||
|     my $fw_status = $extreme->ex_fw_status; | ||||
|     return $fw_status if defined($fw_status); | ||||
|     return $extreme->orig_fw_status(); | ||||
|  | ||||
|     my $b = $extreme->SUPER::fw_status(); | ||||
|     return $b if (keys %$b); | ||||
|  | ||||
|     my $qb = $extreme->qb_fw_status(); | ||||
|     return $qb if (keys %$qb); | ||||
|  | ||||
|     return $extreme->ex_fw_status(); | ||||
| } | ||||
|  | ||||
| # Mapping the virtual VLAN interfaces: | ||||
| @@ -303,7 +358,7 @@ sub _if2tag { | ||||
|         } | ||||
|     } | ||||
|     if ($missed) { | ||||
|         my $global_id = $extreme->ex_vlan_global_id(); | ||||
|         my $global_id = $extreme->ex_vlan_id(); | ||||
|         foreach my $if ( keys %if2tag ) { | ||||
|             $if2tag{$if} = -$global_id->{$if} | ||||
|                 if ( $if2tag{$if} == -1 && defined( $global_id->{$if} ) ); | ||||
| @@ -312,7 +367,7 @@ sub _if2tag { | ||||
|     return \%if2tag; | ||||
| } | ||||
|  | ||||
| # No partial support in v_name or v_index, because the obivous partial | ||||
| # No partial support in v_name or v_index, because the obvious partial | ||||
| # is the VLAN ID and the index here is the ifIndex of | ||||
| # the VLAN interface. | ||||
| sub v_name { | ||||
| @@ -322,12 +377,66 @@ sub v_name { | ||||
|  | ||||
| sub v_index { | ||||
|     my $extreme = shift; | ||||
|     return $extreme->_if2tag(); | ||||
|     return $extreme->ex_vlan_id || $extreme->_if2tag(); | ||||
| } | ||||
|  | ||||
| sub i_vlan { | ||||
|     my $extreme    = shift; | ||||
|     my $partial    = shift; | ||||
|  | ||||
|     # Some devices support Q-Bridge, if so short circuit and return it | ||||
|     my $q_bridge = $extreme->SUPER::i_vlan($partial); | ||||
|     return $q_bridge if (keys %$q_bridge); | ||||
|  | ||||
|     # Next we try extremeVlanOpaqueTable | ||||
|     my $xos = $extreme->_xos_i_vlan($partial); | ||||
|     return $xos if (keys %$xos); | ||||
|      | ||||
|     # Try older ifStack method | ||||
|     my $extremeware = $extreme->_extremeware_i_vlan($partial); | ||||
|     return $extremeware if (keys %$extremeware); | ||||
|      | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub _xos_i_vlan { | ||||
|     my $extreme = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $index   = $extreme->i_index(); | ||||
|     my $vlans   = $extreme->ex_vlan_id() || {}; | ||||
|     my $slotx   = $extreme->_slot_factor() || 1000; | ||||
|     my $u_ports = $extreme->ex_vlan_untagged() || {}; | ||||
|  | ||||
|     my $i_vlan = {}; | ||||
|     foreach my $idx ( keys %$u_ports ) { | ||||
|         next unless ( defined $u_ports->{$idx} ); | ||||
|         my $portlist = $u_ports->{$idx}; | ||||
|         my $ret      = []; | ||||
|  | ||||
|         my ( $vlan_if, $slot ) = $idx =~ /^(\d+)\.(\d+)/; | ||||
|         my $vlan = $vlans->{$vlan_if} || ''; | ||||
|  | ||||
|         # Convert portlist bit array to bp_index array | ||||
|         for ( my $i = 0; $i <= $#$portlist; $i++ ) { | ||||
|             push( @{$ret}, ( $slotx * $slot + $i + 1 ) ) | ||||
|                 if ( @$portlist[$i] ); | ||||
|         } | ||||
|  | ||||
|         #Create HoA ifIndex -> VLAN array | ||||
|         foreach my $port ( @{$ret} ) { | ||||
|             my $ifindex = $index->{$port}; | ||||
|             next unless ( defined($ifindex) );    # shouldn't happen | ||||
|             next if ( defined $partial and $ifindex !~ /^$partial$/ ); | ||||
|             $i_vlan->{$ifindex} = $vlan; | ||||
|         } | ||||
|     } | ||||
|     return $i_vlan; | ||||
| } | ||||
|  | ||||
| sub _extremeware_i_vlan { | ||||
|     my $extreme    = shift; | ||||
|     my $partial    = shift; | ||||
|     my $stack      = $extreme->ifStackStatus($partial); | ||||
|     my $encap_tag  = $extreme->ex_vlan_encap_tag(); | ||||
|     my $vlan_descr = $extreme->ex_vlan_descr(); | ||||
| @@ -351,6 +460,65 @@ sub i_vlan { | ||||
| } | ||||
|  | ||||
| sub i_vlan_membership { | ||||
|     my $extreme = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     # Some devices support Q-Bridge, if so short circuit and return it | ||||
|     my $q_bridge = $extreme->SUPER::i_vlan_membership($partial); | ||||
|     return $q_bridge if (ref {} eq ref $q_bridge and scalar keys %$q_bridge); | ||||
|  | ||||
|     # Next we try extremeVlanOpaqueTable | ||||
|     my $xos = $extreme->_xos_i_vlan_membership($partial); | ||||
|     return $xos if (ref {} eq ref $xos and scalar keys %$xos); | ||||
|      | ||||
|     # Try older ifStack method | ||||
|     my $extremeware = $extreme->_extremeware_i_vlan_membership($partial); | ||||
|     return $extremeware if (ref {} eq ref $extremeware and scalar keys %$extremeware); | ||||
|      | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub _xos_i_vlan_membership { | ||||
|     my $extreme = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $index   = $extreme->i_index(); | ||||
|     my $vlans   = $extreme->ex_vlan_id(); | ||||
|     my $slotx   = $extreme->_slot_factor() || 1000; | ||||
|     my $u_ports = $extreme->ex_vlan_untagged() || {}; | ||||
|     my $t_ports = $extreme->ex_vlan_tagged() || {}; | ||||
|  | ||||
|     my $i_vlan_membership = {}; | ||||
|     foreach my $idx ( keys %$u_ports ) { | ||||
|         next unless ( defined $u_ports->{$idx} ); | ||||
|         my $u_portlist = $u_ports->{$idx}; | ||||
|         my $t_portlist = $t_ports->{$idx}; | ||||
|         my $ret        = []; | ||||
|  | ||||
|         my ( $vlan_if, $slot ) = $idx =~ /^(\d+)\.(\d+)/; | ||||
|         my $vlan = $vlans->{$vlan_if} || ''; | ||||
|  | ||||
|         foreach my $portlist ( $u_portlist, $t_portlist ) { | ||||
|  | ||||
|             # Convert portlist bit array to bp_index array | ||||
|             for ( my $i = 0; $i <= $#$portlist; $i++ ) { | ||||
|                 push( @{$ret}, ( $slotx * $slot + $i + 1 ) ) | ||||
|                     if ( @$portlist[$i] ); | ||||
|             } | ||||
|  | ||||
|             #Create HoA ifIndex -> VLAN array | ||||
|             foreach my $port ( @{$ret} ) { | ||||
|                 my $ifindex = $index->{$port}; | ||||
|                 next unless ( defined($ifindex) );    # shouldn't happen | ||||
|                 next if ( defined $partial and $ifindex !~ /^$partial$/ ); | ||||
|                 push( @{ $i_vlan_membership->{$ifindex} }, $vlan ); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return $i_vlan_membership; | ||||
| } | ||||
|  | ||||
| sub _extremeware_i_vlan_membership { | ||||
|     my $extreme    = shift; | ||||
|     my $partial    = shift; | ||||
|     my $stack      = $extreme->ifStackStatus($partial); | ||||
| @@ -530,6 +698,28 @@ sub set_add_i_vlan_tagged { | ||||
|     return $rv; | ||||
| } | ||||
|  | ||||
| # LLDP uses the bridge index rather than ifIndex | ||||
| sub lldp_if { | ||||
|     my $extreme = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $addr    = $extreme->lldp_rem_pid($partial) || {}; | ||||
|     my $b_index = $extreme->bp_index() || {}; | ||||
|     #my %r_i_descr = reverse %$i_descr; | ||||
|      | ||||
|     my %lldp_if; | ||||
|     foreach my $key ( keys %$addr ) { | ||||
|         my @aOID = split( '\.', $key ); | ||||
|         my $port = $aOID[1]; | ||||
|         next unless $port; | ||||
|  | ||||
|         my $idx = $b_index->{$port}; | ||||
|  | ||||
|         $lldp_if{$key} = $idx; | ||||
|     } | ||||
|     return \%lldp_if; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
| @@ -576,6 +766,10 @@ my $extreme = new SNMP::Info::Layer3::Extreme(...); | ||||
|  | ||||
| =item SNMP::Info::MAU | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =item SNMP::Info::EDP | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
| @@ -658,12 +852,6 @@ Returns base mac | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| @@ -672,6 +860,14 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::EDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::EDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| @@ -716,6 +912,11 @@ Ignores VLAN meta interfaces and loopback | ||||
|  | ||||
| (C<extremeFdbMacFdbStatus>) | ||||
|  | ||||
| =item $extreme->lldp_if() | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table. Extreme LLDP uses the | ||||
| bridge index rather than ifIndex. | ||||
|  | ||||
| =item $extreme->i_vlan() | ||||
|  | ||||
| Returns a mapping between C<ifIndex> and the VLAN. | ||||
| @@ -756,7 +957,14 @@ F<EXTREME-FDB-MIB> rather than F<BRIDGE-MIB>. | ||||
| =item $extreme->peth_port_power() | ||||
|  | ||||
| Power supplied by PoE ports, in milliwatts | ||||
| ("extremePethPortMeasuredPower") | ||||
|  | ||||
| (C<extremePethPortMeasuredPower>) | ||||
|  | ||||
| =item $extreme->peth_power_watts() | ||||
|  | ||||
| The configured maximum amount of in-line power available to the slot. | ||||
|  | ||||
| (C<extremePethSlotPowerLimit>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -768,6 +976,14 @@ See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::EDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::EDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head1 SET METHODS | ||||
|  | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| @@ -818,7 +1034,6 @@ with the numeric VLAN ID and port C<ifIndex>. | ||||
|   $extreme->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})  | ||||
|     or die "Couldn't add port to egress list. ",$extreme->error(1); | ||||
|  | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 Data Munging Callback Subroutines | ||||
|   | ||||
							
								
								
									
										416
									
								
								Info/Layer3/F5.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										416
									
								
								Info/Layer3/F5.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,416 @@ | ||||
| # SNMP::Info::Layer3::F5 | ||||
| # | ||||
| # Copyright (c) 2012 Eric Miller | ||||
| # All Rights Reserved | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer3::F5; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer3::F5::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::F5::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     'F5-BIGIP-SYSTEM-MIB' => 'sysAttrArpMaxEntries', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     'os_ver'     => 'sysProductVersion', | ||||
|     'mkt_name'   => 'sysPlatformInfoMarketingName', | ||||
|     'ps1_status' => 'sysChassisPowerSupplyStatus.1', | ||||
|     'ps2_status' => 'sysChassisPowerSupplyStatus.2', | ||||
|  | ||||
|     # Named serial1 to override serial1 in L3 serial method | ||||
|     'serial1'  => 'sysGeneralChassisSerialNum', | ||||
|     'qb_vlans' => 'sysVlanNumber', | ||||
|     'ports'    => 'sysInterfaceNumber', | ||||
|  | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|  | ||||
|     # sysInterfaceTable | ||||
|     'i_index'       => 'sysInterfaceName', | ||||
|     'i_description' => 'sysInterfaceName', | ||||
|     'i_mtu'         => 'sysInterfaceMtu', | ||||
|     'i_speed'       => 'sysInterfaceMediaActiveSpeed', | ||||
|     'i_mac'         => 'sysInterfaceMacAddr', | ||||
|     'i_up_admin'    => 'sysInterfaceEnabled', | ||||
|     'i_up'          => 'sysInterfaceStatus', | ||||
|  | ||||
|     # sysIfxStatTable | ||||
|     'i_octet_in'       => 'sysIfxStatHcInOctets', | ||||
|     'i_octet_out'      => 'sysIfxStatHcOutOctets', | ||||
|     'i_pkts_ucast_in'  => 'sysIfxStatHcInUcastPkts', | ||||
|     'i_pkts_ucast_out' => 'sysIfxStatHcOutUcastPkts', | ||||
|  | ||||
|     # sysInterfaceStatTable | ||||
|     'i_discards_in'  => 'sysInterfaceStatDropsIn', | ||||
|     'i_discards_out' => 'sysInterfaceStatDropsOut', | ||||
|     'i_errors_in'    => 'sysInterfaceStatErrorsIn', | ||||
|     'i_errors_out'   => 'sysInterfaceStatErrorsOut', | ||||
|  | ||||
|     # sysInterfaceTable | ||||
|     'sys_i_duplex' => 'sysInterfaceMediaActiveDuplex', | ||||
|  | ||||
|     # sysChassisFanTable | ||||
|     'fan_state' => 'sysChassisFanStatus', | ||||
|  | ||||
|     # sysVlanTable | ||||
|     'sys_v_id' => 'sysVlanId', | ||||
|     'v_name'   => 'sysVlanVname', | ||||
|  | ||||
|     # sysVlanMemberTable | ||||
|     'sys_vm_tagged' => 'sysVlanMemberTagged', | ||||
|     'sys_vm_name'   => 'sysVlanMemberVmname', | ||||
|     'sys_vmp_name'  => 'sysVlanMemberParentVname', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer3::MUNGE, ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'f5'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'f5'; | ||||
| } | ||||
|  | ||||
| sub fan { | ||||
|     my $f5        = shift; | ||||
|     my $fan_state = $f5->fan_state(); | ||||
|     my $ret       = ""; | ||||
|     my $s         = ""; | ||||
|     foreach my $i ( sort { $a <=> $b } keys %$fan_state ) { | ||||
|         $ret .= $s . $i . ": " . $fan_state->{$i}; | ||||
|         $s = ", "; | ||||
|     } | ||||
|     return if ( $s eq "" ); | ||||
|     return $ret; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $f5 = shift; | ||||
|  | ||||
|     my $name = $f5->mkt_name(); | ||||
|  | ||||
|     if ( defined $name ) { return $name; } | ||||
|  | ||||
|     my $id    = $f5->id(); | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|     if ( !defined $model ) { return $id; } | ||||
|  | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| # Override L3 interfaces | ||||
| sub interfaces { | ||||
|     my $f5      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $f5->i_index($partial); | ||||
| } | ||||
|  | ||||
| # Override L3 i_name | ||||
| sub i_name { | ||||
|     my $f5      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $f5->i_index($partial); | ||||
| } | ||||
|  | ||||
| # We don't have this, so fake it | ||||
| sub i_type { | ||||
|     my $f5      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $idx = $f5->i_index($partial); | ||||
|  | ||||
|     my %i_type; | ||||
|     foreach my $if ( keys %$idx ) { | ||||
|  | ||||
|         $i_type{$if} = 'ethernetCsmacd'; | ||||
|     } | ||||
|     return \%i_type; | ||||
| } | ||||
|  | ||||
| # Override L3 i_duplex | ||||
| sub i_duplex { | ||||
|     my $f5      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $duplexes = $f5->sys_i_duplex() || {}; | ||||
|  | ||||
|     my %i_duplex; | ||||
|     foreach my $if ( keys %$duplexes ) { | ||||
|         my $duplex = $duplexes->{$if}; | ||||
|         next unless defined $duplex; | ||||
|         next if ( $duplex eq 'none' ); | ||||
|  | ||||
|         $i_duplex{$if} = $duplex; | ||||
|     } | ||||
|     return \%i_duplex; | ||||
| } | ||||
|  | ||||
| # Override Bridge v_index | ||||
| sub v_index { | ||||
|     my $f5      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $f5->sys_v_id($partial); | ||||
| } | ||||
|  | ||||
| sub i_vlan { | ||||
|     my $f5      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $index  = $f5->i_index($partial) || {}; | ||||
|     my $tagged = $f5->sys_vm_tagged()   || {}; | ||||
|     my $vlans  = $f5->v_index()         || {}; | ||||
|  | ||||
|     my $i_vlan = {}; | ||||
|     foreach my $iid ( keys %$tagged ) { | ||||
|         my $tag = $tagged->{$iid}; | ||||
|         next if ( $tag eq 'true' ); | ||||
|  | ||||
|         # IID is length.vlan name index.length.interface index | ||||
|         # Split out and use as the IID to get the VLAN ID and ifIndex | ||||
|         my @iid_array = split /\./, $iid; | ||||
|         my $len       = $iid_array[0]; | ||||
|         my $v_idx     = join '.', ( splice @iid_array, 0, $len + 1 ); | ||||
|         my $idx       = join '.', @iid_array; | ||||
|  | ||||
|         # Check to make sure we can map to a port | ||||
|         my $p_idx = $index->{$idx}; | ||||
|         next unless $p_idx; | ||||
|  | ||||
|         my $vlan = $vlans->{$v_idx}; | ||||
|         next unless $vlan; | ||||
|  | ||||
|         $i_vlan->{$idx} = $vlan; | ||||
|     } | ||||
|     return $i_vlan; | ||||
| } | ||||
|  | ||||
| sub i_vlan_membership { | ||||
|     my $f5      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $index  = $f5->i_index($partial) || {}; | ||||
|     my $tagged = $f5->sys_vm_tagged()   || {}; | ||||
|     my $vlans  = $f5->v_index()         || {}; | ||||
|  | ||||
|     my $i_vlan_membership = {}; | ||||
|     foreach my $iid ( keys %$tagged ) { | ||||
|  | ||||
|         # IID is length.vlan name index.length.interface index | ||||
|         # Split out and use as the IID to get the VLAN ID and ifIndex | ||||
|         my @iid_array = split /\./, $iid; | ||||
|         my $len       = $iid_array[0]; | ||||
|         my $v_idx     = join '.', ( splice @iid_array, 0, $len + 1 ); | ||||
|         my $idx       = join '.', @iid_array; | ||||
|  | ||||
|         # Check to make sure we can map to a port | ||||
|         my $p_idx = $index->{$idx}; | ||||
|         next unless $p_idx; | ||||
|  | ||||
|         my $vlan = $vlans->{$v_idx}; | ||||
|         next unless $vlan; | ||||
|  | ||||
|         push( @{ $i_vlan_membership->{$idx} }, $vlan ); | ||||
|     } | ||||
|     return $i_vlan_membership; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::F5 - SNMP Interface to F5 network devices. | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $f5 = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $f5->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for F5 network devices. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $f5 = new SNMP::Info::Layer3::F5(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<F5-BIGIP-COMMON-MIB> | ||||
|  | ||||
| =item F<F5-BIGIP-SYSTEM-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $f5->model() | ||||
|  | ||||
| Return (C<sysPlatformInfoMarketingName>), otherwise tries to reference | ||||
| $f5->id() to F<F5-BIGIP-COMMON-MIB>.  | ||||
|  | ||||
| =item $f5->vendor() | ||||
|  | ||||
| Returns 'f5' | ||||
|  | ||||
| =item $f5->os() | ||||
|  | ||||
| Returns 'f5' | ||||
|  | ||||
| =item $f5->os_ver() | ||||
|  | ||||
| Returns the software version reported by C<sysProductVersion> | ||||
|  | ||||
| =item $f5->fan() | ||||
|  | ||||
| Combines (C<sysChassisFanStatus>) into a single string. | ||||
|  | ||||
| =item $f5->ps1_status() | ||||
|  | ||||
| Returns status of primary power supply | ||||
|  | ||||
| =item $f5->ps2_status() | ||||
|  | ||||
| Returns status of redundant power supply | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a | ||||
| reference to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $f5->interfaces() | ||||
|  | ||||
| Returns reference to the map between IID and physical port. | ||||
|  | ||||
| (C<sysInterfaceName>). | ||||
|  | ||||
| =item $f5->i_duplex() | ||||
|  | ||||
| Returns reference to hash.  Maps port operational duplexes to IIDs. | ||||
|  | ||||
| =item $f5->i_vlan() | ||||
|  | ||||
| Returns a mapping between C<ifIndex> and the default VLAN. | ||||
|  | ||||
| =item $f5->i_vlan_membership() | ||||
|  | ||||
| Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN | ||||
| IDs. | ||||
|  | ||||
|   Example: | ||||
|   my $interfaces = $f5->interfaces(); | ||||
|   my $vlans      = $f5->i_vlan_membership(); | ||||
|    | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
|     print "Port: $port VLAN: $vlan\n"; | ||||
|   } | ||||
|  | ||||
| =item $f5->v_index() | ||||
|  | ||||
| Returns VLAN IDs | ||||
|  | ||||
| =item $f5->v_name() | ||||
|  | ||||
| Human-entered name for vlans. | ||||
|  | ||||
| =item $f5->i_name() | ||||
|  | ||||
| Returns the human set port name if exists. | ||||
|  | ||||
| =item $f5->i_type() | ||||
|  | ||||
| Returns C<'ethernetCsmacd'> for each C<ifIndex>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
							
								
								
									
										333
									
								
								Info/Layer3/Force10.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										333
									
								
								Info/Layer3/Force10.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,333 @@ | ||||
| # SNMP::Info::Layer3::Force10 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2012 William Bulley | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer3::Force10; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
|  | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::MAU; | ||||
| use SNMP::Info::LLDP; | ||||
|  | ||||
| @SNMP::Info::Layer3::Force10::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU | ||||
|     SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Force10::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'F10-PRODUCTS-MIB' => 'f10Products', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::MAU::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::MAU::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::MAU::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| ); | ||||
|  | ||||
| # use MAU-MIB for admin. duplex and admin. speed | ||||
| *SNMP::Info::Layer3::Force10::i_duplex_admin | ||||
|     = \&SNMP::Info::MAU::mau_i_duplex_admin; | ||||
| *SNMP::Info::Layer3::Force10::i_speed_admin | ||||
|     = \&SNMP::Info::MAU::mau_i_speed_admin; | ||||
|  | ||||
| sub vendor { | ||||
|     return 'force10'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'ftos'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $force10 = shift; | ||||
|     my $descr   = $force10->description(); | ||||
|     my $os_ver  = undef; | ||||
|  | ||||
|     $os_ver = $1 if ( $descr =~ /Force10\s+Application\s+Software\s+Version:\s+(\S+)/s ); | ||||
|  | ||||
|     return $os_ver; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $force10 = shift; | ||||
|     my $id      = $force10->id(); | ||||
|  | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|     return $id unless defined $model; | ||||
|  | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| # 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; | ||||
|  | ||||
|     return $force10->qb_v_name($partial); | ||||
| } | ||||
|  | ||||
| # ------------------- stub for now----------------- | ||||
| sub i_vlan { | ||||
|     my $force10 = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $i_vlan = {}; | ||||
|  | ||||
|     return $i_vlan; | ||||
| } | ||||
|  | ||||
| sub i_vlan_membership { | ||||
|     my $force10 = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $index = $force10->bp_index(); | ||||
|     my $v_index = $force10->v_index(); | ||||
|  | ||||
|     my $v_ports  = $force10->qb_v_egress(); | ||||
|  | ||||
|     # If given a partial it will be an ifIndex, we need to use dot1dBasePort | ||||
|     if ($partial) { | ||||
|         my %r_index = reverse %$index; | ||||
|         $partial    = $r_index{$partial}; | ||||
|     } | ||||
|  | ||||
|     my $i_vlan_membership = {}; | ||||
|  | ||||
|     foreach my $idx ( sort keys %{$v_ports} ) { | ||||
|         next unless ( defined $v_ports->{$idx} ); | ||||
|         my $portlist = $v_ports->{$idx}; # is an array reference | ||||
|         my $ret      = []; | ||||
|         my $vlan_ndx = $idx; | ||||
|  | ||||
|         # Convert portlist bit array to bp_index array | ||||
|         for ( my $i = 0; $i <= $#$portlist; $i++ ) { | ||||
|             push( @{$ret}, $i + 1 ) if ( @$portlist[$i] ); | ||||
|         } | ||||
|  | ||||
|         #Create HoA ifIndex -> VLAN array | ||||
|         foreach my $port ( @{$ret} ) { | ||||
|             my $ifindex = $index->{$port}; | ||||
|             next unless ( defined($ifindex) );    # shouldn't happen | ||||
|             next if ( defined $partial and $ifindex !~ /^$partial$/ ); | ||||
|             my $vlan_tag = $v_index->{$vlan_ndx}; | ||||
|  | ||||
|             # FIXME: would be preferable to use | ||||
|             # the mapping from Q-BRIDGE-MIB::dot1qVlanFdbId  | ||||
|             my $mod = $vlan_tag % 4096; | ||||
|  | ||||
|             push ( @{ $i_vlan_membership->{$ifindex} }, ($mod) ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return $i_vlan_membership; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::Force10 - SNMP Interface to Force10 Networks FTOS | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| William Bulley | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $force10 = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
|                         # These arguments are passed directly to SNMP::Session | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $force10->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Force10 Networks FTOS-based devices. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =item SNMP::Info::MAU | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<F10-PRODUCTS-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP: | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $force10->vendor() | ||||
|  | ||||
| Returns C<'force10'> | ||||
|  | ||||
| =item $force10->model() | ||||
|  | ||||
| Tries to reference $force10->id() to the Force10 product MIB listed above. | ||||
|  | ||||
| =item $force10->os() | ||||
|  | ||||
| Returns C<'ftos'>. | ||||
|  | ||||
| =item $force10->os_ver() | ||||
|  | ||||
| Grabs the operating system version from C<sysDescr> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::MAU | ||||
|  | ||||
| See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $force10->v_name() | ||||
|  | ||||
| Returns the VLAN names. | ||||
|  | ||||
| =item $force10->i_vlan() | ||||
|  | ||||
| Currently not implemented. | ||||
|  | ||||
| =item $force10->i_vlan_membership() | ||||
|  | ||||
| Returns reference to hash of arrays: | ||||
| key = C<ifIndex>, value = array of VLAN IDs. | ||||
| These are the VLANs which are members of the egress list for the port. | ||||
|  | ||||
| =item $force10->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> | ||||
|  | ||||
| =item $force10->i_speed_admin() | ||||
|  | ||||
| Returns info from F<MAU-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::MAU | ||||
|  | ||||
| See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -44,7 +44,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -53,6 +53,8 @@ $VERSION = '2.08'; | ||||
|     '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', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| @@ -65,6 +67,8 @@ $VERSION = '2.08'; | ||||
|     'ps1_type'   => 'snChasPwrSupplyDescription.1', | ||||
|     'ps1_status' => 'snChasPwrSupplyOperStatus.1', | ||||
|     'fan'        => 'snChasFanOperStatus.1', | ||||
|     'img_ver'    => 'snAgImgVer', | ||||
|     'ch_serial'  => 'snChasSerNum', | ||||
|  | ||||
| ); | ||||
|  | ||||
| @@ -79,11 +83,20 @@ $VERSION = '2.08'; | ||||
|     '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::FDP::MUNGE, | ||||
|     'ag_mod2_type' => \&SNMP::Info::munge_e_type, | ||||
|     'ag_mod_type'  => \&SNMP::Info::munge_e_type, | ||||
| ); | ||||
|  | ||||
| sub i_ignore { | ||||
| @@ -155,17 +168,17 @@ sub model { | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'foundry'; | ||||
|     return 'brocade'; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'foundry'; | ||||
|     return 'brocade'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $foundry = shift; | ||||
|  | ||||
|     return $foundry->snAgImgVer() if ( defined $foundry->snAgImgVer() ); | ||||
|     return $foundry->img_ver() if ( defined $foundry->img_ver() ); | ||||
|  | ||||
|     # Some older ones don't have this value,so we cull it from the description | ||||
|     my $descr = $foundry->description(); | ||||
| @@ -204,10 +217,10 @@ sub serial { | ||||
|     my $foundry = shift; | ||||
|  | ||||
|     # Return chassis serial number if available | ||||
|     return $foundry->snChasSerNum() if ( $foundry->snChasSerNum() ); | ||||
|     return $foundry->ch_serial() if ( $foundry->ch_serial() ); | ||||
|  | ||||
|     # If no chassis serial use first module serial | ||||
|     my $mod_serials = $foundry->snAgentConfigModuleSerialNumber(); | ||||
|     my $mod_serials = $foundry->snAgentConfigModuleSerialNumber() || {}; | ||||
|  | ||||
|     foreach my $mod ( sort keys %$mod_serials ) { | ||||
|         my $serial = $mod_serials->{$mod} || ''; | ||||
| @@ -268,132 +281,507 @@ sub stp_p_state { | ||||
|  | ||||
| } | ||||
|  | ||||
| #  Use FDP and/or LLDP | ||||
| # 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 hasCDP { | ||||
|     my $foundry = shift; | ||||
|  | ||||
|     return $foundry->hasLLDP() || $foundry->SUPER::hasCDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
| sub e_index { | ||||
|     my $foundry = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $cdp  = $foundry->SUPER::c_ip($partial) || {}; | ||||
|     my $lldp = $foundry->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; | ||||
|     return $foundry->SUPER::e_index($partial) | ||||
|         || $foundry->brcd_e_index($partial); | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
| sub e_class { | ||||
|     my $foundry = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $foundry->lldp_if($partial)     || {}; | ||||
|     my $cdp  = $foundry->SUPER::c_if($partial) || {}; | ||||
|  | ||||
|     my %c_if; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $if = $cdp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $if = $lldp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|     return \%c_if; | ||||
|     return $foundry->SUPER::e_class($partial) | ||||
|         || $foundry->brcd_e_class($partial); | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
| sub e_descr { | ||||
|     my $foundry = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $foundry->lldp_port($partial)     || {}; | ||||
|     my $cdp  = $foundry->SUPER::c_port($partial) || {}; | ||||
|  | ||||
|     my %c_port; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $port = $cdp->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $port = $lldp->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|     return \%c_port; | ||||
|     return $foundry->SUPER::e_descr($partial) | ||||
|         || $foundry->brcd_e_descr($partial); | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
| sub e_name { | ||||
|     my $foundry = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $foundry->lldp_id($partial)     || {}; | ||||
|     my $cdp  = $foundry->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; | ||||
|     return $foundry->SUPER::e_name($partial) | ||||
|         || $foundry->brcd_e_name($partial); | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
| sub e_parent { | ||||
|     my $foundry = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $foundry->lldp_rem_sysdesc($partial)  || {}; | ||||
|     my $cdp  = $foundry->SUPER::c_platform($partial) || {}; | ||||
|     return $foundry->SUPER::e_parent($partial) | ||||
|         || $foundry->brcd_e_parent($partial); | ||||
| } | ||||
|  | ||||
|     my %c_platform; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $platform = $cdp->{$iid}; | ||||
|         next unless defined $platform; | ||||
| sub e_pos { | ||||
|     my $foundry = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     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 %$lldp ) { | ||||
|         my $platform = $lldp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|     foreach my $iid ( keys %$brcd_e_idx ) { | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|         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 \%c_platform; | ||||
|     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; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| @@ -401,7 +789,8 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry Network Devices | ||||
| SNMP::Info::Layer3::Foundry - SNMP Interface to Brocade (Foundry) Network | ||||
| Devices | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -425,7 +814,7 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for Foundry Networks devices. | ||||
| Abstraction subclass for Brocade (Foundry) Networks devices. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above. | ||||
| @@ -454,6 +843,10 @@ 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 Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
| @@ -477,11 +870,11 @@ and removes 'C<sn>'.  EdgeIron models determined through F<ENTITY-MIB>. | ||||
|  | ||||
| =item $foundry->vendor() | ||||
|  | ||||
| Returns 'foundry' | ||||
| Returns 'brocade' | ||||
|  | ||||
| =item $foundry->os() | ||||
|  | ||||
| Returns 'foundry' | ||||
| Returns 'brocade' | ||||
|  | ||||
| =item $foundry->os_ver() | ||||
|  | ||||
| @@ -527,6 +920,18 @@ Returns the status of the chassis fan. | ||||
|  | ||||
| (C<snChasFanOperStatus.1>) | ||||
|  | ||||
| =item $foundry->img_ver() | ||||
|  | ||||
| Returns device image version. | ||||
|  | ||||
| (C<snAgImgVer.0>) | ||||
|  | ||||
| =item $foundry->ch_serial() | ||||
|  | ||||
| Returns chassis serial number. | ||||
|  | ||||
| (C<snChasSerNum.0>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::Layer3 | ||||
| @@ -543,8 +948,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 | ||||
|  | ||||
| @@ -577,6 +982,130 @@ Skipped if device is an EdgeIron 24G due to reports of hangs. | ||||
|  | ||||
| =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>) | ||||
|  | ||||
| =over | ||||
| @@ -607,51 +1136,67 @@ Returns reference to hash.  Current Port Speed. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Topology information | ||||
| =head2 Power Over Ethernet Port Table | ||||
|  | ||||
| Based upon the software version devices may support Foundry Discovery | ||||
| Protocol (FDP) and Link Layer Discovery Protocol (LLDP). These | ||||
| methods will query both and return the combination of all information. As a | ||||
| result, there may be identical topology information returned from the two | ||||
| protocols causing duplicate entries.  It is the calling program's | ||||
| responsibility to identify any duplicate entries and remove duplicates if | ||||
| necessary. | ||||
| 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->hasCDP() | ||||
| =item $foundry->peth_port_ifindex() | ||||
|  | ||||
| Returns true if the device is running either FDP or LLDP. | ||||
| 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->c_if() | ||||
| =item $foundry->peth_port_admin() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: local device port (interfaces) | ||||
| Administrative status: is this port permitted to deliver power? | ||||
|  | ||||
| =item $foundry->c_ip() | ||||
| C<pethPsePortAdminEnable> | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: remote IPv4 address | ||||
| =item $foundry->peth_port_status() | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with the same IPv4 | ||||
| address, c_ip(), it may be a duplicate entry. | ||||
| Current status: is this port delivering power. | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with different | ||||
| IPv4 addresses, c_ip(), there is either a non-FDP/LLDP device in between two | ||||
| or more devices or multiple devices which are not directly connected.   | ||||
| =item $foundry->peth_port_class() | ||||
|  | ||||
| Use the data from the Layer2 Topology Table below to dig deeper. | ||||
| Device class: if status is delivering power, this represents the 802.3af | ||||
| class of the device being powered. | ||||
|  | ||||
| =item $foundry->c_port() | ||||
| =item $foundry->peth_port_neg_power() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: remote port (interfaces) | ||||
| 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->c_id() | ||||
| =item $foundry->peth_port_power() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: string value used to identify the | ||||
| chassis component associated with the remote system. | ||||
| The power, in milliwatts, that the port is delivering. | ||||
|  | ||||
| =item $foundry->c_platform() | ||||
| =back | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: Remote Device Type | ||||
| =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 | ||||
|  | ||||
|   | ||||
							
								
								
									
										256
									
								
								Info/Layer3/H3C.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								Info/Layer3/H3C.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,256 @@ | ||||
| # SNMP::Info::Layer3::H3C | ||||
| # | ||||
| # Copyright (c) 2012 Jeroen van Ingen | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer3::H3C; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::LLDP; | ||||
|  | ||||
| @SNMP::Info::Layer3::H3C::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::H3C::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'HH3C-LswDEVM-MIB'     => 'hh3cDevMFanStatus', | ||||
|     'HH3C-LswINF-MIB'      => 'hh3cSlotPortMax', | ||||
|     'HH3C-LSW-DEV-ADM-MIB' => 'hh3cLswSysVersion', | ||||
|     'HH3C-PRODUCT-ID-MIB'  => 'hh3c-s5500-28C-EI', | ||||
|     'HH3C-ENTITY-VENDORTYPE-OID-MIB' => 'hh3cevtOther', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'fan' => 'hh3cDevMFanStatus.1', | ||||
|     'ps1_status' => 'hh3cDevMPowerStatus.1', | ||||
|     'ps2_status' => 'hh3cDevMPowerStatus.2', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     i_duplex_admin => 'hh3cifEthernetDuplex', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
|     my $h3c = shift; | ||||
|     my $mfg = $h3c->entPhysicalMfgName(1) || {}; | ||||
|     return $mfg->{1}; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     my $h3c = shift; | ||||
|     my $descr   = $h3c->description(); | ||||
|  | ||||
|     return $1 if ( $descr =~ /(\S+)\s+Platform Software/ ); | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $h3c = shift; | ||||
|     my $descr   = $h3c->description(); | ||||
| #    my $version = $h3c->hh3cLswSysVersion(); # Don't use, indicates base version only, no release details | ||||
|     my $ver_release = $h3c->entPhysicalSoftwareRev(2) || {}; | ||||
|     my $os_ver  = undef; | ||||
|  | ||||
|     $os_ver = "$1 $2" if ( $descr =~ /Software Version ([^,]+),.*(Release\s\S+)/i ); | ||||
|  | ||||
|     return $ver_release->{2} || $os_ver; | ||||
| } | ||||
|  | ||||
| sub i_ignore { | ||||
|     my $l3      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $l3->interfaces($partial) || {}; | ||||
|  | ||||
|     my %i_ignore; | ||||
|     foreach my $if ( keys %$interfaces ) { | ||||
|  | ||||
|         # lo0 etc | ||||
|         if ( $interfaces->{$if} =~ /\blo\d*\b/i ) { | ||||
|             $i_ignore{$if}++; | ||||
|         } | ||||
|     } | ||||
|     return \%i_ignore; | ||||
| } | ||||
|  | ||||
| # 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); | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::H3C - SNMP Interface to L3 Devices, H3C & HP A-series | ||||
|  | ||||
| =head1 AUTHORS | ||||
|  | ||||
| Jeroen van Ingen | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $h3c = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $h3c->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for H3C & HP A-series devices | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<HH3C-LswDEVM-MIB> | ||||
|  | ||||
| =item F<HH3C-LswINF-MIB> | ||||
|  | ||||
| =item F<HH3C-LSW-DEV-ADM-MIB> | ||||
|  | ||||
| =item F<HH3C-PRODUCT-ID-MIB> | ||||
|  | ||||
| =item F<HH3C-ENTITY-VENDORTYPE-OID-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $h3c->vendor() | ||||
|  | ||||
| Returns value for C<entPhysicalMfgName.1>. | ||||
|  | ||||
| =item $h3c->os() | ||||
|  | ||||
| Returns the OS extracted from C<sysDescr>. | ||||
|  | ||||
| =item $h3c->os_ver() | ||||
|  | ||||
| Returns the software version. Either C<entPhysicalSoftwareRev.2> or extracted from  | ||||
| C<sysDescr>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP> for details. | ||||
|  | ||||
| =head1 TABLE ENTRIES | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $h3c->i_ignore() | ||||
|  | ||||
| Returns reference to hash.  Increments value of IID if port is to be ignored. | ||||
|  | ||||
| Ignores loopback | ||||
|  | ||||
| =item $h3c->fw_mac() | ||||
|  | ||||
| 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> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -196,134 +196,6 @@ sub interfaces { | ||||
|     return $i_descr; | ||||
| } | ||||
|  | ||||
| #  Use FDP and/or LLDP | ||||
|  | ||||
| sub hasCDP { | ||||
|     my $hp9300 = shift; | ||||
|  | ||||
|     return $hp9300->hasLLDP() || $hp9300->SUPER::hasCDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $hp9300  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $cdp  = $hp9300->SUPER::c_ip($partial) || {}; | ||||
|     my $lldp = $hp9300->lldp_ip($partial)     || {}; | ||||
|  | ||||
|     my %c_ip; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $ip = $cdp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $ip = $lldp->{$iid}; | ||||
|         next unless defined $ip; | ||||
|  | ||||
|         $c_ip{$iid} = $ip; | ||||
|     } | ||||
|     return \%c_ip; | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
|     my $hp9300  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $hp9300->lldp_if($partial)     || {}; | ||||
|     my $cdp  = $hp9300->SUPER::c_if($partial) || {}; | ||||
|  | ||||
|     my %c_if; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $if = $cdp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $if = $lldp->{$iid}; | ||||
|         next unless defined $if; | ||||
|  | ||||
|         $c_if{$iid} = $if; | ||||
|     } | ||||
|     return \%c_if; | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
|     my $hp9300  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $hp9300->lldp_port($partial)     || {}; | ||||
|     my $cdp  = $hp9300->SUPER::c_port($partial) || {}; | ||||
|  | ||||
|     my %c_port; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $port = $cdp->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $port = $lldp->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $c_port{$iid} = $port; | ||||
|     } | ||||
|     return \%c_port; | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
|     my $hp9300  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $hp9300->lldp_id($partial)     || {}; | ||||
|     my $cdp  = $hp9300->SUPER::c_id($partial) || {}; | ||||
|  | ||||
|     my %c_id; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $id = $cdp->{$iid}; | ||||
|         next unless defined $id; | ||||
|  | ||||
|         $c_id{$iid} = $id; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $id = $lldp->{$iid}; | ||||
|         next unless defined $id; | ||||
|  | ||||
|         $c_id{$iid} = $id; | ||||
|     } | ||||
|     return \%c_id; | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $hp9300  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp = $hp9300->lldp_rem_sysdesc($partial)  || {}; | ||||
|     my $cdp  = $hp9300->SUPER::c_platform($partial) || {}; | ||||
|  | ||||
|     my %c_platform; | ||||
|     foreach my $iid ( keys %$cdp ) { | ||||
|         my $platform = $cdp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$lldp ) { | ||||
|         my $platform = $lldp->{$iid}; | ||||
|         next unless defined $platform; | ||||
|  | ||||
|         $c_platform{$iid} = $platform; | ||||
|     } | ||||
|     return \%c_platform; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| @@ -527,54 +399,6 @@ Returns reference to hash.  Current Port Speed. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Topology information | ||||
|  | ||||
| Based upon the software version devices may support Foundry Discovery | ||||
| Protocol (FDP) and Link Layer Discovery Protocol (LLDP). These | ||||
| methods will query both and return the combination of all information. As a | ||||
| result, there may be identical topology information returned from the two | ||||
| protocols causing duplicate entries.  It is the calling program's | ||||
| responsibility to identify any duplicate entries and remove duplicates | ||||
| if necessary. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $hp9300->hasCDP() | ||||
|  | ||||
| Returns true if the device is running either FDP or LLDP. | ||||
|  | ||||
| =item $hp9300->c_if() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: local device port (interfaces) | ||||
|  | ||||
| =item $hp9300->c_ip() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: remote IPv4 address | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with the same IPv4 | ||||
| address, c_ip(), it may be a duplicate entry. | ||||
|  | ||||
| If multiple entries exist with the same local port, c_if(), with different | ||||
| IPv4 addresses, c_ip(), there is either a non-FDP/LLDP device in between two | ||||
| or more devices or multiple devices which are not directly connected.   | ||||
|  | ||||
| Use the data from the Layer2 Topology Table below to dig deeper. | ||||
|  | ||||
| =item $hp9300->c_port() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: remote port (interfaces) | ||||
|  | ||||
| =item $hp9300->c_id() | ||||
|  | ||||
| Returns reference to hash. Key: iid Value: string value used to identify the | ||||
| chassis component associated with the remote system. | ||||
|  | ||||
| =item $hp9300->c_platform() | ||||
|  | ||||
| Returns reference to hash.  Key: iid Value: Remote Device Type | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|   | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -53,8 +53,9 @@ $VERSION = '2.08'; | ||||
|  | ||||
| %GLOBALS = ( %SNMP::Info::Layer3::GLOBALS,  | ||||
| 	     %SNMP::Info::LLDP::GLOBALS, | ||||
| 	     'serial' => 'jnxBoxSerialNo.0', | ||||
| 	     'mac'    => 'dot1dBaseBridgeAddress', | ||||
| 	     'serial'    => 'jnxBoxSerialNo.0', | ||||
| 	     'mac'       => 'dot1dBaseBridgeAddress', | ||||
| 	     'box_descr' => 'jnxBoxDescr' | ||||
| 	     ); | ||||
|  | ||||
| %FUNCS = ( %SNMP::Info::Layer3::FUNCS,  | ||||
| @@ -248,49 +249,6 @@ sub fw_port { | ||||
|     return $juniper->qb_fw_port($partial); | ||||
| } | ||||
|  | ||||
| # Use LLDP | ||||
|  | ||||
| sub hasCDP { | ||||
|     my $juniper = shift; | ||||
|  | ||||
|     return $juniper->hasLLDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $juniper  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $juniper->lldp_ip($partial); | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
|     my $juniper  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $juniper->lldp_if($partial); | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
|     my $juniper  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $juniper->lldp_port($partial); | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
|     my $juniper  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $juniper->lldp_id($partial); | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $juniper  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $juniper->lldp_rem_sysdesc($partial); | ||||
| } | ||||
|  | ||||
| # Pseudo ENTITY-MIB methods | ||||
|  | ||||
| # This class supports both virtual chassis (stackable) and physical chassis | ||||
| @@ -406,7 +364,7 @@ sub e_descr { | ||||
|     my $juniper = shift; | ||||
|  | ||||
|     my $e_index    = $juniper->e_index() || {}; | ||||
|     my $box_descr  = $juniper->jnxBoxDescr || 0; | ||||
|     my $box_descr  = $juniper->box_descr; | ||||
|     my $contents   = $juniper->jnxContentsDescr() || {}; | ||||
|     my $containers = $juniper->jnxContainersDescr() || {}; | ||||
|  | ||||
| @@ -617,7 +575,7 @@ Subclass for Juniper Devices running JUNOS | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<JUNIPER-VLAN-MIB> dated "200901090000Z" -- Fri Jan 09 00:00:00 2009 UTC or later. | ||||
| =item F<JUNIPER-VLAN-MIB> dated "200901090000Z" or later. | ||||
|  | ||||
| =item F<JUNIPER-CHASSIS-DEFINES-MIB> | ||||
|  | ||||
| @@ -663,16 +621,18 @@ Returns serial number | ||||
|  | ||||
| (C<jnxBoxSerialNo.0>) | ||||
|  | ||||
| =item $juniper->serial() | ||||
| =item $juniper->mac() | ||||
|  | ||||
| Returns the MAC address used by this bridge when it must be referred | ||||
| to in a unique fashion. | ||||
|  | ||||
| (C<dot1dBaseBridgeAddress>) | ||||
|  | ||||
| =item $juniper->hasCDP() | ||||
| =item $juniper->box_descr() | ||||
|  | ||||
| Returns whether LLDP is enabled. | ||||
| The name, model, or detailed description of the device. | ||||
|  | ||||
| (C<jnxBoxDescr.0>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -718,35 +678,6 @@ IDs.  These are the VLANs which are members of the egress list for the port. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Topology information | ||||
|  | ||||
| These methods return Link Layer Discovery Protocol (LLDP) information.  See | ||||
| documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $juniper->c_id() | ||||
|  | ||||
| Returns C<lldp_id> | ||||
|  | ||||
| =item $juniper->c_if() | ||||
|  | ||||
| Returns C<lldp_if> | ||||
|  | ||||
| =item $juniper->c_ip() | ||||
|  | ||||
| Returns C<lldp_ip> | ||||
|  | ||||
| =item $juniper->c_platform() | ||||
|  | ||||
| Returns C<lldp_rem_sysdesc> | ||||
|  | ||||
| =item $juniper->c_port() | ||||
|  | ||||
| Returns C<lldp_port> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Forwarding Table (C<dot1dTpFdbEntry>) | ||||
|  | ||||
| =over  | ||||
|   | ||||
							
								
								
									
										271
									
								
								Info/Layer3/Lantronix.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								Info/Layer3/Lantronix.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,271 @@ | ||||
| # SNMP::Info::Layer3::Lantronix | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2012 J R Binks | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer3::Lantronix; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer3::Lantronix::ISA = qw/ | ||||
|     SNMP::Info::Layer3 | ||||
|     Exporter | ||||
|     /; | ||||
| @SNMP::Info::Layer3::Lantronix::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     'LANTRONIX-MIB'     => 'products', | ||||
|     'LANTRONIX-SLC-MIB' => 'slcNetwork', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     'slc_os_ver'       => 'slcSystemFWRev', | ||||
|     'slc_serial'       => 'slcSystemSerialNo', | ||||
|     'slc_model'        => 'slcSystemModel', | ||||
|     'slc_psu_a_status' => 'slcDevPowerSupplyA', | ||||
|     'slc_psu_b_status' => 'slcDevPowerSupplyB', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( %SNMP::Info::Layer3::FUNCS, ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer3::MUNGE, ); | ||||
|  | ||||
| # General notes: | ||||
| # | ||||
| # Products like the EDS have very minimal MIB support for the basics. | ||||
| # Much information has to be derived from sysDescr string. | ||||
| # | ||||
| sub vendor { | ||||
|     return 'lantronix'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     my $device = shift; | ||||
|     my $descr = $device->description() || ''; | ||||
|     my $os; | ||||
|  | ||||
|     # On EDS, it is called the "Evolution OS" | ||||
|     # Not sure what, if any, name it has a name on other products | ||||
|     $os = 'EvolutionOS' if ( $descr =~ m/Lantronix EDS\w+ V([\d\.R]+)/ ); | ||||
|  | ||||
|     return 'LantronixOS'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $device = shift; | ||||
|     my $descr = $device->description() || ''; | ||||
|     my $slc_os_ver = $device->slc_os_ver; | ||||
|     my $os_ver; | ||||
|  | ||||
|     return $slc_os_ver if defined $slc_os_ver; | ||||
|  | ||||
|     return unless defined $descr; | ||||
|  | ||||
|     # EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)" | ||||
|     $os_ver = $1 if ( $descr =~ m/Lantronix EDS\w+ V([\d\.R]+)/ ); | ||||
|  | ||||
|     return $os_ver; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $device = shift; | ||||
|     my $descr = $device->description() || ''; | ||||
|     my $slc_serial = $device->slc_serial; | ||||
|     my $serial; | ||||
|  | ||||
|     return $slc_serial if defined $slc_serial; | ||||
|  | ||||
|     return unless defined $descr; | ||||
|  | ||||
|     # EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)" | ||||
|     $serial = $1 if ( $descr =~ m/Lantronix EDS\w+ V[\d\.R]+ \((\w+)\)/ ); | ||||
|  | ||||
|     return $serial; | ||||
| }        | ||||
|  | ||||
| sub model { | ||||
|     my $device = shift; | ||||
|     my $descr = $device->description() || ''; | ||||
|     my $slc_model = $device->slc_model; | ||||
|     my $model; | ||||
|  | ||||
|     return $slc_model if defined $slc_model; | ||||
|  | ||||
|     return unless defined $descr; | ||||
|  | ||||
|     # EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)" | ||||
|     $model = $1 if ( $descr =~ m/Lantronix (EDS\w+)/ ); | ||||
|  | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| sub ps1_status { | ||||
|     my $device = shift; | ||||
|     my $slc_psu_a_status = $device->slc_psu_a_status; | ||||
|  | ||||
|     return $slc_psu_a_status if defined $slc_psu_a_status; | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub ps2_status { | ||||
|     my $device = shift; | ||||
|     my $slc_psu_b_status = $device->slc_psu_b_status; | ||||
|  | ||||
|     return $slc_psu_b_status if defined $slc_psu_b_status; | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::Lantronix - SNMP Interface to Lantronix devices such as terminal servers | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| J R Binks | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $device = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'mydevice', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $device->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Lantronix devices such as terminal servers. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<LANTRONIX-MIB> | ||||
|  | ||||
| =item F<LANTRONIX-SLC-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $device->vendor() | ||||
|  | ||||
| Returns 'lantronix'. | ||||
|  | ||||
| =item $device->os() | ||||
|  | ||||
| Returns 'EvolutionOS' for EDS devices. | ||||
|  | ||||
| =item $device->os_ver() | ||||
|  | ||||
| Returns the software version. | ||||
|  | ||||
| =item $device->model() | ||||
|  | ||||
| Returns the model. | ||||
|  | ||||
| =item $device->serial() | ||||
|  | ||||
| Returns the serial number. | ||||
|  | ||||
| =item $device->ps1_status() | ||||
|  | ||||
| Power supply 1 status | ||||
|  | ||||
| =item $device->ps2_status() | ||||
|  | ||||
| Power supply 2 status | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE ENTRIES | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $device->i_ignore() | ||||
|  | ||||
| Returns reference to hash.  Increments value of IID if port is to be ignored. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Lantronix specific items | ||||
|  | ||||
| None at present. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer3::MIBS, ); | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -134,11 +134,11 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $mikrotik->vendor() | ||||
|  | ||||
| Returns 'mikrotik'. | ||||
| Returns C<'mikrotik'>. | ||||
|  | ||||
| =item $mikrotik->os() | ||||
|  | ||||
| Returns 'routeros'. | ||||
| Returns C<'routeros'>. | ||||
|  | ||||
| =item $mikrotik->model() | ||||
|  | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::SONMP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -93,7 +93,7 @@ sub model { | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'nortel'; | ||||
|     return 'avaya'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
| @@ -174,7 +174,8 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::N1600 - SNMP Interface to Nortel 16XX Network Devices | ||||
| SNMP::Info::Layer3::N1600 - SNMP Interface to Avaya/Nortel 16XX Network | ||||
| Devices | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -198,8 +199,8 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a Nortel  | ||||
| N16XX device through SNMP.  | ||||
| Provides abstraction to the configuration information obtainable from an | ||||
| Avaya/Nortel N16XX device through SNMP.  | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| @@ -247,7 +248,7 @@ F<RAPID-CITY-MIB> and then parses out C<rcA>. | ||||
|  | ||||
| =item $n1600->vendor() | ||||
|  | ||||
| Returns 'nortel' | ||||
| Returns 'avaya' | ||||
|  | ||||
| =item $n1600->os() | ||||
|  | ||||
|   | ||||
| @@ -33,16 +33,18 @@ package SNMP::Info::Layer3::NetSNMP; | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::LLDP; | ||||
|  | ||||
| @SNMP::Info::Layer3::NetSNMP::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::NetSNMP::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::NetSNMP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'UCD-SNMP-MIB'       => 'versionTag', | ||||
|     'NET-SNMP-TC'        => 'netSnmpAgentOIDs', | ||||
|     'HOST-RESOURCES-MIB' => 'hrSystem', | ||||
| @@ -50,13 +52,20 @@ $VERSION = '2.08'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'netsnmp_vers'   => 'versionTag', | ||||
|     'hrSystemUptime' => 'hrSystemUptime', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( %SNMP::Info::Layer3::FUNCS, ); | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer3::MUNGE, ); | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'Net-SNMP'; | ||||
| @@ -173,6 +182,8 @@ Subclass for Generic Net-SNMP devices | ||||
|  | ||||
| See L<SNMP::Info::Layer3> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
| @@ -210,6 +221,10 @@ Returns ''. | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP> for details. | ||||
|  | ||||
| =head1 TABLE ENTRIES | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| @@ -231,6 +246,10 @@ Ignores loopback | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP> for details. | ||||
|  | ||||
| =head1 NOTES | ||||
|  | ||||
| In order to cause SNMP::Info to classify your device into this class, it | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| # SNMP::Info::Layer3::Netscreen | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # Copyright (c) 2012 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| @@ -33,34 +32,62 @@ package SNMP::Info::Layer3::Netscreen; | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
|  | ||||
| @SNMP::Info::Layer3::Netscreen::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Netscreen::ISA | ||||
|     = qw/SNMP::Info::Layer3 SNMP::Info::IEEE802dot11 Exporter/; | ||||
| @SNMP::Info::Layer3::Netscreen::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::IEEE802dot11::MIBS, | ||||
|     'NETSCREEN-SMI'           => 'netscreenSetting', | ||||
|     'NETSCREEN-PRODUCTS-MIB'  => 'netscreenGeneric', | ||||
|     'NETSCREEN-INTERFACE-MIB' => 'nsIfIndex', | ||||
|     'NETSCREEN-SET-GEN-MIB'   => 'nsSetGenSwVer', | ||||
|     'NETSCREEN-IP-ARP-MIB'    => 'nsIpArpAOD', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, 'os_version' => 'nsSetGenSwVer', ); | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::IEEE802dot11::GLOBALS, | ||||
|     'os_version' => 'nsSetGenSwVer', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( %SNMP::Info::Layer3::FUNCS, ); | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::IEEE802dot11::FUNCS, | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer3::MUNGE, ); | ||||
|     ns_i_index       => 'nsIfIndex', | ||||
|     ns_i_name        => 'nsIfName', | ||||
|     ns_i_description => 'nsIfDescr', | ||||
|     ns_i_mac         => 'nsIfMAC', | ||||
|     ns_i_up          => 'nsIfStatus', | ||||
|     ns_ip_table      => 'nsIfIp', | ||||
|     ns_ip_netmask    => 'nsIfNetmask', | ||||
|     at_index         => 'nsIpArpIfIdx', | ||||
|     at_paddr         => 'nsIpArpMac', | ||||
|     at_netaddr       => 'nsIpArpIp', | ||||
|     bp_index         => 'nsIfInfo', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::IEEE802dot11::MUNGE, | ||||
|     'ns_i_mac' => \&SNMP::Info::munge_mac, | ||||
|     'at_paddr' => \&SNMP::Info::munge_mac, | ||||
| ); | ||||
|  | ||||
| sub layers { | ||||
|     return '01001100'; | ||||
|     return '01001110'; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'netscreen'; | ||||
|     return 'juniper'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
| @@ -92,6 +119,348 @@ sub serial { | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $id = $netscreen->id(); | ||||
|  | ||||
|     unless ( defined $id ) { | ||||
|         print | ||||
|             " SNMP::Info::Layer3::model() - Device does not support sysObjectID\n" | ||||
|             if $netscreen->debug(); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|  | ||||
|     return $id unless defined $model; | ||||
|  | ||||
|     $model =~ s/^netscreen//i; | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| # provides mapping from IF-MIB to nsIf interfaces - many to 1 (!) | ||||
| # - on WLAN devices wireless0/0(|-[ag]) -> wireless0/0 !! | ||||
| sub _if_nsif_map { | ||||
|     my $netscreen   = shift; | ||||
|     my $i_descr     = $netscreen->SUPER::i_description; | ||||
|     my $ns_descr    = $netscreen->i_description; | ||||
|     my %if_nsif_map = (); | ||||
|     my @ikeys       = sort { $a <=> $b } keys %$i_descr; | ||||
|     my @nskeys      = sort { $a <=> $b } keys %$ns_descr; | ||||
|     my $i           = 0; | ||||
|     my $n           = 0; | ||||
|  | ||||
|     # assumes descriptions are in the same order from both walks | ||||
|     while ( $i < @ikeys && $n < @nskeys ) { | ||||
|  | ||||
|         # find matching sub interfaces | ||||
|         while ( | ||||
|             $i < @ikeys | ||||
|             && substr( | ||||
|                 $i_descr->{ $ikeys[$i] }, | ||||
|                 0, | ||||
|                 length $ns_descr->{ $nskeys[$n] } | ||||
|             ) eq $ns_descr->{ $nskeys[$n] } | ||||
|             ) | ||||
|         { | ||||
|  | ||||
|             $if_nsif_map{ $ikeys[$i] } = $nskeys[$n]; | ||||
|             $i++; | ||||
|         } | ||||
|  | ||||
|         $n++; | ||||
|  | ||||
|         # skip non-matching interfaces (e.g. tunnel.N) | ||||
|         while ( | ||||
|             $i < @ikeys | ||||
|             && substr( | ||||
|                 $i_descr->{ $ikeys[$i] }, | ||||
|                 0, | ||||
|                 length $ns_descr->{ $nskeys[$n] } | ||||
|             ) ne $ns_descr->{ $nskeys[$n] } | ||||
|             && $n < @nskeys | ||||
|             ) | ||||
|         { | ||||
|  | ||||
|             $if_nsif_map{ $ikeys[$i] } = 0;    # no matching interface | ||||
|             $i++; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return \%if_nsif_map; | ||||
| } | ||||
|  | ||||
| # Provides mapping from nsIf interfaces to IF-MIB interfaces - many to 1 | ||||
| # Example, tunnel.# interfaces are not present in IF-MIB.  There exist no | ||||
| # mapping of index IID's between the tables so create mapping based on names | ||||
| sub _nsif_if_map { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $i_descr      = $netscreen->SUPER::i_description; | ||||
|     my $ns_descr     = $netscreen->i_description; | ||||
|     my %rev_i_descr  = reverse %$i_descr; | ||||
|     my %rev_ns_descr = reverse %$ns_descr; | ||||
|  | ||||
|     my %nsif_if_map = (); | ||||
|     foreach my $value ( values %$ns_descr ) { | ||||
|         if ( exists $rev_i_descr{$value} ) { | ||||
|             $nsif_if_map{ $rev_ns_descr{$value} } = $rev_i_descr{$value}; | ||||
|         } | ||||
|         else { | ||||
|             $nsif_if_map{ $rev_ns_descr{$value} } = 0; | ||||
|         } | ||||
|     } | ||||
|     return \%nsif_if_map; | ||||
| } | ||||
|  | ||||
| sub interfaces { | ||||
|     my $netscreen = shift; | ||||
|     return $netscreen->i_description(); | ||||
| } | ||||
|  | ||||
| sub i_index { | ||||
|     my $netscreen = shift; | ||||
|     return $netscreen->ns_i_index(); | ||||
| } | ||||
|  | ||||
| sub i_name { | ||||
|     my $netscreen = shift; | ||||
|     return $netscreen->ns_i_name(); | ||||
| } | ||||
|  | ||||
| sub i_description { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     # Versions prior to 5.4 do not support nsIfDescr but do have nsIfName | ||||
|     return $netscreen->ns_i_description() || $netscreen->ns_i_name(); | ||||
| } | ||||
|  | ||||
| sub i_mac { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $ns_mac   = $netscreen->ns_i_mac()     || {}; | ||||
|     my $if_i_mac = $netscreen->SUPER::i_mac() || {}; | ||||
|     my $ns_i_map = $netscreen->_nsif_if_map(); | ||||
|  | ||||
|     my %i_mac = (); | ||||
|     foreach my $iid ( keys %$ns_i_map ) { | ||||
|         $i_mac{$iid} = $ns_mac->{$iid} || $if_i_mac->{ $ns_i_map->{$iid} }; | ||||
|     } | ||||
|  | ||||
|     return \%i_mac; | ||||
| } | ||||
|  | ||||
| sub i_lastchange { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $if_i_lastchange = $netscreen->SUPER::i_lastchange() || {}; | ||||
|     my $ns_i_map = $netscreen->_nsif_if_map(); | ||||
|     my %i_lastchange; | ||||
|  | ||||
|     foreach my $iid ( keys %$ns_i_map ) { | ||||
|         $i_lastchange{$iid} = $if_i_lastchange->{ $ns_i_map->{$iid} }; | ||||
|     } | ||||
|     return \%i_lastchange; | ||||
| } | ||||
|  | ||||
| sub i_up { | ||||
|     my $netscreen = shift; | ||||
|     return $netscreen->ns_i_up(); | ||||
| } | ||||
|  | ||||
| sub i_up_admin { | ||||
|     my $netscreen  = shift; | ||||
|     my $i_up       = $netscreen->i_up(); | ||||
|     my $i_up_admin = $netscreen->SUPER::i_up_admin(); | ||||
|     my $ns_i_map   = $netscreen->_nsif_if_map(); | ||||
|     my %i_up_admin; | ||||
|  | ||||
|     foreach my $iid ( keys %$ns_i_map ) { | ||||
|         $i_up_admin{$iid}  | ||||
|             = $i_up->{$iid} eq "up" && "up" | ||||
|             || $i_up_admin->{ $ns_i_map->{$iid} } | ||||
|             || 0; | ||||
|     } | ||||
|     return \%i_up_admin; | ||||
| } | ||||
|  | ||||
| sub i_type { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $if_i_type = $netscreen->SUPER::i_type() || {}; | ||||
|     my $ns_i_map = $netscreen->_nsif_if_map(); | ||||
|     my %i_type; | ||||
|  | ||||
|     foreach my $iid ( keys %$ns_i_map ) { | ||||
|         $i_type{$iid} = $if_i_type->{ $ns_i_map->{$iid} } || "tunnel"; | ||||
|     } | ||||
|     return \%i_type; | ||||
| } | ||||
|  | ||||
| sub i_mtu { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $i_type = $netscreen->SUPER::i_mtu() || {}; | ||||
|     my $ns_i_map = $netscreen->_nsif_if_map(); | ||||
|     my %i_mtu; | ||||
|  | ||||
|     foreach my $iid ( keys %$ns_i_map ) { | ||||
|         $i_mtu{$iid} = $i_type->{ $ns_i_map->{$iid} }; | ||||
|     } | ||||
|     return \%i_mtu; | ||||
| } | ||||
|  | ||||
| sub i_ignore { | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub i_speed { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $i_speed  = $netscreen->SUPER::i_speed(); | ||||
|     my $i_name   = $netscreen->i_name(); | ||||
|     my $ns_i_map = $netscreen->_nsif_if_map; | ||||
|     my %i_speed; | ||||
|  | ||||
|     foreach my $iid ( keys %$ns_i_map ) { | ||||
|         $i_speed{$iid}  | ||||
|             = $i_speed->{ $ns_i_map->{$iid} } | ||||
|             || $i_name->{$iid} =~ /tunnel/ && "vpn" | ||||
|             || 0; | ||||
|     } | ||||
|     return \%i_speed; | ||||
| } | ||||
|  | ||||
| sub _mac_map { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $arp_mac = $netscreen->nsIpArpMac() || {}; | ||||
|  | ||||
|     my %mac_map = (); | ||||
|     foreach my $iid ( keys %$arp_mac ) { | ||||
|         my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) ); | ||||
|         $mac_map{$oid} = $iid; | ||||
|     } | ||||
|     return \%mac_map; | ||||
| } | ||||
|  | ||||
| sub ip_index { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $ns_ip = $netscreen->ns_ip_table() || {}; | ||||
|  | ||||
|     my %ip_index = (); | ||||
|     foreach my $iid ( keys %$ns_ip ) { | ||||
|         $ip_index{ $ns_ip->{$iid} } = $iid if $ns_ip->{$iid} ne "0.0.0.0"; | ||||
|     } | ||||
|     return \%ip_index; | ||||
| } | ||||
|  | ||||
| sub ip_table { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $ip_index = $netscreen->ip_index() || {}; | ||||
|  | ||||
|     my %ip_table = (); | ||||
|     foreach my $iid ( keys %$ip_index ) { | ||||
|         $ip_table{$iid} = $iid; | ||||
|     } | ||||
|     return \%ip_table; | ||||
| } | ||||
|  | ||||
| sub ip_netmask { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $ip_index = $netscreen->ip_index() || {}; | ||||
|     my $ns_netmask = $netscreen->ns_ip_netmask(); | ||||
|  | ||||
|     my %ip_netmask = (); | ||||
|     foreach my $iid ( keys %$ip_index ) { | ||||
|         $ip_netmask{$iid} = $ns_netmask->{ $ip_index->{$iid} }; | ||||
|     } | ||||
|     return \%ip_netmask; | ||||
| } | ||||
|  | ||||
| sub fw_index { | ||||
|     my $netscreen = shift; | ||||
|     my %fw_index  = (); | ||||
|     my $arp_mac   = $netscreen->nsIpArpMac() || {}; | ||||
|  | ||||
|     foreach my $iid ( keys %$arp_mac ) { | ||||
|         my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) ); | ||||
|         $fw_index{$iid} = $oid; | ||||
|     } | ||||
|     return \%fw_index; | ||||
| } | ||||
|  | ||||
| sub fw_mac { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $mac_map = $netscreen->_mac_map() || {}; | ||||
|  | ||||
|     my %fw_mac = (); | ||||
|     foreach my $oid ( keys %$mac_map ) { | ||||
|         my $mac | ||||
|             = join( ":", ( map { sprintf "%lx", $_ } split( /\./, $oid ) ) ); | ||||
|         $fw_mac{$oid} = $mac; | ||||
|     } | ||||
|     return \%fw_mac; | ||||
| } | ||||
|  | ||||
| sub bp_index { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $if_info = $netscreen->nsIfInfo() || {}; | ||||
|  | ||||
|     my %bp_index = (); | ||||
|     foreach my $iid ( keys %$if_info ) { | ||||
|         $bp_index{ $if_info->{$iid} } = $iid; | ||||
|     } | ||||
|     return \%bp_index; | ||||
| } | ||||
|  | ||||
| sub fw_port { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $fw_index = $netscreen->fw_index(); | ||||
|     my $arp_if = $netscreen->nsIpArpIfIdx() || {}; | ||||
|  | ||||
|     my %fw_port; | ||||
|     foreach my $iid ( keys %$arp_if ) { | ||||
|         $fw_port{ $fw_index->{$iid} } = $arp_if->{$iid} | ||||
|             if defined $fw_index->{$iid}; | ||||
|     } | ||||
|     return \%fw_port; | ||||
| } | ||||
|  | ||||
| # need to remap from IF-MIB index to nsIf index | ||||
| sub i_ssidlist { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $i_ssidlist = $netscreen->SUPER::i_ssidlist() || {}; | ||||
|     my $ns_i_map = $netscreen->_if_nsif_map(); | ||||
|  | ||||
|     my %i_ssidlist; | ||||
|     foreach my $iid ( keys %$i_ssidlist ) { | ||||
|         $i_ssidlist{ $ns_i_map->{$iid} } = $i_ssidlist->{$iid}; | ||||
|     } | ||||
|     return \%i_ssidlist; | ||||
| } | ||||
|  | ||||
| sub i_80211channel { | ||||
|     my $netscreen = shift; | ||||
|  | ||||
|     my $i_80211channel = $netscreen->SUPER::i_80211channel() || {}; | ||||
|     my $ns_i_map = $netscreen->_if_nsif_map(); | ||||
|  | ||||
|     my %i_80211channel; | ||||
|     foreach my $iid ( keys %$i_80211channel ) { | ||||
|         $i_80211channel{ $ns_i_map->{$iid} } = $i_80211channel->{$iid}; | ||||
|     } | ||||
|     return \%i_80211channel; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
| @@ -124,8 +493,10 @@ Kent Hamilton | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Netscreen device through SNMP. See inherited classes' documentation for  | ||||
| inherited methods. | ||||
| Juniper Netscreen devices through SNMP. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
| my $netscreen = new SNMP::Info::Layer3::Netscreen(...); | ||||
|  | ||||
| @@ -135,6 +506,8 @@ my $netscreen = new SNMP::Info::Layer3::Netscreen(...); | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =item SNMP::Info::IEEE802dot11 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
| @@ -149,9 +522,13 @@ my $netscreen = new SNMP::Info::Layer3::Netscreen(...); | ||||
|  | ||||
| =item F<NETSCREEN-SET-GEN-MIB> | ||||
|  | ||||
| =item Inherited Classes | ||||
| =item F<NETSCREEN-IP-ARP-MIB> | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> and its inherited classes. | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -161,9 +538,13 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $netscreen->model() | ||||
|  | ||||
| Tries to reference $netscreen->id() to F<NETSCREEN-PRODUCTS-MIB> | ||||
|  | ||||
| =item $netscreen->vendor() | ||||
|  | ||||
| Returns 'netscreen' | ||||
| Returns C<'juniper'> | ||||
|  | ||||
| =item $netscreen->os() | ||||
|  | ||||
| @@ -175,7 +556,7 @@ Extracts the OS version from the description string. | ||||
|  | ||||
| =item $netscreen->serial() | ||||
|  | ||||
| Returns serial number.. | ||||
| Returns serial number. | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -185,8 +566,8 @@ Returns serial number.. | ||||
|  | ||||
| =item $netscreen->layers() | ||||
|  | ||||
| Returns 01001100.  Device doesn't report layers properly, modified to reflect  | ||||
| Layer3 functionality. | ||||
| Returns 01001110.  Device doesn't report layers properly, modified to reflect  | ||||
| Layer 2 and 3 functionality. | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -194,14 +575,166 @@ Layer3 functionality. | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::IEEE802dot11 | ||||
|  | ||||
| See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =head3 Interface Information | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $netscreen->interfaces() | ||||
|  | ||||
| Creates a map between the interface identifier (iid) and the physical port | ||||
| name. | ||||
|  | ||||
| Defaults to C<insIfDescr> if available, uses C<nsIfName> if not. | ||||
|  | ||||
| =item $netscreen->i_description()  | ||||
|  | ||||
| Description of the interface. Uses C<insIfDescr> if available, C<nsIfName> | ||||
| if not. | ||||
|  | ||||
| =item $netscreen->i_ignore() | ||||
|  | ||||
| Returns without defining any interfaces to ignore. | ||||
|  | ||||
| =item $netscreen->i_index() | ||||
|  | ||||
| Default SNMP IID to Interface index. | ||||
|  | ||||
| (C<nsIfIndex>) | ||||
|  | ||||
| =item $netscreen->i_lastchange() | ||||
|  | ||||
| The value of C<sysUpTime> when this port last changed states (up,down),  | ||||
| maps from C<ifIndex> to C<nsIfIndex>. | ||||
|  | ||||
| (C<ifLastChange>) | ||||
|  | ||||
| =item $netscreen->i_mac()  | ||||
|  | ||||
| MAC address of the interface.  Note this is just the MAC of the port, not | ||||
| anything connected to it.  Uses C<nsIfMAC> if available, C<ifPhysAddress> | ||||
| if not. | ||||
|  | ||||
| =item $netscreen->i_mtu() | ||||
|  | ||||
| INTEGER. Interface MTU value, maps from C<ifIndex> to C<nsIfIndex>. | ||||
|  | ||||
| (C<ifMtu>) | ||||
|  | ||||
| =item $netscreen->i_name() | ||||
|  | ||||
| Interface Name field. | ||||
|  | ||||
| (C<nsIfName>) | ||||
|  | ||||
| =item $netscreen->i_speed() | ||||
|  | ||||
| Speed of the link, maps from C<ifIndex> to C<nsIfIndex>. | ||||
|  | ||||
| =item $netscreen->i_type() | ||||
|  | ||||
| Interface type.  Maps from C<ifIndex> to C<nsIfIndex>. | ||||
|  | ||||
| (C<ifType>) | ||||
|  | ||||
| =item $netscreen->i_up()  | ||||
|  | ||||
| Link Status of the interface.  Typical values are 'up' and 'down'. | ||||
|  | ||||
| (C<nsIfStatus>) | ||||
|  | ||||
| =item $netscreen->i_up_admin() | ||||
|  | ||||
| Administrative status of the port.  Checks both C<ifAdminStatus> and | ||||
| C<nsIfStatus>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head3 IP Address Table | ||||
|  | ||||
| Each entry in this table is an IP address in use on this device. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $netscreen->ip_index() | ||||
|  | ||||
| Maps the IP Table to the IID | ||||
|  | ||||
| =item $netscreen->ip_table() | ||||
|  | ||||
| Maps the Table to the IP address | ||||
|  | ||||
| (C<nsIfIp>) | ||||
|  | ||||
| =item $netscreen->ip_netmask() | ||||
|  | ||||
| Gives netmask setting for IP table entry. | ||||
|  | ||||
| (C<nsIfNetmask>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head3 Forwarding Table | ||||
|  | ||||
| Uses C<nsIpArpTable> to emulate the forwarding table. | ||||
|  | ||||
| =over  | ||||
|  | ||||
| =item $netscreen->fw_index() | ||||
|  | ||||
| Maps the Forwarding Table to the IID | ||||
|  | ||||
| =item $netscreen->fw_mac() | ||||
|  | ||||
| Returns reference to hash of forwarding table MAC Addresses. | ||||
|  | ||||
| =item $netscreen->fw_port() | ||||
|  | ||||
| Returns reference to hash of forwarding table entries port interface | ||||
| identifier (IID). | ||||
|  | ||||
| =item $netscreen->bp_index() | ||||
|  | ||||
| Returns reference to hash of bridge port table entries map back to interface | ||||
| identifier (IID). | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head3 Wireless Information | ||||
|  | ||||
| =over  | ||||
|  | ||||
| =item $dot11->i_ssidlist() | ||||
|  | ||||
| Returns reference to hash.  SSID's recognized by the radio interface. | ||||
| Remaps from C<ifIndex> to C<nsIfIndex>. | ||||
|  | ||||
| (C<dot11DesiredSSID>) | ||||
|  | ||||
| =item $dot11->i_80211channel() | ||||
|  | ||||
| Returns reference to hash.  Current operating frequency channel of the radio | ||||
| interface.  Remaps from C<ifIndex> to C<nsIfIndex>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::IEEE802dot11 | ||||
|  | ||||
| See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
|  | ||||
|   | ||||
							
								
								
									
										494
									
								
								Info/Layer3/Nexus.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										494
									
								
								Info/Layer3/Nexus.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,494 @@ | ||||
| # SNMP::Info::Layer3::Nexus | ||||
| # | ||||
| # Copyright (c) 2012 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer3::Nexus; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::CDP; | ||||
| use SNMP::Info::CiscoImage; | ||||
| use SNMP::Info::CiscoPortSecurity; | ||||
| use SNMP::Info::CiscoConfig; | ||||
| use SNMP::Info::CiscoPower; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::CiscoStpExtensions; | ||||
| use SNMP::Info::CiscoVTP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| # NOTE : Top-most items gets precedence for @ISA | ||||
| @SNMP::Info::Layer3::Nexus::ISA = qw/ | ||||
|     SNMP::Info::CiscoVTP  | ||||
|     SNMP::Info::CiscoStpExtensions | ||||
|     SNMP::Info::LLDP | ||||
|     SNMP::Info::CDP  | ||||
|     SNMP::Info::CiscoImage | ||||
|     SNMP::Info::CiscoPortSecurity | ||||
|     SNMP::Info::CiscoConfig | ||||
|     SNMP::Info::CiscoPower | ||||
|     SNMP::Info::Layer3 | ||||
|     Exporter | ||||
| /; | ||||
|  | ||||
| @SNMP::Info::Layer3::Nexus::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| # NOTE: Order creates precedence | ||||
| #       Example: v_name exists in Bridge.pm and CiscoVTP.pm | ||||
| #       Bridge is called from Layer3 and CiscoStpExtensions | ||||
| #       So we want CiscoVTP to come last to get the right one. | ||||
| # The @ISA order should be reverse of these orders. | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::CiscoPower::MIBS, | ||||
|     %SNMP::Info::CiscoConfig::MIBS, | ||||
|     %SNMP::Info::CiscoPortSecurity::MIBS, | ||||
|     %SNMP::Info::CiscoImage::MIBS, | ||||
|     %SNMP::Info::CDP::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::CiscoStpExtensions::MIBS,  | ||||
|     %SNMP::Info::CiscoVTP::MIBS, | ||||
|     'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevMIBObjects', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::CiscoPower::GLOBALS, | ||||
|     %SNMP::Info::CiscoConfig::GLOBALS, | ||||
|     %SNMP::Info::CiscoPortSecurity::GLOBALS, | ||||
|     %SNMP::Info::CiscoImage::GLOBALS, | ||||
|     %SNMP::Info::CDP::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::CiscoStpExtensions::GLOBALS, | ||||
|     %SNMP::Info::CiscoVTP::GLOBALS, | ||||
|     'mac' => 'dot1dBaseBridgeAddress', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::CiscoPower::FUNCS, | ||||
|     %SNMP::Info::CiscoConfig::FUNCS, | ||||
|     %SNMP::Info::CiscoPortSecurity::FUNCS, | ||||
|     %SNMP::Info::CiscoImage::FUNCS, | ||||
|     %SNMP::Info::CDP::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::CiscoStpExtensions::FUNCS,  | ||||
|     %SNMP::Info::CiscoVTP::FUNCS,     | ||||
| ); | ||||
|  | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::CiscoPower::MUNGE, | ||||
|     %SNMP::Info::CiscoConfig::MUNGE, | ||||
|     %SNMP::Info::CiscoPortSecurity::MUNGE, | ||||
|     %SNMP::Info::CiscoImage::MUNGE,          | ||||
|     %SNMP::Info::CDP::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::CiscoStpExtensions::MUNGE,  | ||||
|     %SNMP::Info::CiscoVTP::MUNGE,     | ||||
| ); | ||||
|  | ||||
| sub cisco_comm_indexing { return 1; } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'cisco'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'nx-os'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $nexus = shift;  | ||||
|     my $descr = $nexus->description(); | ||||
|      | ||||
|     return $1 if ( $descr =~ /\),\s+Version\s+(.+?),/ ); | ||||
|     return $descr; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $nexus = shift; | ||||
|  | ||||
|     my $e_parent = $nexus->e_parent(); | ||||
|  | ||||
|     foreach my $iid ( keys %$e_parent ) { | ||||
| 	my $parent = $e_parent->{$iid}; | ||||
|         if ($parent eq '0') { | ||||
| 	    my $serial = $nexus->e_serial($iid); | ||||
| 	    return $serial->{$iid}; | ||||
| 	} | ||||
|     }     | ||||
|     return; | ||||
| } | ||||
|  | ||||
| # sysObjectID returns an IID to an entry in the CISCO-ENTITY-VENDORTYPE-OID-MIB. | ||||
| # Look it up and return it. | ||||
| sub model { | ||||
|     my $nexus = shift; | ||||
|     my $id    = $nexus->id(); | ||||
|  | ||||
|     unless ( defined $id ) { | ||||
|         print | ||||
|             " SNMP::Info::Layer3::Nexus::model() - Device does not support sysObjectID\n" | ||||
|             if $nexus->debug(); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|  | ||||
|     return $id unless defined $model; | ||||
|  | ||||
|     $model =~ s/^cevChassis//i; | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| # Reported version 6.x of NX-OS doesn't use the IPv4 address as index | ||||
| # override methods in ipAddrTable | ||||
| sub ip_table { | ||||
|     my $nexus         = shift; | ||||
|     my $orig_ip_table = $nexus->orig_ip_table(); | ||||
|  | ||||
|     my %ip_table; | ||||
|     foreach my $iid ( keys %$orig_ip_table ) { | ||||
| 	my $ip = $orig_ip_table->{$iid}; | ||||
| 	next unless defined $ip; | ||||
|  | ||||
| 	$ip_table{$ip} = $ip; | ||||
|     } | ||||
|     return \%ip_table; | ||||
| } | ||||
|  | ||||
| sub ip_index { | ||||
|     my $nexus         = shift; | ||||
|     my $orig_ip_table = $nexus->orig_ip_table(); | ||||
|     my $orig_ip_index = $nexus->orig_ip_index(); | ||||
|  | ||||
|     my %ip_index; | ||||
|     foreach my $iid ( keys %$orig_ip_table ) { | ||||
| 	my $ip    = $orig_ip_table->{$iid}; | ||||
| 	my $index = $orig_ip_index->{$iid}; | ||||
|  | ||||
| 	next unless ( defined $ip && defined $index ); | ||||
|  | ||||
| 	$ip_index{$ip} = $index; | ||||
|     } | ||||
|     return \%ip_index; | ||||
| } | ||||
|  | ||||
| sub ip_netmask { | ||||
|     my $nexus           = shift; | ||||
|     my $orig_ip_table   = $nexus->orig_ip_table(); | ||||
|     my $orig_ip_netmask = $nexus->orig_ip_netmask(); | ||||
|  | ||||
|     my %ip_netmask; | ||||
|     foreach my $iid ( keys %$orig_ip_table ) { | ||||
| 	my $ip      = $orig_ip_table->{$iid}; | ||||
| 	my $netmask = $orig_ip_netmask->{$iid}; | ||||
|  | ||||
| 	next unless ( defined $ip && defined $netmask ); | ||||
|  | ||||
| 	$ip_netmask{$ip} = $netmask; | ||||
|     } | ||||
|     return \%ip_netmask; | ||||
| } | ||||
|  | ||||
| sub ip_broadcast { | ||||
|     my $nexus             = shift; | ||||
|     my $orig_ip_table     = $nexus->orig_ip_table(); | ||||
|     my $orig_ip_broadcast = $nexus->orig_ip_broadcast(); | ||||
|  | ||||
|     my %ip_broadcast; | ||||
|     foreach my $iid ( keys %$orig_ip_table ) { | ||||
| 	my $ip        = $orig_ip_table->{$iid}; | ||||
| 	my $broadcast = $orig_ip_broadcast->{$iid}; | ||||
|  | ||||
| 	next unless ( defined $ip && defined $broadcast ); | ||||
|  | ||||
| 	$ip_broadcast{$ip} = $broadcast; | ||||
|     } | ||||
|     return \%ip_broadcast; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::Nexus - SNMP Interface to Cisco Nexus Switches running | ||||
| NX-OS | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $nexus = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
|                         # These arguments are passed directly to SNMP::Session | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $nexus->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for Cisco Nexus Switches running NX-OS.   | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $nexus = new SNMP::Info::Layer3::Nexus(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =item SNMP::Info::CiscoVTP | ||||
|  | ||||
| =item SNMP::Info::CDP | ||||
|  | ||||
| =item SNMP::Info::CiscoImage | ||||
|  | ||||
| =item SNMP::Info::CiscoPortSecurity | ||||
|  | ||||
| =item SNMP::Info::CiscoConfig | ||||
|  | ||||
| =item SNMP::Info::CiscoPower | ||||
|  | ||||
| =item SNMP::Info::CiscoStpExtensions | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<CISCO-ENTITY-VENDORTYPE-OID-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB | ||||
| requirements. | ||||
|  | ||||
| See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return a scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $nexus->vendor() | ||||
|  | ||||
| Returns 'cisco' | ||||
|  | ||||
| =item $nexus->os() | ||||
|  | ||||
| Returns C<'nx-os'> | ||||
|  | ||||
| =item $nexus->os_ver() | ||||
|  | ||||
| Returns operating system version extracted from C<sysDescr>. | ||||
|  | ||||
| =item $nexus->serial() | ||||
|  | ||||
| Returns the serial number of the chassis from F<ENTITY-MIB>. | ||||
|  | ||||
| =item $nexus->model() | ||||
|  | ||||
| Tries to reference $nexus->id() to F<CISCO-ENTITY-VENDORTYPE-OID-MIB> | ||||
|  | ||||
| Removes C<'cevChassis'> for readability. | ||||
|  | ||||
| =item $nexus->mac() | ||||
|  | ||||
| C<dot1dBaseBridgeAddress> | ||||
|  | ||||
| =item $nexus->cisco_comm_indexing() | ||||
|  | ||||
| Returns 1.  Use vlan indexing. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =head3 IP Address Table | ||||
|  | ||||
| Each entry in this table is an IP address in use on this device.  Some  | ||||
| versions do not index the table with the IPv4 address in accordance with | ||||
| the MIB definition, these overrides correct that behavior. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $nexus->ip_index() | ||||
|  | ||||
| Maps the IP Table to the IID | ||||
|  | ||||
| (C<ipAdEntIfIndex>) | ||||
|  | ||||
| =item $nexus->ip_table() | ||||
|  | ||||
| Maps the Table to the IP address | ||||
|  | ||||
| (C<ipAdEntAddr>) | ||||
|  | ||||
| =item $nexus->ip_netmask() | ||||
|  | ||||
| Gives netmask setting for IP table entry. | ||||
|  | ||||
| (C<ipAdEntNetMask>) | ||||
|  | ||||
| =item $nexus->ip_broadcast() | ||||
|  | ||||
| Gives broadcast address for IP table entry. | ||||
|  | ||||
| (C<ipAdEntBcastAddr>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::CiscoVTP | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoImage | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoPortSecurity | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoConfig | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoPower | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoStpExtensions | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoVTP | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoStats | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoImage | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoPortSecurity | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for | ||||
| details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoConfig | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoPower | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CiscoStpExtensions | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -175,7 +175,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $pfront->vendor() | ||||
|  | ||||
| Returns 'packetfront'. | ||||
| Returns C<'packetfront'>. | ||||
|  | ||||
| =item $pfront->os() | ||||
|  | ||||
| @@ -187,7 +187,7 @@ Returns the software version extracted from C<sysDescr>. | ||||
|  | ||||
| =item $pfront->serial() | ||||
|  | ||||
| Returns the value of productSerialNo.  | ||||
| Returns the value of C<productSerialNo>.  | ||||
|  | ||||
| =back | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| # SNMP::Info::Layer3::Passport | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # Copyright (c) 2012 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| @@ -30,6 +29,7 @@ | ||||
|  | ||||
| package SNMP::Info::Layer3::Passport; | ||||
|  | ||||
| use warnings; | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::SONMP; | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, %SNMP::Info::RapidCity::MIBS, | ||||
| @@ -80,12 +80,12 @@ sub model { | ||||
|  | ||||
|     return $id unless defined $model; | ||||
|  | ||||
|     $model =~ s/^rcA//i; | ||||
|     $model =~ s/^rc(A)?//i; | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'nortel'; | ||||
|     return 'avaya'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
| @@ -126,9 +126,9 @@ sub i_index { | ||||
|  | ||||
|     # Get VLAN Virtual Router Interfaces | ||||
|     if (!defined $partial | ||||
|         or (defined $model | ||||
|             and (  ( $partial > 2000 and $model =~ /(86|83|81|16)/ ) | ||||
|                 or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         || (defined $model | ||||
|             && (  ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ ) | ||||
|                 || ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         ) | ||||
|         ) | ||||
|     { | ||||
| @@ -182,9 +182,9 @@ sub interfaces { | ||||
|     my $vlan_id = {}; | ||||
|  | ||||
|     if (!defined $partial | ||||
|         or (defined $model | ||||
|             and (  ( $partial > 2000 and $model =~ /(86|83|81|16)/ ) | ||||
|                 or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         || (defined $model | ||||
|             && (  ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ ) | ||||
|                 || ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         ) | ||||
|         ) | ||||
|     { | ||||
| @@ -214,7 +214,7 @@ sub interfaces { | ||||
|             $if{$index} = 'Cpu.6'; | ||||
|         } | ||||
|  | ||||
|         elsif (( $index > 2000 and $model =~ /(86|83|81|16)/ ) | ||||
|         elsif (( $index > 2000 and $model =~ /(86|83|81|16|VSP)/ ) | ||||
|             or ( $index > 256 and $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         { | ||||
|  | ||||
| @@ -255,9 +255,9 @@ sub i_mac { | ||||
|  | ||||
|     # Get VLAN Virtual Router Interfaces | ||||
|     if (!defined $partial | ||||
|         or (defined $model | ||||
|             and (  ( $partial > 2000 and $model =~ /(86|83|81|16)/ ) | ||||
|                 or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         || (defined $model | ||||
|             && (  ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ ) | ||||
|                 || ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         ) | ||||
|         ) | ||||
|     { | ||||
| @@ -329,9 +329,9 @@ sub i_description { | ||||
|  | ||||
|     # Get VLAN Virtual Router Interfaces | ||||
|     if (!defined $partial | ||||
|         or (defined $model | ||||
|             and (  ( $partial > 2000 and $model =~ /(86|83|81|16)/ ) | ||||
|                 or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         || (defined $model | ||||
|             && (  ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ ) | ||||
|                 || ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         ) | ||||
|         ) | ||||
|     { | ||||
| @@ -365,9 +365,9 @@ sub i_name { | ||||
|     my %reverse_vlan; | ||||
|  | ||||
|     if (!defined $partial | ||||
|         or (defined $model | ||||
|             and (  ( $partial > 2000 and $model =~ /(86|83|81|16)/ ) | ||||
|                 or ( $partial > 256 and $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         || (defined $model | ||||
|             && (  ( $partial > 2000 && $model =~ /(86|83|81|16|VSP)/ ) | ||||
|                 || ( $partial > 256 && $model =~ /(105|11[05]0|12[05])/ ) ) | ||||
|         ) | ||||
|         ) | ||||
|     { | ||||
| @@ -402,8 +402,8 @@ sub i_name { | ||||
|                 and $model =~ /(105|11[05]0|12[05])/ ) | ||||
|             ) | ||||
|         { | ||||
|             my $vlan_index = $reverse_vlan{$iid}; | ||||
|             my $vlan_name  = $v_name->{$vlan_index}; | ||||
|             my $vlan_idx = $reverse_vlan{$iid}; | ||||
|             my $vlan_name  = $v_name->{$vlan_idx}; | ||||
|             next unless defined $vlan_name; | ||||
|  | ||||
|             $i_name{$iid} = $vlan_name; | ||||
| @@ -510,7 +510,7 @@ sub root_ip { | ||||
|     my $sonmp_topo_ip   = $passport->sonmp_topo_ip(); | ||||
|  | ||||
|     # Only 8600 and 1600 have CLIP or Management Virtual IP | ||||
|     if ( defined $model and $model =~ /(86|16)/ ) { | ||||
|     if ( defined $model and $model =~ /(86|16|VSP)/ ) { | ||||
|  | ||||
|         # Return CLIP (CircuitLess IP) | ||||
|         foreach my $iid ( keys %$rc_ip_type ) { | ||||
| @@ -683,7 +683,7 @@ sub e_descr { | ||||
|  | ||||
|     my $model = $passport->model(); | ||||
|     my $rc_ps = $passport->rc_ps_detail() || {}; | ||||
|     my $rc_ch = $passport->rcChasType(); | ||||
|     my $rc_ch = $passport->chassis() || ''; | ||||
|     $rc_ch =~ s/a//; | ||||
|  | ||||
|     my %rc_e_descr; | ||||
| @@ -752,7 +752,7 @@ sub e_type { | ||||
|  | ||||
|     my $model = $passport->model(); | ||||
|     my $rc_ps = $passport->rc_ps_type() || {}; | ||||
|     my $rc_ch = $passport->rcChasType(); | ||||
|     my $rc_ch = $passport->chassis(); | ||||
|  | ||||
|     my %rc_e_type; | ||||
|  | ||||
| @@ -927,7 +927,7 @@ sub e_vendor { | ||||
|  | ||||
|     my %rc_e_vendor; | ||||
|     foreach my $iid ( keys %$rc_e_idx ) { | ||||
|         $rc_e_vendor{$iid} = 'nortel'; | ||||
|         $rc_e_vendor{$iid} = 'avaya'; | ||||
|     } | ||||
|     return \%rc_e_vendor; | ||||
| } | ||||
| @@ -1051,8 +1051,8 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::Passport - SNMP Interface to modular Nortel Ethernet Routing | ||||
| Switches (formerly Passport / Accelar) | ||||
| SNMP::Info::Layer3::Passport - SNMP Interface to modular Avaya | ||||
| Ethernet Routing Switch 8000 Series and VSP 9000 Series switches. | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -1075,10 +1075,10 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for modular Nortel Ethernet Routing Switches (formerly | ||||
| Passport and Accelar Series Switches). | ||||
| Abstraction subclass for modular Avaya Ethernet Routing Switch 8000 Series | ||||
| (formerly Nortel/Bay Passport/Accelar) and VSP 9000 Series switches. | ||||
|  | ||||
| These devices have some of the same characteristics as the stackable Nortel  | ||||
| These devices have some of the same characteristics as the stackable Avaya  | ||||
| Ethernet Switches (Baystack).  For example, extended interface information is  | ||||
| gleaned from F<RAPID-CITY>. | ||||
|  | ||||
| @@ -1126,7 +1126,7 @@ F<RAPID-CITY-MIB> and then parses out C<rcA>. | ||||
|  | ||||
| =item $passport->vendor() | ||||
|  | ||||
| Returns 'nortel' | ||||
| Returns 'avaya' | ||||
|  | ||||
| =item $passport->os() | ||||
|  | ||||
| @@ -1273,7 +1273,7 @@ Returns reference to hash.  Key: IID, Value: Hardware version. | ||||
|  | ||||
| =item $passport->e_vendor() | ||||
|  | ||||
| Returns reference to hash.  Key: IID, Value: nortel. | ||||
| Returns reference to hash.  Key: IID, Value: avaya. | ||||
|  | ||||
| =item $passport->e_serial() | ||||
|  | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -118,42 +118,6 @@ sub os_ver { | ||||
|     return $os_ver; | ||||
| } | ||||
|  | ||||
| # Use LLDP | ||||
| sub hasCDP { | ||||
|     my $pf = shift; | ||||
|     return $pf->hasLLDP(); | ||||
| } | ||||
|  | ||||
| sub c_ip { | ||||
|     my $pf  = shift; | ||||
|     my $partial = shift; | ||||
|     return $pf->lldp_ip($partial); | ||||
| } | ||||
|  | ||||
| sub c_if { | ||||
|     my $pf  = shift; | ||||
|     my $partial = shift; | ||||
|     return $pf->lldp_if($partial); | ||||
| } | ||||
|  | ||||
| sub c_port { | ||||
|     my $pf  = shift; | ||||
|     my $partial = shift; | ||||
|     return $pf->lldp_port($partial); | ||||
| } | ||||
|  | ||||
| sub c_id { | ||||
|     my $pf  = shift; | ||||
|     my $partial = shift; | ||||
|     return $pf->lldp_id($partial); | ||||
| } | ||||
|  | ||||
| sub c_platform { | ||||
|     my $pf  = shift; | ||||
|     my $partial = shift; | ||||
|     return $pf->lldp_rem_sysdesc($partial); | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| @@ -230,10 +194,6 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
|     Returns 'FreeBSD' | ||||
|  | ||||
| =item $pf->hasCDP() | ||||
|  | ||||
|     Returns whether LLDP is enabled. | ||||
|  | ||||
| =item $pf->model() | ||||
|  | ||||
| Grabs the os version from C<sysDescr> | ||||
| @@ -259,30 +219,6 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $pf->c_id() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $pf->c_if() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $pf->c_ip() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $pf->c_platform() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =item $pf->c_port() | ||||
|  | ||||
| Returns LLDP information. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|   | ||||
							
								
								
									
										221
									
								
								Info/Layer3/Pica8.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								Info/Layer3/Pica8.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,221 @@ | ||||
| # 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.08'; | ||||
|  | ||||
| %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; | ||||
| } | ||||
|  | ||||
| # 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); | ||||
| } | ||||
|  | ||||
| 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 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $pica8->fw_mac() | ||||
|  | ||||
| Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB> | ||||
|  | ||||
| =item $pica8->fw_port() | ||||
|  | ||||
| Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -36,7 +36,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer3::MIBS, ); | ||||
|  | ||||
|   | ||||
							
								
								
									
										298
									
								
								Info/Layer3/Tasman.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										298
									
								
								Info/Layer3/Tasman.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,298 @@ | ||||
| # SNMP::Info::Layer3::Tasman | ||||
| # | ||||
| # Copyright (c) 2012 Eric Miller | ||||
| # All Rights Reserved | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer3::Tasman; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
|  | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::MAU; | ||||
|  | ||||
| @SNMP::Info::Layer3::Tasman::ISA = qw/SNMP::Info::MAU | ||||
|     SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Tasman::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|     'NT-ENTERPRISE-DATA-MIB' => 'ntEnterpriseRouters', | ||||
|     'SYSTEM-MIB'             => 'nnsysVersion', | ||||
|     'CHASSIS-MIB'            => 'nnchassisModel', | ||||
|     'ENVIRONMENT-MIB'        => 'nnenvPwrsupStatus', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::MAU::GLOBALS, | ||||
|     'ps1_type'      => 'nnenvPwrsupType.1', | ||||
|     'ps1_status'    => 'nnenvPwrsupStatus.1', | ||||
|     'ps2_type'      => 'nnenvPwrsupType.2', | ||||
|     'ps2_status'    => 'nnenvPwrsupStatus.2', | ||||
|     'nn_sys_ver'    => 'nnsysVersion', | ||||
|     'nn_ch_model'   => 'nnchassisModel', | ||||
|     'nn_ch_op_stat' => 'nnchassisOperStatus', | ||||
|     'nn_ch_serial'  => 'nnchassisSerialNumber', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::MAU::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::MAU::MUNGE, | ||||
| ); | ||||
|  | ||||
| # use MAU-MIB for admin. duplex and admin. speed | ||||
| *SNMP::Info::Layer3::Tasman::i_duplex_admin | ||||
|     = \&SNMP::Info::MAU::mau_i_duplex_admin; | ||||
| *SNMP::Info::Layer3::Tasman::i_speed_admin | ||||
|     = \&SNMP::Info::MAU::mau_i_speed_admin; | ||||
|  | ||||
| sub vendor { | ||||
|     return 'avaya'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'tasman'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $tasman  = shift; | ||||
|     my $version = $tasman->nn_sys_ver() || ""; | ||||
|     my $descr   = $tasman->description()  || ""; | ||||
|  | ||||
|     # Newer versions | ||||
|     return $1 if ( $version =~ /^SW:\s+(.+?)\s+/ ); | ||||
|     # Older versions | ||||
|     return $1 if ( $descr =~ /Software Version\s+=\s+[r]*(.+),/); | ||||
|     # Can't find | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $tasman = shift; | ||||
|  | ||||
|     my $id        = $tasman->id(); | ||||
|     my $ch_model = $tasman->nn_ch_model(); | ||||
|      | ||||
|     return $ch_model if $ch_model; | ||||
|  | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|     return $id unless defined $model; | ||||
|  | ||||
|     $model =~ s/^ntSecureRouter/SR/; | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $tasman = shift; | ||||
|  | ||||
|     # Newer versions of the software redefined the MIB in a non-backwards | ||||
|     # compatible manner.  Try the old OID first. | ||||
|     my $serial = $tasman->nn_ch_op_stat(); | ||||
|     # Newer versions populate status, serial should contain some numbers | ||||
|     return $serial if ($serial !~ /^\D+$/); | ||||
|  | ||||
|     # Unfortunately newer versions don't seem to populate the newer OID. | ||||
|     return $tasman->nn_ch_serial(); | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::Tasman - SNMP Interface to Avaya Secure Routers | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $tasman = 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      = $tasman->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Avaya Secure Routers | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =item SNMP::Info::MAU | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<NT-ENTERPRISE-DATA-MIB> | ||||
|  | ||||
| =item F<SYSTEM-MIB> | ||||
|  | ||||
| =item F<CHASSIS-MIB> | ||||
|  | ||||
| =item F<ENVIRONMENT-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $tasman->vendor() | ||||
|  | ||||
| Returns C<'avaya'> | ||||
|  | ||||
| =item $tasman->model() | ||||
|  | ||||
| Tries to get the model from C<nnchassisModel> and if not available  | ||||
| cross references $tasman->id() to F<NT-ENTERPRISE-DATA-MIB>. | ||||
|  | ||||
| Substitutes 'SR' for C<'ntSecureRouter'> in the name for readability. | ||||
|  | ||||
| =item $tasman->os() | ||||
|  | ||||
| Returns C<'tasman'> | ||||
|  | ||||
| =item $tasman->os_ver() | ||||
|  | ||||
| Grabs the os version from C<nnsysVersion> | ||||
|  | ||||
| =item $tasman->ps1_type() | ||||
|  | ||||
| (C<nnenvPwrsupType.1>) | ||||
|  | ||||
| =item $tasman->ps1_status() | ||||
|  | ||||
| (C<nnenvPwrsupStatus.1>) | ||||
|  | ||||
| =item $tasman->ps2_type() | ||||
|  | ||||
| (C<nnenvPwrsupType.2>) | ||||
|  | ||||
| =item $tasman->ps2_status() | ||||
|   | ||||
| (C<nnenvPwrsupStatus.2>) | ||||
|  | ||||
| =item $tasman->nn_sys_ver() | ||||
|  | ||||
| (C<nnsysVersion.0>) | ||||
|  | ||||
| =item $tasman->nn_ch_model() | ||||
|  | ||||
| (C<nnchassisModel.0>) | ||||
|  | ||||
| =item $tasman->nn_ch_op_stat() | ||||
|  | ||||
| (C<nnchassisOperStatus.0>) | ||||
|  | ||||
| =item $tasman->nn_ch_serial() | ||||
|  | ||||
| (C<nnchassisSerialNumber.0>) | ||||
|  | ||||
| =item $tasman->serial() | ||||
|  | ||||
| Tries both (C<nnchassisOperStatus>) and (C<nnchassisSerialNumber>) as oid | ||||
| was redefined between versions. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::MAU | ||||
|  | ||||
| See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over 4 | ||||
|  | ||||
| =item $stack->i_duplex_admin() | ||||
|  | ||||
| Returns reference to hash of iid to administrative duplex setting. | ||||
|  | ||||
| First checks for fixed gigabit ports which are always full duplex. Next checks | ||||
| the port administrative speed (C<portAdminSpeed>) which if set to | ||||
| autonegotiate then the duplex will also autonegotiate, otherwise it uses the | ||||
| reported port duplex (C<portDuplex>). | ||||
|  | ||||
| =item $stack->i_speed_admin() | ||||
|  | ||||
| Returns reference to hash of iid to administrative speed setting. | ||||
|  | ||||
| C<portAdminSpeed> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::MAU | ||||
|  | ||||
| See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer3::MIBS, 'TIMETRA-GLOBAL-MIB' => 'timetraReg', ); | ||||
|  | ||||
|   | ||||
| @@ -37,9 +37,9 @@ use SNMP::Info; | ||||
| @SNMP::Info::Layer7::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Layer7::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/; | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -60,11 +60,15 @@ $VERSION = '2.08'; | ||||
|  | ||||
|  | ||||
| # $l7->model() - Looks at sysObjectID which gives the oid of the system | ||||
| #       name, contained in a propriatry MIB. | ||||
| #       name, contained in a proprietary  MIB. | ||||
| sub model { | ||||
|     my $l7    = shift; | ||||
|     my $id    = $l7->id(); | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|  | ||||
|     # Neoteris (Juniper IVE)     | ||||
|     $model =~ s/^ive//i; | ||||
|  | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| @@ -84,15 +88,35 @@ sub interfaces { | ||||
|     my $l7      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $l7->i_index($partial)   || {}; | ||||
|     my $rptr_port  = $l7->rptr_port($partial) || {}; | ||||
|     my $interfaces = $l7->i_index($partial)       || {}; | ||||
|     my $i_descr    = $l7->i_description($partial) || {}; | ||||
|  | ||||
|     foreach my $port ( keys %$rptr_port ) { | ||||
|         $interfaces->{$port} = $port; | ||||
|     # Replace the Index with the ifDescr field. | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|         my $port = $i_descr->{$iid}; | ||||
|         next unless defined $port; | ||||
|         $interfaces->{$iid} = $port; | ||||
|     } | ||||
|     return $interfaces; | ||||
| } | ||||
|  | ||||
| sub i_ignore { | ||||
|     my $l7      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $i_type = $l7->i_type($partial) || {}; | ||||
|  | ||||
|     my %i_ignore = (); | ||||
|  | ||||
|     foreach my $if ( keys %$i_type ) { | ||||
|         my $type = $i_type->{$if}; | ||||
|         $i_ignore{$if}++ | ||||
|             if $type =~ /(loopback|other|cpu)/i; | ||||
|     } | ||||
|  | ||||
|     return \%i_ignore; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| @@ -186,7 +210,6 @@ Cross references $l7->id() with product IDs. | ||||
| Tries to discover the vendor by looking up the enterprise number in | ||||
| C<sysObjectID>. | ||||
|  | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info | ||||
| @@ -206,6 +229,12 @@ to a hash. | ||||
|  | ||||
| Returns reference to the map between IID and physical Port. | ||||
|  | ||||
| =item $l7->i_ignore() | ||||
|  | ||||
| Returns reference to hash.  Increments value of IID if port is to be ignored. | ||||
|  | ||||
| Ignores loopback, other, and cpu | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
|   | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::Layer7; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '2.08'; | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer7::MIBS, | ||||
| @@ -161,7 +161,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $apc->os() | ||||
|  | ||||
| Returns 'aos' | ||||
| Returns C<'aos'> | ||||
|  | ||||
| =item $apc->os_bin() | ||||
|  | ||||
| @@ -173,12 +173,12 @@ C<POWERNET-MIB::experimental.2.4.1.4.1> | ||||
|  | ||||
| =item $apc->serial() | ||||
|  | ||||
| Combines the UPS serial C<upsAdvIdentSerialNumber.0> with the managment | ||||
| Combines the UPS serial C<upsAdvIdentSerialNumber.0> with the management | ||||
| card serial C<POWERNET-MIB::experimental.2.4.1.2.1> into a pretty string. | ||||
|  | ||||
| =item $apc->vendor() | ||||
|  | ||||
| apc | ||||
| Returns C<'apc'> | ||||
|  | ||||
| =item $apc->model() | ||||
|  | ||||
|   | ||||
							
								
								
									
										164
									
								
								Info/Layer7/Neoteris.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								Info/Layer7/Neoteris.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| # SNMP::Info::Layer7::Neoteris | ||||
| # | ||||
| # Copyright (c) 2012 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer7::Neoteris; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer7; | ||||
|  | ||||
| @SNMP::Info::Layer7::Neoteris::ISA       = qw/SNMP::Info::Layer7 Exporter/; | ||||
| @SNMP::Info::Layer7::Neoteris::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer7::MIBS, | ||||
|     'UCD-SNMP-MIB'       => 'versionTag', | ||||
|     'JUNIPER-IVE-MIB'    => 'productVersion', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer7::GLOBALS, | ||||
|     'os_ver' => 'productVersion', | ||||
|     'cpu'    => 'iveCpuUtil', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( %SNMP::Info::Layer7::FUNCS, ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer7::MUNGE, ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'juniper'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'ive'; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     return ''; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer7::Neoteris - SNMP Interface to Juniper SSL VPN appliances | ||||
|  | ||||
| =head1 AUTHORS | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $neoteris = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $neoteris->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Juniper SSL VPN appliances | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer7 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<UCD-SNMP-MIB> | ||||
|  | ||||
| =item F<JUNIPER-IVE-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer7> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $neoteris->vendor() | ||||
|  | ||||
| Returns 'juniper'. | ||||
|  | ||||
| =item $neoteris->os() | ||||
|  | ||||
| Returns C<'ive'>. | ||||
|  | ||||
| =item $neoteris->os_ver() | ||||
|  | ||||
| C<productVersion> | ||||
|  | ||||
| =item $neoteris->cpu() | ||||
|  | ||||
| C<iveCpuUtil> | ||||
|  | ||||
| =item $neoteris->serial() | ||||
|  | ||||
| Returns ''. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer7 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer7> 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::Layer7 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer7> for details. | ||||
|  | ||||
| =cut | ||||
							
								
								
									
										215
									
								
								Info/Layer7/Netscaler.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								Info/Layer7/Netscaler.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,215 @@ | ||||
| # SNMP::Info::Layer7::Netscaler | ||||
| # | ||||
| # Copyright (c) 2012 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer7::Netscaler; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer7; | ||||
|  | ||||
| @SNMP::Info::Layer7::Netscaler::ISA       = qw/SNMP::Info::Layer7 Exporter/; | ||||
| @SNMP::Info::Layer7::Netscaler::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.08'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer7::MIBS, | ||||
|     'NS-ROOT-MIB' => 'sysBuildVersion', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer7::GLOBALS, | ||||
|     'build_ver'   => 'sysBuildVersion', | ||||
|     'sys_hw_desc' => 'sysHardwareVersionDesc', | ||||
|     'cpu'         => 'resCpuUsage', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer7::FUNCS, | ||||
|     # IP Address Table - NS-ROOT-MIB::nsIpAddrTable | ||||
|     'ip_index'    => 'ipAddr', | ||||
|     'ip_netmask'  => 'ipNetmask', | ||||
|     # TODO VLAN - NS-ROOT-MIB::vlanTable | ||||
|     'ns_vid'      =>'vlanId', | ||||
|     'ns_vlan_mem' => 'vlanMemberInterfaces', | ||||
|     'ns_vtag_int' => 'vlanTaggedInterfaces', | ||||
|     ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer7::MUNGE, ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'citrix'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'netscaler'; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     return ''; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $ns    = shift; | ||||
|     my $desc  = $ns->sys_hw_desc() || ''; | ||||
|     | ||||
|     $desc =~ s/^.+\bNS//i; | ||||
|  | ||||
|     return $desc; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $ns    = shift; | ||||
|     my $ver  = $ns->build_ver() || ''; | ||||
|      | ||||
|     if ($ver =~ /^.+\bNS(\d+\.\d+)/) { | ||||
|         $ver = $1; | ||||
|     } | ||||
|     return $ver; | ||||
| } | ||||
|  | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer7::Netscaler - SNMP Interface to Citrix Netscaler appliances | ||||
|  | ||||
| =head1 AUTHORS | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $ns = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $ns->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Citrix Netscaler appliances | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer7 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<NS-ROOT-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer7> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ns->vendor() | ||||
|  | ||||
| Returns 'citrix'. | ||||
|  | ||||
| =item $ns->os() | ||||
|  | ||||
| Returns 'netscaler'. | ||||
|  | ||||
| =item $ns->os_ver() | ||||
|  | ||||
| Release extracted from C<sysBuildVersion>. | ||||
|  | ||||
| =item $ns->model() | ||||
|  | ||||
| Model extracted from C<sysHardwareVersionDesc>. | ||||
|  | ||||
| =item $ns->cpu() | ||||
|  | ||||
| C<resCpuUsage> | ||||
|  | ||||
| =item $ns->build_ver() | ||||
|  | ||||
| C<sysBuildVersion> | ||||
|  | ||||
| =item $ns->sys_hw_desc() | ||||
|  | ||||
| C<sysHardwareVersionDesc> | ||||
|  | ||||
| =item $ns->serial() | ||||
|  | ||||
| Returns ''. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer7 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer7> for details. | ||||
|  | ||||
| =head1 TABLE ENTRIES | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ns->ip_index() | ||||
|  | ||||
| C<ipAddr> | ||||
|  | ||||
| =item $ns->ip_netmask() | ||||
|  | ||||
| C<ipNetmask> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer7 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer7> for details. | ||||
|  | ||||
| =cut | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user