Compare commits
	
		
			221 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | cf42fe1496 | ||
|  | 1af11bd088 | ||
|  | 073ec319e7 | ||
|  | 5852c3548b | ||
|  | 2344a1eacf | ||
|  | d0887fbea7 | ||
|  | e5ebda1b1e | ||
|  | 8d1681dbfc | ||
|  | 7221797826 | ||
|  | f2fdbb077c | ||
|  | a6fdb107b4 | ||
|  | 7f31038462 | ||
|  | 5fb7c78619 | ||
|  | 603345205a | ||
|  | bd85ebc8d6 | ||
|  | 2aca6d9300 | ||
|  | 4919cb0f69 | ||
|  | d134c342e8 | ||
|  | b1c7e78d12 | ||
|  | 0a0766afbd | ||
|  | 2d39911cba | ||
|  | 3bf60002f4 | ||
|  | 42db01335e | ||
|  | 752e1c632c | ||
|  | 892d2014ca | ||
|  | 1fdc486cd5 | ||
|  | 9e7f7f734e | ||
|  | e311f8a5c6 | ||
|  | 82755ab8db | ||
|  | 62823e3d83 | ||
|  | 66077c9662 | ||
|  | 74e129154b | ||
|  | 75880d9134 | ||
|  | 245fe93be4 | ||
|  | 54a0baa2fa | ||
|  | 4e18ccc9e2 | ||
|  | 9ed5a187a9 | ||
|  | a636ba6117 | ||
|  | facdf0aafe | ||
|  | 75dcf74148 | ||
|  | e252dac59c | ||
|  | 9d384f2bc2 | ||
|  | cc9a1c9f47 | ||
|  | b43eafd09a | ||
|  | 141470fdf4 | ||
|  | 2e18464635 | ||
|  | 87a287e0c9 | ||
|  | a38eafbf56 | ||
|  | 81c7203642 | ||
|  | c515a5e4a1 | ||
|  | 02e6807e44 | ||
|  | 90bb0ef071 | ||
|  | 209988cf9e | ||
|  | da130926a9 | ||
|  | 4c51c29428 | ||
|  | 2301d2e60a | ||
|  | 53a5b5aa0a | ||
|  | d13adfee80 | ||
|  | 9752bf2878 | ||
|  | 9949eeb389 | ||
|  | aceed9cc52 | ||
|  | 0371ca35d6 | ||
|  | ce0a350ef2 | ||
|  | 3b58ba8678 | ||
|  | a69b45d849 | ||
|  | ad0a1044b9 | ||
|  | 5336ec2db2 | ||
|  | e20cd6dd02 | ||
|  | 66f16f6617 | ||
|  | 0755487e02 | ||
|  | afeb37ae5e | ||
|  | cc05fb927f | ||
|  | facdf5b7a7 | ||
|  | 66bedd4d54 | ||
|  | 3a3c1efe46 | ||
|  | 1a069c2b52 | ||
|  | f7de9ffbc6 | ||
|  | 3c6cfa8ecf | ||
|  | 585d01895b | ||
|  | 63cac2a3a8 | ||
|  | 0623fbfdf1 | ||
|  | 0c711269ae | ||
|  | f676d27a3b | ||
|  | 64167df588 | ||
|  | 398f3ee74b | ||
|  | 125f02b8a2 | ||
|  | eeeabeec94 | ||
|  | 5fe0ebaeda | ||
|  | fda59f51f7 | ||
|  | e8de74c6a5 | ||
|  | da6716b107 | ||
|  | 62267f4e8e | ||
|  | fd1c91edac | ||
|  | a0b2010994 | ||
|  | bda796ae98 | ||
|  | 8b3b03b312 | ||
|  | cbc756a3f8 | ||
|  | 9af7a7661c | ||
|  | eab89e4736 | ||
|  | 8391cee4f3 | ||
|  | fcd0e30d64 | ||
|  | 4a454c9431 | ||
|  | cd751071e1 | ||
|  | c921e8b35c | ||
|  | 60d5591401 | ||
|  | 98e8e57747 | ||
|  | f6a4f937ee | ||
|  | 1e5eda927c | ||
|  | c6eb73bc7b | ||
|  | c49d8ab921 | ||
|  | 27b310ee68 | ||
|  | f6d0fb1d7e | ||
|  | ddc5fd8c96 | ||
|  | 26b13fbcd4 | ||
|  | 91b98085f6 | ||
|  | 1c948d6e45 | ||
|  | 76cbb05f19 | ||
|  | e7fcd98107 | ||
|  | 090d94191b | ||
|  | 2c3a6a3c6e | ||
|  | 814083e2fa | ||
|  | 7621b30bc2 | ||
|  | 9e2e55dcb3 | ||
|  | f8a1d5bc7a | ||
|  | 1a65be101e | ||
|  | 4c5d0a5695 | ||
|  | f8b3381d16 | ||
|  | 8a41e5063a | ||
|  | 24a84cdc25 | ||
|  | 25354e1f3e | ||
|  | 2025044952 | ||
|  | d00dcdad85 | ||
|  | fc069c13f5 | ||
|  | 69430f4a21 | ||
|  | a83855157b | ||
|  | 5ce80ba4ee | ||
|  | 16e96d9fcf | ||
|  | ac753c5970 | ||
|  | 313e187399 | ||
|  | f5aaee6c89 | ||
|  | c8b4f8f4fd | ||
|  | 6113dd3b98 | ||
|  | e21f22bb3b | ||
|  | bb4578dea5 | ||
|  | e83ca6fbe3 | ||
|  | ae9963cf85 | ||
|  | 650aef9c2d | ||
|  | 397b14da22 | ||
|  | 0f00322e03 | ||
|  | e2b688077e | ||
|  | 4afbd37cbd | ||
|  | 40d3340ac5 | ||
|  | 9bb71d3df7 | ||
|  | 4860447b06 | ||
|  | 445b3f19a3 | ||
|  | 32efd26999 | ||
|  | f2f95150bd | ||
|  | f210bf8812 | ||
|  | c30e1a2446 | ||
|  | 10392fc08e | ||
|  | df10473fb5 | ||
|  | 6505e7e85f | ||
|  | ffd80722b8 | ||
|  | 6bd5bb3dda | ||
|  | 83dec3c1d6 | ||
|  | 82f2a83eec | ||
|  | 5194af9d91 | ||
|  | a4c76d2fb9 | ||
|  | 57a35075fa | ||
|  | fb69a60b45 | ||
|  | 2625381e5b | ||
|  | 1c048320a6 | ||
|  | c5c25cee7f | ||
|  | dee8177a67 | ||
|  | abbe040351 | ||
|  | 29a0f849f1 | ||
|  | 7e524f46c6 | ||
|  | 1146e99de2 | ||
|  | 6740929d41 | ||
|  | 831788c1c9 | ||
|  | 7e9d4520af | ||
|  | c4317e6e6b | ||
|  | e4e3debce0 | ||
|  | a5b7431070 | ||
|  | 054808f59d | ||
|  | 0b313d627e | ||
|  | 9813b9db90 | ||
|  | 9a4e024abb | ||
|  | 04a669157f | ||
|  | a364c1512d | ||
|  | 0451e6f0a6 | ||
|  | b7f87d9e82 | ||
|  | e2713fb57a | ||
|  | c8eff78d34 | ||
|  | 04ca5793fa | ||
|  | 83d00ee9c7 | ||
|  | bf56ed2540 | ||
|  | e75aba14b4 | ||
|  | 5d2d2d416f | ||
|  | 62799bfc9d | ||
|  | df8fbc3c03 | ||
|  | 604de81ab8 | ||
|  | ed14b09567 | ||
|  | 800758815c | ||
|  | 058b74bd63 | ||
|  | 02a52a4e09 | ||
|  | 74ddc93f7f | ||
|  | eb8af0c81b | ||
|  | bd49274808 | ||
|  | 8b1547c589 | ||
|  | c093f83848 | ||
|  | c0b28c38c5 | ||
|  | 4621a0898f | ||
|  | 6f02e1035f | ||
|  | d4ae9237a6 | ||
|  | 914eb05a60 | ||
|  | 4da17227c1 | ||
|  | 20014cab29 | ||
|  | 9d62361c8a | ||
|  | 260992b7bf | ||
|  | b9cd429551 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -9,3 +9,4 @@ Makefile* | ||||
| Build | ||||
| _build | ||||
| blib | ||||
| cover_db | ||||
|   | ||||
							
								
								
									
										18
									
								
								.perltidyrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.perltidyrc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| # .perltidyrc - PBP perltidy configuration file for SNMP::Info | ||||
| # $Id$ | ||||
|  | ||||
| -l=78   # Max line width is 78 cols | ||||
| -i=4    # Indent level is 4 cols | ||||
| -ci=4   # Continuation indent is 4 cols | ||||
| -nst    # Output to STDOUT | ||||
| -se     # Errors to STDERR | ||||
| -vt=2   # Maximal vertical tightness | ||||
| -cti=0  # No extra indentation for closing brackets | ||||
| -pt=1   # Medium parenthesis tightness | ||||
| -bt=1   # Medium brace tightness | ||||
| -sbt=1  # Medium square bracket tightness | ||||
| -bbt=1  # Medium block brace tightness | ||||
| -nsfs   # No space before semicolons | ||||
| -nolq   # Don't outdent long quoted strings | ||||
| -wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= && += -= /= |= >>= ||= .= %= ^= x=" # Break before all operators | ||||
|  | ||||
							
								
								
									
										29
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| language: perl | ||||
| addons: | ||||
|   apt: | ||||
|     packages: | ||||
|       - jq | ||||
|       - libsnmp-dev | ||||
| branches: | ||||
|   only: | ||||
|     - /^3\.\d{2}$/ | ||||
|     - 'master' | ||||
| before_install: | ||||
|   - mkdir ~/netdisco-mibs | ||||
|   - cd ~/netdisco-mibs | ||||
| install: | ||||
|   - curl -sL https://github.com/netdisco/netdisco-mibs/releases/download/4.010/netdisco-mibs.tar.gz | tar --strip-components=1 -zxf - | ||||
|   - cpanm --quiet --notest PkgConfig Test::CChecker Alien::zlib::Static Alien::OpenSSL::Static Alien::SNMP::MAXTC | ||||
| before_script: | ||||
|   - 'cd ${TRAVIS_BUILD_DIR}' | ||||
| script: | ||||
|   - > | ||||
|     perl Build.PL && | ||||
|     PERL_MM_USE_DEFAULT=1 ./Build installdeps --cpan_client 'cpanm --quiet --notest' && | ||||
|     ./Build test --test_files t/ --test_files xt/ | ||||
| notifications: | ||||
|   irc: | ||||
|     on_success: change | ||||
|     on_failure: always | ||||
|     channels: | ||||
|       - 'chat.freenode.net#netdisco' | ||||
							
								
								
									
										18
									
								
								Build.PL
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								Build.PL
									
									
									
									
									
								
							| @@ -7,6 +7,7 @@ Module::Build->new( | ||||
|   license     => 'bsd', | ||||
|   dist_author => 'Eric A. Miller <emiller@cpan.org>', | ||||
|   # dynamic_config => 1, | ||||
|   create_readme => 1, | ||||
|   configure_requires => { | ||||
|     'Module::Build' => '0.42', | ||||
|   }, | ||||
| @@ -16,10 +17,23 @@ Module::Build->new( | ||||
|     'SNMP' => '0', | ||||
|     'Math::BigInt' => '0', | ||||
|   }, | ||||
|   # recommends => { | ||||
|   # }, | ||||
|   recommends => { | ||||
|     'PPI' => '0', | ||||
|     'Class::ISA' => '0', | ||||
|     'Module::Info' => '0', | ||||
|     'Module::Load' => '0', | ||||
|     'File::Slurp' => '0', | ||||
|   }, | ||||
|   test_requires => { | ||||
|     'Test::More' => '0.88', | ||||
|     'Test::Distribution' => '0', | ||||
|     'Test::Class::Most'  => '0', | ||||
|     'Test::MockObject::Extends' => '0', | ||||
|     'File::Find' => '0', | ||||
|     'Path::Class' => '0', | ||||
|     'File::Slurper' => '0', | ||||
|     'Test::Exception' => '0.43', | ||||
|     'Class::Inspector' => '0', | ||||
|   }, | ||||
|   # script_files => [ | ||||
|   # ], | ||||
|   | ||||
							
								
								
									
										247
									
								
								Changes
									
									
									
									
									
								
							
							
						
						
									
										247
									
								
								Changes
									
									
									
									
									
								
							| @@ -1,4 +1,249 @@ | ||||
| SNMP::Info - Friendly OO-style interface to Network devices using SNMP. | ||||
| Version 3.58 (2018-04-29) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|  | ||||
|   * #202 Support for Aerohive access points | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #220 Alcatel-Lucent / Nokia SR 7750 missing port information. Add duplex, | ||||
|     fan, and power supply status, as well as, module inventory to L3::Timetra | ||||
|   * Add fan and power supply status to L3::Huawei | ||||
|   * Override ifMTU with max frame size when applicable in L3::Huawei | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * Correct POE power module to port mapping in L3::Huawei | ||||
|  | ||||
| Version 3.57 (2018-04-26) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #145 Patch for Huawei (robwwd) | ||||
|   * #228 Huawei aggregate link support | ||||
|   * POE and duplex admin support added to L3::Huawei | ||||
|   * Significant performance improvement validating AUTOLOAD methods | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * IEEE802dot3ad portlist is indexed with a dot1dBasePort, cross reference | ||||
|     with dot1dBasePortIfIndex | ||||
|   * Fix for macsuck in Cisco classes introduced in 3.55 caused by inheritance | ||||
|     issue in CiscoStack | ||||
|  | ||||
| Version 3.56 (2018-04-22) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * Fix table methods when defined as an OID which will not completely | ||||
|     translate to a fully qualified textual leaf  | ||||
|  | ||||
| Version 3.55 (2018-04-19) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|   * #260 Oneaccess (robwwd) | ||||
|   * #259 Add ERX (Old Juniper E-Series JunOSe) Support (robwwd) | ||||
|   * #258 Add support for Arbor devices (robwwd) | ||||
|   * #253 Nexans switch support (paecker) | ||||
|   * #142 Sixnet Switch Support | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #117 Recognition for HP Blade switches (J R Binks) | ||||
|   * #196 Support for powerconnect 8164F | ||||
|   * Refactor Layer3::Dell for better support of newer models | ||||
|   * Increase capture of i_vlan on router interfaces in L3::Cisco | ||||
|   * Factor out logic to determine serial number from ENTITY-MIB in Layer2 and | ||||
|     Layer3 to new method entity_derived_serial in Entity class and added new | ||||
|     method entity_derived_os_ver in Entity class to determine OS version | ||||
|     in a similar manner | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #67 Juniper EX4300 Missing/Wrong information | ||||
|   * #61 ZyXEL (X)GS1900 family MIB - Fix loop in layers method | ||||
|   * Fix ISA in AMAP and EDP classes | ||||
|   * Add missing MIB in L2::Trapeze, L2::NWSS2300, and L3::Dell | ||||
|   * Fix gigabit logic in i_duplex_admin() of CiscoStack | ||||
|   * Prevent potential undefined warnings in i_speed_admin() of L2::C2900 and | ||||
|     ports() of L3::C3550 | ||||
|   * Correct validation and IID/key used in mau_set_i_speed_admin() and | ||||
|     mau_set_i_duplex_admin() of MAU | ||||
|   * Correct typo in MIB leaf names in L3::Aironet  | ||||
|   * Don't use MIB leafs that are not-accessible according to MIB | ||||
|     NOTE: Fixing this logic now results in methods on MIB leafs specified as | ||||
|     not-accessible failing validation in _validate_autoload_method() | ||||
|  | ||||
| Version 3.54 (2018-04-01) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|  | ||||
|   * #141 Avocent ACS files for correct discovery in Netdisco | ||||
|   * Add support for Avocent ACS 5K/6K/8K terminal servers in Layer1::Cyclades | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #215 Nokia/Alcatel-Lucent 7705 LLDP | ||||
|   * #220 Alcatel-Lucent / Nokia SR 7750 missing neighbors | ||||
|   * Improve Layer3::Timetra model detection | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * Fix logic in Layer1::Asante i_up() method | ||||
|   * Fix MIB leaf typo in IPv6 | ||||
|   * Don't use MIB leafs that are not-accessible according to MIB | ||||
|   * Fix logic for determining if MIB leaf supports set operations | ||||
|     NOTE: Fixing this logic now results in methods starting with set_ on MIB | ||||
|     leafs without Write or Create access failing validation in | ||||
|     _validate_autoload_method() | ||||
|  | ||||
| Version 3.53 (2018-03-22) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|  | ||||
|   * #12 add Cisco PortFast support via CiscoStpExtensions::i_faststart_enabled | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * Report serial/version on Netgear FSM (paecker) | ||||
|   * Add test harness and expand developer test coverage | ||||
|   * Add back the base (RFC) MIBs for when net-snmp does not have them builtin | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   *  Fix AUTOLOAD / can() bug that could result in DESTROY being redefined and | ||||
|      dynamic methods not being added to the symbol table. | ||||
|  | ||||
| version 3.52 (2018-03-19) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * set fallback for nonmatching interfaces in Cumulus class | ||||
|   * better interface naming for Ubiquiti | ||||
|   * modify mock utility to work under a perlbrew environment | ||||
|  | ||||
| version 3.50 (2018-03-14) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #198 Add Support for Gigamon devices | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #226 Avaya VSP devices - no ifAlias | ||||
|   * #227 Remove bogus can() check in _set() | ||||
|   * Fix SNMP::Info::IEEE802dot3ad when more than 1 LAG  | ||||
|  | ||||
| version 3.49 (2018-03-03) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * Better Layer3::Cumulus interface naming | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * Use GitHub for MIBs download for testing, instead of sf.net | ||||
|  | ||||
| version 3.48 (2018-03-03) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * Add Layer3::Cumulus for Cumulus Networks devices | ||||
|  | ||||
| version 3.47 (2018-02-27) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * Add LLDP-MIB::lldpXMedRemInventoryTable methods | ||||
|  | ||||
| version 3.46 (2018-02-17) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * Add method to get err-disable cause for interfaces on Cisco | ||||
|  | ||||
| version 3.45 (2018-02-14) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * Enable Layer3::Foundry for Brocade VDX platform | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #222 #238 #239 handle BayStack switches with port index 128 (zoeloe) | ||||
|  | ||||
| version 3.44 (2018-02-12) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * Improve F10 OS version detection (laelly) | ||||
|   * Better IPv6 prefix derivation | ||||
|  | ||||
| version 3.43 (2018-02-02) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * Fix identification of Brocade CES | ||||
|  | ||||
| version 3.42 (2018-02-02) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * IPv6 Prefix Length support via IPv6::ipv6_addr_prefixlength | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * Fix test for updated snmplabs.com data | ||||
|  | ||||
| version 3.41 (2018-02-01) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * Fixes to distriution metadata | ||||
|  | ||||
| version 3.40 (2018-01-28) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #240 Support for CheckPoint devies through SNMP | ||||
|   * #240 Cisco SB switches fixup | ||||
|   * #244 Add Adtran support | ||||
|   * #241 Vyatta/VyOS support | ||||
|   * #246 Nexus VRF support (works with Netdisco) | ||||
|   * #244 Improve Juniper model reporting | ||||
|   * #240 Improve H3C reporting | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #243 Nexus additional debug lines should be hidden | ||||
|  | ||||
| version 3.39 (2017-12-17) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #236 Enhanced Ubiquiti device support (L. Begnaud) | ||||
|   * add HP J9774A model (H. Teulahti) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * fix scripts (F. Mass) | ||||
|   * fix CiscoASA typos (laelly) | ||||
|  | ||||
| version 3.38 (2017-10-23) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * Layer2::Airespace several newer 802.11 data rates added | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #232 Improve generic Info::Layer3 serial number detection | ||||
|  | ||||
| version 3.37 (2017-07-11) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * Layer3::Juniper fixed to return os_ver for JUNOS 14.x and higher | ||||
|  | ||||
| version 3.36 (2017-06-28) | ||||
|  | ||||
|   | ||||
							
								
								
									
										138
									
								
								MANIFEST
									
									
									
									
									
								
							
							
						
						
									
										138
									
								
								MANIFEST
									
									
									
									
									
								
							| @@ -1,3 +1,4 @@ | ||||
| .perltidyrc | ||||
| Build.PL | ||||
| Changes | ||||
| contrib/DEVELOP | ||||
| @@ -40,6 +41,8 @@ lib/SNMP/Info/Layer1/Cyclades.pm | ||||
| lib/SNMP/Info/Layer1/S3000.pm | ||||
| lib/SNMP/Info/Layer2.pm | ||||
| lib/SNMP/Info/Layer2/3Com.pm | ||||
| lib/SNMP/Info/Layer2/Adtran.pm | ||||
| lib/SNMP/Info/Layer2/Aerohive.pm | ||||
| lib/SNMP/Info/Layer2/Airespace.pm | ||||
| lib/SNMP/Info/Layer2/Aironet.pm | ||||
| lib/SNMP/Info/Layer2/Allied.pm | ||||
| @@ -57,8 +60,10 @@ lib/SNMP/Info/Layer2/Kentrox.pm | ||||
| lib/SNMP/Info/Layer2/N2270.pm | ||||
| lib/SNMP/Info/Layer2/NAP222x.pm | ||||
| lib/SNMP/Info/Layer2/Netgear.pm | ||||
| lib/SNMP/Info/Layer2/Nexans.pm | ||||
| lib/SNMP/Info/Layer2/NWSS2300.pm | ||||
| lib/SNMP/Info/Layer2/Orinoco.pm | ||||
| lib/SNMP/Info/Layer2/Sixnet.pm | ||||
| lib/SNMP/Info/Layer2/Trapeze.pm | ||||
| lib/SNMP/Info/Layer2/Ubiquiti.pm | ||||
| lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm | ||||
| @@ -74,14 +79,17 @@ lib/SNMP/Info/Layer3/BlueCoatSG.pm | ||||
| lib/SNMP/Info/Layer3/C3550.pm | ||||
| lib/SNMP/Info/Layer3/C4000.pm | ||||
| lib/SNMP/Info/Layer3/C6500.pm | ||||
| lib/SNMP/Info/Layer3/CheckPoint.pm | ||||
| lib/SNMP/Info/Layer3/Cisco.pm | ||||
| lib/SNMP/Info/Layer3/CiscoASA.pm | ||||
| lib/SNMP/Info/Layer3/CiscoFWSM.pm | ||||
| lib/SNMP/Info/Layer3/CiscoSwitch.pm | ||||
| lib/SNMP/Info/Layer3/Contivity.pm | ||||
| lib/SNMP/Info/Layer3/Cumulus.pm | ||||
| lib/SNMP/Info/Layer3/Dell.pm | ||||
| lib/SNMP/Info/Layer3/DLink.pm | ||||
| lib/SNMP/Info/Layer3/Enterasys.pm | ||||
| lib/SNMP/Info/Layer3/ERX.pm | ||||
| lib/SNMP/Info/Layer3/Extreme.pm | ||||
| lib/SNMP/Info/Layer3/F5.pm | ||||
| lib/SNMP/Info/Layer3/Force10.pm | ||||
| @@ -99,6 +107,7 @@ lib/SNMP/Info/Layer3/N1600.pm | ||||
| lib/SNMP/Info/Layer3/Netscreen.pm | ||||
| lib/SNMP/Info/Layer3/NetSNMP.pm | ||||
| lib/SNMP/Info/Layer3/Nexus.pm | ||||
| lib/SNMP/Info/Layer3/OneAccess.pm | ||||
| lib/SNMP/Info/Layer3/PacketFront.pm | ||||
| lib/SNMP/Info/Layer3/PaloAlto.pm | ||||
| lib/SNMP/Info/Layer3/Passport.pm | ||||
| @@ -110,9 +119,12 @@ lib/SNMP/Info/Layer3/Sun.pm | ||||
| lib/SNMP/Info/Layer3/Tasman.pm | ||||
| lib/SNMP/Info/Layer3/Timetra.pm | ||||
| lib/SNMP/Info/Layer3/VMware.pm | ||||
| lib/SNMP/Info/Layer3/VyOS.pm | ||||
| lib/SNMP/Info/Layer7.pm | ||||
| lib/SNMP/Info/Layer7/APC.pm | ||||
| lib/SNMP/Info/Layer7/Arbor.pm | ||||
| lib/SNMP/Info/Layer7/CiscoIPS.pm | ||||
| lib/SNMP/Info/Layer7/Gigamon.pm | ||||
| lib/SNMP/Info/Layer7/Neoteris.pm | ||||
| lib/SNMP/Info/Layer7/Netscaler.pm | ||||
| lib/SNMP/Info/LLDP.pm | ||||
| @@ -126,6 +138,7 @@ LICENSE | ||||
| MANIFEST			This list of files | ||||
| META.json | ||||
| META.yml | ||||
| README | ||||
| t/00_load.t | ||||
| xt/.perltidyrc | ||||
| xt/00_local_distribution.t | ||||
| @@ -136,3 +149,128 @@ xt/00_local_pod.t | ||||
| xt/00_local_prereq.t | ||||
| xt/00_local_spelling.t | ||||
| xt/00_local_versionsync.t | ||||
| xt/10_remote_snmplabs.t | ||||
| xt/20_run.t | ||||
| xt/lib/My/Test/Class.pm | ||||
| xt/lib/Test/SNMP/Info.pm | ||||
| xt/lib/Test/SNMP/Info/AdslLine.pm | ||||
| xt/lib/Test/SNMP/Info/Aggregate.pm | ||||
| xt/lib/Test/SNMP/Info/Airespace.pm | ||||
| xt/lib/Test/SNMP/Info/AMAP.pm | ||||
| xt/lib/Test/SNMP/Info/Bridge.pm | ||||
| xt/lib/Test/SNMP/Info/CDP.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoAgg.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoConfig.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoPortSecurity.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoPower.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoQOS.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoRTT.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoStats.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoStpExtensions.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoVTP.pm | ||||
| xt/lib/Test/SNMP/Info/EDP.pm | ||||
| xt/lib/Test/SNMP/Info/Entity.pm | ||||
| xt/lib/Test/SNMP/Info/EtherLike.pm | ||||
| xt/lib/Test/SNMP/Info/FDP.pm | ||||
| xt/lib/Test/SNMP/Info/IEEE802dot11.pm | ||||
| xt/lib/Test/SNMP/Info/IEEE802dot3ad.pm | ||||
| xt/lib/Test/SNMP/Info/IPv6.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1/Allied.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1/Asante.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1/Bayhub.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1/Cyclades.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1/S3000.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/3Com.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Aerohive.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Airespace.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Aironet.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Allied.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Baystack.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/C1900.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/C2900.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Catalyst.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Centillion.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Cisco.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/CiscoSB.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/HP.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/HP4000.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/HPVC.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Kentrox.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/N2270.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/NAP222x.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Netgear.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Nexans.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/NWSS2300.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Orinoco.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Sixnet.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Trapeze.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Ubiquiti.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/ZyXEL_DSLAM.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Aironet.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/AlcatelLucent.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/AlteonAD.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Altiga.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Arista.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Aruba.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/BayRS.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/BlueCoatSG.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/C3550.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/C4000.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/C6500.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/CheckPoint.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Cisco.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/CiscoASA.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/CiscoFWSM.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/CiscoSwitch.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Contivity.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Cumulus.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Dell.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/DLink.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Enterasys.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/ERX.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Extreme.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/F5.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Force10.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Fortinet.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Foundry.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/H3C.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/HP9300.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Huawei.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/IBMGbTor.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Juniper.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Lantronix.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Microsoft.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Mikrotik.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/N1600.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Netscreen.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/NetSNMP.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Nexus.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/OneAccess.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/PacketFront.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/PaloAlto.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Passport.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Pf.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Pica8.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/SonicWALL.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Steelhead.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Sun.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Tasman.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Timetra.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/VMware.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/VyOS.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/APC.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/Arbor.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/CiscoIPS.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/Gigamon.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/Neoteris.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/Netscaler.pm | ||||
| xt/lib/Test/SNMP/Info/LLDP.pm | ||||
| xt/lib/Test/SNMP/Info/MAU.pm | ||||
| xt/lib/Test/SNMP/Info/NortelStack.pm | ||||
| xt/lib/Test/SNMP/Info/PowerEthernet.pm | ||||
| xt/lib/Test/SNMP/Info/RapidCity.pm | ||||
| xt/lib/Test/SNMP/Info/SONMP.pm | ||||
|   | ||||
| @@ -65,3 +65,6 @@ | ||||
| .github | ||||
| .travis | ||||
| README.md | ||||
|  | ||||
| # Avoid Komodo project file | ||||
| \.komodoproject$ | ||||
|   | ||||
							
								
								
									
										295
									
								
								META.json
									
									
									
									
									
								
							
							
						
						
									
										295
									
								
								META.json
									
									
									
									
									
								
							| @@ -4,13 +4,13 @@ | ||||
|       "Eric A. Miller <emiller@cpan.org>" | ||||
|    ], | ||||
|    "dynamic_config" : 1, | ||||
|    "generated_by" : "Module::Build version 0.4222", | ||||
|    "generated_by" : "Module::Build version 0.4224", | ||||
|    "license" : [ | ||||
|       "bsd" | ||||
|    ], | ||||
|    "meta-spec" : { | ||||
|       "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", | ||||
|       "version" : "2" | ||||
|       "version" : 2 | ||||
|    }, | ||||
|    "name" : "SNMP-Info", | ||||
|    "prereqs" : { | ||||
| @@ -20,6 +20,13 @@ | ||||
|          } | ||||
|       }, | ||||
|       "runtime" : { | ||||
|          "recommends" : { | ||||
|             "Class::ISA" : "0", | ||||
|             "File::Slurp" : "0", | ||||
|             "Module::Info" : "0", | ||||
|             "Module::Load" : "0", | ||||
|             "PPI" : "0" | ||||
|          }, | ||||
|          "requires" : { | ||||
|             "Math::BigInt" : "0", | ||||
|             "SNMP" : "0" | ||||
| @@ -27,6 +34,14 @@ | ||||
|       }, | ||||
|       "test" : { | ||||
|          "requires" : { | ||||
|             "Class::Inspector" : "0", | ||||
|             "File::Find" : "0", | ||||
|             "File::Slurper" : "0", | ||||
|             "Path::Class" : "0", | ||||
|             "Test::Class::Most" : "0", | ||||
|             "Test::Distribution" : "0", | ||||
|             "Test::Exception" : "0.43", | ||||
|             "Test::MockObject::Extends" : "0", | ||||
|             "Test::More" : "0.88" | ||||
|          } | ||||
|       } | ||||
| @@ -34,459 +49,503 @@ | ||||
|    "provides" : { | ||||
|       "SNMP::Info" : { | ||||
|          "file" : "lib/SNMP/Info.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::AMAP" : { | ||||
|          "file" : "lib/SNMP/Info/AMAP.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::AdslLine" : { | ||||
|          "file" : "lib/SNMP/Info/AdslLine.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Aggregate" : { | ||||
|          "file" : "lib/SNMP/Info/Aggregate.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Airespace" : { | ||||
|          "file" : "lib/SNMP/Info/Airespace.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Bridge" : { | ||||
|          "file" : "lib/SNMP/Info/Bridge.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CDP" : { | ||||
|          "file" : "lib/SNMP/Info/CDP.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoAgg" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoAgg.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoConfig" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoConfig.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoPortSecurity" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoPortSecurity.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoPower" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoPower.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoQOS" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoQOS.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoRTT" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoRTT.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoStack" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoStack.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoStats" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoStats.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoStpExtensions" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoStpExtensions.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoVTP" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoVTP.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::EDP" : { | ||||
|          "file" : "lib/SNMP/Info/EDP.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Entity" : { | ||||
|          "file" : "lib/SNMP/Info/Entity.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::EtherLike" : { | ||||
|          "file" : "lib/SNMP/Info/EtherLike.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::FDP" : { | ||||
|          "file" : "lib/SNMP/Info/FDP.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::IEEE802dot11" : { | ||||
|          "file" : "lib/SNMP/Info/IEEE802dot11.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::IEEE802dot3ad" : { | ||||
|          "file" : "lib/SNMP/Info/IEEE802dot3ad.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::IPv6" : { | ||||
|          "file" : "lib/SNMP/Info/IPv6.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::LLDP" : { | ||||
|          "file" : "lib/SNMP/Info/LLDP.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Allied" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Allied.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Asante" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Asante.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Bayhub" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Bayhub.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Cyclades" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Cyclades.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::S3000" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/S3000.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::3Com" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/3Com.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Adtran" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Adtran.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Aerohive" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Aerohive.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Airespace" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Airespace.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Aironet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Aironet.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Allied" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Allied.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Baystack" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Baystack.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::C1900" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/C1900.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::C2900" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/C2900.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Catalyst" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Catalyst.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Centillion" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Centillion.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Cisco" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Cisco.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::CiscoSB" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/CiscoSB.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::HP" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/HP.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::HP4000" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/HP4000.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::HPVC" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/HPVC.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Kentrox" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Kentrox.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::N2270" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/N2270.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::NAP222x" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/NAP222x.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::NWSS2300" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/NWSS2300.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Netgear" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Netgear.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Nexans" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Nexans.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Orinoco" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Orinoco.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Sixnet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Sixnet.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Trapeze" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Trapeze.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Ubiquiti" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Ubiquiti.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::ZyXEL_DSLAM" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Aironet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Aironet.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::AlcatelLucent" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/AlcatelLucent.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::AlteonAD" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/AlteonAD.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Altiga" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Altiga.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Arista" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Arista.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Aruba" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Aruba.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::BayRS" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/BayRS.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::BlueCoatSG" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/BlueCoatSG.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::C3550" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/C3550.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::C4000" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/C4000.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::C6500" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/C6500.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CheckPoint" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CheckPoint.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Cisco" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Cisco.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CiscoASA" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CiscoASA.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CiscoFWSM" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CiscoFWSM.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CiscoSwitch" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CiscoSwitch.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Contivity" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Contivity.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Cumulus" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Cumulus.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::DLink" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/DLink.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Dell" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Dell.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::ERX" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/ERX.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Enterasys" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Enterasys.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Extreme" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Extreme.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::F5" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/F5.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Force10" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Force10.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Fortinet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Fortinet.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Foundry" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Foundry.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::H3C" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/H3C.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::HP9300" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/HP9300.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Huawei" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Huawei.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::IBMGbTor" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/IBMGbTor.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Juniper" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Juniper.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Lantronix" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Lantronix.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Microsoft" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Microsoft.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Mikrotik" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Mikrotik.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::N1600" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/N1600.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::NetSNMP" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/NetSNMP.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Netscreen" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Netscreen.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Nexus" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Nexus.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::OneAccess" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/OneAccess.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::PacketFront" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/PacketFront.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::PaloAlto" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/PaloAlto.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Passport" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Passport.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Pf" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Pf.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Pica8" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Pica8.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::SonicWALL" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/SonicWALL.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Steelhead" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Steelhead.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Sun" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Sun.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Tasman" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Tasman.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Timetra" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Timetra.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::VMware" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/VMware.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::VyOS" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/VyOS.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::APC" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/APC.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Arbor" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Arbor.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::CiscoIPS" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/CiscoIPS.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Gigamon" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Gigamon.pm", | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Neoteris" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Neoteris.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Netscaler" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Netscaler.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::MAU" : { | ||||
|          "file" : "lib/SNMP/Info/MAU.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::MRO" : { | ||||
|          "file" : "lib/SNMP/Info/MRO.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::NortelStack" : { | ||||
|          "file" : "lib/SNMP/Info/NortelStack.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::PowerEthernet" : { | ||||
|          "file" : "lib/SNMP/Info/PowerEthernet.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::RapidCity" : { | ||||
|          "file" : "lib/SNMP/Info/RapidCity.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       }, | ||||
|       "SNMP::Info::SONMP" : { | ||||
|          "file" : "lib/SNMP/Info/SONMP.pm", | ||||
|          "version" : "3.36" | ||||
|          "version" : "3.58" | ||||
|       } | ||||
|    }, | ||||
|    "release_status" : "stable", | ||||
| @@ -504,6 +563,6 @@ | ||||
|       "x_IRC" : "irc://irc.freenode.org/#netdisco", | ||||
|       "x_MailingList" : "https://lists.sourceforge.net/lists/listinfo/snmp-info-users" | ||||
|    }, | ||||
|    "version" : "3.36", | ||||
|    "x_serialization_backend" : "JSON::PP version 2.27400" | ||||
|    "version" : "3.58", | ||||
|    "x_serialization_backend" : "JSON::PP version 2.97001" | ||||
| } | ||||
|   | ||||
							
								
								
									
										281
									
								
								META.yml
									
									
									
									
									
								
							
							
						
						
									
										281
									
								
								META.yml
									
									
									
									
									
								
							| @@ -3,11 +3,19 @@ abstract: 'OO Interface to Network devices and MIBs through SNMP' | ||||
| author: | ||||
|   - 'Eric A. Miller <emiller@cpan.org>' | ||||
| build_requires: | ||||
|   Class::Inspector: '0' | ||||
|   File::Find: '0' | ||||
|   File::Slurper: '0' | ||||
|   Path::Class: '0' | ||||
|   Test::Class::Most: '0' | ||||
|   Test::Distribution: '0' | ||||
|   Test::Exception: '0.43' | ||||
|   Test::MockObject::Extends: '0' | ||||
|   Test::More: '0.88' | ||||
| configure_requires: | ||||
|   Module::Build: '0.42' | ||||
| dynamic_config: 1 | ||||
| generated_by: 'Module::Build version 0.4222, CPAN::Meta::Converter version 2.150010' | ||||
| generated_by: 'Module::Build version 0.4224, CPAN::Meta::Converter version 2.150010' | ||||
| license: bsd | ||||
| meta-spec: | ||||
|   url: http://module-build.sourceforge.net/META-spec-v1.4.html | ||||
| @@ -16,346 +24,385 @@ name: SNMP-Info | ||||
| provides: | ||||
|   SNMP::Info: | ||||
|     file: lib/SNMP/Info.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::AMAP: | ||||
|     file: lib/SNMP/Info/AMAP.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::AdslLine: | ||||
|     file: lib/SNMP/Info/AdslLine.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Aggregate: | ||||
|     file: lib/SNMP/Info/Aggregate.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Airespace: | ||||
|     file: lib/SNMP/Info/Airespace.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Bridge: | ||||
|     file: lib/SNMP/Info/Bridge.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CDP: | ||||
|     file: lib/SNMP/Info/CDP.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CiscoAgg: | ||||
|     file: lib/SNMP/Info/CiscoAgg.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CiscoConfig: | ||||
|     file: lib/SNMP/Info/CiscoConfig.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CiscoPortSecurity: | ||||
|     file: lib/SNMP/Info/CiscoPortSecurity.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CiscoPower: | ||||
|     file: lib/SNMP/Info/CiscoPower.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CiscoQOS: | ||||
|     file: lib/SNMP/Info/CiscoQOS.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CiscoRTT: | ||||
|     file: lib/SNMP/Info/CiscoRTT.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CiscoStack: | ||||
|     file: lib/SNMP/Info/CiscoStack.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CiscoStats: | ||||
|     file: lib/SNMP/Info/CiscoStats.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CiscoStpExtensions: | ||||
|     file: lib/SNMP/Info/CiscoStpExtensions.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::CiscoVTP: | ||||
|     file: lib/SNMP/Info/CiscoVTP.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::EDP: | ||||
|     file: lib/SNMP/Info/EDP.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Entity: | ||||
|     file: lib/SNMP/Info/Entity.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::EtherLike: | ||||
|     file: lib/SNMP/Info/EtherLike.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::FDP: | ||||
|     file: lib/SNMP/Info/FDP.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::IEEE802dot11: | ||||
|     file: lib/SNMP/Info/IEEE802dot11.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::IEEE802dot3ad: | ||||
|     file: lib/SNMP/Info/IEEE802dot3ad.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::IPv6: | ||||
|     file: lib/SNMP/Info/IPv6.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::LLDP: | ||||
|     file: lib/SNMP/Info/LLDP.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer1: | ||||
|     file: lib/SNMP/Info/Layer1.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer1::Allied: | ||||
|     file: lib/SNMP/Info/Layer1/Allied.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer1::Asante: | ||||
|     file: lib/SNMP/Info/Layer1/Asante.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer1::Bayhub: | ||||
|     file: lib/SNMP/Info/Layer1/Bayhub.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer1::Cyclades: | ||||
|     file: lib/SNMP/Info/Layer1/Cyclades.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer1::S3000: | ||||
|     file: lib/SNMP/Info/Layer1/S3000.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2: | ||||
|     file: lib/SNMP/Info/Layer2.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::3Com: | ||||
|     file: lib/SNMP/Info/Layer2/3Com.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Adtran: | ||||
|     file: lib/SNMP/Info/Layer2/Adtran.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Aerohive: | ||||
|     file: lib/SNMP/Info/Layer2/Aerohive.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Airespace: | ||||
|     file: lib/SNMP/Info/Layer2/Airespace.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Aironet: | ||||
|     file: lib/SNMP/Info/Layer2/Aironet.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Allied: | ||||
|     file: lib/SNMP/Info/Layer2/Allied.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Baystack: | ||||
|     file: lib/SNMP/Info/Layer2/Baystack.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::C1900: | ||||
|     file: lib/SNMP/Info/Layer2/C1900.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::C2900: | ||||
|     file: lib/SNMP/Info/Layer2/C2900.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Catalyst: | ||||
|     file: lib/SNMP/Info/Layer2/Catalyst.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Centillion: | ||||
|     file: lib/SNMP/Info/Layer2/Centillion.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Cisco: | ||||
|     file: lib/SNMP/Info/Layer2/Cisco.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::CiscoSB: | ||||
|     file: lib/SNMP/Info/Layer2/CiscoSB.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::HP: | ||||
|     file: lib/SNMP/Info/Layer2/HP.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::HP4000: | ||||
|     file: lib/SNMP/Info/Layer2/HP4000.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::HPVC: | ||||
|     file: lib/SNMP/Info/Layer2/HPVC.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Kentrox: | ||||
|     file: lib/SNMP/Info/Layer2/Kentrox.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::N2270: | ||||
|     file: lib/SNMP/Info/Layer2/N2270.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::NAP222x: | ||||
|     file: lib/SNMP/Info/Layer2/NAP222x.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::NWSS2300: | ||||
|     file: lib/SNMP/Info/Layer2/NWSS2300.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Netgear: | ||||
|     file: lib/SNMP/Info/Layer2/Netgear.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Nexans: | ||||
|     file: lib/SNMP/Info/Layer2/Nexans.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Orinoco: | ||||
|     file: lib/SNMP/Info/Layer2/Orinoco.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Sixnet: | ||||
|     file: lib/SNMP/Info/Layer2/Sixnet.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Trapeze: | ||||
|     file: lib/SNMP/Info/Layer2/Trapeze.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::Ubiquiti: | ||||
|     file: lib/SNMP/Info/Layer2/Ubiquiti.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer2::ZyXEL_DSLAM: | ||||
|     file: lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3: | ||||
|     file: lib/SNMP/Info/Layer3.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Aironet: | ||||
|     file: lib/SNMP/Info/Layer3/Aironet.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::AlcatelLucent: | ||||
|     file: lib/SNMP/Info/Layer3/AlcatelLucent.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::AlteonAD: | ||||
|     file: lib/SNMP/Info/Layer3/AlteonAD.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Altiga: | ||||
|     file: lib/SNMP/Info/Layer3/Altiga.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Arista: | ||||
|     file: lib/SNMP/Info/Layer3/Arista.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Aruba: | ||||
|     file: lib/SNMP/Info/Layer3/Aruba.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::BayRS: | ||||
|     file: lib/SNMP/Info/Layer3/BayRS.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::BlueCoatSG: | ||||
|     file: lib/SNMP/Info/Layer3/BlueCoatSG.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::C3550: | ||||
|     file: lib/SNMP/Info/Layer3/C3550.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::C4000: | ||||
|     file: lib/SNMP/Info/Layer3/C4000.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::C6500: | ||||
|     file: lib/SNMP/Info/Layer3/C6500.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::CheckPoint: | ||||
|     file: lib/SNMP/Info/Layer3/CheckPoint.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Cisco: | ||||
|     file: lib/SNMP/Info/Layer3/Cisco.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::CiscoASA: | ||||
|     file: lib/SNMP/Info/Layer3/CiscoASA.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::CiscoFWSM: | ||||
|     file: lib/SNMP/Info/Layer3/CiscoFWSM.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::CiscoSwitch: | ||||
|     file: lib/SNMP/Info/Layer3/CiscoSwitch.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Contivity: | ||||
|     file: lib/SNMP/Info/Layer3/Contivity.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Cumulus: | ||||
|     file: lib/SNMP/Info/Layer3/Cumulus.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::DLink: | ||||
|     file: lib/SNMP/Info/Layer3/DLink.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Dell: | ||||
|     file: lib/SNMP/Info/Layer3/Dell.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::ERX: | ||||
|     file: lib/SNMP/Info/Layer3/ERX.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Enterasys: | ||||
|     file: lib/SNMP/Info/Layer3/Enterasys.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Extreme: | ||||
|     file: lib/SNMP/Info/Layer3/Extreme.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::F5: | ||||
|     file: lib/SNMP/Info/Layer3/F5.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Force10: | ||||
|     file: lib/SNMP/Info/Layer3/Force10.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Fortinet: | ||||
|     file: lib/SNMP/Info/Layer3/Fortinet.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Foundry: | ||||
|     file: lib/SNMP/Info/Layer3/Foundry.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::H3C: | ||||
|     file: lib/SNMP/Info/Layer3/H3C.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::HP9300: | ||||
|     file: lib/SNMP/Info/Layer3/HP9300.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Huawei: | ||||
|     file: lib/SNMP/Info/Layer3/Huawei.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::IBMGbTor: | ||||
|     file: lib/SNMP/Info/Layer3/IBMGbTor.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Juniper: | ||||
|     file: lib/SNMP/Info/Layer3/Juniper.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Lantronix: | ||||
|     file: lib/SNMP/Info/Layer3/Lantronix.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Microsoft: | ||||
|     file: lib/SNMP/Info/Layer3/Microsoft.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Mikrotik: | ||||
|     file: lib/SNMP/Info/Layer3/Mikrotik.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::N1600: | ||||
|     file: lib/SNMP/Info/Layer3/N1600.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::NetSNMP: | ||||
|     file: lib/SNMP/Info/Layer3/NetSNMP.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Netscreen: | ||||
|     file: lib/SNMP/Info/Layer3/Netscreen.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Nexus: | ||||
|     file: lib/SNMP/Info/Layer3/Nexus.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::OneAccess: | ||||
|     file: lib/SNMP/Info/Layer3/OneAccess.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::PacketFront: | ||||
|     file: lib/SNMP/Info/Layer3/PacketFront.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::PaloAlto: | ||||
|     file: lib/SNMP/Info/Layer3/PaloAlto.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Passport: | ||||
|     file: lib/SNMP/Info/Layer3/Passport.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Pf: | ||||
|     file: lib/SNMP/Info/Layer3/Pf.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Pica8: | ||||
|     file: lib/SNMP/Info/Layer3/Pica8.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::SonicWALL: | ||||
|     file: lib/SNMP/Info/Layer3/SonicWALL.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Steelhead: | ||||
|     file: lib/SNMP/Info/Layer3/Steelhead.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Sun: | ||||
|     file: lib/SNMP/Info/Layer3/Sun.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Tasman: | ||||
|     file: lib/SNMP/Info/Layer3/Tasman.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::Timetra: | ||||
|     file: lib/SNMP/Info/Layer3/Timetra.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::VMware: | ||||
|     file: lib/SNMP/Info/Layer3/VMware.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer3::VyOS: | ||||
|     file: lib/SNMP/Info/Layer3/VyOS.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer7: | ||||
|     file: lib/SNMP/Info/Layer7.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer7::APC: | ||||
|     file: lib/SNMP/Info/Layer7/APC.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer7::Arbor: | ||||
|     file: lib/SNMP/Info/Layer7/Arbor.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer7::CiscoIPS: | ||||
|     file: lib/SNMP/Info/Layer7/CiscoIPS.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer7::Gigamon: | ||||
|     file: lib/SNMP/Info/Layer7/Gigamon.pm | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer7::Neoteris: | ||||
|     file: lib/SNMP/Info/Layer7/Neoteris.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::Layer7::Netscaler: | ||||
|     file: lib/SNMP/Info/Layer7/Netscaler.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::MAU: | ||||
|     file: lib/SNMP/Info/MAU.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::MRO: | ||||
|     file: lib/SNMP/Info/MRO.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::NortelStack: | ||||
|     file: lib/SNMP/Info/NortelStack.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::PowerEthernet: | ||||
|     file: lib/SNMP/Info/PowerEthernet.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::RapidCity: | ||||
|     file: lib/SNMP/Info/RapidCity.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
|   SNMP::Info::SONMP: | ||||
|     file: lib/SNMP/Info/SONMP.pm | ||||
|     version: '3.36' | ||||
|     version: '3.58' | ||||
| recommends: | ||||
|   Class::ISA: '0' | ||||
|   File::Slurp: '0' | ||||
|   Module::Info: '0' | ||||
|   Module::Load: '0' | ||||
|   PPI: '0' | ||||
| requires: | ||||
|   Math::BigInt: '0' | ||||
|   SNMP: '0' | ||||
| @@ -366,5 +413,5 @@ resources: | ||||
|   homepage: http://netdisco.org/ | ||||
|   license: http://opensource.org/licenses/bsd-license.php | ||||
|   repository: https://github.com/netdisco/snmp-info | ||||
| version: '3.36' | ||||
| x_serialization_backend: 'CPAN::Meta::YAML version 0.011' | ||||
| version: '3.58' | ||||
| x_serialization_backend: 'CPAN::Meta::YAML version 0.018' | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #!/usr/bin/perl | ||||
| #!/usr/bin/env perl | ||||
| # | ||||
| # test_class_mocked.pl | ||||
| # | ||||
| @@ -33,7 +33,7 @@ use strict; | ||||
| use warnings; | ||||
| use Carp; | ||||
| use FindBin; | ||||
| use lib "$FindBin::Bin/../../.."; | ||||
| use lib "$FindBin::Bin/../../lib"; | ||||
| use File::Slurp qw(slurp); | ||||
| use Getopt::Long; | ||||
| use Pod::Usage; | ||||
|   | ||||
							
								
								
									
										458
									
								
								lib/SNMP/Info.pm
									
									
									
									
									
								
							
							
						
						
									
										458
									
								
								lib/SNMP/Info.pm
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -33,12 +33,12 @@ use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::LLDP::EXPORT_OK = qw//; | ||||
| @SNMP::Info::AMAP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::AMAP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS | ||||
|     = ( 'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', ); | ||||
|   | ||||
| @@ -38,7 +38,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' ); | ||||
|  | ||||
|   | ||||
| @@ -38,9 +38,10 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = (); # IF-MIB | ||||
| # Load MIB for leafs referenced within class | ||||
| %MIBS = ('IF-MIB' => 'ifIndex',); | ||||
|  | ||||
| %GLOBALS = (); | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|   | ||||
| @@ -42,11 +42,12 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'BRIDGE-MIB'   => 'dot1dBaseBridgeAddress', | ||||
|     'Q-BRIDGE-MIB' => 'dot1qPvid', | ||||
|     'RSTP-MIB'     => 'dot1dStpPortOperEdgePort', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| @@ -104,6 +105,10 @@ $VERSION = '3.36'; | ||||
|     'stp_p_bridge'   => 'dot1dStpPortDesignatedBridge', | ||||
|     'stp_p_port'     => 'dot1dStpPortDesignatedPort', | ||||
|  | ||||
|     # Rapid Spanning Tree Protocol Table : dot1dStpExtPortEntry | ||||
|     'is_edgeport_admin' => 'dot1dStpPortAdminEdgePort', | ||||
|     'is_edgeport_oper'  => 'dot1dStpPortOperEdgePort', | ||||
|  | ||||
|     # Q-BRIDGE-MIB : dot1qPortVlanTable | ||||
|     'qb_i_vlan'        => 'dot1qPvid', | ||||
|     'qb_i_vlan_type'   => 'dot1qPortAcceptableFrameTypes', | ||||
| @@ -716,7 +721,7 @@ tagged ports or the VLAN ID. | ||||
|  | ||||
| =item $bridge->qb_fdb_index() | ||||
|  | ||||
| Returns reference to hash: key = VLAN ID, value = FDB ID. | ||||
| Returns reference to hash: key = FDB ID, value = VLAN ID. | ||||
|  | ||||
| =item $bridge->v_index() | ||||
|  | ||||
|   | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info; | ||||
| use vars | ||||
|     qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT %CDP_CAPABILITIES/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| # Five data structures required by SNMP::Info | ||||
| %MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' ); | ||||
| @@ -58,7 +58,6 @@ $VERSION = '3.36'; | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     'cdp_index'        => 'cdpCacheIfIndex', | ||||
|     'cdp_proto'        => 'cdpCacheAddressType', | ||||
|     'cdp_addr'         => 'cdpCacheAddress', | ||||
|     'cdp_ver'          => 'cdpCacheVersion', | ||||
| @@ -128,11 +127,6 @@ sub hasCDP { | ||||
| sub cdp_if { | ||||
|     my $cdp = shift; | ||||
|  | ||||
|     # See if by some miracle Cisco implemented the cdpCacheIfIndex entry | ||||
|     my $cdp_index = $cdp->cdp_index(); | ||||
|     return $cdp_index if defined $cdp_index; | ||||
|  | ||||
|     # Nope, didn't think so. Now we fake it. | ||||
|     my $cdp_ip = $cdp->cdp_ip(); | ||||
|     unless ( defined $cdp_ip ) { | ||||
|         $cdp->error_throw( | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| # SNMP::Info::CiscoAgg | ||||
| # | ||||
| # Copyright (c) 2014 SNMP::Info Developers | ||||
| # Copyright (c) 2018 SNMP::Info Developers | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info::IEEE802dot3ad 'agg_ports_lag'; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|   %SNMP::Info::IEEE802dot3ad::MIBS, | ||||
| @@ -52,9 +52,13 @@ $VERSION = '3.36'; | ||||
|  | ||||
| %GLOBALS = (); | ||||
|  | ||||
| %FUNCS = (); | ||||
| %FUNCS = ( | ||||
|   %SNMP::Info::IEEE802dot3ad::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = (); | ||||
| %MUNGE = ( | ||||
|   %SNMP::Info::IEEE802dot3ad::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub agg_ports_pagp { | ||||
|   my $dev = shift; | ||||
| @@ -147,4 +151,8 @@ automatically. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::IEEE802dot3ad | ||||
|  | ||||
| See documentation in L<SNMP::Info::IEEE802dot3ad> for details. | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable', | ||||
|   | ||||
| @@ -32,18 +32,20 @@ package SNMP::Info::CiscoPortSecurity; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::CiscoPortSecurity::ISA       = qw/Exporter/; | ||||
| @SNMP::Info::CiscoPortSecurity::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoPortSecurity::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB', | ||||
|     'CISCO-PAE-MIB'           => 'ciscoPaeMIB', | ||||
|     'IEEE8021-PAE-MIB'        => 'dot1xAuthLastEapolFrameSource', | ||||
|     'CISCO-ERR-DISABLE-MIB'   => 'ciscoErrDisableMIB', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| @@ -81,30 +83,27 @@ $VERSION = '3.36'; | ||||
|     # CISCO-PORT-SECURITY-MIB::cpsIfVlanTable | ||||
|     'cps_i_v_mac_count' => 'cpsIfVlanCurSecureMacAddrCount', | ||||
|     'cps_i_v_mac_max'   => 'cpsIfVlanMaxSecureMacAddr', | ||||
|     'cps_i_v'           => 'cpsIfVlanIndex', | ||||
|  | ||||
|     # CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable | ||||
|     'cps_i_v_mac_status' => 'cpsIfVlanSecureMacAddrRowStatus', | ||||
|     'cps_i_v_mac_age'    => 'cpsIfVlanSecureMacAddrRemainAge', | ||||
|     'cps_i_v_mac_type'   => 'cpsIfVlanSecureMacAddrType', | ||||
|     'cps_i_v_vlan'       => 'cpsIfVlanSecureVlanIndex', | ||||
|     'cps_i_v_mac'        => 'cpsIfVlanSecureMacAddress', | ||||
|  | ||||
|     # CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable | ||||
|     'cps_m_status' => 'cpsSecureMacAddrRowStatus', | ||||
|     'cps_m_age'    => 'cpsSecureMacAddrRemainingAge', | ||||
|     'cps_m_type'   => 'cpsSecureMacAddrType', | ||||
|     'cps_m_mac'    => 'cpsSecureMacAddress', | ||||
|  | ||||
|     # IEEE8021-PAE-MIB::dot1xPaePortEntry | ||||
|     'pae_i_capabilities'            => 'dot1xPaePortCapabilities', | ||||
|     'pae_i_last_eapol_frame_source' => 'dot1xAuthLastEapolFrameSource', | ||||
|  | ||||
|     # CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusEntry | ||||
|     'cerr_i_cause' => 'cErrDisableIfStatusCause', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     'cps_i_mac'                     => \&SNMP::Info::munge_mac, | ||||
|     'cps_m_mac'                     => \&SNMP::Info::munge_mac, | ||||
|     'cps_i_v_mac'                   => \&SNMP::Info::munge_mac, | ||||
|     'pae_i_last_eapol_frame_source' => \&SNMP::Info::munge_mac, | ||||
|     'pae_i_capabilities'            => \&munge_pae_capabilities, | ||||
| ); | ||||
| @@ -123,13 +122,29 @@ sub munge_pae_capabilities { | ||||
|     return join( ' ', @vals ); | ||||
| } | ||||
|  | ||||
| # Define a generic method to show the cause for a port to be err-disabled. | ||||
| # Cisco indexes cErrDisableIfStatusCause by {ifindex,vlan}, but for a more | ||||
| # generic method, using ifIndex only makes it easier to implement across | ||||
| # device classes. Besides, several (most?) err-disable features will disable | ||||
| # the whole interface anyway, and not just a vlan on the interface. | ||||
| sub i_err_disable_cause { | ||||
|     my $cps = shift; | ||||
|     my $ret; | ||||
|     my $causes = $cps->cerr_i_cause() || {}; | ||||
|     foreach my $interfacevlan (keys %$causes) { | ||||
|         my ($iid, $vid) = split(/\./, $interfacevlan); | ||||
|         $ret->{$iid} = $causes->{$interfacevlan}; | ||||
|     } | ||||
|     return $ret; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::CiscoPortSecurity - SNMP Interface to data from | ||||
| F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB> | ||||
| F<CISCO-PORT-SECURITY-MIB>, F<CISCO-PAE-MIB> and F<CISCO-ERR-DISABLE-MIB>. | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -153,8 +168,9 @@ Eric Miller | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::CiscoPortSecurity is a subclass of SNMP::Info that provides | ||||
| an interface to the F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB>.  These | ||||
| MIBs are used across the Catalyst family under CatOS and IOS. | ||||
| an interface to the F<CISCO-PORT-SECURITY-MIB>, F<CISCO-PAE-MIB> and | ||||
| F<CISCO-ERR-DISABLE-MIB>. These MIBs are used across the Catalyst | ||||
| family under CatOS and IOS. | ||||
|  | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
|  | ||||
| @@ -172,6 +188,8 @@ None. | ||||
|  | ||||
| =item F<IEEE8021-PAE-MIB> | ||||
|  | ||||
| =item F<CISCO-ERR-DISABLE-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
| @@ -300,10 +318,6 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
| (C<cpsIfVlanMaxSecureMacAddr>) | ||||
|  | ||||
| =item $cps->cps_i_v() | ||||
|  | ||||
| (C<cpsIfVlanIndex>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable> | ||||
| @@ -322,14 +336,6 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
| (C<cpsIfVlanSecureMacAddrType>) | ||||
|  | ||||
| =item $cps->cps_i_v_vlan() | ||||
|  | ||||
| (C<cpsIfVlanSecureVlanIndex>) | ||||
|  | ||||
| =item $cps->cps_i_v_mac() | ||||
|  | ||||
| (C<cpsIfVlanSecureMacAddress>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 C<CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable> | ||||
| @@ -348,10 +354,6 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
| (C<cpsSecureMacAddrType>) | ||||
|  | ||||
| =item $cps->cps_m_mac() | ||||
|  | ||||
| (C<cpsSecureMacAddress>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 C<IEEE8021-PAE-MIB::dot1xPaePortEntry> | ||||
| @@ -374,6 +376,31 @@ The source MAC address carried in the most recently received EAPOL frame. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 C<CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusEntry> | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cps->cerr_i_cause() | ||||
|  | ||||
| C<cErrDisableIfStatusCause> | ||||
|  | ||||
| Indicates the feature/event that caused the {interface, vlan} (or the entire | ||||
| interface) to be error-disabled. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 METHODS | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item C<i_err_disable_cause> | ||||
|  | ||||
| Returns a HASH reference mapping ifIndex to err-disabled cause. The returned | ||||
| data is sparse, so if the ifIndex is not present in the return value, the port | ||||
| is not err-disabled. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 Data Munging Callback Subroutines | ||||
|  | ||||
| =over | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex', | ||||
|           'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' ); | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', ); | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', ); | ||||
|  | ||||
|   | ||||
| @@ -38,7 +38,7 @@ use Exporter; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', ); | ||||
|  | ||||
| @@ -194,7 +194,7 @@ sub i_duplex_admin { | ||||
|         next if ( defined $partial and $iid !~ /^$partial$/ ); | ||||
|  | ||||
|         # Test for gigabit | ||||
|         if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 1 ) { | ||||
|         if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) { | ||||
|             $i_duplex_admin->{$iid} = 'full'; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -42,14 +42,14 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'SNMPv2-MIB'            => 'sysDescr', | ||||
|     'CISCO-PROCESS-MIB'     => 'cpmCPUTotal5sec', | ||||
|     'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed', | ||||
|     'OLD-CISCO-SYSTEM-MIB'  => 'writeMem', | ||||
|     'CISCO-PRODUCTS-MIB'    => 'sysName', | ||||
|     'CISCO-PRODUCTS-MIB'    => 'ciscoIGS', | ||||
|     'ENTITY-MIB'            => 'entPhysicalSoftwareRev', | ||||
|     'CISCO-IMAGE-MIB'       => 'ciscoImageString', | ||||
|  | ||||
|   | ||||
| @@ -36,7 +36,7 @@ use SNMP::Info::Bridge; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| @SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//; | ||||
| @@ -54,12 +54,15 @@ $VERSION = '3.36'; | ||||
|             'stpx_stp_type'          => 'stpxSpanningTreeType', | ||||
|             'stpx_bpduguard_enable'  => 'stpxFastStartBpduGuardEnable', | ||||
|             'stpx_bpdufilter_enable' => 'stpxFastStartBpduFilterEnable', | ||||
|             'stpx_faststart_default' => 'stpxFastStartGlobalDefaultMode', | ||||
|            ); | ||||
|  | ||||
| %FUNCS   = ( | ||||
|             %SNMP::Info::Bridge::FUNCS, | ||||
|             'stpx_rootguard_enabled'      => 'stpxRootGuardConfigEnabled', | ||||
|             'stpx_loopguard_enabled'      => 'stpxLoopGuardConfigEnabled', | ||||
|             'stpx_faststart_enabled'      => 'stpxFastStartPortEnable', | ||||
|             'stpx_faststart_operational'  => 'stpxFastStartPortMode', | ||||
|             'stpx_port_bpduguard_mode'    => 'stpxFastStartPortBpduGuardMode', | ||||
|             'stpx_port_bpdufilter_mode'   => 'stpxFastStartPortBpduFilterMode', | ||||
|             'stpx_smst_root'              => 'stpxSMSTInstanceCISTRegionalRoot', | ||||
| @@ -69,7 +72,7 @@ $VERSION = '3.36'; | ||||
|  | ||||
| %MUNGE   = ( | ||||
|             %SNMP::Info::Bridge::MUNGE, | ||||
|            'stpx_mst_config_digest'     => \&SNMP::Info::CiscoStpExtensions::oct2str, | ||||
|            'stpx_mst_config_digest'      => \&SNMP::Info::CiscoStpExtensions::oct2str, | ||||
|            ); | ||||
|  | ||||
|  | ||||
| @@ -225,6 +228,36 @@ sub i_bpdufilter_enabled { | ||||
|     return \%res; | ||||
| } | ||||
|  | ||||
| sub i_faststart_enabled { | ||||
|     my $self    = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $faststart_default = $self->stpx_faststart_default(); | ||||
|     my $bp_index          = $self->bp_index($partial); | ||||
|     my $faststart         = $self->stpx_faststart_enabled(); | ||||
|     my $faststart_oper    = $self->stpx_faststart_operational(); | ||||
|  | ||||
|     my %res; | ||||
|     # stpxFastStartPortEnable is deprecated in favour of stpxFastStartPortMode | ||||
|     # see https://github.com/netdisco/netdisco/issues/12 | ||||
|     foreach my $index ( keys %$faststart, keys %$faststart_oper ){ | ||||
|         my $mode = $faststart_oper->{$index} || $faststart->{$index}; | ||||
|         my $iid  = $bp_index->{$index}; | ||||
|         next unless defined $iid; | ||||
|         next unless defined $mode; | ||||
|         if ( $mode eq 'default' ){ | ||||
|             $res{$iid} =  $faststart_default; | ||||
|         }else{ | ||||
|             $res{$iid} = $mode; | ||||
|         } | ||||
|         $res{$iid} = 'enable'  if $res{$iid} eq 'true'; | ||||
|         $res{$iid} = 'disable' if $res{$iid} eq 'false'; | ||||
|         $res{$iid} = 1 if $res{$iid} =~ m/enable/i; # enableForTrunk | ||||
|         $res{$iid} = 0 if $res{$iid} eq 'disable'; | ||||
|     } | ||||
|     return \%res; | ||||
| } | ||||
|  | ||||
|  | ||||
| sub oct2str { | ||||
|     my ($v) = @_; | ||||
| @@ -340,6 +373,13 @@ Format is a hash reference with key = C<ifIndex>, value = [1|0] | ||||
|  | ||||
| (C<stpxFastStartBpduFilterEnable>) | ||||
|  | ||||
| =item $stpx->i_faststart_enabled() | ||||
|  | ||||
| Returns 1 or 0 depending on whether FastStart (aka PortFast) is enabled on a | ||||
| given port.  Format is a hash reference with key = C<ifIndex>, value = [1|0] | ||||
|  | ||||
| (C<stpxFastStartPortEnable> and C<stpxFastStartPortMode>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 MUNGES | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'CISCO-VTP-MIB'                       => 'vtpVlanName', | ||||
| @@ -61,7 +61,6 @@ $VERSION = '3.36'; | ||||
| %FUNCS = ( | ||||
|  | ||||
|     # CISCO-VTP-MIB::managementDomainTable | ||||
|     'vtp_d_index'     => 'managementDomainIndex', | ||||
|     'vtp_d_name'      => 'managementDomainName', | ||||
|     'vtp_d_mode'      => 'managementDomainLocalMode', | ||||
|     'vtp_d_rev'       => 'managementDomainConfigRevNumber', | ||||
| @@ -780,10 +779,6 @@ Each bit represents a VLAN.  This is 3072 through 4095 | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $vtp->vtp_d_index() | ||||
|  | ||||
| (C<managementDomainIndex>) | ||||
|  | ||||
| =item $vtp->vtp_d_name() | ||||
|  | ||||
| (C<managementDomainName>) | ||||
|   | ||||
| @@ -34,12 +34,12 @@ use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::LLDP::EXPORT_OK = qw//; | ||||
| @SNMP::Info::EDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::EDP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'EXTREME-EDP-MIB'   => 'extremeEdpPortIfIndex', | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' ); | ||||
|  | ||||
| @@ -109,6 +109,57 @@ sub e_port { | ||||
|     return \%e_port; | ||||
| } | ||||
|  | ||||
| sub entity_derived_serial { | ||||
|     my $entity  = shift; | ||||
|  | ||||
|     my $e_parent = $entity->e_parent() || {}; | ||||
|     my $e_class  = $entity->e_class() || {}; | ||||
|  | ||||
|     # Sort keys to return a consistent result between runs | ||||
|     foreach my $iid ( sort keys %$e_parent ) { | ||||
|         my $parent = $e_parent->{$iid}; | ||||
|         my $class = $e_class->{$iid} || ''; | ||||
|         # Only consider serial numbers for entries without a parent, or | ||||
|         # if they are of type "chassis" | ||||
|         if ( $parent eq '0' or $class eq 'chassis') { | ||||
|             my $serial = $entity->e_serial($iid); | ||||
|             if ( $serial && $serial->{$iid} ) { | ||||
|                 return $serial->{$iid}; | ||||
|             } | ||||
|             else { | ||||
|                 my $descr = $entity->e_descr($iid); | ||||
|                 if ( $descr and $descr->{$iid} =~ /serial#?:\s*([a-z0-9]+)/i ) | ||||
|                 { | ||||
|                     return $1; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub entity_derived_os_ver { | ||||
|     my $entity  = shift; | ||||
|  | ||||
|     my $e_parent = $entity->e_parent() || {}; | ||||
|     my $e_class  = $entity->e_class() || {}; | ||||
|  | ||||
|     # Sort keys to return a consistent result between runs | ||||
|     foreach my $iid ( sort keys %$e_parent ) { | ||||
|         my $parent = $e_parent->{$iid}; | ||||
|         my $class = $e_class->{$iid} || ''; | ||||
|         # Only consider serial numbers for entries without a parent, or | ||||
|         # if they are of type "chassis" | ||||
|         if ( $parent eq '0' or $class eq 'chassis') { | ||||
|             my $os_ver = $entity->e_swver($iid); | ||||
|             if ( $os_ver && $os_ver->{$iid} ) { | ||||
|                 return $os_ver->{$iid}; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
| @@ -173,6 +224,23 @@ none. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $entity->entity_derived_serial() | ||||
|  | ||||
| Tries to determine the device serial number from the F<ENTITY-MIB>. Only | ||||
| considers serial numbers for entries without a parent, or if they are of type | ||||
| chassis. Looks at C<entPhysicalSerialNum> and then C<entPhysicalDescr> for | ||||
| serial number. | ||||
|  | ||||
| =item $entity->entity_derived_os_ver() | ||||
|  | ||||
| Tries to determine the device OS version from the F<ENTITY-MIB>. Only | ||||
| considers serial numbers for entries without a parent, or if they are of type | ||||
| chassis. Looks at C<entPhysicalSoftwareRev> for the version. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Entity Table | ||||
|  | ||||
| =over | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( 'EtherLike-MIB' => 'etherMIB' ); | ||||
|  | ||||
| @@ -68,7 +68,6 @@ $VERSION = '3.36'; | ||||
|     'el_xmit_defer'      => 'dot3StatsDeferredTransmissions', | ||||
|  | ||||
|     # Ethernet-like Collision Statistics Group | ||||
|     'el_coll_count' => 'dot3CollCount', | ||||
|     'el_coll_freq'  => 'dot3CollFrequencies' | ||||
| ); | ||||
|  | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' ); | ||||
|  | ||||
| @@ -50,11 +50,9 @@ $VERSION = '3.36'; | ||||
|     'fdp_run'      => 'snFdpGlobalRun', | ||||
|     'fdp_interval' => 'snFdpGlobalMessageInterval', | ||||
|     'fdp_holdtime' => 'snFdpGlobalHoldTime', | ||||
|     'fdp_id'       => 'snFdpGlobalDeviceId', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     'fdp_index'        => 'snFdpCacheIfIndex', | ||||
|     'fdp_proto'        => 'snFdpCacheAddressType', | ||||
|     'fdp_ip'           => 'snFdpCacheAddress', | ||||
|     'fdp_ver'          => 'snFdpCacheVersion', | ||||
| @@ -62,9 +60,7 @@ $VERSION = '3.36'; | ||||
|     'fdp_port'         => 'snFdpCacheDevicePort', | ||||
|     'fdp_platform'     => 'snFdpCachePlatform', | ||||
|     'fdp_capabilities' => 'snFdpCacheCapabilities', | ||||
|     'fdp_domain'       => 'snFdpCacheVTPMgmtDomain', | ||||
|     'fdp_vlan'         => 'snFdpCacheNativeVLAN', | ||||
|     'fdp_duplex'       => 'snFdpCacheDuplex', | ||||
|     'fdp_cache_type'   => 'snFdpCacheVendorId', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
| @@ -84,9 +80,7 @@ sub fdp_run { | ||||
| sub hasFDP { | ||||
|     my $fdp = shift; | ||||
|  | ||||
|     my $ver = $fdp->{_version}; | ||||
|  | ||||
|     #my $ver = $fdp->fdp_ver; | ||||
|     my $ver = $fdp->snmp_ver(); | ||||
|  | ||||
|     # SNMP v1 clients dont have the globals | ||||
|     if ( defined $ver and $ver == 1 ) { | ||||
| @@ -103,11 +97,6 @@ sub hasFDP { | ||||
| sub fdp_if { | ||||
|     my $fdp = shift; | ||||
|  | ||||
|     # See if by some miracle Cisco implemented the fdpCacheIfIndex entry | ||||
|     my $fdp_index = $fdp->fdp_index(); | ||||
|     return $fdp_index if defined $fdp_index; | ||||
|  | ||||
|     # Nope, didn't think so. Now we fake it. | ||||
|     my $fdp_ip = $fdp->fdp_ip(); | ||||
|     unless ( defined $fdp_ip ) { | ||||
|         $fdp->error_throw( | ||||
| @@ -231,15 +220,6 @@ Time in seconds that FDP messages are kept. | ||||
|  | ||||
| (C<fdpGlobalHoldTime>) | ||||
|  | ||||
| =item  $fdp->fdp_id()  | ||||
|  | ||||
| Returns FDP device ID.   | ||||
|  | ||||
| This is the device id broadcast via FDP to other devices, and is what is | ||||
| retrieved from remote devices with $fdp->id(). | ||||
|  | ||||
| (C<fdpGlobalDeviceId>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
| @@ -323,19 +303,6 @@ Thanks to Martin Lorensen for a pointer to this information. | ||||
|  | ||||
| (C<fdpCacheCapabilities>) | ||||
|  | ||||
| =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->fdp_duplex()  | ||||
|  | ||||
| Returns the port duplex status from remote devices. | ||||
|  | ||||
| (C<fdpCacheDuplex>) | ||||
|  | ||||
| =item $fdp->fdp_id() | ||||
|  | ||||
| Returns remote device id string | ||||
| @@ -346,19 +313,11 @@ Returns remote device id string | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table. | ||||
|  | ||||
| Note that a lot devices don't implement $fdp->fdp_index(),  So if it isn't | ||||
| around, we fake it.  | ||||
|  | ||||
| In order to map the fdp table entry back to the interfaces() entry, we | ||||
| truncate the last number off of it : | ||||
|  | ||||
|   # it exists, yay. | ||||
|   my $fdp_index     = $device->fdp_index(); | ||||
|   return $fdp_index if defined $fdp_index; | ||||
|  | ||||
|   # if not, let's fake it | ||||
|   my $fdp_ip       = $device->fdp_ip(); | ||||
|      | ||||
|  | ||||
|   my %fdp_if | ||||
|   foreach my $key (keys %$fdp_ip){ | ||||
|       $iid = $key; | ||||
| @@ -366,21 +325,9 @@ truncate the last number off of it : | ||||
|       $iid =~ s/\.\d+$//; | ||||
|       $fdp_if{$key} = $iid; | ||||
|   } | ||||
|   | ||||
|  | ||||
|   return \%fdp_if; | ||||
|  | ||||
|  | ||||
| =item $fdp->fdp_index() | ||||
|  | ||||
| Returns the mapping to the SNMP2 Interface table for FDP Cache Entries.  | ||||
|  | ||||
| Most devices don't implement this, so you probably want to use $fdp->fdp_if() | ||||
| instead. | ||||
|  | ||||
| See fdp_if() entry. | ||||
|  | ||||
| (C<fdpCacheIfIndex>) | ||||
|  | ||||
| =item  $fdp->fdp_ip() | ||||
|  | ||||
| Returns remote IP address | ||||
| @@ -411,11 +358,11 @@ Returns remote hardware version | ||||
|  | ||||
| (C<fdpCacheVersion>) | ||||
|  | ||||
| =item $fdp->fdp_vlan() | ||||
| =item $fdp->fdp_cache_type()  | ||||
|  | ||||
| Returns the remote interface native VLAN. | ||||
| Returns type of entry received, either FDP or CDP. | ||||
|  | ||||
| (C<fdpCacheNativeVLAN>) | ||||
| (C<snFdpCacheVendorId>) | ||||
|  | ||||
| =back | ||||
|  | ||||
|   | ||||
| @@ -32,13 +32,14 @@ package SNMP::Info::IEEE802dot11; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::IEEE802dot11::ISA       = qw/Exporter/; | ||||
| @SNMP::Info::IEEE802dot11::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::IEEE802dot11::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', ); | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| # SNMP::Info::IEEE802dot3ad | ||||
| # | ||||
| # Copyright (c) 2014 SNMP::Info Developers | ||||
| # Copyright (c) 2018 SNMP::Info Developers | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info::Aggregate; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|   %SNMP::Info::Aggregate::MIBS, | ||||
| @@ -52,29 +52,40 @@ $VERSION = '3.36'; | ||||
|  | ||||
| %GLOBALS = (); | ||||
|  | ||||
| %FUNCS = (); | ||||
| %FUNCS = ( | ||||
|   'ad_lag_ports'    => 'dot3adAggPortListPorts', | ||||
|  ); | ||||
|  | ||||
| %MUNGE = (); | ||||
| %MUNGE = ( | ||||
|   'ad_lag_ports' => \&SNMP::Info::munge_port_list, | ||||
|  ); | ||||
|  | ||||
| sub agg_ports_lag { | ||||
|   my $dev = shift; | ||||
|  | ||||
|   # TODO: implement partial | ||||
|   my $masters = $dev->dot3adAggActorOperKey; | ||||
|   my $slaves  = $dev->dot3adAggPortActorOperKey; | ||||
|   my $ports  = $dev->ad_lag_ports(); | ||||
|   my $index  = $dev->bp_index() || {}; | ||||
|  | ||||
|   return {} unless | ||||
|     ref {} eq ref $masters and scalar keys %$masters | ||||
|     and ref {} eq ref $slaves and scalar keys %$slaves; | ||||
|   return {} unless ref {} eq ref $ports and scalar keys %$ports; | ||||
|  | ||||
|   my $ret = {}; | ||||
|   foreach my $s (keys %$slaves) { | ||||
|       next if $slaves->{$s} == 0; | ||||
|       foreach my $m (keys %$masters) { | ||||
|           next unless $masters->{$m} == $slaves->{$s}; | ||||
|           $ret->{$s} = $m; | ||||
|           last; | ||||
|   foreach my $m ( keys %$ports ) { | ||||
|     my $idx = $m; | ||||
|     my $portlist = $ports->{$m}; | ||||
|     next unless $portlist; | ||||
|  | ||||
|     # While dot3adAggTable is indexed by ifIndex, the portlist is indexed | ||||
|     # with a dot1dBasePort, so we need to use dot1dBasePortIfIndex to map to | ||||
|     # the ifIndex. If we don't have dot1dBasePortIfIndex assume | ||||
|     # dot1dBasePort = ifIndex | ||||
|     for ( my $i = 0; $i <= scalar(@$portlist); $i++ ) { | ||||
|       my $ifindex = $i+1; | ||||
|       if ( exists($index->{$i+1}) and defined($index->{$i+1}) ) { | ||||
|         $ifindex = $index->{$i+1};        | ||||
|       } | ||||
|       $ret->{$ifindex} = $idx if ( @$portlist[$i] ); | ||||
|     }    | ||||
|   } | ||||
|  | ||||
|   return $ret; | ||||
|   | ||||
| @@ -44,7 +44,7 @@ use constant { | ||||
|     IPV6MIB => 3, | ||||
| }; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -67,20 +67,24 @@ $VERSION = '3.36'; | ||||
|  | ||||
|     'ip_n2p_phys_state' => 'ipNetToPhysicalState',          # IP-MIB | ||||
|     'c_inet_phys_state' => 'cInetNetToMediaState',          # CISCO-IETF-IP-MIB | ||||
|     'i6_n2p_phys_state' => 'ipv6NetToMediaState',           # IPV6-MIB | ||||
|     'i6_n2p_phys_state' => 'ipv6IfNetToMediaState',         # IPV6-MIB | ||||
|  | ||||
|     'ip_pfx_origin'     => 'ipAddressPrefixOrigin',         # IP-MIB | ||||
|     'c_pfx_origin'      => 'cIpAddressPfxOrigin',           # CISCO-IETF-IP-MIB  | ||||
|  | ||||
|     'ip_addr6_pfx'      => 'ipAddressPrefix',               # IP-MIB  | ||||
|     'ip_addr6_pfx'      => 'ipAddressPrefix',               # IP-MIB | ||||
|     'c_addr6_pfx'       => 'cIpAddressPrefix',              # CISCO-IETF-IP-MIB  | ||||
|  | ||||
|     # Commented out are not-accessible according to MIB | ||||
|     #'ip_addr6_pfxlen'   => 'ipAddressPrefixLength',        # IP-MIB | ||||
|     #'c_addr6_pfxlen'    => 'cIpAddressPfxLength',          # CISCO-IETF-IP-MIB | ||||
|     'i6_addr_pfxlen'    => 'ipv6AddrPfxLength',             # IPV6-MIB | ||||
|  | ||||
|     'ip_addr6_index'    => 'ipAddressIfIndex',              # IP-MIB | ||||
|     'c_addr6_index'     => 'cIpAddressIfIndex',             # CISCO-IETF-IP-MIB  | ||||
|  | ||||
|     'ip_addr6_type'     => 'ipAddressType',                 # IP-MIB | ||||
|     'c_addr6_type'      => 'cIpAddressType',                # CISCO-IETF-IP-MIB | ||||
|      | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
| @@ -329,6 +333,33 @@ sub ipv6_addr_prefix { | ||||
|     return $return; | ||||
| } | ||||
|  | ||||
| sub ipv6_addr_prefixlength { | ||||
|     my $info = shift; | ||||
|     my $return; | ||||
|     my $ipv6_addr_prefix = &_test_methods( $info, { | ||||
|         ip_addr6_pfx  => IPMIB, | ||||
|         c_addr6_pfx   => CISCO, | ||||
|     }); | ||||
|     return unless defined $ipv6_addr_prefix; | ||||
|     foreach my $row (keys %$ipv6_addr_prefix) { | ||||
|         if ($row =~ /^(\d+)\.[\d\.]+$/) { | ||||
|             my $type = $1; | ||||
|             if (($type == 2) or ($type == 4)) { # IPv6 | ||||
|                 # Remove interface specific part from vrf interfaces | ||||
|                 if ($row =~ /^((\d+\.){17}\d+)/) { $row = $1 } | ||||
|                 # Remove the OID part from the value | ||||
|                 my $val = $ipv6_addr_prefix->{$row}; | ||||
|                 if ( $val =~ /^.+?((?:\d+\.){19}(\d+))$/ ) { | ||||
|                     $val = $2; | ||||
|                     $return->{$row} = $val; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug(); | ||||
|     return $return; | ||||
| } | ||||
|  | ||||
| sub ipv6_addr { | ||||
|     my $info = shift; | ||||
|     my $return; | ||||
| @@ -355,6 +386,7 @@ sub ipv6_addr { | ||||
| sub _method_used { | ||||
|     my $info = shift; | ||||
|     my $return = 'none of the MIBs'; | ||||
|     # FIXME ugh! a global. makes order of calls important for debug. | ||||
|     if (defined $info::METHOD) { | ||||
|         if ($info::METHOD eq IPMIB) { | ||||
|             $return = 'IP-MIB'; | ||||
| @@ -374,6 +406,7 @@ sub _test_methods { | ||||
|     foreach my $method (sort {$test->{$a} <=> $test->{$b}} keys %$test) { | ||||
|         $return = $info->$method || {}; | ||||
|         if (scalar keys %$return) { | ||||
|             # FIXME ugh! a global. makes order of calls important for debug. | ||||
|             $info::METHOD = $test->{$method}; | ||||
|             last; | ||||
|         } | ||||
| @@ -490,6 +523,10 @@ Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.) | ||||
|  | ||||
| Maps IPv6 addresses with their prefixes | ||||
|  | ||||
| =item $info->ipv6_addr_prefixlength() | ||||
|  | ||||
| Maps IPv6 addresses with their prefix length | ||||
|  | ||||
| =item $info->ipv6_addr() | ||||
|  | ||||
| Maps a table instance to an IPv6 address | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'LLDP-MIB'          => 'lldpLocSysCapEnabled', | ||||
| @@ -70,6 +70,18 @@ $VERSION = '3.36'; | ||||
|     'lldp_rem_sys_cap'  => 'lldpRemSysCapEnabled', | ||||
|     'lldp_rem_cap_spt'  => 'lldpRemSysCapSupported', | ||||
|  | ||||
|     # LLDP-MIB::lldpXMedRemInventoryTable | ||||
|     'lldp_rem_hw_rev' => 'lldpXMedRemHardwareRev', | ||||
|     'lldp_rem_fw_rev' => 'lldpXMedRemFirmwareRev', | ||||
|     'lldp_rem_sw_rev' => 'lldpXMedRemSoftwareRev', | ||||
|     'lldp_rem_serial' => 'lldpXMedRemSerialNum', | ||||
|     'lldp_rem_vendor' => 'lldpXMedRemMfgName', | ||||
|     'lldp_rem_model'  => 'lldpXMedRemModelName', | ||||
|     'lldp_rem_asset'  => 'lldpXMedRemAssetID', | ||||
|  | ||||
|     'lldp_rem_media_cap'     => 'lldpXMedRemCapCurrent', | ||||
|     'lldp_rem_media_cap_spt' => 'lldpXMedRemCapSupported', | ||||
|  | ||||
|     # LLDP-MIB::lldpRemManAddrTable | ||||
|     'lldp_rman_addr' => 'lldpRemManAddrIfSubtype', | ||||
| ); | ||||
| @@ -83,6 +95,17 @@ $VERSION = '3.36'; | ||||
|     'lldp_sys_cap'       => \&SNMP::Info::munge_bits, | ||||
|     'lldp_rem_sys_cap'   => \&SNMP::Info::munge_bits, | ||||
|     'lldp_rem_cap_spt'   => \&SNMP::Info::munge_bits, | ||||
|  | ||||
|     'lldp_rem_hw_rev' => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_fw_rev' => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_sw_rev' => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_serial' => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_vendor' => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_model'  => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_asset'  => \&SNMP::Info::munge_null, | ||||
|  | ||||
|     'lldp_rem_media_cap'     => \&SNMP::Info::munge_bits, | ||||
|     'lldp_rem_media_cap_spt' => \&SNMP::Info::munge_bits, | ||||
| ); | ||||
|  | ||||
| sub hasLLDP { | ||||
| @@ -324,6 +347,39 @@ sub lldp_cap { | ||||
|     return \%lldp_cap; | ||||
| } | ||||
|  | ||||
| sub lldp_media_cap { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $lldp_caps = $lldp->lldp_rem_media_cap_spt($partial) || {}; | ||||
|  | ||||
|     # Encoded as BITS which Perl Net-SNMP implementation doesn't seem to | ||||
|     # be able to enumerate for us, so we have to get it from the MIB | ||||
|     # and enumerate ourselves | ||||
|     my $oid = SNMP::translateObj( 'lldpXMedRemCapCurrent', 0, 1 ) || ''; | ||||
|     my $enums = ( | ||||
|         ( ref {} eq ref $SNMP::MIB{$oid}{'enums'} ) | ||||
|         ? $SNMP::MIB{$oid}{'enums'} | ||||
|         : {} | ||||
|     ); | ||||
|     my %r_enums = reverse %$enums; | ||||
|  | ||||
|     my %lldp_cap; | ||||
|     foreach my $key ( keys %$lldp_caps ) { | ||||
|         my $cap_bits = $lldp_caps->{$key}; | ||||
|         next unless $cap_bits; | ||||
|  | ||||
|         my $count = 0; | ||||
|         foreach my $bit ( split //, $cap_bits ) { | ||||
|             if ($bit) { | ||||
|                 push( @{ $lldp_cap{$key} }, $r_enums{$count} ); | ||||
|             } | ||||
|             $count++; | ||||
|         } | ||||
|     } | ||||
|     return \%lldp_cap; | ||||
| } | ||||
|  | ||||
| #sub root_ip { | ||||
| #    my $lldp = shift; | ||||
| # | ||||
| @@ -570,6 +626,12 @@ Returns hash of arrays with each array containing the system capabilities | ||||
| supported by the remote system.  Possible elements in the array are | ||||
| enumerated from C<LldpSystemCapabilitiesMap>. | ||||
|  | ||||
| =item  $lldp->lldp_media_cap()  | ||||
|  | ||||
| Returns hash of arrays with each array containing the media capabilities | ||||
| supported by the remote system.  Possible elements in the array are | ||||
| enumerated from C<LldpXMedCapabilities>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 LLDP Remote Table (C<lldpRemTable>) | ||||
| @@ -631,6 +693,65 @@ Nulls are removed before the value is returned. | ||||
|  | ||||
| (C<lldpRemSysDesc>) | ||||
|  | ||||
| =item $lldp->lldp_rem_hw_rev() | ||||
|  | ||||
| Returns the string value used to identify the hardware revision of the | ||||
| remote system. Nulls are removed before the value is returned.  | ||||
|  | ||||
| (C<lldpXMedRemHardwareRev>) | ||||
|  | ||||
| =item $lldp->lldp_rem_fw_rev() | ||||
|  | ||||
| Returns the string value used to identify the firmware revision of the | ||||
| remote system. Nulls are removed before the value is returned.  | ||||
|  | ||||
| (C<lldpXMedRemHardwareRev>) | ||||
|  | ||||
| =item $lldp->lldp_rem_sw_rev() | ||||
|  | ||||
| Returns the string value used to identify the software revision of the | ||||
| remote system. Nulls are removed before the value is returned.  | ||||
|  | ||||
| (C<lldpXMedRemSoftwareRev>) | ||||
|  | ||||
| =item $lldp->lldp_rem_serial() | ||||
|  | ||||
| Returns the string value used to identify the serial number of the | ||||
| remote system. Nulls are removed before the value is returned.  | ||||
|  | ||||
| (C<lldpXMedRemSerialNum>) | ||||
|  | ||||
| =item $lldp->lldp_rem_vendor() | ||||
|  | ||||
| Returns the string value used to identify the manufacturer of the | ||||
| remote system. Nulls are removed before the value is returned.  | ||||
|  | ||||
| (C<lldpXMedRemMfgName>) | ||||
|  | ||||
| =item $lldp->lldp_rem_asset() | ||||
|  | ||||
| Returns the string value used to identify the asset number of the | ||||
| remote system. Nulls are removed before the value is returned.  | ||||
|  | ||||
| (C<lldpXMedRemAssetID>) | ||||
|  | ||||
| =item $lldp->lldp_rem_model() | ||||
|  | ||||
| Returns the string value used to identify the model of the | ||||
| remote system. Nulls are removed before the value is returned.  | ||||
|  | ||||
| (C<lldpXMedRemModelName>) | ||||
|  | ||||
| =item  $lldp->lldp_rem_media_cap_spt()  | ||||
|  | ||||
| Returns which media capabilities are supported on the remote system. Results | ||||
| are munged into an ascii binary string, LSB. | ||||
|  | ||||
| =item  $lldp->lldp_rem_media_cap()  | ||||
|  | ||||
| Returns which media capabilities are enabled on the remote system. Results | ||||
| are munged into an ascii binary string, LSB. | ||||
|  | ||||
| =item  $lldp->lldp_rem_sys_cap()  | ||||
|  | ||||
| Returns which system capabilities are enabled on the remote system.  Results | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' ); | ||||
|  | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::Layer1; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', ); | ||||
| @@ -71,6 +71,7 @@ sub os_ver { | ||||
|     if ( $descr =~ m/version (\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::Layer1; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, ); | ||||
| @@ -84,6 +84,7 @@ sub os_ver { | ||||
|     if ( $descr =~ /software v(\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
| @@ -94,7 +95,7 @@ sub model { | ||||
|     my $asante = shift; | ||||
|  | ||||
|     my $id    = $asante->id(); | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|     my $model = SNMP::translateObj($id); | ||||
|  | ||||
|     return $model; | ||||
| } | ||||
| @@ -108,8 +109,8 @@ sub i_up { | ||||
|     my $i_up = {}; | ||||
|     foreach my $port ( keys %$asante_up ) { | ||||
|         my $up = $asante_up->{$port}; | ||||
|         $i_up->{$port} = 'down' if $up =~ /on/; | ||||
|         $i_up->{$port} = 'up'   if $up =~ /off/; | ||||
|         $i_up->{$port} = 'down' if $up =~ /off/; | ||||
|         $i_up->{$port} = 'up'   if $up =~ /on/; | ||||
|     } | ||||
|  | ||||
|     return $i_up; | ||||
| @@ -149,7 +150,7 @@ sub i_name { | ||||
|     my $asante  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $i_name = $asante->orig_i_descr($partial) || {}; | ||||
|     my $i_name = $asante->orig_i_description($partial) || {}; | ||||
|  | ||||
|     my %i_name; | ||||
|  | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| # SNMP::Info::Layer1::Cyclades | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # Copyright (c) 2018 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| @@ -39,38 +39,105 @@ use SNMP::Info::Layer1; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer1::MIBS, | ||||
|     'CYCLADES-ACS-SYS-MIB'  => 'cyACSversion', | ||||
|     'CYCLADES-ACS-CONF-MIB' => 'cyEthIPaddr', | ||||
|     'CYCLADES-ACS-INFO-MIB' => 'cyISPortTty', | ||||
|     'CYCLADES-ACS-SYS-MIB'    => 'cyACSversion', | ||||
|     'CYCLADES-ACS5K-SYS-MIB'  => 'cyACS5Kversion', | ||||
|     'CYCLADES-ACS-CONF-MIB'   => 'cyACSConf', | ||||
|     'CYCLADES-ACS5K-CONF-MIB' => 'cyACS5KConf', | ||||
|     'CYCLADES-ACS-INFO-MIB'   => 'cyACSInfo', | ||||
|     'CYCLADES-ACS5K-INFO-MIB' => 'cyACS5KInfo', | ||||
|     'ACS-MIB'                 => 'acs6016', | ||||
|     'ACS8000-MIB'             => 'acs8048', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|  | ||||
|     # CYCLADES-ACS-SYS-MIB | ||||
|     %SNMP::Info::Layer1::GLOBALS, | ||||
|     'os_ver'     => 'cyACSversion', | ||||
|     'cy_model'   => 'cyACSpname', | ||||
|     'serial'     => 'cyACSDevId', | ||||
|     'root_ip'    => 'cyEthIPaddr', | ||||
|     'ps1_status' => 'cyACSPw1', | ||||
|     'ps2_status' => 'cyACSPw2', | ||||
|  | ||||
|     # CYCLADES-ACS-SYS-MIB | ||||
|     'cy_os_ver'     => 'cyACSversion', | ||||
|     'cy_model'      => 'cyACSpname', | ||||
|     'cy_serial'     => 'cyACSDevId', | ||||
|     'cy_ps1_status' => 'cyACSPw1', | ||||
|     'cy_ps2_status' => 'cyACSPw2', | ||||
|  | ||||
|     # CYCLADES-ACS-CONF-MIB | ||||
|     'cy_root_ip' => 'CYCLADES_ACS_CONF_MIB__cyEthIPaddr', | ||||
|  | ||||
|     # CYCLADES-ACS5K-SYS-MIB | ||||
|     'cy5k_os_ver'     => 'cyACS5Kversion', | ||||
|     'cy5k_model'      => 'cyACS5Kpname', | ||||
|     'cy5k_serial'     => 'cyACS5KDevId', | ||||
|     'cy5k_ps1_status' => 'cyACS5KPw1', | ||||
|     'cy5k_ps2_status' => 'cyACS5KPw2', | ||||
|  | ||||
|     # CYCLADES-ACS5K-CONF-MIB | ||||
|     'cy5k_root_ip'   => 'CYCLADES_ACS5K_CONF_MIB__cyEthIPaddr', | ||||
|  | ||||
|     # ACS-MIB | ||||
|     'acs_os_ver'     => 'ACS_MIB__acsFirmwareVersion', | ||||
|     'acs_model'      => 'ACS_MIB__acsProductModel', | ||||
|     'acs_serial'     => 'ACS_MIB__acsSerialNumber', | ||||
|     'acs_ps1_status' => 'ACS_MIB__acsPowerSupplyStatePw1', | ||||
|     'acs_ps2_status' => 'ACS_MIB__acsPowerSupplyStatePw2', | ||||
|  | ||||
|     # ACS8000-MIB | ||||
|     'acs8k_os_ver'     => 'ACS8000_MIB__acsFirmwareVersion', | ||||
|     'acs8k_model'      => 'ACS8000_MIB__acsProductModel', | ||||
|     'acs8k_serial'     => 'ACS8000_MIB__acsSerialNumber', | ||||
|     'acs8k_ps1_status' => 'ACS8000_MIB__acsPowerSupplyStatePw1', | ||||
|     'acs8k_ps2_status' => 'ACS8000_MIB__acsPowerSupplyStatePw2', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer1::FUNCS, | ||||
|  | ||||
|     # CYCLADES-ACS-INFO-MIB::cyInfoSerialTable | ||||
|     'cy_port_tty'   => 'cyISPortTty', | ||||
|     'cy_port_name'  => 'cyISPortName', | ||||
|     'cy_port_speed' => 'cyISPortSpeed', | ||||
|     'cy_port_cd'    => 'cyISPortSigCD', | ||||
|     'cy_port_tty'   => 'CYCLADES_ACS_INFO_MIB__cyISPortTty', | ||||
|     'cy_port_name'  => 'CYCLADES_ACS_INFO_MIB__cyISPortName', | ||||
|     'cy_port_speed' => 'CYCLADES_ACS_INFO_MIB__cyISPortSpeed', | ||||
|     'cy_port_cd'    => 'CYCLADES_ACS_INFO_MIB__cyISPortSigCD', | ||||
|  | ||||
|     # CYCLADES-ACS-CONF-MIB::cySerialPortTable | ||||
|     'cy_port_socket' => 'cySPortSocketPort', | ||||
|     'cy_port_socket' => 'CYCLADES_ACS_CONF_MIB__cySPortSocketPort', | ||||
|  | ||||
|     # CYCLADES-ACS5K-INFO-MIB::cyInfoSerialTable | ||||
|     'cy5k_port_tty'   => 'CYCLADES_ACS5K_INFO_MIB__cyISPortTty', | ||||
|     'cy5k_port_name'  => 'CYCLADES_ACS5K_INFO_MIB__cyISPortName', | ||||
|     'cy5k_port_speed' => 'CYCLADES_ACS5K_INFO_MIB__cyISPortSpeed', | ||||
|     'cy5k_port_cd'    => 'CYCLADES_ACS5K_INFO_MIB__cyISPortSigCD', | ||||
|  | ||||
|     # CYCLADES-ACS5K-CONF-MIB::cySerialPortTable | ||||
|     'cy5k_port_socket' => 'CYCLADES_ACS5K_CONF_MIB__cySPortSocketPort', | ||||
|  | ||||
|     # ACS-MIB::acsSerialPortTable | ||||
|     'acs_port_tty'   => 'ACS_MIB__acsSerialPortTableDeviceName', | ||||
|     'acs_port_name'  => 'ACS_MIB__acsSerialPortTableName', | ||||
|     'acs_port_speed' => 'ACS_MIB__acsSerialPortTableComSpeed', | ||||
|     'acs_port_cd'    => 'ACS_MIB__acsSerialPortTableSignalStateDCD', | ||||
|  | ||||
|     # Equivalent to cySPortSocketPort doesn't exist in ACS-MIB | ||||
|     # Use 'acsSerialPortTableDeviceName' as an equivalent, it just needs | ||||
|     # to be unique so that we can differentiate between the index in the | ||||
|     # acsSerialPortTable from ifIndex which are both integers | ||||
|     # ACS-MIB::acsSerialPortTableEntry | ||||
|     'acs_port_socket' => 'ACS_MIB__acsSerialPortTableDeviceName', | ||||
|  | ||||
|     # ACS8000-MIB::acsSerialPortTable | ||||
|     'acs8k_port_tty'   => 'ACS8000_MIB__acsSerialPortTableDeviceName', | ||||
|     'acs8k_port_name'  => 'ACS8000_MIB__acsSerialPortTableName', | ||||
|     'acs8k_port_speed' => 'ACS8000_MIB__acsSerialPortTableComSpeed', | ||||
|     'acs8k_port_cd'    => 'ACS8000_MIB__acsSerialPortTableSignalStateDCD', | ||||
|  | ||||
|     # Equivalent to cySPortSocketPort doesn't exist in ACS-MIB | ||||
|     # Use 'acsSerialPortTableDeviceName' as an equivalent, it just needs | ||||
|     # to be unique so that we can differentiate between the index in the | ||||
|     # acsSerialPortTable from ifIndex which are both integers | ||||
|     # ACS8000-MIB::acsSerialPortTableEntry | ||||
|     'acs8k_port_socket' => 'ACS8000_MIB__acsSerialPortTableDeviceName', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer1::MUNGE, ); | ||||
| @@ -82,21 +149,85 @@ sub layers { | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'cyclades'; | ||||
|     return 'avocent'; | ||||
| } | ||||
|  | ||||
| # Use "short circuit" to return the first MIB instance that returns data to | ||||
| # reduce network communications | ||||
| # We'll try newest (acs*) first assuming those are most likely deployed | ||||
| sub os_ver { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     return | ||||
|            $cyclades->acs_os_ver() | ||||
|         || $cyclades->acs8k_os_ver() | ||||
|         || $cyclades->cy5k_os_ver() | ||||
|         || $cyclades->cy_os_ver() | ||||
|         || undef; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'cyclades'; | ||||
|     return 'vertiv'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     my $model = $cyclades->cy_model(); | ||||
|     my $model | ||||
|         = $cyclades->acs_model() | ||||
|         || $cyclades->acs8k_model() | ||||
|         || $cyclades->cy5k_model() | ||||
|         || $cyclades->cy_model() | ||||
|         || undef; | ||||
|  | ||||
|     return unless defined $model; | ||||
|     return lc($model) if ( defined $model ); | ||||
|  | ||||
|     return lc($model); | ||||
|     my $id   = $cyclades->id(); | ||||
|     my $prod = SNMP::translateObj($id); | ||||
|  | ||||
|     return $prod || $id; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     return | ||||
|            $cyclades->acs_serial() | ||||
|         || $cyclades->acs8k_serial() | ||||
|         || $cyclades->cy5k_serial() | ||||
|         || $cyclades->cy_serial() | ||||
|         || undef; | ||||
| } | ||||
|  | ||||
| sub root_ip { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     return | ||||
|            $cyclades->cy5k_root_ip() | ||||
|         || $cyclades->cy_root_ip() | ||||
|         || undef; | ||||
| } | ||||
|  | ||||
| sub ps1_status { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     return | ||||
|            $cyclades->acs_ps1_status() | ||||
|         || $cyclades->acs8k_ps1_status() | ||||
|         || $cyclades->cy5k_ps1_status() | ||||
|         || $cyclades->cy_ps1_status() | ||||
|         || undef; | ||||
| } | ||||
|  | ||||
| sub ps2_status { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     return | ||||
|            $cyclades->acs_ps2_status() | ||||
|         || $cyclades->acs8k_ps2_status() | ||||
|         || $cyclades->cy5k_ps2_status() | ||||
|         || $cyclades->cy_ps2_status() | ||||
|         || undef; | ||||
| } | ||||
|  | ||||
| # Extend interface methods to include serial ports | ||||
| @@ -109,7 +240,12 @@ sub i_index { | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $orig_index = $cyclades->orig_i_index($partial) || {}; | ||||
|     my $cy_index   = $cyclades->cy_port_socket()       || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|  | ||||
|     my %i_index; | ||||
|     foreach my $iid ( keys %$orig_index ) { | ||||
| @@ -136,9 +272,19 @@ sub interfaces { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_descr  = $cyclades->orig_i_description($partial) || {}; | ||||
|     my $cy_index = $cyclades->cy_port_socket()             || {}; | ||||
|     my $cy_p_tty = $cyclades->cy_port_tty()                || {}; | ||||
|     my $i_descr = $cyclades->orig_i_description($partial) || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|     my $cy_p_tty | ||||
|         = $cyclades->acs_port_tty() | ||||
|         || $cyclades->acs8k_port_tty() | ||||
|         || $cyclades->cy5k_port_tty() | ||||
|         || $cyclades->cy_port_tty() | ||||
|         || {}; | ||||
|  | ||||
|     my %if; | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
| @@ -166,8 +312,18 @@ sub i_speed { | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_speed    = $cyclades->orig_i_speed($partial) || {}; | ||||
|     my $cy_index   = $cyclades->cy_port_socket()       || {}; | ||||
|     my $cy_p_speed = $cyclades->cy_port_speed()        || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|     my $cy_p_speed | ||||
|         = $cyclades->acs_port_speed() | ||||
|         || $cyclades->acs8k_port_speed() | ||||
|         || $cyclades->cy5k_port_speed() | ||||
|         || $cyclades->cy_port_speed() | ||||
|         || {}; | ||||
|  | ||||
|     my %i_speed; | ||||
|     foreach my $iid ( keys %$i_speed ) { | ||||
| @@ -195,8 +351,18 @@ sub i_up { | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_up     = $cyclades->orig_i_up($partial) || {}; | ||||
|     my $cy_index = $cyclades->cy_port_socket()    || {}; | ||||
|     my $cy_p_up  = $cyclades->cy_port_cd()        || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|     my $cy_p_up | ||||
|         = $cyclades->acs_port_cd() | ||||
|         || $cyclades->acs8k_port_cd() | ||||
|         || $cyclades->cy5k_port_cd() | ||||
|         || $cyclades->cy_port_cd() | ||||
|         || {}; | ||||
|  | ||||
|     my %i_up; | ||||
|     foreach my $iid ( keys %$i_up ) { | ||||
| @@ -224,8 +390,18 @@ sub i_description { | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_desc    = $cyclades->orig_i_description($partial) || {}; | ||||
|     my $cy_index  = $cyclades->cy_port_socket()             || {}; | ||||
|     my $cy_p_desc = $cyclades->cy_port_name()               || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|     my $cy_p_desc | ||||
|         = $cyclades->acs_port_name() | ||||
|         || $cyclades->acs8k_port_name() | ||||
|         || $cyclades->cy5k_port_name() | ||||
|         || $cyclades->cy_port_name() | ||||
|         || {}; | ||||
|  | ||||
|     my %descr; | ||||
|     foreach my $iid ( keys %$i_desc ) { | ||||
| @@ -253,8 +429,18 @@ sub i_name { | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_name    = $cyclades->orig_i_name($partial) || {}; | ||||
|     my $cy_index  = $cyclades->cy_port_socket()      || {}; | ||||
|     my $cy_p_desc = $cyclades->cy_port_name()        || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|     my $cy_p_desc | ||||
|         = $cyclades->acs_port_name() | ||||
|         || $cyclades->acs8k_port_name() | ||||
|         || $cyclades->cy5k_port_name() | ||||
|         || $cyclades->cy_port_name() | ||||
|         || {}; | ||||
|  | ||||
|     my %i_name; | ||||
|     foreach my $iid ( keys %$i_name ) { | ||||
| @@ -282,7 +468,8 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer1::Cyclades - SNMP Interface to Cyclades terminal servers | ||||
| SNMP::Info::Layer1::Cyclades - SNMP Interface to Cyclades/Avocent terminal | ||||
| servers | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -309,7 +496,7 @@ Eric Miller | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Cyclades device through SNMP. | ||||
| Cyclades/Avocent 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.  | ||||
| @@ -334,6 +521,14 @@ my $cyclades = new SNMP::Info::Layer1::Cyclades(...); | ||||
|  | ||||
| =item F<CYCLADES-ACS-INFO-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS5K-SYS-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS5K-CONF-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS5K-INFO-MIB> | ||||
|  | ||||
| =item F<ACS6000-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
| @@ -348,11 +543,11 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $cyclades->os_ver() | ||||
|  | ||||
| (C<cyACSversion>) | ||||
| (C<acsFirmwareVersion>), (C<cyACS5Kversion>), or (C<cyACSversion>) | ||||
|  | ||||
| =item $cyclades->serial() | ||||
|  | ||||
| (C<cyACSDevId>) | ||||
| (C<acsSerialNumber>), (C<cyACS5KDevId>), or (C<cyACSDevId>) | ||||
|  | ||||
| =item $cyclades->root_ip() | ||||
|  | ||||
| @@ -360,11 +555,11 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $cyclades->ps1_status() | ||||
|  | ||||
| (C<cyACSPw1>) | ||||
| (C<acsPowerSupplyStatePw1>), (C<cyACS5KPw1>), or (C<cyACSPw1>) | ||||
|  | ||||
| =item $cyclades->ps2_status() | ||||
|  | ||||
| (C<cyACSPw2>) | ||||
| (C<acsPowerSupplyStatePw2>), (C<cyACS5KPw2>), or (C<cyACSPw2>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -379,15 +574,16 @@ to poll for an ARP cache so turn off reported Layer 2 and Layer 3. | ||||
|  | ||||
| =item $cyclades->vendor() | ||||
|  | ||||
| Returns 'cyclades' | ||||
| Returns 'vertiv' | ||||
|  | ||||
| =item $cyclades->os() | ||||
|  | ||||
| Returns 'cyclades' | ||||
| Returns 'avocent' | ||||
|  | ||||
| =item $cyclades->model() | ||||
|  | ||||
| Returns lower case (C<cyACSpname>) | ||||
| Returns lower case (C<cyACSpname>) or (C<acsProductModel>) if it exists | ||||
| otherwise tries to reference $cyclades->id() to one of the MIBs listed above | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -409,31 +605,34 @@ to a hash. | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
|  | ||||
| Extended to include serial ports.  Serial ports are indexed with the | ||||
| alternative labeling system for the serial port, the listening socket port | ||||
| C<cySPortSocketPort> to avoid conflicts with C<ifIndex>.   | ||||
| alternative labeling system for the serial port, either the listening socket | ||||
| port C<cySPortSocketPort> or C<acsSerialPortTableDeviceName> name to avoid | ||||
| conflicts with C<ifIndex>.   | ||||
|  | ||||
| =item $cyclades->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to physical ports.  Extended to include | ||||
| serial ports, C<cyISPortTty>. | ||||
| serial ports, C<acsSerialPortTableDeviceName> or C<cyISPortTty>. | ||||
|  | ||||
| =item $cyclades->i_speed() | ||||
|  | ||||
| Returns interface speed.  Extended to include serial ports, C<cyISPortSpeed>.  | ||||
| Returns interface speed.  Extended to include serial ports, | ||||
| C<acsSerialPortTableComSpeed> or C<cyISPortSpeed>.  | ||||
|  | ||||
| =item $cyclades->i_up() | ||||
|  | ||||
| Returns link status for each port.  Extended to include serial ports, | ||||
| C<cyISPortSigCD>. | ||||
| C<acsSerialPortTableSignalStateDCD> or C<cyISPortSigCD>. | ||||
|  | ||||
| =item $cyclades->i_description() | ||||
|  | ||||
| Returns description of each port.  Extended to include serial ports, | ||||
| C<cyISPortName>. | ||||
| C<acsSerialPortTableName> or C<cyISPortName>. | ||||
|  | ||||
| =item $cyclades->i_name() | ||||
|  | ||||
| Returns name of each port.  Extended to include serial ports, C<cyISPortName>. | ||||
| Returns name of each port.  Extended to include serial ports, | ||||
| C<acsSerialPortTableName> or C<cyISPortName>. | ||||
|  | ||||
| =back | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|   | ||||
| @@ -46,7 +46,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,         %SNMP::Info::Bridge::MIBS, | ||||
| @@ -118,24 +118,18 @@ sub vendor { | ||||
| sub serial { | ||||
|     my $l2 = shift; | ||||
|  | ||||
|     my $serial1  = $l2->serial1(); | ||||
|     my $e_descr  = $l2->e_descr() || {}; | ||||
|     my $e_serial = $l2->e_serial() || {}; | ||||
|  | ||||
|     my $serial2 = $e_serial->{1} || undef; | ||||
|     my $chassis = $e_descr->{1}  || undef; | ||||
|  | ||||
|     # precedence | ||||
|     #   serial2,chassis parse,serial1 | ||||
|     return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ ); | ||||
|  | ||||
|     if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i ) { | ||||
|         return $1; | ||||
|     my $entity_serial = $l2->entity_derived_serial(); | ||||
|     if ( defined $entity_serial and $entity_serial !~ /^\s*$/ ){ | ||||
|         return $entity_serial; | ||||
|     } | ||||
|  | ||||
|     return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ ); | ||||
|     my $serial1  = $l2->serial1(); | ||||
|     if ( defined $serial1 and $serial1 !~ /^\s*$/ ) { | ||||
|         return $serial1; | ||||
|     } | ||||
|  | ||||
|     return; | ||||
|  | ||||
| } | ||||
|  | ||||
| sub interfaces { | ||||
| @@ -262,7 +256,7 @@ Tries to discover the vendor from $l2->model() and $l2->description() | ||||
|  | ||||
| =item $l2->serial() | ||||
|  | ||||
| Returns serial number if available through SNMP | ||||
| Returns a serial number if found from F<ENTITY-MIB> and F<OLD-CISCO->... MIB. | ||||
|  | ||||
| =back | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ use SNMP::Info::CDP; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
| @@ -49,6 +49,7 @@ sub serial { | ||||
|             return $e_serial->{$e}; | ||||
|         } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
| @@ -61,6 +62,7 @@ sub os_ver { | ||||
|             return $e_swver->{$e}; | ||||
|         } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
| @@ -73,7 +75,10 @@ sub model { | ||||
|     my $descr = $dsmodel->description(); | ||||
|     if ( $descr =~ /^([\S ]+) Software.*/){ | ||||
|         return $1; | ||||
|     } else { | ||||
|         return $descr; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|   | ||||
							
								
								
									
										286
									
								
								lib/SNMP/Info/Layer2/Adtran.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										286
									
								
								lib/SNMP/Info/Layer2/Adtran.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,286 @@ | ||||
| package SNMP::Info::Layer2::Adtran; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer2::Adtran::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Adtran::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| # 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::Layer3::MIBS, | ||||
|     'ADTRAN-GENEVC-MIB'     => 'adGenEVCMIB', | ||||
|     'ADTRAN-GENMEF-MIB'     => 'adGenMEFMIB', | ||||
|     'ADTRAN-GENPORT-MIB'    => 'adGenPort', | ||||
|     'ADTRAN-MIB'            => 'adtran', | ||||
|     'ADTRAN-AOSUNIT'     => 'adGenAOSUnitMib', | ||||
|  ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS,  | ||||
|     %SNMP::Info::Layer3::GLOBALS,  | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'serial'    => 'adProdSerialNumber', | ||||
|     'ad_mgmtevcvid' => 'adGenEVCSysMgmtEVCSTagVID', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( %SNMP::Info::Layer2::FUNCS, | ||||
|            %SNMP::Info::Layer3::FUNCS, | ||||
|            %SNMP::Info::LLDP::FUNCS,  | ||||
|            'ad_evcstag' => 'adGenEVCLookupName', | ||||
|            'ad_menport' => 'adGenMenPortRowStatus', | ||||
|            'ad_evcnamevid' => 'adGenEVCSTagVID', | ||||
|            'ad_mgmtevcports' => 'adGenSysMgmtEVCInterfaceConnectionType', | ||||
|            'ad_evcmapuniport' => 'adGenMEFMapUNIPort', | ||||
|            'ad_evcmapevc' => 'adGenMEFMapAssociatedEVCAlias', | ||||
|            'ad_genportcustuse' => 'adGenPortCustomerUse', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, %SNMP::Info::Layer3::MUNGE ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'adtran'; | ||||
| } | ||||
| sub os { | ||||
|     return 'aos'; | ||||
| } | ||||
|  | ||||
| sub layers { | ||||
|     my $adtran = shift; | ||||
|      | ||||
|     my $layers = $adtran->SUPER::layers(); | ||||
|     # Some netvantas don't report L2 properly  | ||||
|     my $macs   = $adtran->fw_mac(); | ||||
|      | ||||
|     if (keys %$macs) { | ||||
|         my $l = substr $layers, 6, 1, "1"; | ||||
|     } | ||||
|  | ||||
|     return $layers; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $adtran = shift; | ||||
|     my $ver = $adtran->adProdSwVersion() || undef; | ||||
|     return $ver if (defined $ver); | ||||
|     my $aos_ver = $adtran->adAOSDeviceVersion(); | ||||
|     return $aos_ver; | ||||
| } | ||||
| sub model {  | ||||
|     my $adtran = shift; | ||||
|     my $id = $adtran->id(); | ||||
|     my $mod = $adtran->adProdName() || undef; | ||||
|     return $mod if (defined $mod); | ||||
|     my $model = $adtran->adAOSDeviceProductName() || undef; | ||||
|     return $model; | ||||
| } | ||||
| sub serial {  | ||||
|     my $adtran = shift; | ||||
|     my $e_serial = $adtran->e_serial() || {}; | ||||
|     my $serial2 = $e_serial->{1} || undef; | ||||
|     return $serial2 if ( defined $serial2 ); | ||||
|     return $adtran->orig_serial(); | ||||
| } | ||||
|  | ||||
| sub i_name { | ||||
|     my $adtran = shift; | ||||
|     my $partial = shift; | ||||
|     my $i_name = $adtran->SUPER::i_alias() || undef;  | ||||
|     return $i_name if (defined $i_name); | ||||
|     $i_name = {}; | ||||
|     my $adname = $adtran->ad_genportcustuse() || undef; | ||||
|     if (defined $adname) {   | ||||
|         foreach my $port (keys %$adname) {  | ||||
|             my @split = split(/\./,$port); | ||||
|             $i_name->{@split[1]} = $adname->{$port}; | ||||
|         } | ||||
|     } | ||||
|     return $i_name; | ||||
| } | ||||
| sub i_vlan {  | ||||
|     my $adtran = shift; | ||||
|     my $partial = shift; | ||||
|     my $uniports = $adtran->ad_evcmapuniport() || undef; | ||||
|     my $evcmaps = $adtran->ad_evcmapevc() || undef; | ||||
|     my $v_names = $adtran->ad_evcnamevid() || undef; | ||||
|     if (defined $uniports) { | ||||
|         my $vlans = {}; | ||||
|         foreach my $oid (keys %$v_names) { | ||||
|             my $name = pack("C*", split(/\./,$oid)); | ||||
|             $vlans->{$name} = $v_names->{$oid}; | ||||
|         } | ||||
|         my $i_vlan = {}; | ||||
|         foreach my $evcmap (keys %$evcmaps) { | ||||
|             $i_vlan->{$uniports->{$evcmap}} = $vlans->{$evcmaps->{$evcmap}}; | ||||
|         } | ||||
|         return $i_vlan; | ||||
|     } | ||||
|     return {}; | ||||
|          | ||||
| } | ||||
|          | ||||
| sub i_vlan_membership {          | ||||
|     my $adtran  = shift; | ||||
|     my $partial = shift; | ||||
|     my $i_vlan = $adtran->ad_menport(); | ||||
|     if (defined $i_vlan) {  | ||||
|         my $vlans = {}; | ||||
|         my $v_name = $adtran->v_name(); | ||||
|         foreach my $vid (keys %$v_name) { | ||||
|             $vlans->{$v_name->{$vid}} = $vid; | ||||
|         } | ||||
|         my $if_vlans = {}; | ||||
|         foreach my $entry (keys %$i_vlan) { | ||||
|             my @split = split(/(\.0)+\./,$entry); | ||||
|             my $name = pack("C*", split(/\./,@split[0])); | ||||
|             push @{$if_vlans->{@split[2]}}, $vlans->{$name}; | ||||
|         } | ||||
|         my $mgmtevcports = $adtran->ad_mgmtevcports(); | ||||
|         my $mgmtevcid = $adtran->ad_mgmtevcvid(); | ||||
|         foreach my $port (keys %$mgmtevcports) { | ||||
|            push @{$if_vlans->{$port}}, $mgmtevcid; | ||||
|         } | ||||
|         return $if_vlans; | ||||
|     } | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| sub v_name { | ||||
|     my $adtran = shift; | ||||
|     my $partial = shift; | ||||
|     my $v_index = $adtran->ad_evcstag(); | ||||
|     return {} unless defined $v_index; | ||||
|     $v_index->{$adtran->ad_mgmtevcvid()} = 'system-management-evc'; | ||||
|     return $v_index; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Adtran - SNMP Interface to Adtran Devices | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $adtran = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $adtran->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for adtran Devices running JUNOS | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $adtran->vendor() | ||||
|  | ||||
| Returns 'adtran' | ||||
|  | ||||
| =item $adtran->os() | ||||
|  | ||||
| Returns 'aos' | ||||
|  | ||||
| =item $adtran->layers() | ||||
|  | ||||
| Ensures that layer two is reported, at least. | ||||
|  | ||||
| =item $adtran->os_ver() | ||||
|  | ||||
| Returns the software version extracted first from C<adProdSwVersion> or | ||||
| C<adAOSDeviceVersion>. | ||||
|  | ||||
| =item $adtran->model() | ||||
|  | ||||
| Returns the model extracted first from C<adProdName> or | ||||
| C<adAOSDeviceProductName>. | ||||
|  | ||||
| =item $adtran->serial() | ||||
|  | ||||
| Returns serial number. | ||||
|  | ||||
| =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::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. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $adtran->v_name() | ||||
|  | ||||
| VLAN names table. | ||||
|  | ||||
| =item $adtran->i_name() | ||||
|  | ||||
| Interface names table. | ||||
|  | ||||
| =item $adtran->i_vlan() | ||||
|  | ||||
| Returns a mapping between C<ifIndex> and the PVID or default VLAN. | ||||
|  | ||||
| =item $adtran->i_vlan_membership() | ||||
|  | ||||
| Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN | ||||
| IDs.  These are the VLANs which are members of the egress list for the port. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 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 | ||||
							
								
								
									
										472
									
								
								lib/SNMP/Info/Layer2/Aerohive.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										472
									
								
								lib/SNMP/Info/Layer2/Aerohive.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,472 @@ | ||||
| # SNMP::Info::Layer2::Aerohive | ||||
| # | ||||
| # Copyright (c) 2018 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Aerohive; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Aerohive::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Aerohive::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'AH-SYSTEM-MIB'    => 'ahSystemSerial', | ||||
|     'AH-INTERFACE-MIB' => 'ahSSIDName', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|  | ||||
|     # AH-SYSTEM-MIB | ||||
|     'serial' => 'ahSystemSerial', | ||||
|     'os_bin' => 'ahFirmwareVersion', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|  | ||||
|     # AH-INTERFACE-MIB::ahRadioAttributeTable | ||||
|     'i_80211channel'      => 'ahRadioChannel', | ||||
|     'dot11_cur_tx_pwr_mw' => 'ahRadioTxPower', | ||||
|  | ||||
|     # AH-INTERFACE-MIB::ahXIfTable | ||||
|     'ah_i_ssidlist' => 'ahSSIDName', | ||||
|  | ||||
|     # AH-INTERFACE-MIB::ahAssociationTable | ||||
|     'cd11_txrate'      => 'ahClientLastTxRate', | ||||
|     'cd11_uptime'      => 'ahClientLinkUptime', | ||||
|     'cd11_sigstrength' => 'ahClientRSSI', | ||||
|     'cd11_rxpkt'       => 'ahClientRxDataFrames', | ||||
|     'cd11_txpkt'       => 'ahClientTxDataFrames', | ||||
|     'cd11_rxbyte'      => 'ahClientRxDataOctets', | ||||
|     'cd11_txbyte'      => 'ahClientTxDataOctets', | ||||
|     'cd11_ssid'        => 'ahClientSSID', | ||||
|     'ah_c_vlan'        => 'ahClientVLAN', | ||||
|     'ah_c_ip'          => 'ahClientIP', | ||||
| ); | ||||
|  | ||||
| %MUNGE | ||||
|     = ( %SNMP::Info::Layer2::MUNGE, 'at_paddr' => \&SNMP::Info::munge_mac, ); | ||||
|  | ||||
| sub layers { | ||||
|     return '00000111'; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'aerohive'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'hiveos'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $aerohive = shift; | ||||
|     my $descr    = $aerohive->description(); | ||||
|  | ||||
|     if ( $descr =~ m/\bHiveOS\s(\d\.\w+)\b/ix ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $aerohive = shift; | ||||
|     my $descr    = $aerohive->description(); | ||||
|  | ||||
|     if ( $descr =~ m/\bHive(AP\d+)\b/ix ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub i_ssidlist { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $ssids = $aerohive->ah_i_ssidlist($partial) || {}; | ||||
|  | ||||
|     my %i_ssidlist; | ||||
|     foreach my $iid ( keys %$ssids ) { | ||||
|         my $ssid = $ssids->{$iid}; | ||||
|         next if $ssid =~ /N\/A/i; | ||||
|  | ||||
|         $i_ssidlist{$iid} = $ssid; | ||||
|     } | ||||
|     return \%i_ssidlist; | ||||
| } | ||||
|  | ||||
| sub i_ssidmac { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $ssids = $aerohive->i_ssidlist($partial) || {}; | ||||
|     my $macs  = $aerohive->i_mac($partial)      || {}; | ||||
|  | ||||
|     my %i_ssidmac; | ||||
|     foreach my $iid ( keys %$ssids ) { | ||||
|         my $mac = $macs->{$iid}; | ||||
|         next unless $mac; | ||||
|  | ||||
|         $i_ssidmac{$iid} = $mac; | ||||
|     } | ||||
|     return \%i_ssidmac; | ||||
| } | ||||
|  | ||||
| # Break up the ahAssociationEntry INDEX into ifIndex and MAC Address. | ||||
| sub _ah_association_index { | ||||
|     my $idx     = shift; | ||||
|     my @values  = split( /\./, $idx ); | ||||
|     my $ifindex = shift(@values); | ||||
|     my $length  = shift(@values); | ||||
|     return ( $ifindex, join( ':', map { sprintf "%02x", $_ } @values ) ); | ||||
| } | ||||
|  | ||||
| sub cd11_port { | ||||
|     my $aerohive = shift; | ||||
|  | ||||
|     my $cd11_txrate = $aerohive->cd11_txrate(); | ||||
|     my $interfaces  = $aerohive->interfaces(); | ||||
|  | ||||
|     my %ret; | ||||
|     foreach ( keys %$cd11_txrate ) { | ||||
|         my ( $ifindex, $mac ) = _ah_association_index($_); | ||||
|         $ret{$_} = $interfaces->{$ifindex}; | ||||
|     } | ||||
|     return \%ret; | ||||
| } | ||||
|  | ||||
| sub cd11_mac { | ||||
|     my $aerohive = shift; | ||||
|  | ||||
|     my $cd11_txrate = $aerohive->cd11_txrate(); | ||||
|  | ||||
|     my %ret; | ||||
|     foreach ( keys %$cd11_txrate ) { | ||||
|         my ( $ifindex, $mac ) = _ah_association_index($_); | ||||
|         $ret{$_} = $mac; | ||||
|     } | ||||
|     return \%ret; | ||||
| } | ||||
|  | ||||
| # Does not support the standard Bridge MIB | ||||
| sub bp_index { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_index = $aerohive->i_index($partial) || {}; | ||||
|  | ||||
|     my %bp_index; | ||||
|     foreach my $iid ( keys %$i_index ) { | ||||
|         my $index = $i_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|  | ||||
|         $bp_index{$index} = $iid; | ||||
|     } | ||||
|  | ||||
|     return \%bp_index; | ||||
| } | ||||
|  | ||||
| sub qb_fw_port { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $txrate = $aerohive->cd11_txrate($partial) || {}; | ||||
|  | ||||
|     my $qb_fw_port = {}; | ||||
|     foreach my $idx ( keys %$txrate ) { | ||||
|         my ( $fdb_id, $mac ) = _ah_association_index($idx); | ||||
|         $qb_fw_port->{$idx} = $fdb_id; | ||||
|     } | ||||
|     return $qb_fw_port; | ||||
| } | ||||
|  | ||||
| sub qb_fw_mac { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $txrate = $aerohive->cd11_txrate($partial) || {}; | ||||
|  | ||||
|     my $qb_fw_mac = {}; | ||||
|     foreach my $idx ( keys %$txrate ) { | ||||
|         my ( $fdb_id, $mac ) = _ah_association_index($idx); | ||||
|         $qb_fw_mac->{$idx} = $mac; | ||||
|     } | ||||
|     return $qb_fw_mac; | ||||
| } | ||||
|  | ||||
| sub qb_fw_vlan { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $vlans = $aerohive->ah_c_vlan($partial) || {}; | ||||
|  | ||||
|     my $qb_fw_vlan = {}; | ||||
|     foreach my $idx ( keys %$vlans ) { | ||||
|         my $vlan = $vlans->{$idx}; | ||||
|         next unless defined $vlan; | ||||
|         $qb_fw_vlan->{$idx} = $vlan; | ||||
|     } | ||||
|     return $qb_fw_vlan; | ||||
| } | ||||
|  | ||||
| # arpnip: | ||||
| # | ||||
| # This is the AP snooping on the MAC->IP mappings. | ||||
| # Pretending this is arpnip data allows us to get MAC->IP | ||||
| # mappings even for stations that only communicate locally. | ||||
|  | ||||
| sub at_paddr { | ||||
|     my $aerohive = shift; | ||||
|  | ||||
|     my $txrate = $aerohive->cd11_txrate() || {}; | ||||
|  | ||||
|     my $at_paddr = {}; | ||||
|     foreach my $idx ( keys %$txrate ) { | ||||
|         my ( $fdb_id, $mac ) = _ah_association_index($idx); | ||||
|         $at_paddr->{$idx} = $mac; | ||||
|     } | ||||
|     return $at_paddr; | ||||
| } | ||||
|  | ||||
| sub at_netaddr { | ||||
|     my $aerohive = shift; | ||||
|  | ||||
|     my $ips = $aerohive->ah_c_ip() || {}; | ||||
|  | ||||
|     my $ret = {}; | ||||
|     foreach my $idx ( keys %$ips ) { | ||||
|         next if ( $ips->{$idx} eq '0.0.0.0' ); | ||||
|         $ret->{$idx} = $ips->{$idx}; | ||||
|     } | ||||
|     return $ret; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Aerohive - SNMP Interface to Aerohive Access Points | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $aerohive = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $aerohive->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from an | ||||
| Aerohive wireless Access Point through SNMP.  | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $aerohive = new SNMP::Info::Layer2::Aerohive(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<AH-SYSTEM-MIB> | ||||
|  | ||||
| =item F<AH-INTERFACE-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $aerohive->vendor() | ||||
|  | ||||
| Returns 'aerohive'. | ||||
|  | ||||
| =item $aerohive->os() | ||||
|  | ||||
| Returns 'hive_os'. | ||||
|  | ||||
| =item $aerohive->os_ver() | ||||
|  | ||||
| Returns the OS versionl extracted from C<sysDescr>. | ||||
|  | ||||
| =item $aerohive->os_bin() | ||||
|  | ||||
| Returns the firmware version extracted from C<ahFirmwareVersion>. | ||||
|  | ||||
| =item $aerohive->model() | ||||
|  | ||||
| Returns the model extracted from C<sysDescr>. | ||||
|  | ||||
| =item $aerohive->serial() | ||||
|  | ||||
| Returns the serial number extracted from C<ahSystemSerial>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $aerohive->layers() | ||||
|  | ||||
| Returns 00000111. Layer 2 and Layer 3 functionality through proprietary MIBs. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $aerohive->i_ssidlist() | ||||
|  | ||||
| Returns reference to hash.  SSID's recognized by the radio interface. | ||||
|  | ||||
| =item $aerohive->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. | ||||
|  | ||||
| =item $aerohive->i_80211channel() | ||||
|  | ||||
| Returns reference to hash.  Current operating frequency channel of the radio | ||||
| interface. | ||||
|  | ||||
| C<ahRadioChannel> | ||||
|  | ||||
| =item $aerohive->dot11_cur_tx_pwr_mw() | ||||
|  | ||||
| Returns reference to hash.  Current transmit power, in milliwatts, of the | ||||
| radio interface. | ||||
|  | ||||
| C<ahRadioTxPower> | ||||
|  | ||||
| =item $aironet->cd11_port() | ||||
|  | ||||
| Returns radio interfaces. | ||||
|  | ||||
| =item $aironet->cd11_mac() | ||||
|  | ||||
| Returns client radio interface MAC addresses. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $aerohive->bp_index() | ||||
|  | ||||
| Simulates bridge MIB by returning reference to a hash mapping i_index() to | ||||
| the interface iid. | ||||
|  | ||||
| =item $aerohive->qb_fw_port() | ||||
|  | ||||
| Returns reference to hash of forwarding table entries port interface | ||||
| identifier (iid) | ||||
|  | ||||
| =item $aerohive->qb_fw_mac() | ||||
|  | ||||
| Returns reference to hash of forwarding table MAC Addresses | ||||
|  | ||||
| C<ahClientMac> | ||||
|  | ||||
| =item $aerohive->qb_fw_vlan() | ||||
|  | ||||
| Returns reference to hash of forwarding table entries VLAN ID | ||||
|  | ||||
| C<ahClientVLAN> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Arp Cache Table Augmentation | ||||
|  | ||||
| The AP 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 $aerohive->at_paddr() | ||||
|  | ||||
| C<ahClientMac> | ||||
|  | ||||
| =item $aerohive->at_netaddr() | ||||
|  | ||||
| C<ahClientIP> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::Airespace; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,      %SNMP::Info::Bridge::MIBS, | ||||
| @@ -97,6 +97,14 @@ my $mcs_index = { | ||||
| 	m13 => '104', | ||||
| 	m14 => '117', | ||||
| 	m15 => '130', | ||||
| 	m16 => '19.5', | ||||
| 	m17 => '39', | ||||
| 	m18 => '58.5', | ||||
| 	m19 => '78', | ||||
| 	m20 => '117', | ||||
| 	m21 => '156', | ||||
| 	m22 => '175.5', | ||||
| 	m23 => '195', | ||||
| 	# This is a cheat for 802.11a bonded | ||||
| 	m108 => '108', | ||||
|     }, | ||||
| @@ -117,6 +125,14 @@ my $mcs_index = { | ||||
| 	m13 => '240', | ||||
| 	m14 => '270', | ||||
| 	m15 => '300', | ||||
| 	m16 => '45', | ||||
| 	m17 => '90', | ||||
| 	m18 => '135', | ||||
| 	m19 => '180', | ||||
| 	m20 => '270', | ||||
| 	m21 => '360', | ||||
| 	m22 => '405', | ||||
| 	m23 => '450', | ||||
|     } | ||||
| }; | ||||
|  | ||||
| @@ -165,6 +181,7 @@ sub cd11_txrate { | ||||
| 	elsif ( $rate =~ /^m/ ) { | ||||
| 	    my $band = $protos->{$idx}; | ||||
| 	    my $bw   = $bws->{$band}; | ||||
| 	    # FIXME throw some kind of error if we get an index/rate that we haven't implemented yet? Now we simply return "0.0"... | ||||
| 	    $cd11_txrate->{$idx} = [ $mcs_index->{$bw}->{$rate} || '0.0' ]; | ||||
| 	} | ||||
| 	else { | ||||
|   | ||||
| @@ -49,7 +49,7 @@ use SNMP::Info::IEEE802dot11; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::IEEE802dot11::GLOBALS, | ||||
| @@ -60,7 +60,6 @@ $VERSION = '3.36'; | ||||
|     %SNMP::Info::CiscoConfig::GLOBALS, | ||||
|     %SNMP::Info::CDP::GLOBALS, | ||||
|     'serial' => 'entPhysicalSerialNum.1', | ||||
|     'descr'  => 'sysDescr', | ||||
|     'ps1_type' => 'cpoePdCurrentPowerSource' | ||||
| ); | ||||
|  | ||||
| @@ -136,7 +135,7 @@ sub interfaces { | ||||
| # Tag on e_descr.1 | ||||
| sub description { | ||||
|     my $aironet = shift; | ||||
|     my $descr   = $aironet->descr(); | ||||
|     my $descr   = $aironet->SUPER::description(); | ||||
|     my $e_descr = $aironet->e_descr(); | ||||
|  | ||||
|     $descr = "$e_descr->{1}  $descr" if defined $e_descr->{1}; | ||||
|   | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::Layer1; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %GLOBALS = ( %SNMP::Info::Layer2::GLOBALS ); | ||||
|  | ||||
| @@ -73,6 +73,7 @@ sub os_ver { | ||||
|     if ( $descr =~ m/version (\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|   | ||||
| @@ -46,7 +46,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS,    %SNMP::Info::LLDP::MIBS, | ||||
| @@ -229,7 +229,7 @@ sub index_factor { | ||||
|         if ( ( $model =~ /(470)/ ) | ||||
|         or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) ); | ||||
|     $index_factor = 128 | ||||
|         if ( ( $model =~ /(5[56]\d\d)|VSP/ ) | ||||
|         if ( ( $model =~ /(5[56]\d\d)|VSP|4950|59100/ ) | ||||
|         and ( $os_ver >= 6 ) ); | ||||
|  | ||||
|     return $index_factor; | ||||
|   | ||||
| @@ -48,7 +48,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
| @@ -200,6 +200,8 @@ sub set_i_duplex_admin { | ||||
|  | ||||
|     my $iid = $c1900->c1900_p_ifindex($port); | ||||
|  | ||||
|     return 0 unless $iid->{$port}; | ||||
|  | ||||
|     $duplex = lc($duplex); | ||||
|  | ||||
|     return 0 unless defined $duplexes{$duplex}; | ||||
| @@ -212,17 +214,17 @@ sub i_vlan { | ||||
|     my $partial = shift; | ||||
|  | ||||
|     # Overlap allows more than one VLAN per port.  Unable to determine default | ||||
|     my $overlap  | ||||
|     my $overlap | ||||
|         = $c1900->bridgeGroupAllowMembershipOverlap() | ||||
|         || $c1900->vlanAllowMembershipOverlap() | ||||
|         || 'disabled'; | ||||
|  | ||||
|     if ( $overlap eq 'enabled' ) { | ||||
|         return; | ||||
|         return {}; | ||||
|     } | ||||
|  | ||||
|     my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup() | ||||
|         || $c1900->vlanMemberPortOfVlan(); | ||||
|         || $c1900->vlanMemberPortOfVlan() || {}; | ||||
|  | ||||
|     my $i_pvid = {}; | ||||
|     foreach my $idx ( keys %$member_of ) { | ||||
| @@ -244,7 +246,7 @@ sub i_vlan_membership { | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup() | ||||
|         || $c1900->vlanMemberPortOfVlan(); | ||||
|         || $c1900->vlanMemberPortOfVlan() || {}; | ||||
|  | ||||
|     my $i_vlan_membership = {}; | ||||
|     foreach my $idx ( keys %$member_of ) { | ||||
| @@ -261,7 +263,7 @@ sub i_vlan_membership { | ||||
|     return $i_vlan_membership; | ||||
| } | ||||
|  | ||||
| sub i_vlan_membership_untagged { return; } | ||||
| sub i_vlan_membership_untagged { return {}; } | ||||
|  | ||||
| sub bp_index { | ||||
|     my $c1900   = shift; | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::Layer2::Cisco; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::Cisco::GLOBALS, | ||||
| @@ -128,25 +128,24 @@ 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 $c2900_p_admin = $c2900->c2900_p_speed_admin(); | ||||
|  | ||||
|     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; | ||||
|     my %i_speed_admin; | ||||
|     foreach my $if ( keys %$interfaces ) { | ||||
|         my $port_2900 = $reverse_2900{$if}; | ||||
|         next unless defined $port_2900; | ||||
|         my $speed = $c2900_p_admin->{$port_2900}; | ||||
|         next unless defined $speed; | ||||
|  | ||||
|         $speed = 'auto' if $speed eq 'autoDetect'; | ||||
|         $speed = '10 Mbps' if $speed eq 's10000000'; | ||||
|         $speed = '100 Mbps' if $speed eq 's100000000'; | ||||
|         $i_speed_admin{$if} = $speed; | ||||
|     } | ||||
|     return \%i_speed_admin; | ||||
| } | ||||
|  | ||||
| @@ -190,7 +189,7 @@ sub set_i_duplex_admin { | ||||
|     return $c2900->set_c2900_p_duplex_admin( $duplexes{$duplex}, $iid ); | ||||
| } | ||||
|  | ||||
| # Use i_descritption for port key, cuz i_name can be manually entered. | ||||
| # Use i_description for port key, cuz i_name can be manually entered. | ||||
| sub interfaces { | ||||
|     my $c2900   = shift; | ||||
|     my $partial = shift; | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info::Layer2::Cisco; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::Cisco::MIBS, | ||||
| @@ -70,7 +70,7 @@ $VERSION = '3.36'; | ||||
| sub i_physical { | ||||
|     my $cat = shift; | ||||
|  | ||||
|     my $p_port = $cat->p_port(); | ||||
|     my $p_port = $cat->p_port() || {}; | ||||
|  | ||||
|     my %i_physical; | ||||
|     foreach my $port ( keys %$p_port ) { | ||||
| @@ -104,8 +104,8 @@ sub os_ver { | ||||
| # Workaround for incomplete bp_index | ||||
| sub bp_index { | ||||
|     my $cat     = shift; | ||||
|     my $p_index = $cat->p_port(); | ||||
|     my $b_index = $cat->p_oidx(); | ||||
|     my $p_index = $cat->p_port() || {}; | ||||
|     my $b_index = $cat->p_oidx() || {}; | ||||
|  | ||||
|     my %bp_index; | ||||
|     foreach my $iid ( keys %$p_index ) { | ||||
|   | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info::SONMP; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|   | ||||
| @@ -52,7 +52,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|   | ||||
| @@ -50,7 +50,7 @@ use SNMP::Info::CDP; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
| @@ -130,8 +130,9 @@ sub model { | ||||
|  | ||||
|     foreach my $e ( sort keys %$e_model ) { | ||||
|         if (defined $e_model->{$e} and $e_model->{$e} !~ /^\s*$/) { | ||||
|             my $model = "$e_model->{$e} $e_hwver->{$e}"; | ||||
|             return $model; | ||||
|             return $e_model->{$e}; | ||||
|             #my $model = "$e_model->{$e} $e_hwver->{$e}"; | ||||
|             #return $model; | ||||
|         } | ||||
|     } | ||||
|     return $ciscosb->description(); | ||||
|   | ||||
| @@ -50,22 +50,24 @@ use SNMP::Info::Aggregate 'agg_ports_ifstack'; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|     %SNMP::Info::CDP::MIBS, | ||||
|     %SNMP::Info::Aggregate::MIBS, | ||||
|     'RFC1271-MIB'    => 'logDescription', | ||||
|     'HP-ICF-OID'     => 'hpSwitch4000', | ||||
|     'STATISTICS-MIB' => 'hpSwitchCpuStat', | ||||
|     'NETSWITCH-MIB'  => 'hpMsgBufFree', | ||||
|     'CONFIG-MIB'     => 'hpSwitchConfig', | ||||
|     'HP-ICF-CHASSIS' => 'hpicfSensorObjectId', | ||||
|     'HP-ICF-BRIDGE'  => 'hpicfBridgeRstpForceVersion', | ||||
|     'HP-ICF-POE-MIB' => 'hpicfPoePethPsePortCurrent', | ||||
|     'SEMI-MIB'       => 'hpHttpMgSerialNumber', | ||||
|     'RFC1271-MIB'            => 'logDescription', | ||||
|     'HP-ICF-OID'             => 'hpSwitch4000', | ||||
|     'STATISTICS-MIB'         => 'hpSwitchCpuStat', | ||||
|     'NETSWITCH-MIB'          => 'hpMsgBufFree', | ||||
|     'CONFIG-MIB'             => 'hpSwitchConfig', | ||||
|     'HP-ICF-CHASSIS'         => 'hpicfSensorObjectId', | ||||
|     'HP-ICF-BRIDGE'          => 'hpicfBridgeRstpForceVersion', | ||||
|     'HP-ICF-POE-MIB'         => 'hpicfPoePethPsePortCurrent', | ||||
|     'SEMI-MIB'               => 'hpHttpMgSerialNumber', | ||||
|     'HP-SWITCH-PL-MIB'       => 'hpSwitchProliant', | ||||
|     'BLADETYPE4-NETWORK-MIB' => 'hpProLiant-GbE2c-InterconnectSwitch', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| @@ -215,6 +217,7 @@ $VERSION = '3.36'; | ||||
|     'J9085A' => '2610-24', | ||||
|     'J8762A' => '2600-8-PWR', | ||||
|     'J9780A' => '2530-8-PoE+', | ||||
|     'J9774A' => '2530-8G-PoEP', | ||||
|     'J9777A' => '2530-8G', | ||||
|     'J9783A' => '2530-8', | ||||
|     'J9778A' => '2530-48-PoE+', | ||||
| @@ -623,6 +626,14 @@ Included in V2 mibs from Cisco | ||||
|  | ||||
| =item F<HP-ICF-POE-MIB> | ||||
|  | ||||
| =item F<HP-ICF-CHASSIS> | ||||
|  | ||||
| =item F<SEMI-MIB> | ||||
|  | ||||
| =item F<HP-SWITCH-PL-MIB> | ||||
|  | ||||
| =item F<BLADETYPE4-NETWORK-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| The last four MIBs listed are from HP and can be found at | ||||
|   | ||||
| @@ -44,7 +44,7 @@ use SNMP::Info::CDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|   | ||||
| @@ -36,7 +36,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -66,6 +66,7 @@ sub os_ver { | ||||
|     if ( $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){ | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
| @@ -75,7 +76,7 @@ sub serial { | ||||
|         my $str = substr($1,8,10); | ||||
|         return $str; | ||||
|     } | ||||
|  | ||||
|     return; | ||||
| } | ||||
| sub vendor { | ||||
|     return 'Kentrox'; | ||||
| @@ -87,6 +88,7 @@ sub model { | ||||
|     if ( $descr =~ /^(\S+\s\S+)/){ | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info::Airespace; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,        %SNMP::Info::Bridge::MIBS, | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS, | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Bridge; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -49,6 +49,7 @@ $VERSION = '3.36'; | ||||
|     'NTWS-CLIENT-SESSION-MIB'       => 'ntwsClSessTotalSessions', | ||||
|     'NTWS-SYSTEM-MIB'               => 'ntwsSysCpuAverageLoad', | ||||
|     'NTWS-BASIC-MIB'                => 'ntwsVersionString', | ||||
|     'NTWS-AP-CONFIG-MIB'            => 'ntwsApConfServProfBeaconEnabled', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|   | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| # This will be filled in with the device's index into the EntPhysicalEntry | ||||
| # table by the serial() function. | ||||
| @@ -89,7 +89,7 @@ sub serial { | ||||
|  | ||||
|     # 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 $netgear->ng_gsmserial() if defined $netgear->model and $netgear->model =~ m/[FG]SM\d/i;; | ||||
|     return 'none'; | ||||
| } | ||||
|  | ||||
| @@ -139,7 +139,7 @@ sub interfaces { | ||||
|     return $interfaces; | ||||
| } | ||||
|  | ||||
| # these seem to work for GSM models but not GS | ||||
| # these seem to work for GSM/FSM models but not GS | ||||
| # https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529 | ||||
| sub os_ver { | ||||
|     my $netgear = shift; | ||||
| @@ -148,7 +148,7 @@ sub os_ver { | ||||
|         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_gsmosver() if defined  $netgear->model and $netgear->model =~ m/[FG]SM\d/i; | ||||
|     return $netgear->ng_fsosver() if defined  $netgear->model and $netgear->model =~ m/FS\d/i; | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										253
									
								
								lib/SNMP/Info/Layer2/Nexans.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										253
									
								
								lib/SNMP/Info/Layer2/Nexans.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,253 @@ | ||||
| # SNMP::Info::Layer2::Nexans | ||||
| # | ||||
| # Copyright (c) 2018 Christoph Neuhaus | ||||
| # 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::Nexans; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Nexans::ISA = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Nexans::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'NEXANS-MIB'    => 'nexansANS', | ||||
|     'NEXANS-BM-MIB' => 'infoDescr', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     'mac'   => 'adminAgentPhysAddress.0', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     'i_duplex'          => 'portLinkState', #NEXANS-BM-MIB | ||||
|     'i_duplex_admin'    => 'portSpeedDuplexSetup', #NEXANS-BM-MIB | ||||
|     'nexans_i_name'     => 'ifAlias', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     'i_duplex'          => \&munge_i_duplex, | ||||
|     'i_duplex_admin'    => \&munge_i_duplex_admin, | ||||
| ); | ||||
|  | ||||
| sub munge_i_duplex { | ||||
|     my $duplex   = shift; | ||||
|     return unless defined $duplex; | ||||
|     $duplex = 'half' if $duplex =~/Hdx/; | ||||
|     $duplex = 'full' if $duplex =~/Fdx/; | ||||
|     return $duplex; | ||||
| } | ||||
|  | ||||
| sub munge_i_duplex_admin { | ||||
|     my $duplex_admin    = shift; | ||||
|     return unless defined $duplex_admin; | ||||
|     $duplex_admin = 'full' if $duplex_admin =~/Fdx/; | ||||
|     $duplex_admin = 'half' if $duplex_admin =~/Hdx/; | ||||
|     $duplex_admin = 'auto' if $duplex_admin =~/autoneg/; | ||||
|     return $duplex_admin; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'nexans'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $nexans  = shift; | ||||
|     my $id      = $nexans->id() || ''; | ||||
|     my $model   = &SNMP::translateObj($id); | ||||
|     return $id unless defined $model; | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'nexanos'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $nexans  = shift; | ||||
|     my $ver     = $nexans->infoMgmtFirmwareVersion() || ''; | ||||
|     return $ver; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $nexans = shift; | ||||
|     return $nexans->infoSeriesNo(); | ||||
| } | ||||
|  | ||||
| sub i_name { | ||||
|     my $nexans  = shift; | ||||
|     my $return  = $nexans->nexans_i_name(); | ||||
|     # replace i_name where possible | ||||
|     foreach my $iid ( keys %$return ) { | ||||
|         next unless $return->{$iid} eq ""; | ||||
|         $return->{$iid} = $iid;  | ||||
|     } | ||||
|     return \%$return; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Nexans - SNMP Interface to Nexans network devices. | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Christoph Neuhaus | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
| # Let SNMP::Info determine the correct subclass for you.  | ||||
|  | ||||
|     my $nexans = new SNMP::Info( | ||||
|                             AutoSpecify => 1, | ||||
|                             Debug       => 1, | ||||
|                             DestHost    => 'myswitch', | ||||
|                             Community   => 'public', | ||||
|                             Version     => 2 | ||||
|                             )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|     my $class = $nexans->class(); | ||||
|     print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for Nexans network devices. | ||||
|  | ||||
| tested devices: | ||||
|  | ||||
|     fiberSwitch100BmPlus version 3.61 | ||||
|     gigaSwitch641DeskSfpTp version 3.68, 4.14W | ||||
|     gigaSwitchV3d2SfpSfp version 3.68, 4.02, 4.02B, 4.10C, 4,14W | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|     my $nexans = new SNMP::Info::Layer2::Nexans(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<NEXANS> | ||||
|  | ||||
| =item F<NEXANS-BM> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $nexans->vendor() | ||||
|  | ||||
| Returns 'nexans' | ||||
|  | ||||
| =item $nexans->model() | ||||
|  | ||||
| Returns the chassis model. | ||||
|  | ||||
| =item $nexans->os() | ||||
|  | ||||
| Returns 'nexanos' | ||||
|  | ||||
| =item $nexans->os_ver() | ||||
|  | ||||
| Returns the software version. | ||||
|  | ||||
| =item $nexans->serial() | ||||
|  | ||||
| Returns the chassis serial number. | ||||
|  | ||||
| (C<infoSeriesNo>) | ||||
|  | ||||
| =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. | ||||
|  | ||||
| =over  | ||||
|  | ||||
| =item $nexans->i_name() | ||||
|  | ||||
| Returns reference to map of IIDs to human-set port name. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head1 Data Munging Callback Subroutines | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item munge_i_duplex() | ||||
|  | ||||
| Converts duplex returned by C<portLinkState> to either 'full' or 'half'. | ||||
|  | ||||
| =item munge_i_duplex_admin() | ||||
|  | ||||
| Converts duplex returned by C<portSpeedDuplexSetup> to either 'full', 'half', | ||||
| or 'auto'. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
| @@ -41,13 +41,11 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::IEEE802dot11::MIBS, | ||||
|  | ||||
|     #'ORiNOCO-MIB' => 'orinoco', | ||||
| ); | ||||
|  | ||||
| %GLOBALS | ||||
| @@ -56,12 +54,6 @@ $VERSION = '3.36'; | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::IEEE802dot11::FUNCS, | ||||
|  | ||||
|     # ORiNOCO-MIB:oriWirelessIfPropertiesTable | ||||
|     #'ori_ssid'       => 'oriWirelessIfNetworkName', | ||||
|     #'ori_channel'    => 'oriWirelessIfChannel', | ||||
|     #'ori_closed_sys' => 'oriWirelessIfClosedSystem', | ||||
|     # ORiNOCO-MIB:oriSystemInvMgmtComponentTable | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, ); | ||||
| @@ -165,22 +157,6 @@ sub interfaces { | ||||
|     return \%interfaces; | ||||
| } | ||||
|  | ||||
| #sub i_ssidbcast { | ||||
| #    my $orinoco = shift; | ||||
| #    my $partial = shift; | ||||
| # | ||||
| #    my $bcast = $orinoco->ori_closed_sys($partial) || {}; | ||||
| # | ||||
| #    my %i_ssidbcast; | ||||
| #    foreach my $iid (keys %$bcast){ | ||||
| #        my $bc   = $bcast->{$iid}; | ||||
| #        next unless defined $bc; | ||||
| # | ||||
| #        $i_ssidbcast{$iid} = $bc; | ||||
| #    } | ||||
| #    return \%i_ssidbcast; | ||||
| #} | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
|   | ||||
							
								
								
									
										182
									
								
								lib/SNMP/Info/Layer2/Sixnet.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								lib/SNMP/Info/Layer2/Sixnet.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,182 @@ | ||||
| # SNMP::Info::Layer2::Sixnet | ||||
| # | ||||
| # Copyright (c) 2018 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Sixnet; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Sixnet::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Sixnet::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = (%SNMP::Info::Layer2::MIBS, 'SIXNET-MIB' => 'sxid',); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|   %SNMP::Info::Layer2::GLOBALS, | ||||
|   'os_ver'     => 'firmwareRevision', | ||||
|   's_model'    => 'sxid', | ||||
|   'ps1_status' => 'p1status', | ||||
|   'ps2_status' => 'p2status', | ||||
| ); | ||||
|  | ||||
| %FUNCS = (%SNMP::Info::Layer2::FUNCS,); | ||||
|  | ||||
| %MUNGE = (%SNMP::Info::Layer2::MUNGE,); | ||||
|  | ||||
|  | ||||
| sub vendor { | ||||
|   return 'sixnet'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|   return 'sixnet'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|   my $sixnet = shift; | ||||
|  | ||||
|   my $s_model = $sixnet->s_model(); | ||||
|   return $s_model if defined $s_model; | ||||
|  | ||||
|   my $id = $sixnet->id(); | ||||
|   return unless defined $id; | ||||
|  | ||||
|   my $model = SNMP::translateObj($id); | ||||
|   return $model ? $model : $id; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Sixnet - SNMP Interface to Sixnet industrial switches | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|     my $sixnet = new SNMP::Info( | ||||
|               AutoSpecify => 1, | ||||
|               Debug       => 1, | ||||
|               DestHost    => 'myswitch', | ||||
|               Community   => 'public', | ||||
|               Version     => 2 | ||||
|             )  | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|     my $class = $sixnet->class(); | ||||
|     print " Using device sub class : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::Layer2::Sixnet is a subclass of SNMP::Info that provides an | ||||
| interface to Sixnet industrial switches. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $sixnet = new SNMP::Info::Layer2::Sixnet(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<SIXNET-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $sixnet->vendor() | ||||
|  | ||||
| Returns 'sixnet' | ||||
|  | ||||
| =item $sixnet->os() | ||||
|  | ||||
| Returns 'sixnet' | ||||
|  | ||||
| =item $sixnet->os_ver() | ||||
|  | ||||
| Returns the software version returned by C<firmwareRevision> | ||||
|  | ||||
| =item $sixnet->model() | ||||
|  | ||||
| Returns model type. Returns C<sxid> if it exists, otherwise cross references | ||||
| $sixnet->id() with the F<SIXNET-MIB>. | ||||
|  | ||||
| =item $sixnet->ps1_status() | ||||
|  | ||||
| (C<p1status>) | ||||
|  | ||||
| =item $sixnet->ps2_status() | ||||
|  | ||||
| (C<p2status>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -51,6 +51,7 @@ $VERSION = '3.36'; | ||||
|     'TRAPEZE-NETWORKS-CLIENT-SESSION-MIB'       => 'trpzClSessTotalSessions', | ||||
|     'TRAPEZE-NETWORKS-SYSTEM-MIB'               => 'trpzSysCpuAverageLoad', | ||||
|     'TRAPEZE-NETWORKS-BASIC-MIB'                => 'trpzVersionString', | ||||
|     'TRAPEZE-NETWORKS-AP-CONFIG-MIB'  => 'trpzApConfServProfBeaconEnabled', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|   | ||||
| @@ -8,6 +8,9 @@ use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::Layer3;  # only used in sub mac() | ||||
|  | ||||
|  | ||||
|  | ||||
| @SNMP::Info::Layer2::Ubiquiti::ISA | ||||
|     = qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/; | ||||
| @@ -15,7 +18,7 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -35,7 +38,30 @@ $VERSION = '3.36'; | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, ); | ||||
|  | ||||
| sub os { | ||||
|     return 'Ubiquiti'; | ||||
|     my $ubnt = shift; | ||||
|  | ||||
|     my $names = $ubnt->dot11_prod_name(); | ||||
|  | ||||
|     foreach my $iid ( keys %$names ) { | ||||
|         my $prod = $names->{$iid}; | ||||
|         next unless defined $prod; | ||||
|         # Product names that match AirOS products | ||||
|                 if((lc $prod) =~ /station/ or (lc $prod) =~ /beam/ or (lc $prod) =~ /grid/){ | ||||
|                         return 'AirOS'; | ||||
|                 # Product names that match UAP | ||||
|                 }elsif((lc $prod) =~ /uap/){ | ||||
|                         return 'UniFi'; | ||||
|                 }else{ | ||||
|                     # Continue below to find OS name | ||||
|                 } | ||||
|     } | ||||
|  | ||||
|     ## EdgeMAX OS (EdgeSwitch and EdgeRouter) name is first field split by space | ||||
|     my $ver = $ubnt->description() || ''; | ||||
|  | ||||
|     my @myver = split(/ /, $ver); | ||||
|  | ||||
|     return $myver[0]; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
| @@ -46,13 +72,24 @@ sub os_ver { | ||||
|     foreach my $iid ( keys %$versions ) { | ||||
|         my $ver = $versions->{$iid}; | ||||
|         next unless defined $ver; | ||||
| 	return $ver; | ||||
|         return $ver; | ||||
|         ## Not sure what this function does, it seems to be extraneous being in the same code block after a return statement? | ||||
|         if ( $ver =~ /([\d\.]+)/ ) { | ||||
|             return $1; | ||||
|         } | ||||
|     } | ||||
|     my $ver = $dot11->description() || ''; | ||||
|     if($ver =~ /^edgeswitch/){ | ||||
|         ## EdgeSwitch OS version is second field split by comma | ||||
|         my @myver = split(/, /, $ver); | ||||
|  | ||||
|     return; | ||||
|         return $myver[1]; | ||||
|     } | ||||
|  | ||||
|     ## EdgeRouter OS version is second field split by space | ||||
|     my @myver = split(/ /, $ver); | ||||
|  | ||||
|     return $myver[1]; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
| @@ -60,18 +97,159 @@ sub vendor { | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $dot11 = shift; | ||||
|     my $ubnt = shift; | ||||
|  | ||||
|     my $names = $dot11->dot11_prod_name(); | ||||
|     my $names = $ubnt->dot11_prod_name(); | ||||
|  | ||||
|     foreach my $iid ( keys %$names ) { | ||||
|         my $prod = $names->{$iid}; | ||||
|         next unless defined $prod; | ||||
|         return $prod; | ||||
|     } | ||||
|     return; | ||||
|      | ||||
|     my $desc = $ubnt->description() || ''; | ||||
|      | ||||
|     ## Pull Model from beginning of description, separated by comma (EdgeSwitch) | ||||
|     if((lc $desc) =~ /^edgeswitch/){     | ||||
|         my @mydesc = split(/, /, $desc); | ||||
|         return $mydesc[0]; | ||||
|     } | ||||
|  | ||||
|     if(!((lc $desc) =~ /edgeos/)){ | ||||
|         # Not sure what type of device this is to get Model | ||||
|         # Wireless devices report dot11_prod_name | ||||
|         # EdgeSwitch includes mode directly and edgeos logic is in else statement | ||||
|         return ; | ||||
|     }else{ | ||||
|         ## do some logic to determine ER model based on tech specs from ubnt: | ||||
|         ## https://help.ubnt.com/hc/en-us/articles/219652227--EdgeRouter-Which-EdgeRouter-Should-I-Use-#tech%20specs | ||||
|         ## Would be nice if UBNT simply adds the model string to their SNMP daemon directly | ||||
|         my $ethCount = 0; | ||||
|         my $switchCount = 0; | ||||
|         #my $sfpCount = 0; | ||||
|         #my $poeCount = 0;   | ||||
|         my $memTotalReal = $ubnt->memTotalReal;    | ||||
|         my $cpuLoad = $ubnt->hrProcessorLoad; | ||||
|         my $cpuCount = 0; | ||||
|         ## My perl is lacking. Not sure if there's a more efficient way to find the cpu count | ||||
|         foreach my $iid ( keys %$cpuLoad ) { | ||||
|             $cpuCount++; | ||||
|         } | ||||
|          | ||||
|         my $ifDescs = $ubnt->ifDescr; | ||||
|         foreach my $iid ( keys %$ifDescs ) { | ||||
|             my $ifDesc = $ifDescs->{$iid}; | ||||
|             next unless defined $ifDesc; | ||||
|  | ||||
|             if((lc $ifDesc) =~ /^eth\d+$/){ # exclude vlan interfaces. Ex: eth1.5 | ||||
|                 $ethCount++; | ||||
|             }elsif((lc $ifDesc) =~ /^switch/){ | ||||
|                 $switchCount++; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ## If people have other models to further fine-tune this logic that would be great.  | ||||
|         if($ethCount eq 9){ | ||||
|             ## Should be ER Infinity | ||||
|             return "EdgeRouter Infinity" | ||||
|         }if($ethCount eq 8){ | ||||
|             ## Could be ER-8 Pro, ER-8, or EP-R8 | ||||
|             return "EdgeRouter 8-Port" | ||||
|         }elsif($ethCount eq 5 and $cpuCount eq 4){ | ||||
|             ## Could be ER-X or ER-X-SFP | ||||
|             return "EdgeRouter X 5-Port" | ||||
|         }elsif($ethCount eq 5){ | ||||
|             return "EdgeRouter PoE 5-Port" | ||||
|         }elsif($ethCount eq 3 and $cpuCount eq 2){ | ||||
|             return "EdgeRouter LITE 3-Port" | ||||
|         }else{ | ||||
|             ## failback string | ||||
|             return "EdgeRouter eth-$ethCount switch-$switchCount mem-$memTotalReal cpuNum-$cpuCount"; | ||||
|         } | ||||
|          | ||||
|     } | ||||
| } | ||||
|  | ||||
| ## simply take the MAC and clean it up | ||||
| sub serial { | ||||
|     my $ubnt = shift; | ||||
|  | ||||
|     my $serial = $ubnt->mac(); | ||||
|     if($serial){ | ||||
|         $serial =~ s/://g; | ||||
|         return uc $serial; | ||||
|     } | ||||
|     return ; | ||||
| } | ||||
|  | ||||
| ## UBNT doesn't put the primary-mac interface at index 1 | ||||
| sub mac { | ||||
|     my $ubnt = shift; | ||||
|     my $ifDescs = $ubnt->ifDescr; | ||||
|  | ||||
|     foreach my $iid ( keys %$ifDescs ) { | ||||
|         my $ifDesc = $ifDescs->{$iid}; | ||||
|         next unless defined $ifDesc; | ||||
|         ## CPU Interface will have the primary MAC for EdgeSwitch | ||||
|         ## eth0 will have primary MAC for linux-based UBNT devices | ||||
|         if($ifDesc =~ /CPU/ or $ifDesc eq 'eth0'){ | ||||
|             my $mac = $ubnt->ifPhysAddress->{$iid}; | ||||
|  | ||||
|             # syntax stolen from sub munge_mac in SNMP::Info | ||||
|             $mac = lc join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $mac ) ); | ||||
|             return $mac if $mac =~ /^([0-9A-F][0-9A-F]:){5}[0-9A-F][0-9A-F]$/i;   | ||||
|              | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     # MAC malformed or missing | ||||
|     return; | ||||
|  | ||||
| } | ||||
|  | ||||
| sub interfaces { | ||||
|     my $netgear = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $netgear->i_index($partial)       || {}; | ||||
|     my $i_descr    = $netgear->i_description($partial) || {}; | ||||
|     my $return = {}; | ||||
|  | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|         # Slot: 0 Port: 4 Gigabit - Level | ||||
|         if ($i_descr->{$iid} =~ m/([0-9]+)[^0-9]+([0-9]+)/) { | ||||
|             $return->{$iid} = $1 .'/'. $2; | ||||
|             next; | ||||
|         } | ||||
|         # Link Aggregate 4 | ||||
|         if ($i_descr->{$iid} =~ m/Link Aggregate (\d+)/) { | ||||
|             $return->{$iid} = '3/'. $1; | ||||
|             next; | ||||
|         } | ||||
|         # else | ||||
|         $return->{$iid} = $i_descr->{$iid}; | ||||
|     } | ||||
|  | ||||
|     return $return; | ||||
| } | ||||
|  | ||||
| sub i_ignore { | ||||
|     my $l2      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $l2->interfaces($partial) || {}; | ||||
|     my $i_descr    = $l2->i_description($partial) || {}; | ||||
|  | ||||
|     my %i_ignore; | ||||
|     foreach my $if ( keys %$interfaces ) { | ||||
|  | ||||
|         # CPU Interface | ||||
|         if ( $i_descr->{$if} =~ /CPU Interface/i ) { | ||||
|             $i_ignore{$if}++; | ||||
|         } | ||||
|     } | ||||
|     return \%i_ignore; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
| @@ -141,15 +319,23 @@ Returns 'Ubiquiti Networks, Inc.' | ||||
|  | ||||
| =item $ubnt->model() | ||||
|  | ||||
| Returns the model extracted from C<dot11manufacturerProductName>. | ||||
| Returns the model extracted from C<dot11manufacturerProductName>, with failback to some complex logic for EdgeMax devices | ||||
|  | ||||
| =item $ubnt->serial() | ||||
|  | ||||
| Serial Number. | ||||
|  | ||||
| =item $ubnt->mac() | ||||
|  | ||||
| Bridge MAC address. | ||||
|  | ||||
| =item $ubnt->os() | ||||
|  | ||||
| Returns 'Ubiquiti' | ||||
| Returns 'Ubiquiti Networks, Inc.' | ||||
|  | ||||
| =item $ubnt->os_ver() | ||||
|  | ||||
| Returns the software version extracted from C<dot11manufacturerProductVersion>. | ||||
| Returns the software version extracted from C<dot11manufacturerProductVersion>, with failback to description splitting for EdgeMax devices | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -166,6 +352,20 @@ See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ubiquiti->interfaces() | ||||
|  | ||||
| Uses the i_name() field. | ||||
|  | ||||
| =item $ubiquiti->i_ignore() | ||||
|  | ||||
| Ignores interfaces with "CPU Interface" in them. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|   | ||||
| @@ -39,14 +39,14 @@ use SNMP::Info::Layer2; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer2::GLOBALS ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     'ip_adresses'   => 'ipAdEntAddr', | ||||
|     'ip_addresses'  => 'ipAdEntAddr', | ||||
|     'i_name'        => 'ifDescr', | ||||
|     'i_description' => 'adslLineConfProfile', | ||||
| ); | ||||
| @@ -58,7 +58,7 @@ $VERSION = '3.36'; | ||||
|  | ||||
| sub layers { | ||||
|     my $zyxel  = shift; | ||||
|     my $layers = $zyxel->layers(); | ||||
|     my $layers = $zyxel->SUPER::layers(); | ||||
|     return $layers if defined $layers; | ||||
|  | ||||
|     # If these don't claim to have any layers, so we'll give them 1+2 | ||||
| @@ -102,7 +102,9 @@ sub ip { | ||||
|     my $ip_hash = $zyxel->ip_addresses(); | ||||
|     my $found_ip; | ||||
|  | ||||
|     foreach my $ip ( keys %{$ip_hash} ) { | ||||
|     # Since hashes are random add sort so we get the same address each time | ||||
|     # if there happens to be more than one. Will return highest numbered address  | ||||
|     foreach my $ip ( sort keys %{$ip_hash} ) { | ||||
|         $found_ip = $ip | ||||
|             if ( defined $ip | ||||
|             and $ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ ); | ||||
|   | ||||
| @@ -53,7 +53,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -194,29 +194,18 @@ sub root_ip { | ||||
| sub serial { | ||||
|     my $l3 = shift; | ||||
|  | ||||
|     my $serial1 = $l3->serial1(); | ||||
|     my $e_parent = $l3->e_parent() || {}; | ||||
|  | ||||
|     foreach my $iid ( keys %$e_parent ) { | ||||
|         my $parent = $e_parent->{$iid}; | ||||
|         if ( $parent eq '0' ) { | ||||
|             my $serial = $l3->e_serial($iid); | ||||
|             if ( $serial && $serial->{$iid} ) { | ||||
|                 return $serial->{$iid}; | ||||
|             } | ||||
|             else { | ||||
|                 my $descr = $l3->e_descr($iid); | ||||
|                 if ( $descr and $descr =~ /serial#?:\s*([a-z0-9]+)/i ) | ||||
|                 { | ||||
|                     return $1; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     my $entity_serial = $l3->entity_derived_serial(); | ||||
|     if ( defined $entity_serial and $entity_serial !~ /^\s*$/ ){ | ||||
|         return $entity_serial; | ||||
|     } | ||||
|  | ||||
|     return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ ); | ||||
|     my $serial1 = $l3->serial1(); | ||||
|     if ( defined $serial1 and $serial1 !~ /^\s*$/ ) { | ||||
|         return $serial1; | ||||
|     } | ||||
|  | ||||
|     return; | ||||
|  | ||||
| } | ||||
|  | ||||
| # $l3->model() - the sysObjectID returns an IID to an entry in | ||||
| @@ -490,8 +479,7 @@ Removes 'cisco'  from cisco devices for readability. | ||||
|  | ||||
| =item $l3->serial() | ||||
|  | ||||
| Tries to cull a serial number from F<ENTITY-MIB>, description, and | ||||
| F<OLD-CISCO->... MIB. | ||||
| Returns a serial number if found from F<ENTITY-MIB> and F<OLD-CISCO->... MIB. | ||||
|  | ||||
| =item $l3->vendor() | ||||
|  | ||||
|   | ||||
| @@ -41,7 +41,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -69,8 +69,8 @@ $VERSION = '3.36'; | ||||
|     'bp_index2' => 'dot1dBasePortIfIndex', | ||||
|  | ||||
|     # AWC Interface Table (awcIfTable) | ||||
|     'awc_default_mac' => 'awcIfDefaultPhyAddress', | ||||
|     'awc_mac'         => 'awcIfPhyAddress', | ||||
|     'awc_default_mac' => 'awcIfDefaultPhysAddress', | ||||
|     'awc_mac'         => 'awcIfPhysAddress', | ||||
|     'awc_ip'          => 'awcIfIpAddress', | ||||
|     'awc_netmask'     => 'awcIfIpNetMask', | ||||
|     'awc_msdu'        => 'awcIfMSDUMaxLength', | ||||
| @@ -364,13 +364,13 @@ Ignores ports that are of type ``rptr'' and ``lo''. | ||||
|  | ||||
| Gives the default MAC address of each interface. | ||||
|  | ||||
| C<awcIfDefaultPhyAddress> | ||||
| C<awcIfDefaultPhysAddress> | ||||
|  | ||||
| =item $aironet->awc_mac() | ||||
|  | ||||
| Gives the actual MAC address of each interface. | ||||
|  | ||||
| C<awcIfPhyAddress> | ||||
| C<awcIfPhysAddress> | ||||
|  | ||||
| =item $aironet->awc_ip() | ||||
|  | ||||
|   | ||||
| @@ -49,7 +49,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::Layer3; | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE  | ||||
|             $int_include_vpn $fake_idx $type_class/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|             %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -48,14 +48,14 @@ use SNMP::Info::Aggregate 'agg_ports_ifstack'; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::Aggregate::MIBS, | ||||
|     'ARISTA-PRODUCTS-MIB' => 'aristaProducts', | ||||
|     'ARISTA-PRODUCTS-MIB' => 'aristaDCS7124S', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|   | ||||
| @@ -40,7 +40,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info::Bridge; | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE %MODEL_MAP | ||||
|     %MODID_MAP %PROCID_MAP/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|   | ||||
| @@ -36,7 +36,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -47,7 +47,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| @SNMP::Info::Layer3::C3550::EXPORT_OK = qw//; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| # NOTE: Order creates precedence | ||||
| #       Example: v_name exists in Bridge.pm and CiscoVTP.pm | ||||
| @@ -96,8 +96,8 @@ sub ports { | ||||
|     my $c3550 = shift; | ||||
|  | ||||
|     my $id    = $c3550->id(); | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|     if ( $model =~ /(12|24|48)(C|T|TS|G|TS-E|TS-S|T-E)?$/ ) { | ||||
|     my $model = SNMP::translateObj($id); | ||||
|     if ( defined $model && $model =~ /(12|24|48)(C|T|TS|G|TS-E|TS-S|T-E)?$/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -44,7 +44,7 @@ use SNMP::Info::MAU; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|   | ||||
| @@ -51,7 +51,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| # NOTE: Order creates precedence | ||||
| #       Example: v_name exists in Bridge.pm and CiscoVTP.pm | ||||
|   | ||||
							
								
								
									
										330
									
								
								lib/SNMP/Info/Layer3/CheckPoint.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										330
									
								
								lib/SNMP/Info/Layer3/CheckPoint.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,330 @@ | ||||
| # SNMP::Info::Layer3::CheckPoint | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bill Fenner | ||||
| # 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::CheckPoint; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::LLDP; | ||||
|  | ||||
| @SNMP::Info::Layer3::CheckPoint::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::CheckPoint::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'CHECKPOINT-MIB'      => 'fwProduct', | ||||
|     'UCD-SNMP-MIB'        => 'versionTag', | ||||
|     'NET-SNMP-TC'         => 'netSnmpAliasDomain', | ||||
|     'NET-SNMP-EXTEND-MIB' => 'nsExtendNumEntries', | ||||
|     'HOST-RESOURCES-MIB'  => 'hrSystem', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'netsnmp_vers'   => 'versionTag', | ||||
|     'hrSystemUptime' => 'hrSystemUptime', | ||||
|      | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|  | ||||
|     # Net-SNMP Extend table that could but customize to add a the CheckPoint version | ||||
|     'extend_output_table' => 'nsExtendOutputFull', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'checkpoint'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $ckp = shift; | ||||
|     my $id = $ckp->id; | ||||
|  | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|  | ||||
|     if (defined $model) { | ||||
|         $model =~ s/^checkPoint//; | ||||
|         return $model; | ||||
|     } else { | ||||
|         return $id; | ||||
|     } | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'checkpoint'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $ckp = shift; | ||||
|     my $extend_table = $ckp->extend_output_table() || {}; | ||||
|  | ||||
|     my $descr   = $ckp->description(); | ||||
|     my $vers    = $ckp->netsnmp_vers(); | ||||
|     my $os_ver  = undef; | ||||
|  | ||||
|     foreach my $ex (keys %$extend_table) { | ||||
|         (my $name = pack('C*',split(/\./,$ex))) =~ s/[^[:print:]]//g; | ||||
|         if ($name eq 'ckpVersion') { | ||||
|             return $1 if ($extend_table->{$ex} =~ /^This is Check Point's software version (.*)$/); | ||||
|             last; | ||||
|         } | ||||
|     }  | ||||
|  | ||||
|     $os_ver = $1 if ( $descr =~ /^\S+\s+\S+\s+(\S+)\s+/ ); | ||||
|     if ($vers) { | ||||
|         $os_ver = "???" unless defined($os_ver); | ||||
|         $os_ver .= " / Net-SNMP " . $vers; | ||||
|     } | ||||
|  | ||||
|     return $os_ver; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $ckp = shift; | ||||
|     my $extend_table = $ckp->extend_output_table() || {}; | ||||
|  | ||||
|     foreach my $ex (keys %$extend_table) { | ||||
|         (my $name = pack('C*',split(/\./,$ex))) =~ s/[^[:print:]]//g; | ||||
|         if ($name eq 'ckpAsset') { | ||||
|             return $1 if ($extend_table->{$ex} =~ /Serial Number: (\S+)/); | ||||
|             last; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return ''; | ||||
| } | ||||
|  | ||||
| sub layers { | ||||
|     return '01001100'; | ||||
| } | ||||
|  | ||||
| # sysUptime gives us the time since the SNMP daemon has restarted, | ||||
| # so return the system uptime since that's probably what the user | ||||
| # wants.  (Caution: this could cause trouble if using | ||||
| # sysUptime-based discontinuity timers or other TimeStamp | ||||
| # objects. | ||||
| sub uptime { | ||||
|     my $ckp = shift; | ||||
|     my $uptime; | ||||
|  | ||||
|     $uptime = $ckp->hrSystemUptime(); | ||||
|     return $uptime if defined $uptime; | ||||
|  | ||||
|     return $ckp->SUPER::uptime(); | ||||
| } | ||||
|  | ||||
| sub i_ignore { | ||||
|     my $l3      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $l3->interfaces($partial) || {}; | ||||
|  | ||||
|     my %i_ignore; | ||||
|     foreach my $if ( keys %$interfaces ) { | ||||
|  | ||||
|         # lo0 etc | ||||
|         if ( $interfaces->{$if} =~ /\blo\d*\b/i ) { | ||||
|             $i_ignore{$if}++; | ||||
|         } | ||||
|     } | ||||
|     return \%i_ignore; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::CheckPoint - SNMP Interface to CheckPoint Devices | ||||
|  | ||||
| =head1 AUTHORS | ||||
|  | ||||
| Ambroise Rosset | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $ckp = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $ckp->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Generic Net-SNMP devices | ||||
|  | ||||
| =head2 WARNING | ||||
|  | ||||
| To correctly and completelly work, you should add the following line in the file C</etc/snmp/snmpd.local.conf> on each of your CheckPoint devices: | ||||
|  | ||||
|  # Netdisco SNMP configuration | ||||
|  extend  ckpVersion /opt/CPsuite-R77/fw1/bin/fw ver | ||||
|  extend  ckpAsset /bin/clish -c 'show asset all' | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<UCD-SNMP-MIB> | ||||
|  | ||||
| =item F<NET-SNMP-TC> | ||||
|  | ||||
| =item F<HOST-RESOURCES-MIB> | ||||
|  | ||||
| =item 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 $ckp->vendor() | ||||
|  | ||||
| Returns 'checkpoint'. | ||||
|  | ||||
| =item $ckp->model() | ||||
|  | ||||
| Return the model type of the CheckPoint device (Based on the sysObjectOID translation). | ||||
|  | ||||
| =item $ckp->os() | ||||
|  | ||||
| Returns the OS extracted from C<sysDescr>. | ||||
|  | ||||
| =item $ckp->os_ver() | ||||
|  | ||||
| Returns the software version extracted from C<sysDescr>, along | ||||
| with the Net-SNMP version. | ||||
|  | ||||
| =item $ckp->uptime() | ||||
|  | ||||
| Returns the system uptime instead of the agent uptime. | ||||
| NOTE: discontinuity timers and other Time Stamp based objects | ||||
| are based on agent uptime, so use orig_uptime(). | ||||
|  | ||||
| =item $ckp->serial() | ||||
|  | ||||
| Return the serial number of the device if the SNMP server is configured as indicated previously. | ||||
| Return '' in other case. | ||||
|  | ||||
| =item $ckp->layers() | ||||
|  | ||||
| Return '01001100'. | ||||
|  | ||||
| =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 $ckp->i_ignore() | ||||
|  | ||||
| Returns reference to hash.  Increments value of IID if port is to be ignored. | ||||
|  | ||||
| Ignores loopback | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP> for details. | ||||
|  | ||||
| =head1 NOTES | ||||
|  | ||||
| In order to cause SNMP::Info to classify your device into this class, it | ||||
| may be necessary to put a configuration line into your F<snmpd.conf> | ||||
| similar to | ||||
|  | ||||
|   sysobjectid .1.3.6.1.4.1.8072.3.2.N | ||||
|  | ||||
| where N is the object ID for your OS from the C<NET-SNMP-TC> MIB (or | ||||
| 255 if not listed).  Some Net-SNMP installations default to an | ||||
| incorrect return value for C<system.sysObjectId>. | ||||
|  | ||||
| In order to recognize a Net-SNMP device as Layer3, it may be necessary | ||||
| to put a configuration line similar to | ||||
|  | ||||
|   sysservices 76 | ||||
|  | ||||
| in your F<snmpd.conf>. | ||||
|  | ||||
| =cut | ||||
| @@ -55,7 +55,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -128,9 +128,14 @@ sub i_vlan { | ||||
|         if (   $i_type->{$idx} eq 'l2vlan' | ||||
|             || $i_type->{$idx} eq '135' && !defined $i_vlan->{$idx} ) | ||||
|         { | ||||
|             # Not sure where this regex came from, anchored at end? | ||||
|             if ( $i_descr->{$idx} =~ /\.(\d+)$/ ) { | ||||
|                 $i_vlan->{$idx} = $1; | ||||
|             } | ||||
|             # This matches 101 in 'Ethernet0.101-802.1Q vLAN subif' | ||||
|             elsif ( $i_descr->{$idx} =~ /\.(\d+)-/ ) { | ||||
|                 $i_vlan->{$idx} = $1; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return $i_vlan; | ||||
| @@ -138,9 +143,10 @@ sub i_vlan { | ||||
|  | ||||
| sub cisco_comm_indexing {  | ||||
|     my $cisco = shift; | ||||
|     # If we get a VTP version, it's *extremely* likely that the device needs community based indexing | ||||
|     # If we get a VTP version, it's *extremely* likely that the device needs | ||||
|     # community based indexing | ||||
|     my $vtp = $cisco->vtp_version() || '0'; | ||||
|     return ($vtp ne '0'); | ||||
|     return $vtp ? 1 : 0; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|   | ||||
| @@ -45,7 +45,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, ); | ||||
|  | ||||
| @@ -73,8 +73,8 @@ sub b_mac { | ||||
|     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}/ ) { | ||||
|         # don't catch the bad macs with bogus OUI | ||||
|         if ( $mac !~ m/(0{1,2}:){2}(00|01)/ ) { | ||||
|             push( @macs, $mac ); | ||||
|         } | ||||
|         @macs = sort(@macs); | ||||
|   | ||||
| @@ -43,7 +43,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, ); | ||||
|  | ||||
|   | ||||
| @@ -50,7 +50,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::Cisco::MIBS, | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info::Entity; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS, | ||||
| @@ -101,7 +101,7 @@ sub mac { | ||||
|     my $i_mac     = $contivity->i_mac(); | ||||
|  | ||||
|     # Return Interface MAC | ||||
|     foreach my $entry ( keys %$i_mac ) { | ||||
|     foreach my $entry ( sort keys %$i_mac ) { | ||||
|         my $sn = $i_mac->{$entry}; | ||||
|         next unless $sn; | ||||
|         return $sn; | ||||
|   | ||||
							
								
								
									
										306
									
								
								lib/SNMP/Info/Layer3/Cumulus.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								lib/SNMP/Info/Layer3/Cumulus.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,306 @@ | ||||
| # SNMP::Info::Layer3::Cumulus | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2018 Bill Fenner and Oliver Gorwits | ||||
| # 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::Cumulus; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::IEEE802dot3ad 'agg_ports_lag'; | ||||
|  | ||||
| @SNMP::Info::Layer3::Cumulus::ISA = qw/ | ||||
|   SNMP::Info::IEEE802dot3ad | ||||
|   SNMP::Info::LLDP | ||||
|   SNMP::Info::Layer3 | ||||
|   Exporter | ||||
| /; | ||||
| @SNMP::Info::Layer3::Cumulus::EXPORT_OK = qw/ agg_ports /; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::IEEE802dot3ad::MIBS, | ||||
|     'UCD-SNMP-MIB'       => 'versionTag', | ||||
|     'NET-SNMP-TC'        => 'netSnmpAliasDomain', | ||||
|     'HOST-RESOURCES-MIB' => 'hrSystem', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'netsnmp_vers'   => 'versionTag', | ||||
|     'hrSystemUptime' => 'hrSystemUptime', | ||||
|     'chassis'    => 'entPhysicalDescr.1', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::IEEE802dot3ad::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::IEEE802dot3ad::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub vendor { return 'Cumulus Networks' } | ||||
|  | ||||
| sub os { return 'cumulus' } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $netsnmp = shift; | ||||
|     my $descr   = $netsnmp->description(); | ||||
|  | ||||
| # STRING: "Cumulus Linux version 3.5.1 running on innotek GmbH VirtualBox" | ||||
|     return $1 if ( $descr =~ /^Cumulus Linux.+(\d+\.\d+\.\d+)\s/ ); | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $netsnmp = shift; | ||||
|     my $chassis = $netsnmp->chassis(); | ||||
|  | ||||
| # STRING: "Cumulus Networks  VX Chassis" | ||||
|     return $1 if ( $chassis =~ /^Cumulus Networks\s+(.+)/ ); | ||||
|     return $netsnmp->SUPER::model(); | ||||
| } | ||||
|  | ||||
| # sysUptime gives us the time since the SNMP daemon has restarted, | ||||
| # so return the system uptime since that's probably what the user | ||||
| # wants.  (Caution: this could cause trouble if using | ||||
| # sysUptime-based discontinuity timers or other TimeStamp | ||||
| # objects. | ||||
| sub uptime { | ||||
|     my $netsnmp = shift; | ||||
|     my $uptime; | ||||
|  | ||||
|     $uptime = $netsnmp->hrSystemUptime(); | ||||
|     return $uptime if defined $uptime; | ||||
|  | ||||
|     return $netsnmp->SUPER::uptime(); | ||||
| } | ||||
|  | ||||
| # 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. | ||||
| # (code from SNMP/Info/Layer2/Netgear.pm) | ||||
| sub interfaces { | ||||
|     my $netsnmp = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $netsnmp->i_index($partial)       || {}; | ||||
|     my $i_descr    = $netsnmp->i_description($partial) || {}; | ||||
|     my $i_name     = $netsnmp->i_name($partial); | ||||
|     my $i_isset    = (); | ||||
|     # Replace the description with the ifName field, if set | ||||
|     foreach my $iid ( keys %$i_name ) { | ||||
|         my $name = $i_name->{$iid}; | ||||
|         next unless defined $name; | ||||
|         if (defined $name and $name !~ /^\s*$/) { | ||||
|             $interfaces->{$iid} = $name; | ||||
|             $i_isset->{$iid} = 1; | ||||
|         } | ||||
|     } | ||||
|     # Replace the Index with the ifDescr field, appended with index | ||||
|     # number, to deal with devices with non-unique ifDescr. | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|         my $port = $i_descr->{$iid} . '-' . $iid; | ||||
|         next unless defined $port; | ||||
|         next if (defined $i_isset->{$iid} and $i_isset->{$iid} == 1); | ||||
|         $interfaces->{$iid} = $port; | ||||
|     } | ||||
|  | ||||
|     return $interfaces; | ||||
| } | ||||
|  | ||||
| sub i_ignore { | ||||
|     my $l3      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $l3->interfaces($partial) || {}; | ||||
|  | ||||
|     my %i_ignore; | ||||
|     foreach my $if ( keys %$interfaces ) { | ||||
|  | ||||
|         # vlan1@br0 or peerlink.4094@peerlink | ||||
|         if ( $interfaces->{$if} =~ /@/i ) { | ||||
|             $i_ignore{$if}++; | ||||
|         } | ||||
|     } | ||||
|     return \%i_ignore; | ||||
| } | ||||
|  | ||||
| sub agg_ports { return agg_ports_lag(@_) } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::Cumulus - SNMP Interface to Cumulus Networks Devices | ||||
|  | ||||
| =head1 AUTHORS | ||||
|  | ||||
| Oliver Gorwits - based on Layer3::NetSNMP implementation | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $cumulus = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $cumulus->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Cumulus Networks devices | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<UCD-SNMP-MIB> | ||||
|  | ||||
| =item F<NET-SNMP-TC> | ||||
|  | ||||
| =item F<HOST-RESOURCES-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::IEEE802dot3ad> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cumulus->vendor() | ||||
|  | ||||
| Returns 'Cumulus Networks'. | ||||
|  | ||||
| =item $cumulus->os() | ||||
|  | ||||
| Returns 'cumulus'. | ||||
|  | ||||
| =item $cumulus->os_ver() | ||||
|  | ||||
| Returns the software version extracted from C<sysDescr>. | ||||
|  | ||||
| =item $cumulus->uptime() | ||||
|  | ||||
| Returns the system uptime instead of the agent uptime. | ||||
| NOTE: discontinuity timers and other Time Stamp based objects | ||||
| are based on agent uptime, so use orig_uptime(). | ||||
|  | ||||
| =item $l3->model() | ||||
|  | ||||
| Returns the chassis type. | ||||
|  | ||||
| =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. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::IEEE802dot3ad | ||||
|  | ||||
| See documentation in L<SNMP::Info::IEEE802dot3ad> 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 $cumulus->interfaces() | ||||
|  | ||||
| Uses the i_name() field. | ||||
|  | ||||
| =item $cumulus->i_ignore() | ||||
|  | ||||
| Ignores interfaces with an "@" in them. | ||||
|  | ||||
| =item C<agg_ports> | ||||
|  | ||||
| Returns a HASH reference mapping from slave to master port for each member of | ||||
| a port bundle on the device. Keys are ifIndex of the slave ports, Values are | ||||
| ifIndex of the corresponding master ports. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::IEEE802dot3ad | ||||
|  | ||||
| See documentation in L<SNMP::Info::IEEE802dot3ad> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -10,7 +10,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -39,8 +39,13 @@ $VERSION = '3.36'; | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     'dlink_fw' => 'probeSoftwareRev', | ||||
|     'dlink_hw' => 'probeHardwareRev', | ||||
|     'dlink_stp_i_root_port' => 'MSTP_MIB__swMSTPInstRootPort', | ||||
|     'dlink_serial_no' => 'AGENT_GENERAL_MIB__agentSerialNumber', | ||||
|     # Replaced with OID since these MIBs are no longer in the netdisco-mibs | ||||
|     # collection. Commit reference of MIB removal in netdisco-mibs: | ||||
|     # d6ec3f15861e28d220a681e7fa3b222c21664fda | ||||
|     'dlink_stp_i_root_port' => '.1.3.6.1.4.1.171.12.15.2.3.1.18', | ||||
|     'dlink_serial_no' => '.1.3.6.1.4.1.171.12.1.1.12', | ||||
|     # TODO: hardcoded OIDs using get() in method calls below should be | ||||
|     # replaced similarly and use the library getter methods | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE, ); | ||||
| @@ -124,3 +129,90 @@ sub stp_i_root_port { | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::DLink - SNMP Interface to DLink Devices | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $dlink = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $dlink->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Vyatta Devices running dlink. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $dlink->model() | ||||
|  | ||||
| Returns the ID or else description. | ||||
|  | ||||
| =item $dlink->vendor() | ||||
|  | ||||
| Returns 'dlink'. | ||||
|  | ||||
| =item $dlink->serial() | ||||
|  | ||||
| Returns serial number. | ||||
|  | ||||
| =item $dlink->fwver() | ||||
|  | ||||
| Returns the firmware version. | ||||
|  | ||||
| =item $dlink->hwver() | ||||
|  | ||||
| Returns the hardware version. | ||||
|  | ||||
| =item $dlink->stp_i_root_port() | ||||
|  | ||||
| Returns the STP root port. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| =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::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -40,21 +40,23 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'RADLAN-COPY-MIB'                => 'rlCopySourceLocation', | ||||
|     'RADLAN-Physicaldescription-MIB' => 'rlPhdStackReorder', | ||||
|     'RADLAN-rlInterfaces'            => 'rlIfNumOfLoopbackPorts', | ||||
|     'RADLAN-HWENVIROMENT'            => 'rlEnvPhysicalDescription', | ||||
|     'Dell-Vendor-MIB'                => 'productIdentificationVersion', | ||||
|     'DELL-REF-MIB'                   => 'dell6224Switch', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'os_ver'       => 'productIdentificationVersion', | ||||
|     'dell_os_ver'  => 'productIdentificationVersion', | ||||
|     'dell_id_name' => 'productIdentificationDisplayName', | ||||
| ); | ||||
|  | ||||
| @@ -114,16 +116,22 @@ sub model { | ||||
|     my $dell = shift; | ||||
|  | ||||
|     my $name  = $dell->dell_id_name(); | ||||
|     my $descr = $dell->description(); | ||||
|     my $id    = $dell->id(); | ||||
|  | ||||
|     if ( defined $name and $name =~ m/(\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|  | ||||
|     # Don't have a vendor MIB for D-Link | ||||
|     else { | ||||
|         return $descr; | ||||
|     return unless defined $id; | ||||
|  | ||||
|     my $model = SNMP::translateObj($id); | ||||
|  | ||||
|     if (defined $model) { | ||||
|         $model =~ s/^dell//; | ||||
|         $model =~ s/Switch$//; | ||||
|         return $model; | ||||
|     } | ||||
|     return $id; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
| @@ -138,19 +146,19 @@ sub os { | ||||
|     return $dell->_vendor(); | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
| sub os_ver { | ||||
|     my $dell = shift; | ||||
|  | ||||
|     my $numbers = $dell->dell_serial_no(); | ||||
|  | ||||
|     foreach my $key ( keys %$numbers ) { | ||||
|         my $serial = $numbers->{$key}; | ||||
|         return $serial if ( defined $serial and $serial !~ /^\s*$/ ); | ||||
|         next; | ||||
|     my $entity_os = $dell->entity_derived_os_ver(); | ||||
|     if ( defined $entity_os and $entity_os !~ /^\s*$/ ){ | ||||
|         return $entity_os; | ||||
|     } | ||||
|  | ||||
|     # Last resort | ||||
|     return $dell->SUPER::serial(); | ||||
|     my $dell_os  = $dell->dell_os_ver(); | ||||
|     if ( defined $dell_os and $dell_os !~ /^\s*$/ ) { | ||||
|         return $dell_os; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| # check all fans, and report overall status | ||||
| @@ -159,41 +167,74 @@ sub fan { | ||||
|  | ||||
|     my $fan   = $dell->dell_fan_desc()  || {}; | ||||
|     my $state = $dell->dell_fan_state() || {}; | ||||
|     my @messages = (); | ||||
|      | ||||
|     if (scalar keys %$fan) { | ||||
|         my @messages = (); | ||||
|  | ||||
|     foreach my $k (keys %$fan) { | ||||
|         next if $state->{$k} and $state->{$k} eq 'normal'; | ||||
|         push @messages, "$fan->{$k}: $state->{$k}"; | ||||
|     } | ||||
|         foreach my $k (keys %$fan) { | ||||
|             next if $state->{$k} and $state->{$k} eq 'normal'; | ||||
|             push @messages, "$fan->{$k}: $state->{$k}"; | ||||
|         } | ||||
|  | ||||
|     push @messages, ((scalar keys %$fan). " fans OK") | ||||
|       if scalar @messages == 0; | ||||
|         push @messages, ((scalar keys %$fan). " fans OK") | ||||
|             if scalar @messages == 0; | ||||
|  | ||||
|     return (join ", ", @messages); | ||||
|         return (join ", ", @messages); | ||||
|         } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub _ps_status { | ||||
|     my ($dell, $unit) = @_; | ||||
| sub ps1_type { | ||||
|     my $dell = shift; | ||||
|  | ||||
|     my $status = 'unknown'; | ||||
|     return $status if !defined $unit; | ||||
|     my $src  = $dell->dell_pwr_src()  || {}; | ||||
|  | ||||
|     my $desc  = $dell->dell_pwr_desc()  || {}; | ||||
|     my $state = $dell->dell_pwr_state() || {}; | ||||
|  | ||||
|     foreach my $k (keys %$desc) { | ||||
|         next unless $desc->{$k} and $desc->{$k} eq "ps1_unit$unit"; | ||||
|         return ($state->{$k} || $status); | ||||
|     foreach my $k (sort keys %$src) { | ||||
|         next unless $src->{$k}; | ||||
|         return $src->{$k}; | ||||
|     } | ||||
|  | ||||
|     return $status; | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub ps1_type { return 'internalRedundant' } | ||||
| sub ps2_type { return 'internalRedundant' } | ||||
| sub ps2_type { | ||||
|     my $dell = shift; | ||||
|  | ||||
| sub ps1_status { return (shift)->_ps_status(1) } | ||||
| sub ps2_status { return (shift)->_ps_status(2) } | ||||
|     my $src  = $dell->dell_pwr_src()  || {}; | ||||
|      | ||||
|     my $i = 0;  | ||||
|     foreach my $k (sort keys %$src) { | ||||
|         $i++; | ||||
|         next unless $src->{$k} and $i == 2; | ||||
|         return $src->{$k}; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub ps1_status { | ||||
|     my $dell = shift; | ||||
|  | ||||
|     my $status  = $dell->dell_pwr_state()  || {}; | ||||
|  | ||||
|     foreach my $k (sort keys %$status) { | ||||
|         next unless $status->{$k}; | ||||
|         return $status->{$k}; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub ps2_status { | ||||
|     my $dell = shift; | ||||
|  | ||||
|     my $status  = $dell->dell_pwr_state()  || {}; | ||||
|      | ||||
|     my $i = 0;  | ||||
|     foreach my $k (sort keys %$status) { | ||||
|         $i++; | ||||
|         next unless $status->{$k} and $i == 2; | ||||
|         return $status->{$k}; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub interfaces { | ||||
|     my $dell    = shift; | ||||
| @@ -213,6 +254,23 @@ sub interfaces { | ||||
|     return $i_descr; | ||||
| } | ||||
|  | ||||
| sub i_duplex { | ||||
|     my $dell    = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $dell_duplex = $dell->dell_duplex($partial) || {}; | ||||
|  | ||||
|     my %i_duplex; | ||||
|     foreach my $if ( keys %$dell_duplex ) { | ||||
|         my $duplex = $dell_duplex->{$if}; | ||||
|         next unless defined $duplex; | ||||
|         next if $duplex eq 'unknown'; | ||||
|  | ||||
|         $i_duplex{$if} = $duplex; | ||||
|     } | ||||
|     return \%i_duplex; | ||||
| } | ||||
|  | ||||
| sub i_duplex_admin { | ||||
|     my $dell    = shift; | ||||
|     my $partial = shift; | ||||
| @@ -225,11 +283,11 @@ sub i_duplex_admin { | ||||
|     foreach my $if ( keys %$interfaces ) { | ||||
|         my $duplex = $dell_duplex->{$if}; | ||||
|         next unless defined $duplex; | ||||
|         my $auto = $dell_auto->{$if} || 'false'; | ||||
|         my $auto = $dell_auto->{$if} || 'disabled'; | ||||
|  | ||||
|         $duplex = 'half' if ( $duplex =~ /half/i and $auto =~ /false/i ); | ||||
|         $duplex = 'full' if ( $duplex =~ /half/i and $auto =~ /false/i ); | ||||
|         $duplex = 'auto' if $auto =~ /true/i; | ||||
|         $duplex = 'half' if ( $duplex eq 'half' and $auto eq 'disabled' ); | ||||
|         $duplex = 'full' if ( $duplex eq 'full' and $auto eq 'disabled' ); | ||||
|         $duplex = 'auto' if $auto eq 'enabled'; | ||||
|         $i_duplex_admin{$if} = $duplex; | ||||
|     } | ||||
|     return \%i_duplex_admin; | ||||
| @@ -241,7 +299,6 @@ sub _vendor { | ||||
|     my $id = $dell->id() || 'undef'; | ||||
|     my %oidmap = ( | ||||
|         2    => 'ibm', | ||||
|         171  => 'dlink', | ||||
|         674  => 'dell', | ||||
|         3955 => 'linksys', | ||||
|     ); | ||||
| @@ -251,7 +308,7 @@ sub _vendor { | ||||
|         return $oidmap{$id}; | ||||
|     } | ||||
|     else { | ||||
|         return 'dlink'; | ||||
|         return $id; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -448,6 +505,10 @@ Returns the map between SNMP Interface Identifier (iid) and physical port | ||||
| name.  Uses name if available instead of description since descriptions are  | ||||
| sometimes not unique. | ||||
|  | ||||
| =item $dell->i_duplex() | ||||
|  | ||||
| Returns reference to map of IIDs to current link duplex. | ||||
|  | ||||
| =item $dell->i_duplex_admin() | ||||
|  | ||||
| Returns reference to hash of iid to current link administrative duplex | ||||
|   | ||||
							
								
								
									
										205
									
								
								lib/SNMP/Info/Layer3/ERX.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								lib/SNMP/Info/Layer3/ERX.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | ||||
| # SNMP::Info::Layer3::ERX | ||||
| # | ||||
| # Copyright (c) 2017 Rob Woodward | ||||
| # 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::ERX; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer3::ERX::ISA = qw/ | ||||
|   SNMP::Info::Layer3 | ||||
|   Exporter | ||||
| /; | ||||
| @SNMP::Info::Layer3::ERX::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
|   return "Juniper"; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|   my $ERX = shift; | ||||
|   my $descr = $ERX->description() || ''; | ||||
|   my $model = undef; | ||||
|  | ||||
|   $model = $1 if ( $descr =~ /Juniper Networks, Inc. (.+) Edge Routing Switch/i ); | ||||
|  | ||||
|   return $model; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|   return 'JunOSe'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|   my $ERX = shift; | ||||
|   my $descr  = $ERX->description(); | ||||
|   my $os_ver = undef; | ||||
|  | ||||
|   if ( $descr =~ /Version : \((.+)\) .+:/ ) { | ||||
|     $os_ver = $1; | ||||
|   } | ||||
|  | ||||
|   return $os_ver; | ||||
| } | ||||
|  | ||||
| sub i_ignore { | ||||
|   my $l3      = shift; | ||||
|   my $partial = shift; | ||||
|  | ||||
|   my $interfaces = $l3->interfaces($partial) || {}; | ||||
|  | ||||
|   my %i_ignore; | ||||
|   foreach my $if ( keys %$interfaces ) { | ||||
|     # lo0 etc | ||||
|     if ( $interfaces->{$if} =~ /\b(inloopback|console)\d*\b/i ) { | ||||
|       $i_ignore{$if}++; | ||||
|     } | ||||
|   } | ||||
|   return \%i_ignore; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::ERX - SNMP Interface to ERX Layer 3 routers. | ||||
|  | ||||
| =head1 AUTHORS | ||||
|  | ||||
| Rob Woodward | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $ERX = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $ERX->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Juniper ERX switches | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ERX->vendor() | ||||
|  | ||||
| Returns 'Juniper'. | ||||
|  | ||||
| =item $ERX->os() | ||||
|  | ||||
| Returns 'JunOSe'. | ||||
|  | ||||
| =item $ERX->os_ver() | ||||
|  | ||||
| Returns the software version extracted from C<sysDescr>. | ||||
|  | ||||
| =item $ERX->model() | ||||
|  | ||||
| Returns the hardware model extracted from C<sysDescr>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =head1 TABLE ENTRIES | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ERX->i_ignore() | ||||
|  | ||||
| Returns reference to hash. Increments value of IID if port is to be ignored. | ||||
|  | ||||
| Ignores InLoopback and Console interfaces | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -44,7 +44,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS, | ||||
|   | ||||
| @@ -46,7 +46,7 @@ use SNMP::Info::EDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -38,7 +38,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -43,13 +43,13 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'F10-PRODUCTS-MIB' => 'f10Products', | ||||
|     'F10-PRODUCTS-MIB' => 'f10ESeriesProducts', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| @@ -89,7 +89,7 @@ sub os_ver { | ||||
|     my $descr   = $force10->description(); | ||||
|     my $os_ver  = undef; | ||||
|  | ||||
|     $os_ver = $1 if ( $descr =~ /Force10\s+Application\s+Software\s+Version:\s+(\S+)/s ); | ||||
|     $os_ver = $1 if ( $descr =~ /\s+Application\s+Software\s+Version:\s+(\S+)/s ); | ||||
|  | ||||
|     return $os_ver; | ||||
| } | ||||
|   | ||||
| @@ -39,7 +39,7 @@ use SNMP::Info::Layer3; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
| @@ -48,7 +48,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -61,6 +61,7 @@ $VERSION = '3.36'; | ||||
|     'FOUNDRY-SN-STACKING-MIB'     => 'snStackingOperUnitRole', | ||||
|     'FOUNDRY-POE-MIB'             => 'snAgentPoeGblPowerCapacityTotal', | ||||
|     'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode', | ||||
|     'BROCADE-PRODUCTS-MIB'        => 'brocadeProducts', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| # SNMP::Info::Layer3::H3C | ||||
| # | ||||
| # Copyright (c) 2012 Jeroen van Ingen | ||||
| # Copyright (c) 2018 Jeroen van Ingen | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| @@ -47,7 +47,7 @@ use SNMP::Info::IEEE802dot3ad 'agg_ports_lag'; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -71,12 +71,14 @@ $VERSION = '3.36'; | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::IEEE802dot3ad::FUNCS, | ||||
|     i_duplex_admin => 'hh3cifEthernetDuplex', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::IEEE802dot3ad::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
| @@ -85,6 +87,20 @@ sub vendor { | ||||
|     return $mfg->{1} || "H3C"; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $h3c = shift; | ||||
|      | ||||
|     my $descr = $h3c->description(); | ||||
|     if ($descr =~ /^.*\n(.*)\n/) { | ||||
|         return $1; | ||||
|     } elsif ($h3c->entPhysicalClass(2)->{2} =~ /^(3|chassis)$/) { | ||||
|         return $h3c->entPhysicalName(2)->{2}; | ||||
|     } else { | ||||
|         my $id = $h3c->id(); | ||||
|         return &SNMP::translateObj($id) || $id; | ||||
|     } | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     my $h3c = shift; | ||||
|     my $descr   = $h3c->description(); | ||||
| @@ -193,6 +209,10 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $h3c->model() | ||||
|  | ||||
| Returns the model from C<sysObjectID> or C<entPhysicalClass>. | ||||
|  | ||||
| =item $h3c->vendor() | ||||
|  | ||||
| Returns value for C<entPhysicalMfgName.1>. | ||||
| @@ -247,4 +267,8 @@ See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::IEEE802dot3ad | ||||
|  | ||||
| See documentation in L<SNMP::Info::IEEE802dot3ad> for details. | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -42,7 +42,7 @@ use SNMP::Info::LLDP; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.36'; | ||||
| $VERSION = '3.58'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user