Compare commits
	
		
			337 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 31b231804f | ||
|  | a4c66663c1 | ||
|  | b9e054093a | ||
|  | 1c7320ce1e | ||
|  | 50841b5109 | ||
|  | babbbb4e57 | ||
|  | e2544129bc | ||
|  | 39b5b3af9f | ||
|  | a263f54744 | ||
|  | 543072ca25 | ||
|  | 39356d72b4 | ||
|  | e013ac3a20 | ||
|  | a85c7a0404 | ||
|  | 4852ed4668 | ||
|  | d36fce44d0 | ||
|  | 60e63ac9cc | ||
|  | a97c48546c | ||
|  | dd96147712 | ||
|  | 912bf62e9b | ||
|  | 0791b7cccb | ||
|  | 78c194faee | ||
|  | 9d00126c83 | ||
|  | 6fa54dd4db | ||
|  | eb6420125e | ||
|  | 51be2d5dc5 | ||
|  | 762a01e619 | ||
|  | f0fb351137 | ||
|  | 6d39026616 | ||
|  | 723f8ea744 | ||
|  | f941f432e9 | ||
|  | 631f99f97b | ||
|  | 1840089789 | ||
|  | 36029e38a7 | ||
|  | 3abffc4d59 | ||
|  | 0f01c6c07c | ||
|  | 68b001105d | ||
|  | d459dd7f8c | ||
|  | 75a00fabe9 | ||
|  | 091a3692e3 | ||
|  | 3bcc522590 | ||
|  | 6c8d39d746 | ||
|  | b6720a2b43 | ||
|  | 6753b795b9 | ||
|  | cefbcce8e3 | ||
|  | 910c5420e3 | ||
|  | 02c8ed0764 | ||
|  | fda13addf0 | ||
|  | 211a06dbf1 | ||
|  | e886190e8e | ||
|  | 8b3a1fd357 | ||
|  | e7adf92b59 | ||
|  | 7de14a2bd9 | ||
|  | f37225ee9a | ||
|  | 52f9042ef0 | ||
|  | d38ef69120 | ||
|  | 6341ad15f8 | ||
|  | f3f01d5f15 | ||
|  | 23d11551c6 | ||
|  | 73b63c8379 | ||
|  | 2652998aba | ||
|  | 254bfd11a3 | ||
|  | 2c61248016 | ||
|  | 45e56b332e | ||
|  | 8003691e64 | ||
|  | 25b1801fe4 | ||
|  | 737bb252a7 | ||
|  | 14e0aa0952 | ||
|  | e7d83a5918 | ||
|  | bfbb2fb2ab | ||
|  | c8f686b7aa | ||
|  | 77fa064db5 | ||
|  | 6b70ccfd79 | ||
|  | 9b1995e90f | ||
|  | 75785f70c7 | ||
|  | ea9ad92cc4 | ||
|  | ad8762a7c4 | ||
|  | c73bc0ca2c | ||
|  | 07de5e53e3 | ||
|  | 141812bf4d | ||
|  | 2308826147 | ||
|  | 01fa098078 | ||
|  | 167cc2f3fa | ||
|  | ea53f79bb8 | ||
|  | 4b75ef1889 | ||
|  | c4ce6a2062 | ||
|  | 9e4e0e3510 | ||
|  | c0228965f4 | ||
|  | 0896bd881c | ||
|  | 42395d49fd | ||
|  | e08d22d51c | ||
|  | f0b429039e | ||
|  | d63baa2473 | ||
|  | e8b4acbee6 | ||
|  | b4734ea607 | ||
|  | 6698b049a4 | ||
|  | 68861fabfb | ||
|  | d93e3ab1b6 | ||
|  | bfd71b5add | ||
|  | 9c8e8fa4e0 | ||
|  | 2e2c6958d6 | ||
|  | 4ba91f9df8 | ||
|  | 3b604723bd | ||
|  | a2877729ff | ||
|  | 605ae68f6b | ||
|  | ef8afd8b65 | ||
|  | 9365c67a6b | ||
|  | 8e3f10673e | ||
|  | cc95604bd9 | ||
|  | 6799312ad0 | ||
|  | 8dee0fcd12 | ||
|  | dca78048c7 | ||
|  | 014d32cec1 | ||
|  | 477d845c39 | ||
|  | 6e5155ffbf | ||
|  | 39679992f0 | ||
|  | 4dee43a863 | ||
|  | 5c599bd3d2 | ||
|  | be0dbf6953 | ||
|  | a59572b392 | ||
|  | 19cdb388e5 | ||
|  | e68fa13289 | ||
|  | d938a2c0d6 | ||
|  | 16285ce2eb | ||
|  | e356189010 | ||
|  | 4230a07c94 | ||
|  | f2b0f67b5f | ||
|  | a8766a0b0b | ||
|  | b78b1b4860 | ||
|  | 6118b0d012 | ||
|  | ca48defd24 | ||
|  | 93787c4c45 | ||
|  | 5562144209 | ||
|  | b28f81adbb | ||
|  | 64846ed2de | ||
|  | d7d747af67 | ||
|  | 41e9332420 | ||
|  | 23613800b2 | ||
|  | 8100461520 | ||
|  | 07afff6ef0 | ||
|  | 400c26a1d7 | ||
|  | b6f7df332b | ||
|  | e5eee009b3 | ||
|  | bb731c6368 | ||
|  | a418ba0a1e | ||
|  | cea462662d | ||
|  | f3a8b1171b | ||
|  | bb773ccc0a | ||
|  | 61dc499369 | ||
|  | d806795a86 | ||
|  | 91f92f0fb9 | ||
|  | bde8da5e6b | ||
|  | f134368e6d | ||
|  | a6ff166e4e | ||
|  | 3ea6bd6217 | ||
|  | 6405ebfc3e | ||
|  | 94ab114cd3 | ||
|  | 954f58fdbc | ||
|  | 8232e783fa | ||
|  | 5aa21deb07 | ||
|  | b7ac11222a | ||
|  | b24da8c380 | ||
|  | ab2be759af | ||
|  | 78e5528c0d | ||
|  | 01ce4238dd | ||
|  | a82e8e32a0 | ||
|  | 770ab9c8ec | ||
|  | f63a71910c | ||
|  | 8fa27f8844 | ||
|  | ea59fa2c2d | ||
|  | a1769aa905 | ||
|  | 78119d6547 | ||
|  | f27d76fa9d | ||
|  | 4f8534169a | ||
|  | f531c9d9a7 | ||
|  | 1a80138026 | ||
|  | 4ff904f3cd | ||
|  | 721193ccb8 | ||
|  | b263fa4375 | ||
|  | 4681004b52 | ||
|  | 0ab688964f | ||
|  | 7e0ef60e24 | ||
|  | 41339c8df4 | ||
|  | 119c077d25 | ||
|  | 9af3f7c579 | ||
|  | e7c93b7abd | ||
|  | 20b655c7a2 | ||
|  | 9fca5b1e42 | ||
|  | 1c581f8e8f | ||
|  | 8d35e15624 | ||
|  | 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 | 
							
								
								
									
										29
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,20 @@ | ||||
| <!--- Provide a general summary of the issue in the Title above --> | ||||
| <!--- https://guides.github.com/features/mastering-markdown/#examples --> | ||||
| <!--- | ||||
|  | ||||
| READ THIS FIRST! | ||||
| ---------------- | ||||
|  | ||||
| the more info you can provide, the easier it is for us the help you, so please | ||||
| fill out as many of the items below as possible. | ||||
|  | ||||
| Provide a general summary of the issue in the Title above | ||||
|  | ||||
| when including netdisco config snippets, whitespace matters since it's a yaml file | ||||
| for github issues it really helps if you include the relevant config parts in a codeblock (code fencing) | ||||
| see the "code" subject on https://guides.github.com/features/mastering-markdown/ for that) | ||||
| this should preserve spaces in the issue tracker and make troubleshooting quicker | ||||
|  | ||||
| --> | ||||
|  | ||||
|  | ||||
| ## Expected Behavior | ||||
| <!--- If you're describing a bug, tell us what should happen --> | ||||
| @@ -25,6 +40,16 @@ | ||||
| <!--- How has this issue affected you? What are you trying to accomplish? --> | ||||
| <!--- Providing context helps us come up with a solution that is most useful in the real world --> | ||||
|  | ||||
| ## Your Device | ||||
| <!--- Some basic info about your device will help out pinpointing the issue more easily --> | ||||
| <!--- also, snmpwalk output of the following oid helps out a lot: .1.3.6.1.2.1.1 --> | ||||
| <!--- this is the system leaf of the snmp mib-2 --> | ||||
| * Vendor: | ||||
| * Device Model: | ||||
| * Operating System Version: | ||||
| * Snmpwalk output of .1.3.6.1.2.1.1: | ||||
|  | ||||
|  | ||||
| ## Your Environment | ||||
| <!--- Include as many relevant details about the environment you experienced the bug in --> | ||||
| * SNMP::Info version used:  | ||||
|   | ||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -9,3 +9,5 @@ Makefile* | ||||
| Build | ||||
| _build | ||||
| blib | ||||
| cover_db | ||||
| .idea | ||||
|   | ||||
							
								
								
									
										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 | ||||
|  | ||||
							
								
								
									
										18
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -1,4 +1,9 @@ | ||||
| language: perl | ||||
| perl: | ||||
|   - "5.30" | ||||
|   - "5.10" | ||||
| os: linux | ||||
| dist: trusty | ||||
| addons: | ||||
|   apt: | ||||
|     packages: | ||||
| @@ -12,10 +17,8 @@ before_install: | ||||
|   - mkdir ~/netdisco-mibs | ||||
|   - cd ~/netdisco-mibs | ||||
| install: | ||||
|   - > | ||||
|     curl -sL https://downloads.sourceforge.net/project/netdisco/netdisco-mibs/latest-snapshot/netdisco-mibs-snapshot.tar.gz | | ||||
|       tar --strip-components=1 -zxf - | ||||
|   - cpanm --quiet --notest PkgConfig Test::CChecker Alien::zlib::Static Alien::OpenSSL::Static Alien::SNMP::MAXTC | ||||
|   - curl -sL https://api.github.com/repos/netdisco/netdisco-mibs/releases/latest | jq -r '.tarball_url' | xargs -n1 curl -sL | tar --strip-components=1 -zxf - | ||||
|   - cpanm --quiet --notest PkgConfig Test::CChecker Alien::zlib::Static Alien::OpenSSL::Static Alien::SNMP | ||||
| before_script: | ||||
|   - 'cd ${TRAVIS_BUILD_DIR}' | ||||
| script: | ||||
| @@ -26,6 +29,11 @@ script: | ||||
| notifications: | ||||
|   irc: | ||||
|     on_success: change | ||||
|     on_failure: always | ||||
|     on_failure: change | ||||
|     channels: | ||||
|       - 'chat.freenode.net#netdisco' | ||||
| #  email: | ||||
| #    on_success: always | ||||
| #    on_failure: always | ||||
| #    recipients: | ||||
| #      - 'snmp-info-cvs@lists.sourceforge.net' | ||||
|   | ||||
							
								
								
									
										11
									
								
								Build.PL
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								Build.PL
									
									
									
									
									
								
							| @@ -16,6 +16,7 @@ Module::Build->new( | ||||
|   requires => { | ||||
|     'SNMP' => '0', | ||||
|     'Math::BigInt' => '0', | ||||
|     'NetAddr::IP' => '4.068', | ||||
|   }, | ||||
|   recommends => { | ||||
|     'PPI' => '0', | ||||
| @@ -27,6 +28,16 @@ Module::Build->new( | ||||
|   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', | ||||
|     'NetSNMP::default_store' => '0', | ||||
|     'Module::Find' => '0', | ||||
|     'Hook::LexWrap' => '0', | ||||
|   }, | ||||
|   # script_files => [ | ||||
|   # ], | ||||
|   | ||||
							
								
								
									
										359
									
								
								Changes
									
									
									
									
									
								
							
							
						
						
									
										359
									
								
								Changes
									
									
									
									
									
								
							| @@ -1,3 +1,358 @@ | ||||
| Version 3.71 (2020-11-27) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|  | ||||
|   * #386 Teltonika RUT9XX support (jeroenvis) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #398, 411 more ubiquiti cleanup and support for er-12 (lbegnaud & inphobia) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #409, 410 Don't add AUTOLOAD generated methods in symbol table | ||||
|   * #372, 375 fix lldp on nx-os6 (inphobia) | ||||
|  | ||||
| Version 3.70 (2019-10-15) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|  | ||||
|   * #361 Siemens Scalance switch support | ||||
|   * #365 Ciena Layer3 support | ||||
|   * #368 DOCSIS cable modem support | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #350 ubiquiti version string cleanup (LBegnaud) | ||||
|   * #352 duplex support for ciscosb | ||||
|   * #353 report all vendor names in lowercase | ||||
|   * #353 sprinkle "use warnings" and "use strict" around | ||||
|   * #358 prefer checkpoint mib over net-snmp mib (earendilfr)  | ||||
|   * #359 detect newer ios-xe using codenames (Christoph Neuhaus) | ||||
|   * #367 test using latest MIBs version dynamically | ||||
|   * #370 smarter Q-BRIDGE handling | ||||
|   * poe power usage & mac address for ciscosb | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #353 doc fixes: report all required mibs for each module as based on code | ||||
|   * #353 include fixes: don't include modules already imported from parent classes | ||||
|   * #355 fix #252, don't think 6char devices names are mac addresses | ||||
|   * #363 clean return calls in code | ||||
|   * #364 strip newline from neoteris os_ver, fixes netdisco #647 | ||||
|  | ||||
| Version 3.68 (2019-04-28) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|  | ||||
|   * initial support for redlion cellular routers (inphobia) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * use pulsesecure mib in layer7::neoteris instead of juniper-ive | ||||
|  | ||||
| Version 3.67 (2019-04-20) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|  | ||||
|   * #323 initial Lenovo / cnos support (inphobia) | ||||
|   * #317 #326 DOCSIS Head End support (Pyro3d) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * add v3 Context update() tests for net-snmp 5.8+ | ||||
|   * support INFO_TRACE and SNMP_TRACE environment variables for Debug | ||||
|   * #324 clean up exinda and add regression test | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #294 snmp::info should show full class used | ||||
|   * #297 perl 5.28 removal of "use vars" | ||||
|   * #306 fix incorrect interfaces for d-link | ||||
|   * #319 make fortinet return a useful interface name (inphobia) | ||||
|   * #320 improve duplicate interfaces() fixup | ||||
|   * #321 clean interface descriptions of null and trailing space | ||||
|   * #322 #327 full fix for aerohive tests | ||||
|   * #325 lazy load legacy RFC1213-MIB only if needed | ||||
|   * #496 fix for aerohive wireless clients support (inphobia) | ||||
|  | ||||
| Version 3.66 (2019-03-24) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|  | ||||
|   * #316 add support for IS-IS routing protocol (pyro3d) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * switch to Alien::SNMP for travis builds (ollyg) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * clarify MRO usage | ||||
|  | ||||
| Version 3.65 (2019-02-24) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #296 expand CiscoAgg to also include LACP (inphobia) | ||||
|   * #308 update VyOS enterprise OID | ||||
|   * #310 bring layer3::oneaccess up to date for oneos6. (inphobia) | ||||
|   * Add two more HP 2930F models (JeroenvIS) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #295 make CiscoAgg return ifindex instead of bp_index (inphobia) | ||||
|   * more documentation fixes + whitespace cleanup in all files | ||||
|  | ||||
| Version 3.64 (2018-12-30) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|  | ||||
|   * #283 support for Exinda/GFI traffic shapers (inphobia) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #282 Aerohive base MAC lookup (inphobia) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * many documentation fixes (inphobia) | ||||
|  | ||||
| Version 3.63 (2018-11-25) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #280 update to retrieve Aerohive serial (inphobia / nick n.) | ||||
|   * #271 update os_ver for Alcatel-Lucent (stromsoe) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #273 remove old ADTRAN modules not in netdisco-mibs | ||||
|  | ||||
| Version 3.62 (2018-10-29) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #278 Support for Cisco Firepower Threat Defense | ||||
|   * #275 Document peth_port_ifindex for Junipers | ||||
|   * #274 Add peth_port_ifindex override for Junipers | ||||
|   * #270 Add support for additional Mikrotik models | ||||
|   * Add HP 3810M, 2930M, 2930F and 2540 series switches | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #265 Fix typos in L3::Huawei | ||||
|  | ||||
| Version 3.61 (2018-05-09) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #255 IPv6 support - Set the transport-specifier if given an IPv6 address | ||||
|   * #195 IP address table - IPv4 Address Table will use the | ||||
|      IP-MIB::ipAddressTable if the deprecated IP-MIB::ipAddrTable doesn't | ||||
|      return results | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #261 EIGRP Peer Neighbor Formatting / Munge | ||||
|   * #252 Unpack binary MAC if present in cdp_port | ||||
|   * Fix SNMPv1 cdp_run check | ||||
|  | ||||
| Version 3.60 (2018-05-06) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #263 detect Aerohive ap250 & ap230 models (inphobia) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * #140 LLDP fixes - treat remote port type of 'local' as an interface name if | ||||
|     the remote port id doesn't look like an index | ||||
|   * Fix potential issue in enumeration of LLDP reported system capabilities | ||||
|     supported by the remote system due to the 'lldpRemSysCapSupported' leaf | ||||
|     name being defined in multiple MIBs | ||||
|  | ||||
| Version 3.59 (2018-05-01) | ||||
|  | ||||
|   [NEW FEATURES] | ||||
|  | ||||
|   * #214 SNMP::Info Device models Genua, ATMedia, Liebert | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * Capture base MAC in L3::Huawei | ||||
|   * Change _lldp_addr_index to a method so it can be properly overridden in | ||||
|     subclasses | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * Capture fan and power supply status in L3::Huawei when description is | ||||
|     not available | ||||
|  | ||||
| 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] | ||||
| @@ -35,13 +390,13 @@ version 3.41 (2018-02-01) | ||||
|  | ||||
|   [BUG FIXES] | ||||
|  | ||||
|   * Fixes to distriution metadata | ||||
|   * Fixes to distribution metadata | ||||
|  | ||||
| version 3.40 (2018-01-28) | ||||
|  | ||||
|   [ENHANCEMENTS] | ||||
|  | ||||
|   * #240 Support for CheckPoint devies through SNMP | ||||
|   * #240 Support for CheckPoint devices through SNMP | ||||
|   * #240 Cisco SB switches fixup | ||||
|   * #244 Add Adtran support | ||||
|   * #241 Vyatta/VyOS support | ||||
|   | ||||
							
								
								
									
										16
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								LICENSE
									
									
									
									
									
								
							| @@ -6,7 +6,7 @@ Original Code | ||||
| Copyright (c) 2002,2003 Regents of the University of California | ||||
| All rights reserved. | ||||
|  | ||||
| Redistribution and use in source and binary forms, with or without  | ||||
| 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, | ||||
| @@ -14,17 +14,17 @@ modification, are permitted provided that the following conditions are met: | ||||
|     * 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  | ||||
|     * 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  | ||||
| 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;  | ||||
| (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  | ||||
| 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. | ||||
|   | ||||
							
								
								
									
										152
									
								
								MANIFEST
									
									
									
									
									
								
							
							
						
						
									
										152
									
								
								MANIFEST
									
									
									
									
									
								
							| @@ -1,3 +1,4 @@ | ||||
| .perltidyrc | ||||
| Build.PL | ||||
| Changes | ||||
| contrib/DEVELOP | ||||
| @@ -25,6 +26,8 @@ lib/SNMP/Info/CiscoStack.pm | ||||
| lib/SNMP/Info/CiscoStats.pm | ||||
| lib/SNMP/Info/CiscoStpExtensions.pm | ||||
| lib/SNMP/Info/CiscoVTP.pm | ||||
| lib/SNMP/Info/DocsisCM.pm | ||||
| lib/SNMP/Info/DocsisHE.pm | ||||
| lib/SNMP/Info/EDP.pm | ||||
| lib/SNMP/Info/Entity.pm | ||||
| lib/SNMP/Info/EtherLike.pm | ||||
| @@ -41,9 +44,11 @@ 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 | ||||
| lib/SNMP/Info/Layer2/Atmedia.pm | ||||
| lib/SNMP/Info/Layer2/Baystack.pm | ||||
| lib/SNMP/Info/Layer2/C1900.pm | ||||
| lib/SNMP/Info/Layer2/C2900.pm | ||||
| @@ -51,6 +56,7 @@ lib/SNMP/Info/Layer2/Catalyst.pm | ||||
| lib/SNMP/Info/Layer2/Centillion.pm | ||||
| lib/SNMP/Info/Layer2/Cisco.pm | ||||
| lib/SNMP/Info/Layer2/CiscoSB.pm | ||||
| lib/SNMP/Info/Layer2/Exinda.pm | ||||
| lib/SNMP/Info/Layer2/HP.pm | ||||
| lib/SNMP/Info/Layer2/HP4000.pm | ||||
| lib/SNMP/Info/Layer2/HPVC.pm | ||||
| @@ -58,8 +64,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 | ||||
| @@ -76,46 +84,58 @@ 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/Ciena.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 | ||||
| lib/SNMP/Info/Layer3/Fortinet.pm | ||||
| lib/SNMP/Info/Layer3/Foundry.pm | ||||
| lib/SNMP/Info/Layer3/Genua.pm | ||||
| lib/SNMP/Info/Layer3/H3C.pm | ||||
| lib/SNMP/Info/Layer3/HP9300.pm | ||||
| lib/SNMP/Info/Layer3/Huawei.pm | ||||
| lib/SNMP/Info/Layer3/IBMGbTor.pm | ||||
| lib/SNMP/Info/Layer3/Juniper.pm | ||||
| lib/SNMP/Info/Layer3/Lantronix.pm | ||||
| lib/SNMP/Info/Layer3/Lenovo.pm | ||||
| lib/SNMP/Info/Layer3/Microsoft.pm | ||||
| lib/SNMP/Info/Layer3/Mikrotik.pm | ||||
| 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 | ||||
| lib/SNMP/Info/Layer3/Pf.pm | ||||
| lib/SNMP/Info/Layer3/Pica8.pm | ||||
| lib/SNMP/Info/Layer3/Redlion.pm | ||||
| lib/SNMP/Info/Layer3/Scalance.pm | ||||
| lib/SNMP/Info/Layer3/SonicWALL.pm | ||||
| lib/SNMP/Info/Layer3/Steelhead.pm | ||||
| lib/SNMP/Info/Layer3/Sun.pm | ||||
| lib/SNMP/Info/Layer3/Tasman.pm | ||||
| lib/SNMP/Info/Layer3/Teltonika.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/Liebert.pm | ||||
| lib/SNMP/Info/Layer7/Neoteris.pm | ||||
| lib/SNMP/Info/Layer7/Netscaler.pm | ||||
| lib/SNMP/Info/LLDP.pm | ||||
| @@ -141,3 +161,135 @@ xt/00_local_prereq.t | ||||
| xt/00_local_spelling.t | ||||
| xt/00_local_versionsync.t | ||||
| xt/10_remote_snmplabs.t | ||||
| xt/21_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/Atmedia.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/Exinda.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/Genua.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/Lenovo.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/Redlion.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Scalance.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/Teltonika.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/Liebert.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 | ||||
|   | ||||
| @@ -58,10 +58,16 @@ | ||||
| # Avoid Devel::Cover and Devel::CoverX::Covered files. | ||||
| \bcover_db\b | ||||
| \bcovered\b | ||||
|   | ||||
|  | ||||
| # Avoid MYMETA files | ||||
| ^MYMETA\. | ||||
|  | ||||
| .github | ||||
| .travis | ||||
| README.md | ||||
|  | ||||
| # Avoid Komodo project file | ||||
| \.komodoproject$ | ||||
|  | ||||
| # ignore intellij | ||||
| \B\.idea | ||||
|   | ||||
							
								
								
									
										329
									
								
								META.json
									
									
									
									
									
								
							
							
						
						
									
										329
									
								
								META.json
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|       "Eric A. Miller <emiller@cpan.org>" | ||||
|    ], | ||||
|    "dynamic_config" : 1, | ||||
|    "generated_by" : "Module::Build version 0.4224", | ||||
|    "generated_by" : "Module::Build version 0.4231", | ||||
|    "license" : [ | ||||
|       "bsd" | ||||
|    ], | ||||
| @@ -29,12 +29,23 @@ | ||||
|          }, | ||||
|          "requires" : { | ||||
|             "Math::BigInt" : "0", | ||||
|             "NetAddr::IP" : "4.068", | ||||
|             "SNMP" : "0" | ||||
|          } | ||||
|       }, | ||||
|       "test" : { | ||||
|          "requires" : { | ||||
|             "Class::Inspector" : "0", | ||||
|             "File::Find" : "0", | ||||
|             "File::Slurper" : "0", | ||||
|             "Hook::LexWrap" : "0", | ||||
|             "Module::Find" : "0", | ||||
|             "NetSNMP::default_store" : "0", | ||||
|             "Path::Class" : "0", | ||||
|             "Test::Class::Most" : "0", | ||||
|             "Test::Distribution" : "0", | ||||
|             "Test::Exception" : "0.43", | ||||
|             "Test::MockObject::Extends" : "0", | ||||
|             "Test::More" : "0.88" | ||||
|          } | ||||
|       } | ||||
| @@ -42,471 +53,547 @@ | ||||
|    "provides" : { | ||||
|       "SNMP::Info" : { | ||||
|          "file" : "lib/SNMP/Info.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::AMAP" : { | ||||
|          "file" : "lib/SNMP/Info/AMAP.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::AdslLine" : { | ||||
|          "file" : "lib/SNMP/Info/AdslLine.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Aggregate" : { | ||||
|          "file" : "lib/SNMP/Info/Aggregate.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Airespace" : { | ||||
|          "file" : "lib/SNMP/Info/Airespace.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Bridge" : { | ||||
|          "file" : "lib/SNMP/Info/Bridge.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CDP" : { | ||||
|          "file" : "lib/SNMP/Info/CDP.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoAgg" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoAgg.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoConfig" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoConfig.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoPortSecurity" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoPortSecurity.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoPower" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoPower.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoQOS" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoQOS.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoRTT" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoRTT.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoStack" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoStack.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoStats" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoStats.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoStpExtensions" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoStpExtensions.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoVTP" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoVTP.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::DocsisCM" : { | ||||
|          "file" : "lib/SNMP/Info/DocsisCM.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::DocsisHE" : { | ||||
|          "file" : "lib/SNMP/Info/DocsisHE.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::EDP" : { | ||||
|          "file" : "lib/SNMP/Info/EDP.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Entity" : { | ||||
|          "file" : "lib/SNMP/Info/Entity.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::EtherLike" : { | ||||
|          "file" : "lib/SNMP/Info/EtherLike.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::FDP" : { | ||||
|          "file" : "lib/SNMP/Info/FDP.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::IEEE802dot11" : { | ||||
|          "file" : "lib/SNMP/Info/IEEE802dot11.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::IEEE802dot3ad" : { | ||||
|          "file" : "lib/SNMP/Info/IEEE802dot3ad.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::IPv6" : { | ||||
|          "file" : "lib/SNMP/Info/IPv6.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::LLDP" : { | ||||
|          "file" : "lib/SNMP/Info/LLDP.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Allied" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Allied.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Asante" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Asante.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Bayhub" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Bayhub.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Cyclades" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Cyclades.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::S3000" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/S3000.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::3Com" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/3Com.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Adtran" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Adtran.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Aerohive" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Aerohive.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Airespace" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Airespace.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Aironet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Aironet.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Allied" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Allied.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Atmedia" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Atmedia.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Baystack" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Baystack.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::C1900" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/C1900.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::C2900" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/C2900.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Catalyst" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Catalyst.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Centillion" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Centillion.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Cisco" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Cisco.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::CiscoSB" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/CiscoSB.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Exinda" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Exinda.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::HP" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/HP.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::HP4000" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/HP4000.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::HPVC" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/HPVC.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Kentrox" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Kentrox.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::N2270" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/N2270.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::NAP222x" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/NAP222x.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::NWSS2300" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/NWSS2300.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Netgear" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Netgear.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Nexans" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Nexans.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Orinoco" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Orinoco.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Sixnet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Sixnet.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Trapeze" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Trapeze.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Ubiquiti" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Ubiquiti.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::ZyXEL_DSLAM" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Aironet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Aironet.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::AlcatelLucent" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/AlcatelLucent.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::AlteonAD" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/AlteonAD.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Altiga" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Altiga.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Arista" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Arista.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Aruba" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Aruba.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::BayRS" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/BayRS.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::BlueCoatSG" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/BlueCoatSG.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::C3550" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/C3550.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::C4000" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/C4000.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::C6500" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/C6500.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CheckPoint" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CheckPoint.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Ciena" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Ciena.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Cisco" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Cisco.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CiscoASA" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CiscoASA.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CiscoFWSM" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CiscoFWSM.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CiscoSwitch" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CiscoSwitch.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Contivity" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Contivity.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Cumulus" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Cumulus.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::DLink" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/DLink.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Dell" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Dell.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::ERX" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/ERX.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Enterasys" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Enterasys.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Extreme" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Extreme.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::F5" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/F5.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Force10" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Force10.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Fortinet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Fortinet.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Foundry" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Foundry.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Genua" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Genua.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::H3C" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/H3C.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::HP9300" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/HP9300.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Huawei" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Huawei.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::IBMGbTor" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/IBMGbTor.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Juniper" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Juniper.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Lantronix" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Lantronix.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Lenovo" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Lenovo.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Microsoft" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Microsoft.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Mikrotik" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Mikrotik.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::N1600" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/N1600.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::NetSNMP" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/NetSNMP.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Netscreen" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Netscreen.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Nexus" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Nexus.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::OneAccess" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/OneAccess.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::PacketFront" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/PacketFront.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::PaloAlto" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/PaloAlto.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Passport" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Passport.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Pf" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Pf.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Pica8" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Pica8.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Redlion" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Redlion.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Scalance" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Scalance.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::SonicWALL" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/SonicWALL.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Steelhead" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Steelhead.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Sun" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Sun.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Tasman" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Tasman.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Teltonika" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Teltonika.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Timetra" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Timetra.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::VMware" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/VMware.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::VyOS" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/VyOS.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::APC" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/APC.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Arbor" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Arbor.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::CiscoIPS" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/CiscoIPS.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Gigamon" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Gigamon.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Liebert" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Liebert.pm", | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Neoteris" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Neoteris.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Netscaler" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Netscaler.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::MAU" : { | ||||
|          "file" : "lib/SNMP/Info/MAU.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::MRO" : { | ||||
|          "file" : "lib/SNMP/Info/MRO.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::NortelStack" : { | ||||
|          "file" : "lib/SNMP/Info/NortelStack.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::PowerEthernet" : { | ||||
|          "file" : "lib/SNMP/Info/PowerEthernet.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::RapidCity" : { | ||||
|          "file" : "lib/SNMP/Info/RapidCity.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       }, | ||||
|       "SNMP::Info::SONMP" : { | ||||
|          "file" : "lib/SNMP/Info/SONMP.pm", | ||||
|          "version" : "3.45" | ||||
|          "version" : "3.71" | ||||
|       } | ||||
|    }, | ||||
|    "release_status" : "stable", | ||||
| @@ -516,7 +603,7 @@ | ||||
|       }, | ||||
|       "homepage" : "http://netdisco.org/", | ||||
|       "license" : [ | ||||
|          "http://opensource.org/licenses/BSD-3-Clause" | ||||
|          "http://opensource.org/licenses/bsd-license.php" | ||||
|       ], | ||||
|       "repository" : { | ||||
|          "url" : "https://github.com/netdisco/snmp-info" | ||||
| @@ -524,6 +611,6 @@ | ||||
|       "x_IRC" : "irc://irc.freenode.org/#netdisco", | ||||
|       "x_MailingList" : "https://lists.sourceforge.net/lists/listinfo/snmp-info-users" | ||||
|    }, | ||||
|    "version" : "3.45", | ||||
|    "x_serialization_backend" : "JSON::PP version 2.94" | ||||
|    "version" : "3.71", | ||||
|    "x_serialization_backend" : "JSON::PP version 4.02" | ||||
| } | ||||
|   | ||||
							
								
								
									
										308
									
								
								META.yml
									
									
									
									
									
								
							
							
						
						
									
										308
									
								
								META.yml
									
									
									
									
									
								
							| @@ -3,12 +3,22 @@ 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' | ||||
|   Hook::LexWrap: '0' | ||||
|   Module::Find: '0' | ||||
|   NetSNMP::default_store: '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.4224, CPAN::Meta::Converter version 2.150010' | ||||
| generated_by: 'Module::Build version 0.4231, CPAN::Meta::Converter version 2.150010' | ||||
| license: bsd | ||||
| meta-spec: | ||||
|   url: http://module-build.sourceforge.net/META-spec-v1.4.html | ||||
| @@ -17,355 +27,412 @@ name: SNMP-Info | ||||
| provides: | ||||
|   SNMP::Info: | ||||
|     file: lib/SNMP/Info.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::AMAP: | ||||
|     file: lib/SNMP/Info/AMAP.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::AdslLine: | ||||
|     file: lib/SNMP/Info/AdslLine.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Aggregate: | ||||
|     file: lib/SNMP/Info/Aggregate.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Airespace: | ||||
|     file: lib/SNMP/Info/Airespace.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Bridge: | ||||
|     file: lib/SNMP/Info/Bridge.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CDP: | ||||
|     file: lib/SNMP/Info/CDP.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CiscoAgg: | ||||
|     file: lib/SNMP/Info/CiscoAgg.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CiscoConfig: | ||||
|     file: lib/SNMP/Info/CiscoConfig.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CiscoPortSecurity: | ||||
|     file: lib/SNMP/Info/CiscoPortSecurity.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CiscoPower: | ||||
|     file: lib/SNMP/Info/CiscoPower.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CiscoQOS: | ||||
|     file: lib/SNMP/Info/CiscoQOS.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CiscoRTT: | ||||
|     file: lib/SNMP/Info/CiscoRTT.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CiscoStack: | ||||
|     file: lib/SNMP/Info/CiscoStack.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CiscoStats: | ||||
|     file: lib/SNMP/Info/CiscoStats.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CiscoStpExtensions: | ||||
|     file: lib/SNMP/Info/CiscoStpExtensions.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::CiscoVTP: | ||||
|     file: lib/SNMP/Info/CiscoVTP.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::DocsisCM: | ||||
|     file: lib/SNMP/Info/DocsisCM.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::DocsisHE: | ||||
|     file: lib/SNMP/Info/DocsisHE.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::EDP: | ||||
|     file: lib/SNMP/Info/EDP.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Entity: | ||||
|     file: lib/SNMP/Info/Entity.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::EtherLike: | ||||
|     file: lib/SNMP/Info/EtherLike.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::FDP: | ||||
|     file: lib/SNMP/Info/FDP.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::IEEE802dot11: | ||||
|     file: lib/SNMP/Info/IEEE802dot11.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::IEEE802dot3ad: | ||||
|     file: lib/SNMP/Info/IEEE802dot3ad.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::IPv6: | ||||
|     file: lib/SNMP/Info/IPv6.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::LLDP: | ||||
|     file: lib/SNMP/Info/LLDP.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer1: | ||||
|     file: lib/SNMP/Info/Layer1.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer1::Allied: | ||||
|     file: lib/SNMP/Info/Layer1/Allied.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer1::Asante: | ||||
|     file: lib/SNMP/Info/Layer1/Asante.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer1::Bayhub: | ||||
|     file: lib/SNMP/Info/Layer1/Bayhub.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer1::Cyclades: | ||||
|     file: lib/SNMP/Info/Layer1/Cyclades.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer1::S3000: | ||||
|     file: lib/SNMP/Info/Layer1/S3000.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2: | ||||
|     file: lib/SNMP/Info/Layer2.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::3Com: | ||||
|     file: lib/SNMP/Info/Layer2/3Com.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Adtran: | ||||
|     file: lib/SNMP/Info/Layer2/Adtran.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Aerohive: | ||||
|     file: lib/SNMP/Info/Layer2/Aerohive.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Airespace: | ||||
|     file: lib/SNMP/Info/Layer2/Airespace.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Aironet: | ||||
|     file: lib/SNMP/Info/Layer2/Aironet.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Allied: | ||||
|     file: lib/SNMP/Info/Layer2/Allied.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Atmedia: | ||||
|     file: lib/SNMP/Info/Layer2/Atmedia.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Baystack: | ||||
|     file: lib/SNMP/Info/Layer2/Baystack.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::C1900: | ||||
|     file: lib/SNMP/Info/Layer2/C1900.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::C2900: | ||||
|     file: lib/SNMP/Info/Layer2/C2900.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Catalyst: | ||||
|     file: lib/SNMP/Info/Layer2/Catalyst.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Centillion: | ||||
|     file: lib/SNMP/Info/Layer2/Centillion.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Cisco: | ||||
|     file: lib/SNMP/Info/Layer2/Cisco.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::CiscoSB: | ||||
|     file: lib/SNMP/Info/Layer2/CiscoSB.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Exinda: | ||||
|     file: lib/SNMP/Info/Layer2/Exinda.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::HP: | ||||
|     file: lib/SNMP/Info/Layer2/HP.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::HP4000: | ||||
|     file: lib/SNMP/Info/Layer2/HP4000.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::HPVC: | ||||
|     file: lib/SNMP/Info/Layer2/HPVC.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Kentrox: | ||||
|     file: lib/SNMP/Info/Layer2/Kentrox.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::N2270: | ||||
|     file: lib/SNMP/Info/Layer2/N2270.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::NAP222x: | ||||
|     file: lib/SNMP/Info/Layer2/NAP222x.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::NWSS2300: | ||||
|     file: lib/SNMP/Info/Layer2/NWSS2300.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Netgear: | ||||
|     file: lib/SNMP/Info/Layer2/Netgear.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Nexans: | ||||
|     file: lib/SNMP/Info/Layer2/Nexans.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Orinoco: | ||||
|     file: lib/SNMP/Info/Layer2/Orinoco.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Sixnet: | ||||
|     file: lib/SNMP/Info/Layer2/Sixnet.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Trapeze: | ||||
|     file: lib/SNMP/Info/Layer2/Trapeze.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::Ubiquiti: | ||||
|     file: lib/SNMP/Info/Layer2/Ubiquiti.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer2::ZyXEL_DSLAM: | ||||
|     file: lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3: | ||||
|     file: lib/SNMP/Info/Layer3.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Aironet: | ||||
|     file: lib/SNMP/Info/Layer3/Aironet.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::AlcatelLucent: | ||||
|     file: lib/SNMP/Info/Layer3/AlcatelLucent.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::AlteonAD: | ||||
|     file: lib/SNMP/Info/Layer3/AlteonAD.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Altiga: | ||||
|     file: lib/SNMP/Info/Layer3/Altiga.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Arista: | ||||
|     file: lib/SNMP/Info/Layer3/Arista.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Aruba: | ||||
|     file: lib/SNMP/Info/Layer3/Aruba.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::BayRS: | ||||
|     file: lib/SNMP/Info/Layer3/BayRS.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::BlueCoatSG: | ||||
|     file: lib/SNMP/Info/Layer3/BlueCoatSG.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::C3550: | ||||
|     file: lib/SNMP/Info/Layer3/C3550.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::C4000: | ||||
|     file: lib/SNMP/Info/Layer3/C4000.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::C6500: | ||||
|     file: lib/SNMP/Info/Layer3/C6500.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::CheckPoint: | ||||
|     file: lib/SNMP/Info/Layer3/CheckPoint.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Ciena: | ||||
|     file: lib/SNMP/Info/Layer3/Ciena.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Cisco: | ||||
|     file: lib/SNMP/Info/Layer3/Cisco.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::CiscoASA: | ||||
|     file: lib/SNMP/Info/Layer3/CiscoASA.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::CiscoFWSM: | ||||
|     file: lib/SNMP/Info/Layer3/CiscoFWSM.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::CiscoSwitch: | ||||
|     file: lib/SNMP/Info/Layer3/CiscoSwitch.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Contivity: | ||||
|     file: lib/SNMP/Info/Layer3/Contivity.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Cumulus: | ||||
|     file: lib/SNMP/Info/Layer3/Cumulus.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::DLink: | ||||
|     file: lib/SNMP/Info/Layer3/DLink.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Dell: | ||||
|     file: lib/SNMP/Info/Layer3/Dell.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::ERX: | ||||
|     file: lib/SNMP/Info/Layer3/ERX.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Enterasys: | ||||
|     file: lib/SNMP/Info/Layer3/Enterasys.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Extreme: | ||||
|     file: lib/SNMP/Info/Layer3/Extreme.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::F5: | ||||
|     file: lib/SNMP/Info/Layer3/F5.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Force10: | ||||
|     file: lib/SNMP/Info/Layer3/Force10.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Fortinet: | ||||
|     file: lib/SNMP/Info/Layer3/Fortinet.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Foundry: | ||||
|     file: lib/SNMP/Info/Layer3/Foundry.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Genua: | ||||
|     file: lib/SNMP/Info/Layer3/Genua.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::H3C: | ||||
|     file: lib/SNMP/Info/Layer3/H3C.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::HP9300: | ||||
|     file: lib/SNMP/Info/Layer3/HP9300.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Huawei: | ||||
|     file: lib/SNMP/Info/Layer3/Huawei.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::IBMGbTor: | ||||
|     file: lib/SNMP/Info/Layer3/IBMGbTor.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Juniper: | ||||
|     file: lib/SNMP/Info/Layer3/Juniper.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Lantronix: | ||||
|     file: lib/SNMP/Info/Layer3/Lantronix.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Lenovo: | ||||
|     file: lib/SNMP/Info/Layer3/Lenovo.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Microsoft: | ||||
|     file: lib/SNMP/Info/Layer3/Microsoft.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Mikrotik: | ||||
|     file: lib/SNMP/Info/Layer3/Mikrotik.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::N1600: | ||||
|     file: lib/SNMP/Info/Layer3/N1600.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::NetSNMP: | ||||
|     file: lib/SNMP/Info/Layer3/NetSNMP.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Netscreen: | ||||
|     file: lib/SNMP/Info/Layer3/Netscreen.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Nexus: | ||||
|     file: lib/SNMP/Info/Layer3/Nexus.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::OneAccess: | ||||
|     file: lib/SNMP/Info/Layer3/OneAccess.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::PacketFront: | ||||
|     file: lib/SNMP/Info/Layer3/PacketFront.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::PaloAlto: | ||||
|     file: lib/SNMP/Info/Layer3/PaloAlto.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Passport: | ||||
|     file: lib/SNMP/Info/Layer3/Passport.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Pf: | ||||
|     file: lib/SNMP/Info/Layer3/Pf.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Pica8: | ||||
|     file: lib/SNMP/Info/Layer3/Pica8.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Redlion: | ||||
|     file: lib/SNMP/Info/Layer3/Redlion.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Scalance: | ||||
|     file: lib/SNMP/Info/Layer3/Scalance.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::SonicWALL: | ||||
|     file: lib/SNMP/Info/Layer3/SonicWALL.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Steelhead: | ||||
|     file: lib/SNMP/Info/Layer3/Steelhead.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Sun: | ||||
|     file: lib/SNMP/Info/Layer3/Sun.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Tasman: | ||||
|     file: lib/SNMP/Info/Layer3/Tasman.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Teltonika: | ||||
|     file: lib/SNMP/Info/Layer3/Teltonika.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::Timetra: | ||||
|     file: lib/SNMP/Info/Layer3/Timetra.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::VMware: | ||||
|     file: lib/SNMP/Info/Layer3/VMware.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer3::VyOS: | ||||
|     file: lib/SNMP/Info/Layer3/VyOS.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer7: | ||||
|     file: lib/SNMP/Info/Layer7.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer7::APC: | ||||
|     file: lib/SNMP/Info/Layer7/APC.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer7::Arbor: | ||||
|     file: lib/SNMP/Info/Layer7/Arbor.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer7::CiscoIPS: | ||||
|     file: lib/SNMP/Info/Layer7/CiscoIPS.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer7::Gigamon: | ||||
|     file: lib/SNMP/Info/Layer7/Gigamon.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer7::Liebert: | ||||
|     file: lib/SNMP/Info/Layer7/Liebert.pm | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer7::Neoteris: | ||||
|     file: lib/SNMP/Info/Layer7/Neoteris.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::Layer7::Netscaler: | ||||
|     file: lib/SNMP/Info/Layer7/Netscaler.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::MAU: | ||||
|     file: lib/SNMP/Info/MAU.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::MRO: | ||||
|     file: lib/SNMP/Info/MRO.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::NortelStack: | ||||
|     file: lib/SNMP/Info/NortelStack.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::PowerEthernet: | ||||
|     file: lib/SNMP/Info/PowerEthernet.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::RapidCity: | ||||
|     file: lib/SNMP/Info/RapidCity.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
|   SNMP::Info::SONMP: | ||||
|     file: lib/SNMP/Info/SONMP.pm | ||||
|     version: '3.45' | ||||
|     version: '3.71' | ||||
| recommends: | ||||
|   Class::ISA: '0' | ||||
|   File::Slurp: '0' | ||||
| @@ -374,13 +441,14 @@ recommends: | ||||
|   PPI: '0' | ||||
| requires: | ||||
|   Math::BigInt: '0' | ||||
|   NetAddr::IP: '4.068' | ||||
|   SNMP: '0' | ||||
| resources: | ||||
|   IRC: irc://irc.freenode.org/#netdisco | ||||
|   MailingList: https://lists.sourceforge.net/lists/listinfo/snmp-info-users | ||||
|   bugtracker: https://github.com/netdisco/snmp-info/issues | ||||
|   homepage: http://netdisco.org/ | ||||
|   license: http://opensource.org/licenses/BSD-3-Clause | ||||
|   license: http://opensource.org/licenses/bsd-license.php | ||||
|   repository: https://github.com/netdisco/snmp-info | ||||
| version: '3.45' | ||||
| version: '3.71' | ||||
| x_serialization_backend: 'CPAN::Meta::YAML version 0.018' | ||||
|   | ||||
| @@ -6,23 +6,28 @@ Coding Guidelines: | ||||
|     - always update ChangeLog before committing | ||||
|     - check-in required mibs to netdisco-mibs and release new package if needed | ||||
|  | ||||
| Release and Testing Instructions:  | ||||
|     - Please see misc/RELEASE in Netdisco | ||||
|       ( http://netdisco.cvs.sourceforge.net/viewvc/netdisco/misc/RELEASE?view=markup ) | ||||
|       and follow all testing and release guidelines | ||||
| Release and Testing Instructions: | ||||
|     - for netdisco see: | ||||
|         -> https://github.com/netdisco/netdisco/wiki/Developing | ||||
|         -> https://metacpan.org/pod/App::Netdisco | ||||
|     - for snmp::info see: | ||||
|         -> https://github.com/netdisco/snmp-info/wiki/Release-Process | ||||
|         -> https://metacpan.org/pod/SNMP::Info#EXTENDING-SNMP::INFO | ||||
|     - for netdisco-mibs see: | ||||
|         -> https://github.com/netdisco/netdisco-mibs/wiki | ||||
|  | ||||
| FAQ: | ||||
|     - Do I have to update the version number and timestamp in modified files before committing?  | ||||
|     - Do I have to update the version number and timestamp in modified files before committing? | ||||
|     -> No.  These are RCS tags that are automatically updated by CVS when you commit | ||||
|  | ||||
|     - Should I add changes at the top of the ChangeLog? | ||||
|     -> Yes. The changelog is created one commit at a time.  If there isn't a | ||||
|         section for the current version, then add one at the top and put your | ||||
|         changes after.  You can leave the date field for the release empty ().  | ||||
|         changes after.  You can leave the date field for the release empty (). | ||||
|  | ||||
|     - What should I change the $VERSION to? | ||||
|     -> If you are the first person to get to a file after a release, update it | ||||
|        to either  release++ or "release++ dash cvs".    | ||||
|        to either  release++ or "release++ dash cvs". | ||||
|        Example: File is marked 2.01, change it to 2.02-cvs with your new changes. | ||||
|        Example: File is marked 2.02-cvs,  no change until packaging for release when the -cvs is removed. | ||||
|        TODO: Is there still an odd/even scheme as introduced by Eric? | ||||
|   | ||||
| @@ -28,7 +28,7 @@ if ($@) { | ||||
|             } else { | ||||
|                 $graph{$vendor}->{$family}=[]; | ||||
|             } | ||||
|              | ||||
|  | ||||
|         } | ||||
|     } | ||||
|     my $now = scalar localtime; | ||||
| @@ -83,7 +83,7 @@ foreach my $vendor (sort sort_nocase keys %$matrix){ | ||||
|                 } elsif (defined $vendor_defaults->{$a}){ | ||||
|                     $val = $vendor_defaults->{$a}; | ||||
|                     $class = 'vendor'; | ||||
|                 }  | ||||
|                 } | ||||
|                 print "  <TD CLASS='$class'>",join("<BR>\n",@$val),"</TD>\n"; | ||||
|             } | ||||
|             print "</TR></TABLE>\n"; | ||||
| @@ -141,7 +141,7 @@ sub parse_data { | ||||
|  | ||||
|         my ($cmd,$value); | ||||
|         if ($line =~ /^([a-z-_]+)\s*:\s*(.*)$/) { | ||||
|             $cmd = $1;  $value = $2;  | ||||
|             $cmd = $1;  $value = $2; | ||||
|         } else { | ||||
|             print "What do i do with this line : $line \n"; | ||||
|             next; | ||||
| @@ -164,18 +164,18 @@ sub parse_data { | ||||
|             $family = $value; | ||||
|             $model = undef; | ||||
|             print "$family has no vendor.\n" unless defined $vendor; | ||||
|             $Matrix->{$vendor}->{families}->{$family} = {}  | ||||
|             $Matrix->{$vendor}->{families}->{$family} = {} | ||||
|                 unless defined $Matrix->{$vendor}->{families}->{$family}; | ||||
|             $class = $Matrix->{$vendor}->{families}->{$family}; | ||||
|             $class->{defaults}->{type}='family'; | ||||
|             next; | ||||
|         }    | ||||
|         } | ||||
|  | ||||
|         if ($cmd eq 'device') { | ||||
|             $model = $value; | ||||
|             print "$model has no family.\n" unless defined $family; | ||||
|             print "$model has no vendor.\n" unless defined $vendor; | ||||
|             $Matrix->{$vendor}->{families}->{$family}->{models}->{$model} = {}  | ||||
|             $Matrix->{$vendor}->{families}->{$family}->{models}->{$model} = {} | ||||
|                 unless defined $Matrix->{$vendor}->{families}->{$family}->{models}->{$model}; | ||||
|             $class = $Matrix->{$vendor}->{families}->{$family}->{models}->{$model}; | ||||
|             $class->{defaults}->{type}='device'; | ||||
| @@ -233,7 +233,7 @@ sub html_head { | ||||
|     .vendor { font-size:12pt; color:#777777; } | ||||
|     .family { font-size:12pt; color:blue; } | ||||
|     .model  { font-size:12pt; color:red; } | ||||
|     .note   { color:red; }  | ||||
|     .note   { color:red; } | ||||
| //--> | ||||
| </STYLE> | ||||
| </HEAD> | ||||
| @@ -304,7 +304,7 @@ be assumed working. | ||||
|         Discovery Protocol (LLDP), Cisco Discovery Protocol (CDP), | ||||
|         SynOptics/Bay/Nortel/Avaya Network Management Protocol (SONMP), | ||||
|         Foundry/Brocade Discovery Protocol (FDP), Extreme Discovery | ||||
|         Protocol (EDP), and Alcatel Mapping Adjacency Protocol (AMAP).  | ||||
|         Protocol (EDP), and Alcatel Mapping Adjacency Protocol (AMAP). | ||||
|     </TD> | ||||
| </TR> | ||||
| <TR> | ||||
| @@ -325,7 +325,7 @@ be assumed working. | ||||
| </BODY> | ||||
| </HTML> | ||||
| end_tail | ||||
|      | ||||
|  | ||||
| } | ||||
|  | ||||
| sub print_headers { | ||||
|   | ||||
| @@ -80,7 +80,7 @@ unless ( defined $sysdescr ) { | ||||
|  | ||||
| SNMP::loadModules(@ARGV); | ||||
|  | ||||
| # Create a hash of MIB Modules for which we want results  | ||||
| # Create a hash of MIB Modules for which we want results | ||||
| my %mib_hash = map {$_ => 1} @ARGV; | ||||
| # Add the common MIB Modules we always want | ||||
| my @common_mibs = ('SNMPv2-MIB', 'IF-MIB'); | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|  | ||||
| use File::Glob qw/bsd_glob/; | ||||
|  | ||||
| my @pms = glob_rec("../../lib"); | ||||
| my @pms = glob_rec("./lib"); | ||||
|  | ||||
| $new_version = shift @ARGV || die "missing new version\n"; | ||||
|  | ||||
| @@ -35,7 +35,7 @@ sub glob_rec { | ||||
|  | ||||
|     foreach my $f (@files) { | ||||
|         next if $f eq '\.$'; | ||||
|          | ||||
|  | ||||
|         if (-d $f) { | ||||
|             push @pms, glob_rec($f); | ||||
|             next; | ||||
|   | ||||
| @@ -250,11 +250,11 @@ test_class.pl [options] | ||||
|  | ||||
| Options: | ||||
|  | ||||
|     -c|class    SNMP::Info class to use, Layer2::Catalyst     | ||||
|     -c|class    SNMP::Info class to use, Layer2::Catalyst | ||||
|     -d|dev      Device | ||||
|     -s|comm     SNMP community | ||||
|     -v|ver      SNMP version | ||||
|     -p|print    Print values  | ||||
|     -p|print    Print values | ||||
|     -i|ignore   Ignore Net-SNMP configuration file | ||||
|     -m|mibdir   Directory containing MIB Files | ||||
|     -n|nobulk   Disable bulkwalk | ||||
| @@ -294,7 +294,7 @@ SNMP version. Default 2. | ||||
| =item B<-print> | ||||
|  | ||||
| Print values of a class method rather than summarizing.  May be repeated | ||||
| multiple times.  | ||||
| multiple times. | ||||
|  | ||||
| -print i_description -print i_type | ||||
|  | ||||
| @@ -308,7 +308,7 @@ provided. | ||||
| =item B<-mibdir> | ||||
|  | ||||
| Directory containing MIB Files.  Multiple directories should be separated by a | ||||
| colon ':'.  | ||||
| colon ':'. | ||||
|  | ||||
| -mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp | ||||
|  | ||||
|   | ||||
| @@ -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; | ||||
| @@ -385,9 +385,9 @@ test_class_mocked.pl [options] | ||||
|  | ||||
| Options: | ||||
|  | ||||
|     -class    SNMP::Info class to use, Layer2::Catalyst     | ||||
|     -class    SNMP::Info class to use, Layer2::Catalyst | ||||
|     -file     File containing data gathered using make_snmpdata.pl | ||||
|     -print    Print values  | ||||
|     -print    Print values | ||||
|     -debug    Debugging flag | ||||
|     -ignore   Ignore Net-SNMP configuration file | ||||
|     -mibdir   Directory containing MIB Files | ||||
| @@ -414,7 +414,7 @@ mandatory option. | ||||
| =item B<-print> | ||||
|  | ||||
| Print values of a class method rather than summarizing.  May be repeated | ||||
| multiple times.  | ||||
| multiple times. | ||||
|  | ||||
| -print i_description -print i_type | ||||
|  | ||||
| @@ -434,7 +434,7 @@ provided. | ||||
| =item B<-mibdir> | ||||
|  | ||||
| Directory containing MIB Files.  Multiple directories should be separated by a | ||||
| colon ':'.  | ||||
| colon ':'. | ||||
|  | ||||
| -mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp | ||||
|  | ||||
|   | ||||
							
								
								
									
										963
									
								
								lib/SNMP/Info.pm
									
									
									
									
									
								
							
							
						
						
									
										963
									
								
								lib/SNMP/Info.pm
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -30,26 +30,27 @@ | ||||
| package SNMP::Info::AMAP; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| 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/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS | ||||
|     = ( 'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', ); | ||||
| %MIBS = ( | ||||
|   'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|  | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|  | ||||
|     # EXTREME-EDP-MIB::extremeEdpTable | ||||
|     # ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB::aipAMAPRemHostname | ||||
|     'amap_rem_sysname' => 'aipAMAPRemHostname', | ||||
| ); | ||||
|  | ||||
| @@ -91,7 +92,7 @@ sub _conn_table_mac { | ||||
| # address since they should all originate from the same device, but we don't | ||||
| # know if they would all be reachable from the network management application. | ||||
| # | ||||
| # We don't inplement partials since this is private index function | ||||
| # We don't implement partials since this is private index function | ||||
| sub _amap_index { | ||||
|     my $amap = shift; | ||||
|  | ||||
| @@ -240,10 +241,10 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $amap = new SNMP::Info (  | ||||
|  my $amap = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
| @@ -253,7 +254,7 @@ Eric Miller | ||||
|  | ||||
|  $hasamap   = $amap->hasAMAP() ? 'yes' : 'no'; | ||||
|  | ||||
|  # Print out a map of device ports with LLDP neighbors: | ||||
|  # Print out a map of device ports with AMAP neighbors: | ||||
|  my $interfaces    = $amap->interfaces(); | ||||
|  my $amap_if       = $amap->amap_if(); | ||||
|  my $amap_ip       = $amap->amap_ip(); | ||||
| @@ -269,7 +270,7 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented  | ||||
| SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented | ||||
| interface to Alcatel Mapping Adjacency Protocol (AMAP) information through | ||||
| SNMP. | ||||
|  | ||||
| @@ -291,7 +292,7 @@ None. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| @@ -299,7 +300,7 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
| =item $amap->hasAMAP() | ||||
|  | ||||
| Is AMAP is active in this device?   | ||||
| Is AMAP is active in this device? | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -322,7 +323,7 @@ Returns the mapping to the SNMP Interface Table. | ||||
|  | ||||
| Returns remote IPv4 addresses.  Note: AMAP returns all IP addresses associated | ||||
| with the remote device.  It would be preferable to include only one address | ||||
| since they should all originate from the same device, but amap_ip() can not  | ||||
| since they should all originate from the same device, but amap_ip() can not | ||||
| determine if all addresses are reachable from the network management | ||||
| application therefore all addresses are returned and the calling application | ||||
| must determine which address to use and if they are in fact from the same | ||||
|   | ||||
| @@ -30,15 +30,16 @@ | ||||
| package SNMP::Info::AdslLine; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::AdslLine::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::AdslLine::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' ); | ||||
|  | ||||
| @@ -50,7 +51,7 @@ $VERSION = '3.45'; | ||||
|     'adsl_atuc_curr_tx_rate'        => 'adslAtucChanCurrTxRate', | ||||
|     'adsl_atuc_prev_tx_rate'        => 'adslAtucChanPrevTxRate', | ||||
|     'adsl_atuc_crc_block_len'       => 'adslAtucChanCrcBlockLength', | ||||
|      | ||||
|  | ||||
|     # ADSL-LINE-MIB::adslAturChanTable | ||||
|     'adsl_atur_interleave_delay'    => 'adslAturChanInterleaveDelay', | ||||
|     'adsl_atur_curr_tx_rate'        => 'adslAturChanCurrTxRate', | ||||
| @@ -73,14 +74,14 @@ Alexander Hartmaier | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $info = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $info->class(); | ||||
| @@ -88,7 +89,7 @@ Alexander Hartmaier | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::AdslLine is a subclass of SNMP::Info that provides  | ||||
| SNMP::Info::AdslLine is a subclass of SNMP::Info that provides | ||||
| information about the adsl interfaces of a device. | ||||
|  | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| @@ -105,8 +106,6 @@ none. | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| =over | ||||
|   | ||||
| @@ -30,17 +30,19 @@ | ||||
| package SNMP::Info::Aggregate; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::Aggregate::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Aggregate::EXPORT_OK = qw/agg_ports_ifstack/; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = (); # IF-MIB | ||||
| # Load MIB for leafs referenced within class | ||||
| %MIBS = ('IF-MIB' => 'ifIndex',); | ||||
|  | ||||
| %GLOBALS = (); | ||||
|  | ||||
| @@ -83,14 +85,14 @@ SNMP::Info Developers | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $info = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $info->class(); | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Airespace | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::Airespace; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::Airespace::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Airespace::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -84,7 +84,7 @@ $VERSION = '3.45'; | ||||
|     'airespace_ess_ifname'    => 'bsnDot11EssInterfaceName', | ||||
|     'airespace_ess_aclname'   => 'bsnDot11EssAclName', | ||||
|     'airespace_ess_bcast'     => 'bsnDot11EssBroadcastSsid', | ||||
|      | ||||
|  | ||||
|     # AIRESPACE-WIRELESS-MIB::bsnAPTable | ||||
|     'airespace_ap_mac'      => 'bsnAPDot3MacAddress', | ||||
|     'airespace_ap_name'     => 'bsnAPName', | ||||
| @@ -508,8 +508,8 @@ sub ip_index { | ||||
|     my $airespace = shift; | ||||
|     my $partial   = shift; | ||||
|  | ||||
|     my $ip_index = $airespace->orig_ip_index($partial) || {}; | ||||
|     my $if_ip    = $airespace->airespace_if_ip()       || {}; | ||||
|     my $ip_index = $airespace->SUPER::ip_index($partial) || {}; | ||||
|     my $if_ip    = $airespace->airespace_if_ip()         || {}; | ||||
|  | ||||
|     my %ip_index; | ||||
|     foreach my $ip ( keys %$ip_index ) { | ||||
| @@ -534,9 +534,9 @@ sub ip_netmask { | ||||
|     my $airespace = shift; | ||||
|     my $partial   = shift; | ||||
|  | ||||
|     my $ip_mask = $airespace->orig_ip_netmask($partial) || {}; | ||||
|     my $if_ip   = $airespace->airespace_if_ip()         || {}; | ||||
|     my $if_mask = $airespace->airespace_if_mask()       || {}; | ||||
|     my $ip_mask = $airespace->SUPER::ip_netmask($partial) || {}; | ||||
|     my $if_ip   = $airespace->airespace_if_ip()           || {}; | ||||
|     my $if_mask = $airespace->airespace_if_mask()         || {}; | ||||
|  | ||||
|     my %ip_netmask; | ||||
|     foreach my $ip ( keys %$ip_mask ) { | ||||
| @@ -764,14 +764,14 @@ sub dot11_cur_tx_pwr_mw { | ||||
|     my $partial   = shift; | ||||
|     my $cur       = $airespace->airespace_apif_power($partial); | ||||
|     my $pwr_abs   = $airespace->airespace_apif_a_pwr($partial); | ||||
|      | ||||
|  | ||||
|     my $dot11_cur_tx_pwr_mw = {}; | ||||
|     foreach my $idx ( keys %$cur ) { | ||||
|         my $pwr = $cur->{$idx}; | ||||
|         if ( $pwr >= 1 && $pwr <= 8 ) { | ||||
|  | ||||
|             my @pwr_list = split(/,/, $pwr_abs->{$idx} );  | ||||
|             $dot11_cur_tx_pwr_mw->{$idx} = $pwr_list[$pwr-1];  | ||||
|             my @pwr_list = split(/,/, $pwr_abs->{$idx} ); | ||||
|             $dot11_cur_tx_pwr_mw->{$idx} = $pwr_list[$pwr-1]; | ||||
|  | ||||
|         } | ||||
|         else { | ||||
| @@ -1087,7 +1087,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -1204,7 +1204,7 @@ valid only when the Transfer Mode is tftp. | ||||
| =item $airespace->airespace_ul_path() | ||||
|  | ||||
| Transfer upload tftp path configures the directory path where the file is to | ||||
| be uploaded to. The switch remembers the last file path used.  | ||||
| be uploaded to. The switch remembers the last file path used. | ||||
|  | ||||
| (C<agentTransferUploadPath>) | ||||
|  | ||||
| @@ -1279,7 +1279,7 @@ radio interface. | ||||
| =item $airespace->i_ssidmac() | ||||
|  | ||||
| With the same keys as i_ssidlist, returns the Basic service set | ||||
| identification (BSSID), MAC address, the AP is using for the SSID.  | ||||
| identification (BSSID), MAC address, the AP is using for the SSID. | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -1346,7 +1346,7 @@ Name of the interface used by this WLAN. | ||||
| Name of ACL for the WLAN. This is applicable only when Web Authentication is | ||||
| enabled. | ||||
|  | ||||
| (C<bsnDot11EssAclName>)            | ||||
| (C<bsnDot11EssAclName>) | ||||
|  | ||||
| =item $airespace->airespace_ess_bcast() | ||||
|  | ||||
| @@ -1672,14 +1672,14 @@ to an empty string. | ||||
|  | ||||
| =item $airespace->i_index() | ||||
|  | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
|  | ||||
| Extends C<ifIndex> to support thin APs and WLAN virtual interfaces as device | ||||
| interfaces. | ||||
|  | ||||
| =item $airespace->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device  | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device | ||||
| interfaces.  The thin AP MAC address airespace_ap_mac() and Slot ID | ||||
| airespace_apif_slot() are used as the port identifier.  Virtual interfaces | ||||
| use airespace_if_name() as the port identifier. | ||||
| @@ -1717,7 +1717,7 @@ for thin AP interfaces. | ||||
| =item $airespace->i_mac() | ||||
|  | ||||
| Returns reference to map of IIDs to MAC address of the interface.  Returns | ||||
| C<ifPhysAddress> for Ethernet interfaces and airespace_if_mac() for virtual  | ||||
| C<ifPhysAddress> for Ethernet interfaces and airespace_if_mac() for virtual | ||||
| interfaces. | ||||
|  | ||||
| =item $airespace->i_vlan() | ||||
| @@ -1751,7 +1751,7 @@ the interface iid. | ||||
| =item $airespace->fw_port() | ||||
|  | ||||
| Returns reference to a hash, value being airespace_sta_mac() and | ||||
| airespace_sta_slot() combined to match the interface iid.   | ||||
| airespace_sta_slot() combined to match the interface iid. | ||||
|  | ||||
| =item $airespace->fw_mac() | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Bridge | ||||
| # $Id$ | ||||
| # | ||||
| # Changes since Version 0.7 Copyright (c) 2004 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -34,19 +33,21 @@ | ||||
| package SNMP::Info::Bridge; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::Bridge::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Bridge::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/; | ||||
| our ($VERSION, $DEBUG, %MIBS, %FUNCS, %GLOBALS, %MUNGE, $INIT); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'BRIDGE-MIB'   => 'dot1dBaseBridgeAddress', | ||||
|     'Q-BRIDGE-MIB' => 'dot1qPvid', | ||||
|     'RSTP-MIB'     => 'dot1dStpPortOperEdgePort', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| @@ -104,6 +105,10 @@ $VERSION = '3.45'; | ||||
|     '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', | ||||
| @@ -184,7 +189,7 @@ sub qb_fw_vlan { | ||||
|     foreach my $idx ( keys %$qb_fw_port ) { | ||||
|         my ( $fdb_id, $mac ) = _qb_fdbtable_index($idx); | ||||
|         # Many devices do not populate the dot1qVlanCurrentTable, so default | ||||
|         # to FDB ID = VID, but if we have a mapping use it.   | ||||
|         # to FDB ID = VID, but if we have a mapping use it. | ||||
|         my $vlan = $fdb_id; | ||||
|         # defined as test since some devices have a vlan 0 | ||||
|         if (defined $qb_fdb_ids->{$fdb_id}) { | ||||
| @@ -232,13 +237,15 @@ sub qb_fdb_index { | ||||
|     return $vl_fdb_index; | ||||
| } | ||||
|  | ||||
| # Most devices now support Q-BRIDGE-MIB, fall back to  | ||||
| # Most devices now support Q-BRIDGE-MIB, fall back to | ||||
| # BRIDGE-MIB for those that don't. | ||||
| sub fw_mac { | ||||
|     my $bridge = shift; | ||||
|  | ||||
|     my $qb = $bridge->qb_fw_mac(); | ||||
|     return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|     unless ($bridge->can('cisco_comm_indexing') && $bridge->cisco_comm_indexing()){ | ||||
|         my $qb = $bridge->qb_fw_mac(); | ||||
|         return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|     } | ||||
|  | ||||
|     return $bridge->SUPER::fw_mac(); | ||||
| } | ||||
| @@ -246,8 +253,10 @@ sub fw_mac { | ||||
| sub fw_port { | ||||
|     my $bridge = shift; | ||||
|  | ||||
|     my $qb = $bridge->qb_fw_port(); | ||||
|     return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|     unless ($bridge->can('cisco_comm_indexing') && $bridge->cisco_comm_indexing()){ | ||||
|         my $qb = $bridge->qb_fw_port(); | ||||
|         return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|     } | ||||
|  | ||||
|     return $bridge->SUPER::fw_port(); | ||||
| } | ||||
| @@ -255,9 +264,11 @@ sub fw_port { | ||||
| sub fw_status { | ||||
|     my $bridge = shift; | ||||
|  | ||||
|     my $qb = $bridge->qb_fw_status(); | ||||
|     return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|      | ||||
|     unless ($bridge->can('cisco_comm_indexing') && $bridge->cisco_comm_indexing()){ | ||||
|         my $qb = $bridge->qb_fw_status(); | ||||
|         return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|     } | ||||
|  | ||||
|     return $bridge->SUPER::fw_status(); | ||||
| } | ||||
|  | ||||
| @@ -291,11 +302,11 @@ sub i_stp_port { | ||||
|     my %i_stp_port; | ||||
|  | ||||
|     foreach my $index ( keys %$stp_p_port ) { | ||||
|         my $bridge = $stp_p_port->{$index}; | ||||
|         my $bport  = $stp_p_port->{$index}; | ||||
|         my $iid    = $bp_index->{$index}; | ||||
|         next unless defined $iid; | ||||
|         next unless defined $bridge; | ||||
|         $i_stp_port{$iid} = $bridge; | ||||
|         next unless defined $bport; | ||||
|         $i_stp_port{$iid} = $bport; | ||||
|     } | ||||
|     return \%i_stp_port; | ||||
| } | ||||
| @@ -310,11 +321,11 @@ sub i_stp_id { | ||||
|     my %i_stp_id; | ||||
|  | ||||
|     foreach my $index ( keys %$stp_p_id ) { | ||||
|         my $bridge = $stp_p_id->{$index}; | ||||
|         my $bport  = $stp_p_id->{$index}; | ||||
|         my $iid    = $bp_index->{$index}; | ||||
|         next unless defined $iid; | ||||
|         next unless defined $bridge; | ||||
|         $i_stp_id{$iid} = $bridge; | ||||
|         next unless defined $bport; | ||||
|         $i_stp_id{$iid} = $bport; | ||||
|     } | ||||
|     return \%i_stp_id; | ||||
| } | ||||
| @@ -329,11 +340,11 @@ sub i_stp_bridge { | ||||
|     my %i_stp_bridge; | ||||
|  | ||||
|     foreach my $index ( keys %$stp_p_bridge ) { | ||||
|         my $bridge = $stp_p_bridge->{$index}; | ||||
|         my $bport  = $stp_p_bridge->{$index}; | ||||
|         my $iid    = $bp_index->{$index}; | ||||
|         next unless defined $iid; | ||||
|         next unless defined $bridge; | ||||
|         $i_stp_bridge{$iid} = $bridge; | ||||
|         next unless defined $bport; | ||||
|         $i_stp_bridge{$iid} = $bport; | ||||
|     } | ||||
|     return \%i_stp_bridge; | ||||
| } | ||||
| @@ -550,10 +561,10 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $bridge = new SNMP::Info (  | ||||
|  my $bridge = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'switch',  | ||||
|                              DestHost    => 'switch', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                              ); | ||||
| @@ -574,7 +585,7 @@ Max Baker | ||||
|     my $port  = $interfaces->{$iid}; | ||||
|  | ||||
|     print "Port:$port forwarding to $mac\n"; | ||||
|  }  | ||||
|  } | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| @@ -583,12 +594,12 @@ MAC Forwarding Table and Spanning Tree Protocol info. | ||||
|  | ||||
| F<Q-BRIDGE-MIB> holds 802.1q information -- VLANs and Trunking.  Cisco tends | ||||
| not to use this MIB, but some proprietary ones.  HP and some nicer vendors use | ||||
| this.  This is from C<RFC2674_q>.   | ||||
| this.  This is from C<RFC2674_q>. | ||||
|  | ||||
| Create or use a subclass of SNMP::Info that inherits this class.  Do not use | ||||
| directly. | ||||
|  | ||||
| For debugging you can call new() directly as you would in SNMP::Info  | ||||
| For debugging you can call new() directly as you would in SNMP::Info | ||||
|  | ||||
|  my $bridge = new SNMP::Info::Bridge(...); | ||||
|  | ||||
| @@ -604,12 +615,11 @@ None. | ||||
|  | ||||
| =item F<Q-BRIDGE-MIB> | ||||
|  | ||||
| =item F<RSTP-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| F<BRIDGE-MIB> needs to be extracted from | ||||
| ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz | ||||
|  | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| @@ -652,19 +662,19 @@ Returns root of STP. | ||||
|  | ||||
| (C<dot1dStpDesignatedRoot>) | ||||
|  | ||||
| =item $bridge->qb_vlans_max()  | ||||
| =item $bridge->qb_vlans_max() | ||||
|  | ||||
| Maximum number of VLANS supported on this device. | ||||
|  | ||||
| (C<dot1qMaxSupportedVlans>) | ||||
|  | ||||
| =item $bridge->qb_vlans()  | ||||
| =item $bridge->qb_vlans() | ||||
|  | ||||
| Current number of VLANs that are configured in this device. | ||||
|  | ||||
| (C<dot1qNumVlans>) | ||||
|  | ||||
| =item $bridge->qb_next_vlan_index()  | ||||
| =item $bridge->qb_next_vlan_index() | ||||
|  | ||||
| The next available value for C<dot1qVlanIndex> of a local VLAN entry in | ||||
| C<dot1qVlanStaticTable> | ||||
| @@ -696,7 +706,7 @@ IDs.  These are the VLANs which are members of the egress list for the port. | ||||
|   Example: | ||||
|   my $interfaces = $bridge->interfaces(); | ||||
|   my $vlans      = $bridge->i_vlan_membership(); | ||||
|    | ||||
|  | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
| @@ -716,7 +726,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() | ||||
|  | ||||
| @@ -726,7 +736,7 @@ Returns VLAN IDs | ||||
|  | ||||
| =head2 Forwarding Table (C<dot1dTpFdbEntry>) | ||||
|  | ||||
| =over  | ||||
| =over | ||||
|  | ||||
| =item $bridge->fw_mac() | ||||
|  | ||||
| @@ -944,7 +954,7 @@ The set of ports which are assigned to the egress list for this VLAN. | ||||
| =item $bridge->qb_cv_untagged() | ||||
|  | ||||
| The set of ports which should transmit egress packets for this VLAN as | ||||
| untagged.  | ||||
| untagged. | ||||
|  | ||||
| (C<dot1qVlanCurrentUntaggedPorts>) | ||||
|  | ||||
| @@ -982,7 +992,7 @@ for this VLAN. | ||||
| =item $bridge->qb_v_untagged() | ||||
|  | ||||
| The set of ports which should transmit egress packets for this VLAN as | ||||
| untagged.  | ||||
| untagged. | ||||
|  | ||||
| (C<dot1qVlanStaticUntaggedPorts>) | ||||
|  | ||||
| @@ -1022,13 +1032,13 @@ Returns reference to hash of forwarding table entries status | ||||
| (C<dot1qTpFdbStatus>) | ||||
|  | ||||
| =back | ||||
|   | ||||
|  | ||||
| =head1 SET METHODS | ||||
|  | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
|  | ||||
| =over | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CDP | ||||
| # $Id$ | ||||
| # | ||||
| # Changes since Version 0.7 Copyright (c) 2004 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -34,16 +33,17 @@ | ||||
| package SNMP::Info::CDP; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::CDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CDP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars | ||||
|     qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT %CDP_CAPABILITIES/; | ||||
| our | ||||
|     ($VERSION, $DEBUG, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $INIT, %CDP_CAPABILITIES); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| # Five data structures required by SNMP::Info | ||||
| %MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' ); | ||||
| @@ -54,16 +54,15 @@ $VERSION = '3.45'; | ||||
|     'cdp_run'      => 'cdpGlobalRun', | ||||
|     'cdp_interval' => 'cdpGlobalMessageInterval', | ||||
|     'cdp_holdtime' => 'cdpGlobalHoldTime', | ||||
|     'cdp_gid'       => 'cdpGlobalDeviceId', | ||||
|     'cdp_gid'      => 'cdpGlobalDeviceId', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     'cdp_index'        => 'cdpCacheIfIndex', | ||||
|     'cdp_proto'        => 'cdpCacheAddressType', | ||||
|     'cdp_addr'         => 'cdpCacheAddress', | ||||
|     'cdp_ver'          => 'cdpCacheVersion', | ||||
|     'cdp_dev_id'       => 'cdpCacheDeviceId', | ||||
|     'cdp_port'         => 'cdpCacheDevicePort', | ||||
|     'cdp_dev_port'     => 'cdpCacheDevicePort', | ||||
|     'cdp_platform'     => 'cdpCachePlatform', | ||||
|     'cdp_capabilities' => 'cdpCacheCapabilities', | ||||
|     'cdp_domain'       => 'cdpCacheVTPMgmtDomain', | ||||
| @@ -80,11 +79,9 @@ $VERSION = '3.45'; | ||||
|     'cdp_capabilities' => \&SNMP::Info::munge_bits, | ||||
|     'cdp_platform'     => \&SNMP::Info::munge_null, | ||||
|     'cdp_domain'       => \&SNMP::Info::munge_null, | ||||
|     'cdp_port'         => \&SNMP::Info::munge_null, | ||||
|     'cdp_ver'          => \&SNMP::Info::munge_null, | ||||
|     'cdp_ip'           => \&SNMP::Info::munge_ip, | ||||
|     'cdp_power'        => \&munge_power, | ||||
|  | ||||
| ); | ||||
|  | ||||
| %CDP_CAPABILITIES = ( | ||||
| @@ -111,28 +108,21 @@ sub munge_power { | ||||
| sub hasCDP { | ||||
|     my $cdp = shift; | ||||
|  | ||||
|     my $ver = $cdp->{_version}; | ||||
|     # Check the global that is supposed to indicate CDP is running | ||||
|     my $cdp_run = $cdp->cdp_run(); | ||||
|     return 1 if $cdp_run; | ||||
|  | ||||
|     # SNMP v1 clients dont have the globals | ||||
|     if ( defined $ver and $ver == 1 ) { | ||||
|         my $cdp_ip = $cdp->cdp_ip(); | ||||
|     # SNMP v1 clients don't have the globals, fallback | ||||
|     # by checking if it would report neighbors | ||||
|     my $cdp_ip = $cdp->cdp_ip() || {}; | ||||
|     return 1 if scalar keys %$cdp_ip; | ||||
|  | ||||
|         # See if anything in cdp cache, if so we have cdp | ||||
|         return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) ); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     return $cdp->cdp_run(); | ||||
|     return; | ||||
| } | ||||
|  | ||||
| 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( | ||||
| @@ -225,6 +215,28 @@ sub cdp_id { | ||||
|     return \%cdp_id; | ||||
| } | ||||
|  | ||||
| sub cdp_port { | ||||
|     my $cdp    = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $ch = $cdp->cdp_dev_port($partial) || {}; | ||||
|  | ||||
|     # most devices return a string with the interface name here (Port-ID TLV) | ||||
|     # see https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/cdp/command/cdp-cr-book/cdp-cr-a1.html | ||||
|     # it seems however that some devices report hex encoded mac addresses for this, see | ||||
|     # https://github.com/netdisco/snmp-info/issues/252 | ||||
|     # once these bad devices get known we can figure out workarounds for them | ||||
|  | ||||
|     my %cdp_port; | ||||
|     foreach my $key ( sort keys %$ch ) { | ||||
|         my $port = $ch->{$key}; | ||||
|         next unless $port; | ||||
|         $port = SNMP::Info::munge_null($port); | ||||
|         $cdp_port{$key} = $port; | ||||
|     } | ||||
|     return \%cdp_port; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| @@ -238,10 +250,10 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $cdp = new SNMP::Info (  | ||||
|  my $cdp = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
| @@ -252,7 +264,7 @@ Max Baker | ||||
|  $hascdp   = $cdp->hasCDP() ? 'yes' : 'no'; | ||||
|  | ||||
|  # Print out a map of device ports with CDP neighbors: | ||||
|  my $interfaces = $cdp->interfaces(); | ||||
|  my $interfaces   = $cdp->interfaces(); | ||||
|  my $cdp_if       = $cdp->cdp_if(); | ||||
|  my $cdp_ip       = $cdp->cdp_ip(); | ||||
|  my $cdp_port     = $cdp->cdp_port(); | ||||
| @@ -267,17 +279,17 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented  | ||||
| SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented | ||||
| interface to CDP information through SNMP. | ||||
|  | ||||
| CDP is a Layer 2 protocol that supplies topology information of devices that | ||||
| also speak CDP, mostly switches and routers.  CDP is implemented in Cisco and | ||||
| some HP devices. | ||||
| also speak CDP, mostly switches and routers.  CDP is implemented by Cisco and | ||||
| several other vendors. | ||||
|  | ||||
| Create or use a device subclass that inherits this class.  Do not use | ||||
| directly. | ||||
|  | ||||
| Each device implements a subset of the global and cache entries.  | ||||
| Each device implements a subset of the global and cache entries. | ||||
| Check the return value to see if that data is held by the device. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
| @@ -292,9 +304,7 @@ None. | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
|  | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| @@ -302,7 +312,7 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
| =item  $cdp->hasCDP() | ||||
|  | ||||
| Is CDP is active in this device?   | ||||
| Is CDP is active in this device? | ||||
|  | ||||
| Accounts for SNMP version 1 devices which may have CDP but not cdp_run() | ||||
|  | ||||
| @@ -321,13 +331,13 @@ Interval in seconds at which CDP messages are generated. | ||||
|  | ||||
| =item $cdp->cdp_holdtime() | ||||
|  | ||||
| Time in seconds that CDP messages are kept.  | ||||
| Time in seconds that CDP messages are kept. | ||||
|  | ||||
| (C<cdpGlobalHoldTime>) | ||||
|  | ||||
| =item  $cdp->cdp_gid()  | ||||
| =item  $cdp->cdp_gid() | ||||
|  | ||||
| Returns CDP device ID.   | ||||
| Returns CDP device ID. | ||||
|  | ||||
| This is the device id broadcast via CDP to other devices, and is what is | ||||
| retrieved from remote devices with $cdp->id(). | ||||
| @@ -348,9 +358,9 @@ to a hash. | ||||
| =item $cdp->cdp_capabilities() | ||||
|  | ||||
| Returns Device Functional Capabilities.  Results are munged into an ascii | ||||
| binary string, MSB.  Each digit represents a bit from the table below from  | ||||
| binary string, MSB.  Each digit represents a bit from the table below from | ||||
| the CDP Capabilities Mapping to Smartport Type table within the | ||||
| Cisco Small Business 200 Series Smart Switch Administration Guide,  | ||||
| Cisco Small Business 200 Series Smart Switch Administration Guide, | ||||
| L<http://www.cisco.com/c/en/us/support/switches/small-business-200-series-smart-switches/products-maintenance-guides-list.html>: | ||||
|  | ||||
| (Bit) - Description | ||||
| @@ -400,7 +410,7 @@ C<CISCO-VTP-MIB::managementDomainName> | ||||
|  | ||||
| (C<cdpCacheVTPMgmtDomain>) | ||||
|  | ||||
| =item $cdp->cdp_duplex()  | ||||
| =item $cdp->cdp_duplex() | ||||
|  | ||||
| Returns the port duplex status from remote devices. | ||||
|  | ||||
| @@ -417,7 +427,7 @@ Returns remote device id string | ||||
| Returns the mapping to the SNMP Interface Table. | ||||
|  | ||||
| Note that a lot devices don't implement $cdp->cdp_index(),  So if it isn't | ||||
| around, we fake it.  | ||||
| around, we fake it. | ||||
|  | ||||
| In order to map the cdp table entry back to the interfaces() entry, we | ||||
| truncate the last number off of it : | ||||
| @@ -428,7 +438,7 @@ truncate the last number off of it : | ||||
|  | ||||
|   # if not, let's fake it | ||||
|   my $cdp_ip       = $device->cdp_ip(); | ||||
|      | ||||
|  | ||||
|   my %cdp_if | ||||
|   foreach my $key (keys %$cdp_ip){ | ||||
|       $iid = $key; | ||||
| @@ -436,13 +446,13 @@ truncate the last number off of it : | ||||
|       $iid =~ s/\.\d+$//; | ||||
|       $cdp_if{$key} = $iid; | ||||
|   } | ||||
|   | ||||
|  | ||||
|   return \%cdp_if; | ||||
|  | ||||
|  | ||||
| =item $cdp->cdp_index() | ||||
|  | ||||
| Returns the mapping to the SNMP2 Interface table for CDP Cache Entries.  | ||||
| Returns the mapping to the SNMP2 Interface table for CDP Cache Entries. | ||||
|  | ||||
| Most devices don't implement this, so you probably want to use $cdp->cdp_if() | ||||
| instead. | ||||
| @@ -464,17 +474,18 @@ Returns remote address | ||||
|  | ||||
| (C<cdpCacheAddress>) | ||||
|  | ||||
| =item $cdp->cdp_platform()  | ||||
| =item $cdp->cdp_platform() | ||||
|  | ||||
| Returns remote platform id  | ||||
| Returns remote platform id | ||||
|  | ||||
| (C<cdpCachePlatform>) | ||||
|  | ||||
| =item $cdp->cdp_port() | ||||
|  | ||||
| Returns remote port ID | ||||
| Returns remote Port-ID. Most of the time this is a string with the port name, but this | ||||
| is not guaranteed to be so. | ||||
|  | ||||
| (C<cdpDevicePort>) | ||||
| (C<cdpCacheDevicePort>) | ||||
|  | ||||
| =item  $cdp->cdp_proto() | ||||
|  | ||||
| @@ -482,7 +493,7 @@ Returns remote address type received.  Usually IP. | ||||
|  | ||||
| (C<cdpCacheAddressType>) | ||||
|  | ||||
| =item $cdp->cdp_ver()  | ||||
| =item $cdp->cdp_ver() | ||||
|  | ||||
| Returns remote hardware version | ||||
|  | ||||
| @@ -501,7 +512,7 @@ for decimal placement. | ||||
|  | ||||
| (C<cdpCachePowerConsumption>) | ||||
|  | ||||
| =item  $cdp->cdp_cap()  | ||||
| =item  $cdp->cdp_cap() | ||||
|  | ||||
| Returns hash of arrays with each array containing the system capabilities | ||||
| supported by the remote system.  Possible elements in the array are | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| # SNMP::Info::CiscoAgg | ||||
| # | ||||
| # Copyright (c) 2014 SNMP::Info Developers | ||||
| # Copyright (c) 2019 SNMP::Info Developers | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| @@ -30,31 +30,71 @@ | ||||
| package SNMP::Info::CiscoAgg; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::IEEE802dot3ad 'agg_ports_lag'; | ||||
| use SNMP::Info::IEEE802dot3ad; | ||||
|  | ||||
| @SNMP::Info::CiscoAgg::ISA = qw/ | ||||
|   SNMP::Info::IEEE802dot3ad | ||||
|   Exporter | ||||
| /; | ||||
|  | ||||
| @SNMP::Info::CiscoAgg::EXPORT_OK = qw/ | ||||
|   agg_ports | ||||
|   agg_ports_cisco | ||||
|   agg_ports_lag | ||||
|   agg_ports_pagp | ||||
| /; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($DEBUG, $VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|   %SNMP::Info::IEEE802dot3ad::MIBS, | ||||
|   'CISCO-PAGP-MIB'   => 'pagpGroupIfIndex', | ||||
|   'CISCO-PAGP-MIB'         => 'pagpGroupIfIndex', | ||||
|   'CISCO-LAG-MIB'          => 'clagAggPortListPorts', | ||||
|   'CISCO-IF-EXTENSION-MIB' => 'cieIfLastInTime', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = (); | ||||
|  | ||||
| %FUNCS = (); | ||||
| %FUNCS = ( | ||||
|   %SNMP::Info::IEEE802dot3ad::FUNCS, | ||||
|   'lag_ports'         => 'clagAggPortListPorts', | ||||
|   'lag_members'       => 'clagAggPortListInterfaceIndexList', | ||||
| ); | ||||
|  | ||||
| %MUNGE = (); | ||||
| %MUNGE = ( | ||||
|   %SNMP::Info::IEEE802dot3ad::MUNGE, | ||||
|   'lag_ports'     => \&SNMP::Info::munge_port_list, | ||||
|   'lag_members'   => \&munge_port_ifindex, | ||||
| ); | ||||
|  | ||||
| sub munge_port_ifindex { | ||||
|     my $plist = shift; | ||||
|     return unless defined $plist; | ||||
|     return unless length $plist; | ||||
|  | ||||
|     my $list = [ map {sprintf "%d", hex($_)} unpack( "(A8)*", join( '' ,  map { sprintf "%02x", $_} unpack( "(C4)*", $plist ) ))  ]; | ||||
|  | ||||
|     return $list; | ||||
| } | ||||
|  | ||||
| sub agg_ports_cisco { | ||||
|   my $dev = shift; | ||||
|   my $group = $dev->lag_members; | ||||
|  | ||||
|   my $mapping = {}; | ||||
|   for my $master (keys %$group) { | ||||
|     my $slaves = $group->{$master}; | ||||
|     for my $slave (@$slaves) { | ||||
|       $mapping->{$slave} = $master; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return $mapping; | ||||
| } | ||||
|  | ||||
| sub agg_ports_pagp { | ||||
|   my $dev = shift; | ||||
| @@ -76,9 +116,28 @@ sub agg_ports_pagp { | ||||
|   return $mapping; | ||||
| } | ||||
|  | ||||
| # until we have PAgP data and need to combine with LAG data | ||||
| sub agg_ports_lag { | ||||
|   my $dev = shift; | ||||
|  | ||||
|   # same note as for agg_ports_pagp, it will miss mappings if interfaces | ||||
|   # are down or lacp is not synced. | ||||
|  | ||||
|   my $mapping = {}; | ||||
|   my $group = $dev->dot3adAggPortSelectedAggID; | ||||
|   for my $slave (keys %$group) { | ||||
|     my $master = $group->{$slave}; | ||||
|     next if($master == 0 || $slave == $master); | ||||
|  | ||||
|     $mapping->{$slave} = $master; | ||||
|   } | ||||
|  | ||||
|   return $mapping; | ||||
| } | ||||
|  | ||||
|  | ||||
| # combine PAgP, LAG & Cisco proprietary data | ||||
| sub agg_ports { | ||||
|   my $ret = {%{agg_ports_pagp(@_)}, %{agg_ports_lag(@_)}}; | ||||
|   my $ret = {%{agg_ports_pagp(@_)}, %{agg_ports_lag(@_)}, %{agg_ports_cisco(@_)}}; | ||||
|   return $ret; | ||||
| } | ||||
|  | ||||
| @@ -96,14 +155,14 @@ SNMP::Info Developers | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $info = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $info->class(); | ||||
| @@ -112,7 +171,7 @@ SNMP::Info Developers | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| This class provides access to Aggregated Links configuration on Cisco devices. | ||||
| It combines Cisco PAgP and IEEE 802.3ad information. | ||||
| It combines Cisco PAgP, Cisco proprietary info and IEEE 802.3ad information. | ||||
|  | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
|  | ||||
| @@ -126,11 +185,13 @@ L<SNMP::Info::IEEE802dot3ad> | ||||
|  | ||||
| =item F<CISCO-PAGP-MIB> | ||||
|  | ||||
| =item F<CISCO-LAG-MIB> | ||||
|  | ||||
| =item F<CISCO-IF-EXTENSION-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
|  | ||||
| =head1 METHODS | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| =over 4 | ||||
|  | ||||
| @@ -140,11 +201,52 @@ Returns a HASH reference mapping from slave to master port for each member of | ||||
| a port bundle on the device. Keys are ifIndex of the slave ports, Values are | ||||
| ifIndex of the corresponding master ports. | ||||
|  | ||||
| =item C<agg_ports_cisco> | ||||
|  | ||||
| Implements the cisco LAG info retrieval. Merged into C<agg_ports> data | ||||
| automatically. Will fetch all members of C<clagAggPortListInterfaceIndexList> | ||||
| even if they are not running an aggregation protocol. | ||||
|  | ||||
| =item C<agg_ports_pagp> | ||||
|  | ||||
| Implements the PAgP LAG info retrieval. Merged into C<agg_ports> data | ||||
| automatically. | ||||
|  | ||||
| =item C<lag_members> | ||||
|  | ||||
| Mimics C<ad_lag_ports> from L<SNMP::Info::IEEE802dot3ad> but based on ifindex | ||||
| instead of instead of bp_index. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 OVERRIDES | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item C<agg_ports_lag> | ||||
|  | ||||
| This will retrieve LAG ports based on C<dot3adAggPortSelectedAggID> data. | ||||
| It will be merged into C<agg_ports> data. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::IEEE802dot3ad | ||||
|  | ||||
| =over | ||||
|  | ||||
| See documentation in L<SNMP::Info::IEEE802dot3ad> for details. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 MUNGES | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item C<munge_port_ifindex> | ||||
|  | ||||
| Takes C<clagAggPortListInterfaceIndexList>, uses the index as master port, then | ||||
| returns all members as ifindex. Works with single or multiple slaves to a master. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoConfig | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::CiscoConfig; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::CiscoConfig::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoConfig::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable', | ||||
| @@ -279,7 +279,7 @@ Justin Hunter, Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -336,10 +336,6 @@ These are methods that return scalar value from SNMP | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Config Copy Request Table  (C<ccCopyTable>) | ||||
|  | ||||
| =over | ||||
| @@ -435,7 +431,7 @@ Table of Flash copy operation entries. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
|  | ||||
| =over | ||||
|  | ||||
| @@ -452,7 +448,7 @@ older procedure has been depreciated by Cisco and is utilized only to support | ||||
| devices running older code revisions. | ||||
|  | ||||
|  Example: | ||||
|  $ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig')  | ||||
|  $ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig') | ||||
|     or die "Couldn't save config. ",$ciscoconfig->error(1); | ||||
|  | ||||
| =item $ciscoconfig->copy_run_start() | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoPortSecurity | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,19 +30,22 @@ | ||||
| package SNMP::Info::CiscoPortSecurity; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| 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/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PAECAPABILITIES); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB', | ||||
|     'CISCO-PAE-MIB'           => 'ciscoPaeMIB', | ||||
|     'IEEE8021-PAE-MIB'        => 'dot1xAuthLastEapolFrameSource', | ||||
|     'CISCO-ERR-DISABLE-MIB'   => 'ciscoErrDisableMIB', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| @@ -81,37 +83,34 @@ $VERSION = '3.45'; | ||||
|     # 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, | ||||
| ); | ||||
|  | ||||
| %PAECAPABILITIES = ( | ||||
|     0 => 'dot1xPaePortAuthCapable', | ||||
|     1 => 'dot1xPaePortSuppCapable' | ||||
|     1 => 'dot1xPaePortSuppCapable', | ||||
| ); | ||||
|  | ||||
| sub 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 | ||||
|  | ||||
| @@ -137,14 +152,14 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $cps = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $cps->class(); | ||||
| @@ -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,16 +188,14 @@ None. | ||||
|  | ||||
| =item F<IEEE8021-PAE-MIB> | ||||
|  | ||||
| =item F<CISCO-ERR-DISABLE-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 F<CISCO-PORT-SECURITY-MIB> globals | ||||
|  | ||||
| =over | ||||
| @@ -300,10 +314,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 +332,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 +350,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 +372,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 | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoPower | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bill Fenner | ||||
| # All rights reserved. | ||||
| @@ -31,24 +30,26 @@ | ||||
| package SNMP::Info::CiscoPower; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::CiscoPower::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoPower::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex', | ||||
|           'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' ); | ||||
|           'CISCO-CDP-MIB' => 'cdpCachePowerConsumption', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = (); | ||||
|  | ||||
| %FUNCS = (  | ||||
|     'cpeth_ent_phy'     => 'cpeExtPsePortEntPhyIndex',  | ||||
|     'peth_port_power'   => 'cpeExtPsePortPwrConsumption',  | ||||
| %FUNCS = ( | ||||
|     'cpeth_ent_phy'     => 'cpeExtPsePortEntPhyIndex', | ||||
|     'peth_port_power'   => 'cpeExtPsePortPwrConsumption', | ||||
| ); | ||||
|  | ||||
| %MUNGE = (); | ||||
| @@ -113,14 +114,14 @@ Bill Fenner | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $poe = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $poe->class(); | ||||
| @@ -153,6 +154,8 @@ Note that it requires that the device inherits from Info::Entity. | ||||
|  | ||||
| =item F<CISCO-POWER-ETHERNET-EXT-MIB> | ||||
|  | ||||
| =item F<CISCO-CDP-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
| @@ -176,7 +179,7 @@ Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>. | ||||
|  | ||||
| Power supplied by PoE ports, in milliwatts | ||||
| (C<cpeExtPsePortPwrConsumption>) | ||||
|   | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 CDP Port table | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoQOS | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2005 Alexander Hartmaier | ||||
| # All rights reserved. | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::CiscoQOS; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::CiscoQOS::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoQOS::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', ); | ||||
|  | ||||
| @@ -86,14 +86,14 @@ Alexander Hartmaier | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $qos = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $qos->class(); | ||||
| @@ -101,7 +101,7 @@ Alexander Hartmaier | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::CiscoQOS is a subclass of SNMP::Info that provides  | ||||
| SNMP::Info::CiscoQOS is a subclass of SNMP::Info that provides | ||||
| information about a cisco device's QoS config. | ||||
|  | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| @@ -118,8 +118,6 @@ none. | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| =over | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoRTT | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2005 Alexander Hartmaier | ||||
| # All rights reserved. | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::CiscoRTT; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::CiscoRTT::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoRTT::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', ); | ||||
|  | ||||
| @@ -67,14 +67,14 @@ Alexander Hartmaier | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $rtt = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $rtt->class(); | ||||
| @@ -82,7 +82,7 @@ Alexander Hartmaier | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::CiscoRTT is a subclass of SNMP::Info that provides  | ||||
| SNMP::Info::CiscoRTT is a subclass of SNMP::Info that provides | ||||
| information about a cisco device's RTT values. | ||||
|  | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| @@ -99,8 +99,6 @@ none. | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| =over | ||||
| @@ -113,7 +111,7 @@ None | ||||
|  | ||||
| =head2 Overall Control Group Table | ||||
|  | ||||
| This table is from C<CISCO-RTTMAN-MIB::rttMonCtrlAdminTable> | ||||
| This table is from C<CISCO-RTTMON-MIB::rttMonCtrlAdminTable> | ||||
|  | ||||
| =over | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoStack | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -31,14 +30,15 @@ | ||||
| package SNMP::Info::CiscoStack; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
|  | ||||
| @SNMP::Info::CiscoStack::ISA       = qw/Exporter/; | ||||
| @SNMP::Info::CiscoStack::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PORTSTAT); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', ); | ||||
|  | ||||
| @@ -106,7 +106,7 @@ $VERSION = '3.45'; | ||||
|     1 => 'other', | ||||
|     2 => 'ok', | ||||
|     3 => 'minorFault', | ||||
|     4 => 'majorFault' | ||||
|     4 => 'majorFault', | ||||
| ); | ||||
|  | ||||
| # Changes binary byte describing each port into ascii, and returns | ||||
| @@ -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'; | ||||
|         } | ||||
|  | ||||
| @@ -286,8 +286,7 @@ __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::CiscoStack - SNMP Interface to data from F<CISCO-STACK-MIB> and | ||||
| F<CISCO-PORT-SECURITY-MIB> | ||||
| SNMP::Info::CiscoStack - SNMP Interface to data from F<CISCO-STACK-MIB> | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -295,17 +294,17 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $ciscostats = new SNMP::Info( | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $ciscostack = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $ciscostats->class(); | ||||
|  my $class = $ciscostack->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
| @@ -386,7 +385,7 @@ Returns a map to IID for ports that are physical ports, not vlans, etc. | ||||
|  | ||||
| =item $stack->i_type() | ||||
|  | ||||
| Crosses p_port() with p_type() and returns the results.  | ||||
| Crosses p_port() with p_type() and returns the results. | ||||
|  | ||||
| Overrides with C<ifType> if p_type() isn't available. | ||||
|  | ||||
| @@ -425,7 +424,7 @@ C<portAdminSpeed> | ||||
|  | ||||
|     Example: | ||||
|     my %if_map = reverse %{$stack->interfaces()}; | ||||
|     $stack->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})  | ||||
|     $stack->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'}) | ||||
|         or die "Couldn't change port speed. ",$stack->error(1); | ||||
|  | ||||
| =item $stack->set_i_duplex_admin(duplex, ifIndex) | ||||
| @@ -439,7 +438,7 @@ C<portAdminSpeed> | ||||
|  | ||||
|     Example: | ||||
|     my %if_map = reverse %{$stack->interfaces()}; | ||||
|     $stack->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})  | ||||
|     $stack->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) | ||||
|         or die "Couldn't change port duplex. ",$stack->error(1); | ||||
|  | ||||
| =back | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoStats | ||||
| # $Id$ | ||||
| # | ||||
| # Changes since Version 0.7 Copyright (c) 2008-2009 Max Baker and SNMP::Info Developers | ||||
| # All rights reserved. | ||||
| @@ -34,22 +33,23 @@ | ||||
| package SNMP::Info::CiscoStats; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::CiscoStats::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoStats::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %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', | ||||
|  | ||||
| @@ -88,7 +88,7 @@ $VERSION = '3.45'; | ||||
|  | ||||
|     # CISCO-FLASH-MIB::ciscoFlashDeviceTable | ||||
|     'cisco_flash_size' => 'ciscoFlashDeviceSize', | ||||
|      | ||||
|  | ||||
|     # CISCO-IMAGE-MIB | ||||
|     'ci_images' => 'ciscoImageString', | ||||
| ); | ||||
| @@ -105,6 +105,10 @@ sub os { | ||||
|  | ||||
|     # order here matters - there are Catalysts that run IOS and have catalyst | ||||
|     # in their description field, as well as Catalysts that run IOS-XE. | ||||
|     return 'ios-xe'   if ( $descr =~ /Denali/ ); | ||||
|     return 'ios-xe'   if ( $descr =~ /Fuji/ ); | ||||
|     return 'ios-xe'   if ( $descr =~ /Everest/ ); | ||||
|     return 'ios-xe'   if ( $descr =~ /Gibraltar/ ); | ||||
|     return 'ios-xe'   if ( $descr =~ /IOS-XE/ ); | ||||
|     return 'ios-xr'   if ( $descr =~ /IOS XR/ ); | ||||
|     return 'ios'      if ( $descr =~ /IOS/ ); | ||||
| @@ -334,7 +338,7 @@ Eric Miller, Max Baker, Sam Stickland | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $ciscostats = new SNMP::Info( | ||||
|                     AutoSpecify => 1, | ||||
|                     Debug       => 1, | ||||
| @@ -342,7 +346,7 @@ Eric Miller, Max Baker, Sam Stickland | ||||
|                     DestHost    => 'myswitch', | ||||
|                     Community   => 'public', | ||||
|                     Version     => 2 | ||||
|                     )  | ||||
|                     ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $ciscostats->class(); | ||||
| @@ -351,7 +355,7 @@ Eric Miller, Max Baker, Sam Stickland | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory, | ||||
| os and version information about Cisco Devices.  | ||||
| os and version information about Cisco Devices. | ||||
|  | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
|  | ||||
| @@ -385,8 +389,6 @@ None. | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| =over | ||||
| @@ -447,7 +449,7 @@ Tries to parse C<ROMMON> version from rom_id() string | ||||
|  | ||||
| Current CPU usage in percent. | ||||
|  | ||||
| C<1.3.6.1.4.1.9.2.1.56.0> =  | ||||
| C<1.3.6.1.4.1.9.2.1.56.0> = | ||||
| C<OLD-CISCO-CPU-MIB:avgBusyPer> | ||||
|  | ||||
| =item $ciscostats->ios_cpu_1min() | ||||
|   | ||||
| @@ -1,42 +1,42 @@ | ||||
| # SNMP::Info::CiscoStpExtensions | ||||
| # | ||||
| # Copyright (c)2009 Carlos Vicente | ||||
| # All rights reserved.   | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without  | ||||
| # 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 author nor the  | ||||
| #       names of its contributors may be used to endorse or promote products  | ||||
| #     * Neither the name of the author 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  | ||||
| # 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;  | ||||
| # (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  | ||||
| # 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::CiscoStpExtensions; | ||||
|  | ||||
| use strict; | ||||
|  | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
|  | ||||
| use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/; | ||||
| our ($VERSION, $DEBUG, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PORTSTAT, $INIT); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| @SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//; | ||||
| @@ -54,12 +54,15 @@ $VERSION = '3.45'; | ||||
|             '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.45'; | ||||
|  | ||||
| %MUNGE   = ( | ||||
|             %SNMP::Info::Bridge::MUNGE, | ||||
|            'stpx_mst_config_digest'     => \&SNMP::Info::CiscoStpExtensions::oct2str, | ||||
|            'stpx_mst_config_digest'      => \&SNMP::Info::CiscoStpExtensions::oct2str, | ||||
|            ); | ||||
|  | ||||
|  | ||||
| @@ -103,11 +106,11 @@ sub mst_region_rev { | ||||
|  | ||||
| sub mst_vlan2instance { | ||||
|     my $self = shift; | ||||
|      | ||||
|  | ||||
|     # Get MST vlan-to-instance mapping | ||||
|     my $m1k2k = $self->stpx_smst_vlans_mapped_1k2k; | ||||
|     my $m3k4k = $self->stpx_smst_vlans_mapped_3k4k; | ||||
|     | ||||
|  | ||||
|     # Get list of VLANs | ||||
|     my $vlan_membership = $self->i_vlan_membership; | ||||
|     my @vlans; | ||||
| @@ -137,7 +140,7 @@ sub mst_vlan2instance { | ||||
|                     $res{$vlan} = $inst; | ||||
|                     last; | ||||
|                 } | ||||
|             }        | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return \%res; | ||||
| @@ -159,7 +162,7 @@ sub i_rootguard_enabled { | ||||
|         $res{$iid} = $enabled; | ||||
|     } | ||||
|     return \%res; | ||||
| }   | ||||
| } | ||||
|  | ||||
| sub i_loopguard_enabled { | ||||
|     my $self    = shift; | ||||
| @@ -177,7 +180,7 @@ sub i_loopguard_enabled { | ||||
|         $res{$iid} = $enabled; | ||||
|     } | ||||
|     return \%res; | ||||
| }   | ||||
| } | ||||
|  | ||||
| sub i_bpduguard_enabled { | ||||
|     my $self    = shift; | ||||
| @@ -186,7 +189,7 @@ sub i_bpduguard_enabled { | ||||
|     my $bpdugm_default = $self->stpx_bpduguard_enable(); | ||||
|     my $bp_index       = $self->bp_index($partial); | ||||
|     my $bpdugm         = $self->stpx_port_bpduguard_mode(); | ||||
|      | ||||
|  | ||||
|     my %res; | ||||
|     foreach my $index ( keys %$bpdugm ){ | ||||
|         my $mode = $bpdugm->{$index}; | ||||
| @@ -209,7 +212,7 @@ sub i_bpdufilter_enabled { | ||||
|     my $bpdufm_default = $self->stpx_bpdufilter_enable(); | ||||
|     my $bp_index       = $self->bp_index($partial); | ||||
|     my $bpdufm         = $self->stpx_port_bpdufilter_mode(); | ||||
|      | ||||
|  | ||||
|     my %res; | ||||
|     foreach my $index ( keys %$bpdufm ){ | ||||
|         my $mode = $bpdufm->{$index}; | ||||
| @@ -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) = @_; | ||||
| @@ -244,12 +277,25 @@ Carlos Vicente | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|    my $stpx = new SNMP::Info( | ||||
|                          AutoSpecify => 1, | ||||
|                          Debug       => 1, | ||||
|                          DestHost    => 'myswitch', | ||||
|                          Community   => 'public', | ||||
|                          Version     => 2 | ||||
|                        ) | ||||
|  | ||||
|    or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|    my $class = $stpx->class(); | ||||
|    print " Using device sub class : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Create or use a subclass of SNMP::Info that inherits this class.  Do not use | ||||
| directly. | ||||
|  | ||||
| For debugging you can call new() directly as you would in SNMP::Info  | ||||
| For debugging you can call new() directly as you would in SNMP::Info | ||||
|  | ||||
|  my $stpx = new SNMP::Info::CiscoStpExtensions(...); | ||||
|  | ||||
| @@ -257,15 +303,21 @@ For debugging you can call new() directly as you would in SNMP::Info | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info  | ||||
| =item SNMP::Info | ||||
|  | ||||
| =item SNMP::Info::Bridge  | ||||
| =item SNMP::Info::Bridge | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =head1 GLOBAL METHODS | ||||
| =over | ||||
|  | ||||
| =item F<CISCO-STP-EXTENSIONS-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| @@ -273,7 +325,7 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
| =item $stpx->stp_ver() | ||||
|  | ||||
| Returns the particular STP version running on this device.   | ||||
| Returns the particular STP version running on this device. | ||||
| Meant to override SNMP::Info::Brigde::stp_ver() | ||||
|  | ||||
| Values: C<pvstPlus>, C<mistp>, C<mistpPvstPlus>, C<mst>, C<rapidPvstPlus> | ||||
| @@ -291,25 +343,25 @@ to a hash. | ||||
|  | ||||
| =item $stpx->mst_config_digest() | ||||
|  | ||||
| Returns the Multiple Spanning Tree (MST) configuration digest  | ||||
| Returns the Multiple Spanning Tree (MST) configuration digest | ||||
|  | ||||
| (C<stpxSMSTConfigDigest>) | ||||
|  | ||||
| =item $stpx->mst_region_name() | ||||
|  | ||||
| Returns the Multiple Spanning Tree (MST) region name  | ||||
| Returns the Multiple Spanning Tree (MST) region name | ||||
|  | ||||
| (C<stpxMSTRegionName>) | ||||
|  | ||||
| =item $stpx->mst_region_rev() | ||||
|  | ||||
| Returns the Multiple Spanning Tree (MST) region name  | ||||
| Returns the Multiple Spanning Tree (MST) region name | ||||
|  | ||||
| (C<stpxSMSTRegionRevision>) | ||||
|  | ||||
| =item $stpx->mst_vlan2instance() | ||||
|  | ||||
| Returns the mapping of vlan to MST instance in the form of a hash reference  | ||||
| Returns the mapping of vlan to MST instance in the form of a hash reference | ||||
| with key = VLAN id, value = STP instance | ||||
|  | ||||
| =item $stpx->i_rootguard_enabled() | ||||
| @@ -340,6 +392,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 | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoVTP | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::CiscoVTP; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::CiscoVTP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoVTP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'CISCO-VTP-MIB'                       => 'vtpVlanName', | ||||
| @@ -61,7 +61,6 @@ $VERSION = '3.45'; | ||||
| %FUNCS = ( | ||||
|  | ||||
|     # CISCO-VTP-MIB::managementDomainTable | ||||
|     'vtp_d_index'     => 'managementDomainIndex', | ||||
|     'vtp_d_name'      => 'managementDomainName', | ||||
|     'vtp_d_mode'      => 'managementDomainLocalMode', | ||||
|     'vtp_d_rev'       => 'managementDomainConfigRevNumber', | ||||
| @@ -173,7 +172,7 @@ sub i_vlan { | ||||
|         # vtp_trunk_dyn_stat is not useful for down ports | ||||
|         # so we use vtp_trunk_dyn to see if trunking is set | ||||
|         my $dyn = $trunk_dyn->{$port}; | ||||
|          | ||||
|  | ||||
|         if (($stat and $stat =~ /^trunking/ ) | ||||
|             or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate')))) | ||||
|         { | ||||
| @@ -304,7 +303,7 @@ sub i_vlan_membership_untagged { | ||||
|         my $vlan = $vlans->{$port}; | ||||
|         push( @{ $i_vlan_membership->{$port} }, $vlan ); | ||||
|     } | ||||
|      | ||||
|  | ||||
|     return $i_vlan_membership; | ||||
| } | ||||
|  | ||||
| @@ -530,14 +529,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $vtp = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $vtp->class(); | ||||
| @@ -545,7 +544,7 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::CiscoVTP is a subclass of SNMP::Info that provides  | ||||
| SNMP::Info::CiscoVTP is a subclass of SNMP::Info that provides | ||||
| information about a Cisco device's VLAN and VTP Domain membership. | ||||
|  | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| @@ -566,8 +565,6 @@ None. | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| =over | ||||
| @@ -621,7 +618,7 @@ IDs.  These are the VLANs which are members of enabled VLAN list for the port. | ||||
|   Example: | ||||
|   my $interfaces = $vtp->interfaces(); | ||||
|   my $vlans      = $vtp->i_vlan_membership(); | ||||
|    | ||||
|  | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
| @@ -723,7 +720,7 @@ for a good treaty of how to connect to the VLANs | ||||
|  | ||||
| =item $vtp->i_vlan_type() | ||||
|  | ||||
| Static, Dynamic, or multiVlan.   | ||||
| Static, Dynamic, or multiVlan. | ||||
|  | ||||
| (C<vmVlanType>) | ||||
|  | ||||
| @@ -770,7 +767,7 @@ Each bit represents a VLAN.  This is 3072 through 4095 | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $vtp->i_voice_vlan()  | ||||
| =item $vtp->i_voice_vlan() | ||||
|  | ||||
| (C<vmVoiceVlanId>) | ||||
|  | ||||
| @@ -780,10 +777,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>) | ||||
| @@ -889,7 +882,7 @@ Each bit represents a VLAN.  This is 3072 through 4095 | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
|  | ||||
| =over | ||||
|  | ||||
| @@ -901,7 +894,7 @@ VLAN ID and port C<ifIndex>.  This method should only be used on end station | ||||
|  | ||||
|   Example: | ||||
|   my %if_map = reverse %{$vtp->interfaces()}; | ||||
|   $vtp->set_i_vlan('2', $if_map{'FastEthernet0/1'})  | ||||
|   $vtp->set_i_vlan('2', $if_map{'FastEthernet0/1'}) | ||||
|     or die "Couldn't change port VLAN. ",$vtp->error(1); | ||||
|  | ||||
| =item $vtp->set_i_pvid ( pvid, ifIndex ) | ||||
| @@ -911,7 +904,7 @@ port C<ifIndex>.  This method should only be used on trunk ports. | ||||
|  | ||||
|   Example: | ||||
|   my %if_map = reverse %{$vtp->interfaces()}; | ||||
|   $vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'})  | ||||
|   $vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'}) | ||||
|     or die "Couldn't change port default VLAN. ",$vtp->error(1); | ||||
|  | ||||
| =item $vtp->set_i_untagged ( vlan, ifIndex ) | ||||
| @@ -927,7 +920,7 @@ numeric VLAN ID and port C<ifIndex>. | ||||
|  | ||||
|   Example: | ||||
|   my %if_map = reverse %{$vtp->interfaces()}; | ||||
|   $vtp->set_add_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})  | ||||
|   $vtp->set_add_i_vlan_tagged('2', $if_map{'FastEthernet0/1'}) | ||||
|     or die "Couldn't add port to egress list. ",$vtp->error(1); | ||||
|  | ||||
| =item $vtp->set_remove_i_vlan_tagged ( vlan, ifIndex ) | ||||
| @@ -937,7 +930,7 @@ with the numeric VLAN ID and port C<ifIndex>. | ||||
|  | ||||
|   Example: | ||||
|   my %if_map = reverse %{$vtp->interfaces()}; | ||||
|   $vtp->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})  | ||||
|   $vtp->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'}) | ||||
|     or die "Couldn't add port to egress list. ",$vtp->error(1); | ||||
|  | ||||
| =back | ||||
|   | ||||
							
								
								
									
										126
									
								
								lib/SNMP/Info/DocsisCM.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								lib/SNMP/Info/DocsisCM.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| # SNMP::Info::DocsisCM - SNMP Interface to DOCSIS Cable Modems | ||||
| # | ||||
| # Copyright (c) 2019 by The Netdisco Developer Team. | ||||
| # | ||||
| # 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::DocsisCM; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
|  | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::DocsisCM::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::DocsisCM::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.71'; | ||||
|   | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS | ||||
| ); | ||||
|  | ||||
| %FUNCS  = ( | ||||
|     %SNMP::Info::Layer2::FUNCS | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
|     my $cm = shift; | ||||
|     my $descr = $cm->description(); | ||||
|     return $1 if $descr =~ /VENDOR: (.*?);/; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $cm = shift; | ||||
|     my $descr = $cm->description(); | ||||
|     return $1 if $descr =~ /MODEL: (.*?)>>/; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return "CM"; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $cm = shift; | ||||
|     my $descr = $cm->description(); | ||||
|     return $1 if $descr =~ /SW_REV: (.*?);/; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::DocsisCM - SNMP Interface for DOCSIS Cable Modems | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
| SNMP::Info::DocsisCM is a subclass of SNMP::Info that provides info | ||||
| about a given cable modem. Extracts data from the sysDescr, which is  | ||||
| mandated in the DOCSIS specification to match | ||||
| "HW_REV: <value>; VENDOR: <value>; BOOTR: <value>; SW_REV: <value>; MODEL: <value>" | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cm->vendor() | ||||
|  | ||||
| Returns the vendor of the cable modem. | ||||
|  | ||||
| =item $cm->model() | ||||
|  | ||||
| Returns the model of the cable modem. | ||||
|  | ||||
| =item $cm->os() | ||||
|  | ||||
| Returns 'cm', as the actual os is vendor and model dependent. | ||||
|  | ||||
| =item $cm->os_ver() | ||||
|  | ||||
| Returns the version of the software, extracted from the SW_REV field. | ||||
|  | ||||
| =back | ||||
|  | ||||
							
								
								
									
										124
									
								
								lib/SNMP/Info/DocsisHE.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								lib/SNMP/Info/DocsisHE.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| package SNMP::Info::DocsisHE; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
|  | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::DocsisHE::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::DocsisHE::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'DOCS-IF3-MIB' => 'docsIf3Mib', | ||||
|     'DOCS-IF-MIB'  => 'docsIfMib', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = (); | ||||
|  | ||||
| %FUNCS  = ( | ||||
|     # DOCSIS 3.0 (DOCS-IF3-MIB) from CableLabs | ||||
|     'docs_if3_cmts_cm_status_md_if_index'=> 'docsIf3CmtsCmRegStatusMdIfIndex', | ||||
|     # DOCSIS (1.1, etc) from IETF | ||||
|     'docs_if_cmts_cm_status_inet_address_type' => 'docsIfCmtsCmStatusInetAddressType', | ||||
|     'docs_if_cmts_cm_status_inet_address'      => 'docsIfCmtsCmStatusInetAddress', | ||||
|     'docs_cmts_cm_down_channel_if_index'       => 'docsIfCmtsCmStatusDownChannelIfIndex', | ||||
|     'docs_cmts_cm_up_channel_if_index'         => 'docsIfCmtsCmStatusUpChannelIfIndex', | ||||
| ); | ||||
|  | ||||
| %MUNGE = (); | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::DocsisHE - SNMP Interface for F<DOCS-IF-MIB> and F<DOCS-IF3-MIB> | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Ryan Gasik | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $cmts = new SNMP::Info( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'cmts', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                           ); | ||||
|  # Get a list of modems off the DOCSIS CMTS | ||||
|  my $modems = $cmts->docs_if_cmts_cm_status_inet_address() | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
| SNMP::Info::DocsisHE is a subclass of SNMP::Info that provides information | ||||
| about the cable modems of a DOCSIS CMTS. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<DOCS-IF-MIB> | ||||
| Standard IETF MIBs for DOCSIS 1.1 | ||||
|  | ||||
| =item F<DOCS-IF3-MIB> | ||||
| CableLabs MIBs for DOCSIS 3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $info->docs_if3_cmts_cm_status_md_if_index() | ||||
|  | ||||
| Returns reference to hash of the IfIndex associated with each cable modem. | ||||
|  | ||||
| (C<docsIf3CmtsCmRegStatusMdIfIndex>) | ||||
|  | ||||
| =item $info->docs_if_cmts_cm_status_inet_address_type() | ||||
|  | ||||
| Returns reference to hash of the type of IP address (ie, IPv4, IPv6) | ||||
| associated with each cable modem | ||||
|  | ||||
| (C<docsIfCmtsCmStatusInetAddressType>) | ||||
|  | ||||
| =item $info->docs_if_cmts_cm_status_inet_address() | ||||
|  | ||||
| Returns reference to hash of the IP address associated with each | ||||
| cable modem. | ||||
|  | ||||
| (C<docsIfCmtsCmStatusInetAddress>) | ||||
|  | ||||
| =item $info->docs_cmts_cm_down_channel_if_index() | ||||
|  | ||||
| Returns reference to hash of the IfIndex of the down channel | ||||
| (for DOCSIS 1.1) or a down channel (DOCSIS 3+) associated with each | ||||
| cable modem. | ||||
|  | ||||
| (C<docsIfCmtsCmStatusDownChannelIfIndex>) | ||||
|  | ||||
| =item $info->docs_cmts_cm_up_channel_if_index() | ||||
|  | ||||
| Returns reference to hash of the IfIndex of the up channel | ||||
| (for DOCSIS 1.1) or a up channel (DOCSIS 3+) associated with each | ||||
| cable modem. | ||||
|  | ||||
| (C<docsIfCmtsCmStatusUpChannelIfIndex>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
| @@ -31,15 +31,16 @@ | ||||
| package SNMP::Info::EDP; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| 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/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'EXTREME-EDP-MIB'   => 'extremeEdpPortIfIndex', | ||||
| @@ -64,7 +65,7 @@ sub hasEDP { | ||||
|     my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {}; | ||||
|  | ||||
|     return 1 if ( scalar( keys %$edp_ip ) ); | ||||
|      | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| @@ -75,12 +76,12 @@ sub hasEDP { | ||||
| # address since they should all originate from the same device, but we don't | ||||
| # know if they would all be reachable from the network management application. | ||||
| # | ||||
| # We don't inplement partials since this is private index function | ||||
| # We don't implement partials since this is private index function | ||||
| sub _edp_index { | ||||
|     my $edp = shift; | ||||
|  | ||||
|     my $edp_ip  = $edp->extremeEdpNeighborVlanIpAddress() || {}; | ||||
|      | ||||
|  | ||||
|     my %edp_index; | ||||
|     foreach my $key ( keys %$edp_ip ) { | ||||
|         my $ip = $edp_ip->{$key}; | ||||
| @@ -103,7 +104,7 @@ sub edp_if { | ||||
|         $iid = $1 if $iid =~ /^(\d+)\./; | ||||
|         $edp_if{$key} = $iid; | ||||
|     } | ||||
|   | ||||
|  | ||||
|   return \%edp_if; | ||||
| } | ||||
|  | ||||
| @@ -193,10 +194,10 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $edp = new SNMP::Info (  | ||||
|  my $edp = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
| @@ -204,10 +205,10 @@ Eric Miller | ||||
|  my $class = $edp->class(); | ||||
|  print " Using device sub class : $class\n"; | ||||
|  | ||||
|  $haslldp   = $edp->hasLLDP() ? 'yes' : 'no'; | ||||
|  $hasedp   = $edp->hasEDP() ? 'yes' : 'no'; | ||||
|  | ||||
|  # Print out a map of device ports with LLDP neighbors: | ||||
|  my $interfaces    = $edp->interfaces(); | ||||
|  # Print out a map of device ports with EDP neighbors: | ||||
|  my $interfaces   = $edp->interfaces(); | ||||
|  my $edp_if       = $edp->edp_if(); | ||||
|  my $edp_ip       = $edp->edp_ip(); | ||||
|  my $edp_port     = $edp->edp_port(); | ||||
| @@ -222,7 +223,7 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented  | ||||
| SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented | ||||
| interface to EDP information through SNMP. | ||||
|  | ||||
| EDP is a Layer 2 protocol that allows a network device to advertise its | ||||
| @@ -243,7 +244,7 @@ None. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| @@ -251,7 +252,7 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
| =item $edp->hasEDP() | ||||
|  | ||||
| Is EDP is active in this device?   | ||||
| Is EDP active on this device? | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -285,7 +286,7 @@ Returns remote port ID | ||||
|  | ||||
| Returns the operating system version of the remote system. | ||||
|  | ||||
| Nulls are removed before the value is returned.  | ||||
| Nulls are removed before the value is returned. | ||||
|  | ||||
| (C<extremeEdpNeighborSoftwareVersion>) | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Entity | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Entity; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::Entity::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Entity::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' ); | ||||
|  | ||||
| @@ -75,7 +75,7 @@ sub e_index { | ||||
|     my $entity  = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     # Force use of MIB leaf to avoid inheritance issues in psuedo classes | ||||
|     # Force use of MIB leaf to avoid inheritance issues in pseudo classes | ||||
|     my $e_descr = $entity->entPhysicalDescr($partial); | ||||
|  | ||||
|     return unless ($e_descr); | ||||
| @@ -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__ | ||||
| @@ -123,14 +174,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $entity = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $entity->class(); | ||||
| @@ -162,8 +213,6 @@ none. | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| none. | ||||
| @@ -173,6 +222,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 | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::EtherLike | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::EtherLike; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::EtherLike::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::EtherLike::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( 'EtherLike-MIB' => 'etherMIB' ); | ||||
|  | ||||
| @@ -68,8 +68,7 @@ $VERSION = '3.45'; | ||||
|     'el_xmit_defer'      => 'dot3StatsDeferredTransmissions', | ||||
|  | ||||
|     # Ethernet-like Collision Statistics Group | ||||
|     'el_coll_count' => 'dot3CollCount', | ||||
|     'el_coll_freq'  => 'dot3CollFrequencies' | ||||
|     'el_coll_freq'  => 'dot3CollFrequencies', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::MUNGE, 'el_duplex' => \&munge_el_duplex, ); | ||||
| @@ -96,22 +95,22 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $el = new SNMP::Info (  | ||||
|  my $el = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
|   | ||||
|  my $class = $cdp->class(); | ||||
|  | ||||
|  my $class = $el->class(); | ||||
|  print " Using device sub class : $class\n"; | ||||
|  | ||||
|  # Find the duplex setting for a port on a device that implements | ||||
|  # ETHERLIKE-MIB | ||||
|  my $interfaces = $el->interfaces(); | ||||
|  my $el_index   = $el->el_index(); | ||||
|  my $el_duplex  = $el->el_duplex();  | ||||
|  my $el_duplex  = $el->el_duplex(); | ||||
|  | ||||
|  foreach my $el_port (keys %$el_duplex){ | ||||
|     my $duplex = $el_duplex->{$el_port}; | ||||
| @@ -123,7 +122,7 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies  | ||||
| SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies | ||||
| access to the F<ETHERLIKE-MIB> used by some Layer 3 Devices such as | ||||
| Cisco routers. | ||||
|  | ||||
| @@ -134,7 +133,7 @@ directly. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| None.   | ||||
| None. | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| @@ -144,8 +143,6 @@ None. | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::FDP | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bruce Rodger, Max Baker | ||||
| # All rights reserved. | ||||
| @@ -34,15 +33,16 @@ | ||||
| package SNMP::Info::FDP; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::FDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::FDP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' ); | ||||
|  | ||||
| @@ -50,11 +50,9 @@ $VERSION = '3.45'; | ||||
|     'fdp_run'      => 'snFdpGlobalRun', | ||||
|     'fdp_interval' => 'snFdpGlobalMessageInterval', | ||||
|     'fdp_holdtime' => 'snFdpGlobalHoldTime', | ||||
|     'fdp_gid'      => 'snFdpGlobalDeviceId', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     'fdp_index'        => 'snFdpCacheIfIndex', | ||||
|     'fdp_proto'        => 'snFdpCacheAddressType', | ||||
|     'fdp_ip'           => 'snFdpCacheAddress', | ||||
|     'fdp_ver'          => 'snFdpCacheVersion', | ||||
| @@ -62,14 +60,12 @@ $VERSION = '3.45'; | ||||
|     'fdp_port'         => 'snFdpCacheDevicePort', | ||||
|     'fdp_platform'     => 'snFdpCachePlatform', | ||||
|     'fdp_capabilities' => 'snFdpCacheCapabilities', | ||||
|     'fdp_domain'       => 'snFdpCacheVTPMgmtDomain', | ||||
|     'fdp_vlan'         => 'snFdpCacheNativeVLAN', | ||||
|     'fdp_duplex'       => 'snFdpCacheDuplex', | ||||
|     'fdp_cache_type'   => 'snFdpCacheVendorId', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     'fdp_capabilities' => \&SNMP::Info::munge_bits, | ||||
|     'fdp_ip'           => \&SNMP::Info::munge_ip | ||||
|     'fdp_ip'           => \&SNMP::Info::munge_ip, | ||||
| ); | ||||
|  | ||||
| sub fdp_run { | ||||
| @@ -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( | ||||
| @@ -143,10 +132,10 @@ Bruce Rodger, Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $fdp = new SNMP::Info (  | ||||
|  my $fdp = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
| @@ -157,7 +146,7 @@ Bruce Rodger, Max Baker | ||||
|  $hasfdp   = $fdp->hasFDP() ? 'yes' : 'no'; | ||||
|  | ||||
|  # Print out a map of device ports with FDP neighbors: | ||||
|  my $interfaces = $fdp->interfaces(); | ||||
|  my $interfaces   = $fdp->interfaces(); | ||||
|  my $fdp_if       = $fdp->fdp_if(); | ||||
|  my $fdp_ip       = $fdp->fdp_ip(); | ||||
|  my $fdp_port     = $fdp->fdp_port(); | ||||
| @@ -172,7 +161,7 @@ Bruce Rodger, Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::FDP is a subclass of SNMP::Info that provides an object oriented  | ||||
| SNMP::Info::FDP is a subclass of SNMP::Info that provides an object oriented | ||||
| interface to FDP information through SNMP. | ||||
|  | ||||
| FDP is a Layer 2 protocol that supplies topology information of | ||||
| @@ -183,7 +172,7 @@ virtually identical.  FDP is implemented in Brocade (Foundry) devices. | ||||
| Create or use a device subclass that inherits this class.  Do not use | ||||
| directly. | ||||
|  | ||||
| Each device implements a subset of the global and cache entries.  | ||||
| Each device implements a subset of the global and cache entries. | ||||
| Check the return value to see if that data is held by the device. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
| @@ -197,11 +186,11 @@ None. | ||||
| =item F<FOUNDRY-SN-SWITCH-GROUP-MIB> | ||||
|  | ||||
| Needs a reasonably recent MIB. Works OK with B2R07604A.mib, but doesn't | ||||
| work with B2R07600C.  | ||||
| work with B2R07600C. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| @@ -209,13 +198,13 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
| =item  $fdp->hasFDP() | ||||
|  | ||||
| Is FDP is active in this device?   | ||||
| Is FDP is active in this device? | ||||
|  | ||||
| Accounts for SNMP version 1 devices which may have FDP but not fdp_run() | ||||
|  | ||||
| =item $fdp->fdp_run() | ||||
|  | ||||
| Is FDP enabled on this device?   | ||||
| Is FDP enabled on this device? | ||||
|  | ||||
| (C<fdpGlobalRun>) | ||||
|  | ||||
| @@ -227,19 +216,10 @@ Interval in seconds at which FDP messages are generated. | ||||
|  | ||||
| =item $fdp->fdp_holdtime() | ||||
|  | ||||
| Time in seconds that FDP messages are kept.  | ||||
| Time in seconds that FDP messages are kept. | ||||
|  | ||||
| (C<fdpGlobalHoldTime>) | ||||
|  | ||||
| =item  $fdp->fdp_gid() | ||||
|  | ||||
| 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 | ||||
| @@ -256,13 +236,13 @@ Interval in seconds at which FDP messages are generated. | ||||
|  | ||||
| =item $fdp->fdp_holdtime() | ||||
|  | ||||
| Time in seconds that FDP messages are kept.  | ||||
| Time in seconds that FDP messages are kept. | ||||
|  | ||||
| (C<fdpGlobalHoldTime>) | ||||
|  | ||||
| =item  $fdp->fdp_id()  | ||||
| =item  $fdp->fdp_id() | ||||
|  | ||||
| Returns FDP device 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(). | ||||
| @@ -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,30 +325,18 @@ 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 | ||||
|  | ||||
| (C<fdpCacheAddress>) | ||||
|  | ||||
| =item $fdp->fdp_platform()  | ||||
| =item $fdp->fdp_platform() | ||||
|  | ||||
| Returns remote platform id  | ||||
| Returns remote platform id | ||||
|  | ||||
| (C<fdpCachePlatform>) | ||||
|  | ||||
| @@ -405,17 +352,17 @@ Returns remote address type received.  Usually IP. | ||||
|  | ||||
| (C<fdpCacheAddressType>) | ||||
|  | ||||
| =item $fdp->fdp_ver()  | ||||
| =item $fdp->fdp_ver() | ||||
|  | ||||
| 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 | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::IEEE802dot11 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,14 +30,16 @@ | ||||
| package SNMP::Info::IEEE802dot11; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| 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/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', ); | ||||
|  | ||||
| @@ -202,7 +203,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
| @@ -30,6 +30,7 @@ | ||||
| package SNMP::Info::IEEE802dot3ad; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Aggregate; | ||||
|  | ||||
| @@ -41,9 +42,9 @@ use SNMP::Info::Aggregate; | ||||
|   agg_ports_lag | ||||
| /; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|   %SNMP::Info::Aggregate::MIBS, | ||||
| @@ -52,29 +53,40 @@ $VERSION = '3.45'; | ||||
|  | ||||
| %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; | ||||
| @@ -94,14 +106,14 @@ SNMP::Info Developers | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $info = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $info->class(); | ||||
|   | ||||
| @@ -30,13 +30,14 @@ | ||||
| package SNMP::Info::IPv6; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::IPv6::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::IPv6::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE $METHOD/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, $METHOD); | ||||
|  | ||||
| use constant { | ||||
|     IPMIB   => 1, | ||||
| @@ -44,19 +45,19 @@ use constant { | ||||
|     IPV6MIB => 3, | ||||
| }; | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
|  | ||||
|  | ||||
| %MIBS = (  | ||||
| %MIBS = ( | ||||
|     'IP-MIB'            => 'ipv6InterfaceTableLastChange', | ||||
|     'IPV6-MIB'          => 'ipv6IfTableLastChange', | ||||
|     'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress',  | ||||
|     'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = (); | ||||
|  | ||||
| %FUNCS = (  | ||||
| %FUNCS = ( | ||||
|     'ip_n2p_phys_addr'  => 'ipNetToPhysicalPhysAddress',    # IP-MIB | ||||
|     'c_inet_phys_addr'  => 'cInetNetToMediaPhysAddress',    # CISCO-IETF-IP-MIB | ||||
|     'i6_n2p_phys_addr'  => 'ipv6NetToMediaPhysAddress',     # IPV6-MIB | ||||
| @@ -67,20 +68,21 @@ $VERSION = '3.45'; | ||||
|  | ||||
|     '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  | ||||
|     'c_pfx_origin'      => 'cIpAddressPfxOrigin',           # CISCO-IETF-IP-MIB | ||||
|  | ||||
|     'ip_addr6_pfx'      => 'ipAddressPrefix',               # IP-MIB | ||||
|     'c_addr6_pfx'       => 'cIpAddressPrefix',              # CISCO-IETF-IP-MIB  | ||||
|     'c_addr6_pfx'       => 'cIpAddressPrefix',              # CISCO-IETF-IP-MIB | ||||
|  | ||||
|     'ip_addr6_pfxlen'   => 'ipAddressPrefixLength',         # IP-MIB | ||||
|     'c_addr6_pfxlen'    => 'cIpAddressPfxLength',           # 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  | ||||
|     'c_addr6_index'     => 'cIpAddressIfIndex',             # CISCO-IETF-IP-MIB | ||||
|  | ||||
|     'ip_addr6_type'     => 'ipAddressType',                 # IP-MIB | ||||
|     'c_addr6_type'      => 'cIpAddressType',                # CISCO-IETF-IP-MIB | ||||
| @@ -105,8 +107,8 @@ sub ipv6_n2p_mac { | ||||
|     foreach my $row (keys %$phys_addr) { | ||||
|         if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) { | ||||
|             my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4; | ||||
|             if ($info::METHOD == IPV6MIB) {  | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index;  | ||||
|             if ($info::METHOD == IPV6MIB) { | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index; | ||||
|                 # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes) | ||||
|                 $v6addr = join('.', $addrtype, $addrsize, $v6addr); | ||||
|                 $addrtype = 2; | ||||
| @@ -132,8 +134,8 @@ sub ipv6_n2p_addr { | ||||
|     foreach my $row (keys %$net_addr) { | ||||
|         if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) { | ||||
|             my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4; | ||||
|             if ($info::METHOD == IPV6MIB) {  | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index;  | ||||
|             if ($info::METHOD == IPV6MIB) { | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index; | ||||
|                 # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes) | ||||
|                 $v6addr = join('.', $addrtype, $addrsize, $v6addr); | ||||
|                 $addrtype = 2; | ||||
| @@ -141,7 +143,7 @@ sub ipv6_n2p_addr { | ||||
|             if ($addrtype == 2) { # IPv6 | ||||
|                 my $v6_packed = pack("C*", split(/\./, $v6addr)); | ||||
|                 if (length($v6_packed) == 15) { | ||||
|                     # Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize,  | ||||
|                     # Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize, | ||||
|                     # so what we've collected in that variable is actually the first byte of the address. | ||||
|                     $v6_packed = pack('C', $addrsize) . $v6_packed; | ||||
|                 } | ||||
| @@ -176,8 +178,8 @@ sub ipv6_n2p_if { | ||||
|     foreach my $row (keys %$phys_addr) { | ||||
|         if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) { | ||||
|             my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4; | ||||
|             if ($info::METHOD == IPV6MIB) {  | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index;  | ||||
|             if ($info::METHOD == IPV6MIB) { | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index; | ||||
|                 # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes) | ||||
|                 $v6addr = join('.', $addrtype, $addrsize, $v6addr); | ||||
|                 $addrtype = 2; | ||||
| @@ -203,8 +205,8 @@ sub ipv6_n2p_type { | ||||
|     foreach my $row (keys %$phys_type) { | ||||
|         if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) { | ||||
|             my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4; | ||||
|             if ($info::METHOD == IPV6MIB) {  | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index;  | ||||
|             if ($info::METHOD == IPV6MIB) { | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index; | ||||
|                 # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes) | ||||
|                 $v6addr = join('.', $addrtype, $addrsize, $v6addr); | ||||
|                 $addrtype = 2; | ||||
| @@ -230,8 +232,8 @@ sub ipv6_n2p_state { | ||||
|     foreach my $row (keys %$phys_state) { | ||||
|         if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) { | ||||
|             my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4; | ||||
|             if ($info::METHOD == IPV6MIB) {  | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index;  | ||||
|             if ($info::METHOD == IPV6MIB) { | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index; | ||||
|                 # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes) | ||||
|                 $v6addr = join('.', $addrtype, $addrsize, $v6addr); | ||||
|                 $addrtype = 2; | ||||
| @@ -441,14 +443,14 @@ Jeroen van Ingen and Carlos Vicente | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $info = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $info->class(); | ||||
| @@ -456,12 +458,12 @@ Jeroen van Ingen and Carlos Vicente | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses  | ||||
| The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses | ||||
| to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>, | ||||
| F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the | ||||
| device. | ||||
|  | ||||
| This class is inherited by Info::Layer3 to provide IPv6 node tracking across   | ||||
| This class is inherited by Info::Layer3 to provide IPv6 node tracking across | ||||
| device classes. | ||||
|  | ||||
| For debugging purposes you can call this class directly as you would | ||||
| @@ -478,7 +480,9 @@ none. | ||||
| =over | ||||
|  | ||||
| =item F<IP-MIB> | ||||
|  | ||||
| =item F<IPV6-MIB> | ||||
|  | ||||
| =item F<CISCO-IETF-IP-MIB> | ||||
|  | ||||
| =back | ||||
| @@ -518,7 +522,7 @@ Maps an IPv6 address to its type (unicast, anycast, etc.) | ||||
|  | ||||
| Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.) | ||||
|  | ||||
| =item $info->ipv6_addr_prefix()  | ||||
| =item $info->ipv6_addr_prefix() | ||||
|  | ||||
| Maps IPv6 addresses with their prefixes | ||||
|  | ||||
| @@ -544,7 +548,7 @@ Maps an address of type C<cInetNetToMediaNetAddressType> on interface C<ifIndex> | ||||
|  | ||||
| =head1 MUNGES | ||||
|  | ||||
| =over  | ||||
| =over | ||||
|  | ||||
| =item munge_physaddr() | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| # SNMP::Info::LLDP | ||||
| # $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 | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::LLDP; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::LLDP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'LLDP-MIB'          => 'lldpLocSysCapEnabled', | ||||
| @@ -55,10 +55,13 @@ $VERSION = '3.45'; | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|  | ||||
|     # LLDP-MIB::lldpLocManAddrTable | ||||
|     'lldp_lman_addr' => 'lldpLocManAddrIfId', | ||||
|  | ||||
|     # LLDP-MIB::LldpLocPortEntry | ||||
|     'lldp_lport_id'   => 'lldpLocPortId', | ||||
|     'lldp_lport_desc' => 'lldpLocPortDesc', | ||||
|  | ||||
|     # LLDP-MIB::lldpRemTable | ||||
|     'lldp_rem_id_type'  => 'lldpRemChassisIdSubtype', | ||||
|     'lldp_rem_id'       => 'lldpRemChassisId', | ||||
| @@ -70,6 +73,18 @@ $VERSION = '3.45'; | ||||
|     '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', | ||||
| ); | ||||
| @@ -80,9 +95,22 @@ $VERSION = '3.45'; | ||||
|     'lldp_rem_sysname'   => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_sysdesc'   => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_port_desc' => \&SNMP::Info::munge_null, | ||||
|     'lldp_lport_id'      => \&SNMP::Info::munge_null, | ||||
|     'lldp_lport_desc'    => \&SNMP::Info::munge_null, | ||||
|     'lldp_sys_cap'       => \&SNMP::Info::munge_bits, | ||||
|     'lldp_rem_sys_cap'   => \&SNMP::Info::munge_bits, | ||||
|     'lldp_rem_cap_spt'   => \&SNMP::Info::munge_bits, | ||||
|  | ||||
|     '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 { | ||||
| @@ -93,7 +121,8 @@ sub hasLLDP { | ||||
|     my $lldp_cap = $lldp->lldp_sys_cap(); | ||||
|     return 1 if defined $lldp_cap; | ||||
|  | ||||
|     # If the device doesn't return local system capabilities, fallback by checking if it would report neighbors | ||||
|     # If the device doesn't return local system capabilities, fallback | ||||
|     # by checking if it would report neighbors | ||||
|     my $lldp_rem = $lldp->lldp_rem_id() || {}; | ||||
|     return 1 if scalar keys %$lldp_rem; | ||||
|  | ||||
| @@ -115,13 +144,22 @@ sub lldp_if { | ||||
|         my @aOID = split( '\.', $key ); | ||||
|         my $port = $aOID[1]; | ||||
|         next unless $port; | ||||
|         # Local LLDP port may not equate to ifIndex, see LldpPortNumber TEXTUAL-CONVENTION in LLDP-MIB. | ||||
|         # Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex, | ||||
|         # prefer ifDescr over ifAlias because using cross ref with description is correct behavior  | ||||
|         # according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though. | ||||
|         my $lldp_desc = $lldp->lldpLocPortDesc($port); | ||||
|  | ||||
|         # Local LLDP port may not equate to ifIndex, see LldpPortNumber | ||||
|         # TEXTUAL-CONVENTION in LLDP-MIB. Cross reference lldpLocPortDesc | ||||
|         # with ifDescr and ifAlias to get ifIndex, prefer ifDescr over | ||||
|         # ifAlias because using cross ref with description is correct | ||||
|         # behavior according to the LLDP-MIB. Some devices (eg H3C gear) | ||||
|         # seem to use ifAlias though. | ||||
|         # snmp::info #372 -> to make things even more complex some devices | ||||
|         # have different behaviour depending on os version (nx-os 6 vs 7) | ||||
|         # so we made this a function to allow overrides in more specific | ||||
|         # modules | ||||
|         my $lldp_desc = $lldp->lldp_lport_desc($port); | ||||
|         my $desc      = $lldp_desc->{$port}; | ||||
|         # If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum | ||||
|  | ||||
|         # If cross reference is successful use it, otherwise stick with | ||||
|         # lldpRemLocalPortNum | ||||
|         if ( $desc && exists $r_i_descr{$desc} ) { | ||||
|             $port = $r_i_descr{$desc}; | ||||
|         } | ||||
| @@ -142,7 +180,7 @@ sub lldp_ip { | ||||
|  | ||||
|     my %lldp_ip; | ||||
|     foreach my $key ( keys %$rman_addr ) { | ||||
|         my ( $index, $proto, $addr ) = _lldp_addr_index($key); | ||||
|         my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key); | ||||
|         next unless defined $index; | ||||
|         next unless $proto == 1; | ||||
|         $lldp_ip{$index} = $addr; | ||||
| @@ -158,7 +196,7 @@ sub lldp_ipv6 { | ||||
|  | ||||
|     my %lldp_ipv6; | ||||
|     foreach my $key ( keys %$rman_addr ) { | ||||
|         my ( $index, $proto, $addr ) = _lldp_addr_index($key); | ||||
|         my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key); | ||||
|         next unless defined $index; | ||||
|         next unless $proto == 2; | ||||
|         $lldp_ipv6{$index} = $addr; | ||||
| @@ -174,7 +212,7 @@ sub lldp_mac { | ||||
|  | ||||
|     my %lldp_ipv6; | ||||
|     foreach my $key ( keys %$rman_addr ) { | ||||
|         my ( $index, $proto, $addr ) = _lldp_addr_index($key); | ||||
|         my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key); | ||||
|         next unless defined $index; | ||||
|         next unless $proto == 6; | ||||
|         $lldp_ipv6{$index} = $addr; | ||||
| @@ -190,7 +228,7 @@ sub lldp_addr { | ||||
|  | ||||
|     my %lldp_ip; | ||||
|     foreach my $key ( keys %$rman_addr ) { | ||||
|         my ( $index, $proto, $addr ) = _lldp_addr_index($key); | ||||
|         my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key); | ||||
|         next unless defined $index; | ||||
|         $lldp_ip{$index} = $addr; | ||||
|     } | ||||
| @@ -210,7 +248,10 @@ sub lldp_port { | ||||
|     foreach my $key ( sort keys %$pid ) { | ||||
|         my $port = $pdesc->{$key}; | ||||
|         my $type = $ptype->{$key}; | ||||
|         if ( $type and $type eq 'interfaceName' ) { | ||||
|         if (    $type | ||||
|             and ( $type eq 'interfaceName' or $type eq 'local' ) | ||||
|             and ( defined $pid->{$key} and $pid->{$key} !~ /^\d+$/ ) ) | ||||
|         { | ||||
|  | ||||
|             # If the pid claims to be an interface name, | ||||
|             # believe it. | ||||
| @@ -223,8 +264,7 @@ sub lldp_port { | ||||
|  | ||||
|           # May need to format other types in the future, i.e. Network address | ||||
|             if ( $type =~ /mac/ ) { | ||||
|                 $port = join( ':', | ||||
|                     map { sprintf "%02x", $_ } unpack( 'C*', $port ) ); | ||||
|                 $port = SNMP::Info::munge_mac($port) | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -259,12 +299,13 @@ sub lldp_id { | ||||
|  | ||||
|         # May need to format other types in the future | ||||
|         if ( $type =~ /mac/ ) { | ||||
|             $id = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) ); | ||||
|             $id = SNMP::Info::munge_mac($id) | ||||
|         } | ||||
|         elsif ( $type eq 'networkAddress' ) { | ||||
|             if ( length( unpack( 'H*', $id ) ) == 10 ) { | ||||
|  | ||||
|                 # IP address (first octet is sign, I guess) | ||||
|                 # IP address - first octet is IANA Address Family Number, need | ||||
|                 # walk with IPv6 | ||||
|                 my @octets | ||||
|                     = ( map { sprintf "%02x", $_ } unpack( 'C*', $id ) ) | ||||
|                     [ 1 .. 4 ]; | ||||
| @@ -300,7 +341,41 @@ sub lldp_cap { | ||||
|     # Encoded as BITS which Perl Net-SNMP implementation doesn't seem to | ||||
|     # be able to enumerate for us, so we have to get it from the MIB | ||||
|     # and enumerate ourselves | ||||
|     my $oid = SNMP::translateObj( 'lldpRemSysCapEnabled', 0, 1 ) || ''; | ||||
|     my $oid | ||||
|         = SNMP::translateObj( 'LLDP-MIB::lldpRemSysCapEnabled', 0, 1 ) || ''; | ||||
|     my $enums = ( | ||||
|         ( ref {} eq ref $SNMP::MIB{$oid}{'enums'} ) | ||||
|         ? $SNMP::MIB{$oid}{'enums'} | ||||
|         : {} | ||||
|     ); | ||||
|     my %r_enums = reverse %$enums; | ||||
|  | ||||
|     my %lldp_cap; | ||||
|     foreach my $key ( keys %$lldp_caps ) { | ||||
|         my $cap_bits = $lldp_caps->{$key}; | ||||
|         next unless $cap_bits; | ||||
|  | ||||
|         my $count = 0; | ||||
|         foreach my $bit ( split //, $cap_bits ) { | ||||
|             if ($bit) { | ||||
|                 push( @{ $lldp_cap{$key} }, $r_enums{$count} ); | ||||
|             } | ||||
|             $count++; | ||||
|         } | ||||
|     } | ||||
|     return \%lldp_cap; | ||||
| } | ||||
|  | ||||
| sub 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'} | ||||
| @@ -345,11 +420,13 @@ sub lldp_cap { | ||||
| # Break up the lldpRemManAddrTable INDEX into common index, protocol, | ||||
| # and address. | ||||
| sub _lldp_addr_index { | ||||
|     my $idx    = shift; | ||||
|     my @oids   = split( /\./, $idx ); | ||||
|     my $index  = join( '.', splice( @oids, 0, 3 ) ); | ||||
|     my $proto  = shift(@oids); | ||||
|     shift(@oids) if scalar @oids > 4; # $length | ||||
|     my $lldp = shift; | ||||
|     my $idx  = shift; | ||||
|  | ||||
|     my @oids = split( /\./, $idx ); | ||||
|     my $index = join( '.', splice( @oids, 0, 3 ) ); | ||||
|     my $proto = shift(@oids); | ||||
|     shift(@oids) if scalar @oids > 4;    # $length | ||||
|  | ||||
|     # IPv4 | ||||
|     if ( $proto == 1 ) { | ||||
| @@ -359,7 +436,7 @@ sub _lldp_addr_index { | ||||
|     # IPv6 | ||||
|     elsif ( $proto == 2 ) { | ||||
|         return ( $index, $proto, | ||||
|             join(':', unpack('(H4)*', pack('C*', @oids)) ) ); | ||||
|             join( ':', unpack( '(H4)*', pack( 'C*', @oids ) ) ) ); | ||||
|     } | ||||
|  | ||||
|     # MAC | ||||
| @@ -387,10 +464,10 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $lldp = new SNMP::Info (  | ||||
|  my $lldp = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
| @@ -416,7 +493,7 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::LLDP is a subclass of SNMP::Info that provides an object oriented  | ||||
| SNMP::Info::LLDP is a subclass of SNMP::Info that provides an object oriented | ||||
| interface to LLDP information through SNMP. | ||||
|  | ||||
| LLDP is a Layer 2 protocol that allows a network device to advertise its | ||||
| @@ -444,7 +521,7 @@ None. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| @@ -452,7 +529,7 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
| =item $lldp->hasLLDP() | ||||
|  | ||||
| Is LLDP is active in this device?   | ||||
| Is LLDP is active in this device? | ||||
|  | ||||
| Note:  LLDP may be active, but nothing in C<lldpRemoteSystemsData> Tables so | ||||
| the device would not return any useful topology information. | ||||
| @@ -463,7 +540,7 @@ The string value used to identify the system name of the local system.  If the | ||||
| local agent supports IETF RFC 3418, C<lldpLocSysName> object should have the | ||||
| same value of C<sysName> object. | ||||
|  | ||||
| Nulls are removed before the value is returned.  | ||||
| Nulls are removed before the value is returned. | ||||
|  | ||||
| (C<lldpLocSysName>) | ||||
|  | ||||
| @@ -477,7 +554,7 @@ Nulls are removed before the value is returned. | ||||
|  | ||||
| (C<lldpLocSysDesc>) | ||||
|  | ||||
| =item  $lldp->lldp_sys_cap()  | ||||
| =item  $lldp->lldp_sys_cap() | ||||
|  | ||||
| Returns which system capabilities are enabled on the local system.  Results | ||||
| are munged into an ascii binary string, LSB.  Each digit represents a bit | ||||
| @@ -527,8 +604,8 @@ with the remote system. | ||||
|  | ||||
| =item $lldp->lldp_if() | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table. Tries to cross reference  | ||||
| (C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>),  | ||||
| Returns the mapping to the SNMP Interface Table. Tries to cross reference | ||||
| (C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>), | ||||
| if unable defaults to (C<lldpRemLocalPortNum>). | ||||
|  | ||||
| =item  $lldp->lldp_ip() | ||||
| @@ -543,7 +620,7 @@ use lldp_addr if you don't care about return address type. | ||||
|  | ||||
| =item  $lldp->lldp_mac() | ||||
|  | ||||
| Returns remote (management) MAC address, if known.  Returns for all other  | ||||
| Returns remote (management) MAC address, if known.  Returns for all other | ||||
| address types, use lldp_addr if you don't care about return address type. | ||||
|  | ||||
| =item  $lldp->lldp_addr() | ||||
| @@ -564,12 +641,18 @@ Returns remote port ID | ||||
| Tries to return something useful from C<lldp_rem_sysdesc()> or | ||||
| C<lldp_rem_sysname()>. | ||||
|  | ||||
| =item  $lldp->lldp_cap()  | ||||
| =item  $lldp->lldp_cap() | ||||
|  | ||||
| Returns hash of arrays with each array containing the system capabilities | ||||
| supported by the remote system.  Possible elements in the array are | ||||
| enumerated from C<LldpSystemCapabilitiesMap>. | ||||
|  | ||||
| =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>) | ||||
| @@ -609,7 +692,7 @@ the remote system. | ||||
| Returns the string value used to identify the description of the given port | ||||
| associated with the remote system. | ||||
|  | ||||
| Nulls are removed before the value is returned.  | ||||
| Nulls are removed before the value is returned. | ||||
|  | ||||
| (C<lldpRemPortDesc>) | ||||
|  | ||||
| @@ -618,7 +701,7 @@ Nulls are removed before the value is returned. | ||||
| Returns the string value used to identify the system name of the remote | ||||
| system. | ||||
|  | ||||
| Nulls are removed before the value is returned.  | ||||
| Nulls are removed before the value is returned. | ||||
|  | ||||
| (C<lldpRemSysName>) | ||||
|  | ||||
| @@ -627,11 +710,70 @@ Nulls are removed before the value is returned. | ||||
| Returns the string value used to identify the system description of the | ||||
| remote system. | ||||
|  | ||||
| Nulls are removed before the value is returned.  | ||||
| Nulls are removed before the value is returned. | ||||
|  | ||||
| (C<lldpRemSysDesc>) | ||||
|  | ||||
| =item  $lldp->lldp_rem_sys_cap()  | ||||
| =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 | ||||
| are munged into an ascii binary string, LSB.  Each digit represents a bit | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Layer1; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::Layer1::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Layer1::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' ); | ||||
|  | ||||
| @@ -49,7 +49,7 @@ $VERSION = '3.45'; | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     'ports_managed' => 'ifNumber', | ||||
|     'rptr_slots'    => 'rptrGroupCapacity', | ||||
|     'slots'         => 'rptrGroupCapacity' | ||||
|     'slots'         => 'rptrGroupCapacity', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
| @@ -86,7 +86,7 @@ sub ports { | ||||
| } | ||||
|  | ||||
| # $l1->model() - Looks at sysObjectID which gives the oid of the system | ||||
| #       name, contained in a propriatry MIB. | ||||
| #       name, contained in a proprietary MIB. | ||||
| sub model { | ||||
|     my $l1    = shift; | ||||
|     my $id    = $l1->id(); | ||||
| @@ -172,14 +172,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $l1 = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $l1->class(); | ||||
| @@ -203,15 +203,15 @@ This class is usually used as a superclass for more specific device classes | ||||
| listed under SNMP::Info::Layer1::*   Please read all docs under SNMP::Info | ||||
| first. | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Layer1 device through SNMP.  Information is stored in a number of MIBs. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
|  | ||||
|  my $l1 = new SNMP::Info::Layer1(...); | ||||
|  | ||||
| =head2 Inherited Classes  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| @@ -219,7 +219,7 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| @@ -227,12 +227,9 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| =back | ||||
|  | ||||
| MIBs required for L<SNMP::Info/"Required MIBs"> | ||||
| MIBs required for L<SNMP::Info/"REQUIREMENTS"> | ||||
|  | ||||
| See L<SNMP::Info/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| F<SNMP-REPEATER-MIB> needs to be extracted from | ||||
| ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz | ||||
| See L<SNMP::Info/"REQUIREMENTS"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| @@ -242,7 +239,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $l1->ports_managed() | ||||
|  | ||||
| Gets the number of ports under the interface mib  | ||||
| Gets the number of ports under the interface mib | ||||
|  | ||||
| (C<ifNumber>) | ||||
|  | ||||
| @@ -278,7 +275,7 @@ Number of 'groups' in the Repeater MIB | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| @@ -341,6 +338,6 @@ Group (slot) Number for given port. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer1::Allied | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Layer1::Allied; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer1; | ||||
|  | ||||
| @SNMP::Info::Layer1::Allied::ISA       = qw/SNMP::Info::Layer1 Exporter/; | ||||
| @SNMP::Info::Layer1::Allied::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', ); | ||||
| @@ -52,9 +52,14 @@ $VERSION = '3.45'; | ||||
|     'ati_up'     => 'linkTestLED', | ||||
| ); | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer1::MIBS, 'ATI-MIB' => 'atiPortGroupIndex' ); | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer1::MIBS, | ||||
|     'ATI-MIB' => 'atiPortGroupIndex', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer1::MUNGE, ); | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer1::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'allied'; | ||||
| @@ -68,9 +73,10 @@ sub os_ver { | ||||
|     my $allied = shift; | ||||
|     my $descr  = $allied->description(); | ||||
|  | ||||
|     if ( $descr =~ m/version (\d+\.\d+)/ ) { | ||||
|     if ( defined ($descr) && $descr =~ m/version (\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
| @@ -78,7 +84,7 @@ sub model { | ||||
|  | ||||
|     my $desc = $allied->description(); | ||||
|  | ||||
|     if ( $desc =~ /(AT-\d{4}\S{1})/ ) { | ||||
|     if ( defined ($desc) && $desc =~ /(AT-\d{4}\S{1})/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| @@ -127,14 +133,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $allied = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myhub', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $allied->class(); | ||||
| @@ -142,8 +148,8 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Allied device through SNMP. See inherited classes' documentation for  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Allied device through SNMP. See inherited classes' documentation for | ||||
| inherited methods. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
| @@ -180,7 +186,7 @@ Returns 'allied' :) | ||||
|  | ||||
| =item $allied->os() | ||||
|  | ||||
| Returns 'allied'  | ||||
| Returns 'allied' | ||||
|  | ||||
| =item $allied->os_ver() | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer1::Asante | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Layer1::Asante; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer1; | ||||
|  | ||||
| @SNMP::Info::Layer1::Asante::ISA       = qw/SNMP::Info::Layer1 Exporter/; | ||||
| @SNMP::Info::Layer1::Asante::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, ); | ||||
| @@ -81,9 +81,10 @@ sub os_ver { | ||||
|     my $asante = shift; | ||||
|     my $descr  = $asante->description(); | ||||
|  | ||||
|     if ( $descr =~ /software v(\d+\.\d+)/ ) { | ||||
|     if ( defined ($descr) && $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; | ||||
|  | ||||
| @@ -172,14 +173,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $asante = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $asante->class(); | ||||
| @@ -187,7 +188,7 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from an | ||||
| Asante device through SNMP. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
| @@ -226,7 +227,7 @@ Culls software version from description() | ||||
|  | ||||
| =item $asante->vendor() | ||||
|  | ||||
| Returns 'asante' :) | ||||
| Returns 'asante' | ||||
|  | ||||
| =item $asante->model() | ||||
|  | ||||
| @@ -249,7 +250,7 @@ See L<SNMP::Info::Layer1/"GLOBALS"> for details. | ||||
|  | ||||
| Returns reference to the map between IID and physical Port. | ||||
|  | ||||
| =item $asante->i_description()  | ||||
| =item $asante->i_description() | ||||
|  | ||||
| Description of the interface. | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer1::Bayhub | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller, Max Baker | ||||
| # All rights reserved. | ||||
| @@ -31,18 +30,19 @@ | ||||
| package SNMP::Info::Layer1::Bayhub; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::SONMP; | ||||
| use SNMP::Info::NortelStack; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer1::Bayhub::ISA | ||||
|     = qw/SNMP::Info::SONMP SNMP::Info::NortelStack  SNMP::Info::Layer2 Exporter/; | ||||
|     = qw/SNMP::Info::SONMP SNMP::Info::NortelStack SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer1::Bayhub::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -492,7 +492,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -501,14 +501,9 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Bay hub device through SNMP.  Also provides device MAC to port mapping through | ||||
| the proprietary MIB.  | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
| my $bayhub = new SNMP::Info::Layer1::Bayhub(...); | ||||
| the proprietary MIB. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| @@ -607,18 +602,18 @@ to a hash. | ||||
|  | ||||
| =item $bayhub->i_index() | ||||
|  | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
|  | ||||
| Since hubs do not support C<ifIndex>, the interface index is created using the | ||||
| formula (board * 256 + port). | ||||
|  | ||||
| =item $bayhub->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to physical ports.  | ||||
| Returns reference to map of IIDs to physical ports. | ||||
|  | ||||
| =item $bayhub->i_duplex() | ||||
|  | ||||
| Returns half, hubs do not support full duplex.  | ||||
| Returns half, hubs do not support full duplex. | ||||
|  | ||||
| =item $bayhub->i_duplex_admin() | ||||
|  | ||||
| @@ -644,7 +639,7 @@ State choices are 'up' or 'down' | ||||
|  | ||||
| Example: | ||||
|   my %if_map = reverse %{$bayhub->interfaces()}; | ||||
|   $bayhub->set_i_up_admin('down', $if_map{'1.1'})  | ||||
|   $bayhub->set_i_up_admin('down', $if_map{'1.1'}) | ||||
|       or die "Couldn't change port state. ",$bayhub->error(1); | ||||
|  | ||||
| =item $bayhub->bp_index() | ||||
| @@ -671,51 +666,51 @@ L<SNMP::Info::NortelStack/"TABLE METHODS"> for details. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $bayhub->e_index()  | ||||
| =item $bayhub->e_index() | ||||
|  | ||||
| Returns ns_e_index(). | ||||
|  | ||||
| =item $bayhub->e_class()  | ||||
| =item $bayhub->e_class() | ||||
|  | ||||
| Returns ns_e_class(). | ||||
|  | ||||
| =item $bayhub->e_descr()  | ||||
| =item $bayhub->e_descr() | ||||
|  | ||||
| Returns ns_e_descr(). | ||||
|  | ||||
| =item $bayhub->e_name()  | ||||
| =item $bayhub->e_name() | ||||
|  | ||||
| Returns ns_e_name(). | ||||
|  | ||||
| =item $bayhub->e_fwver()  | ||||
| =item $bayhub->e_fwver() | ||||
|  | ||||
| Returns ns_e_fwver(). | ||||
|  | ||||
| =item $bayhub->e_hwver()  | ||||
| =item $bayhub->e_hwver() | ||||
|  | ||||
| Returns ns_e_hwver(). | ||||
|  | ||||
| =item $bayhub->e_parent()  | ||||
| =item $bayhub->e_parent() | ||||
|  | ||||
| Returns ns_e_parent(). | ||||
|  | ||||
| =item $bayhub->e_pos()  | ||||
| =item $bayhub->e_pos() | ||||
|  | ||||
| Returns ns_e_pos(). | ||||
|  | ||||
| =item $bayhub->e_serial()  | ||||
| =item $bayhub->e_serial() | ||||
|  | ||||
| Returns ns_e_serial(). | ||||
|  | ||||
| =item $bayhub->e_swver()  | ||||
| =item $bayhub->e_swver() | ||||
|  | ||||
| Returns ns_e_swver(). | ||||
|  | ||||
| =item $bayhub->e_type()  | ||||
| =item $bayhub->e_type() | ||||
|  | ||||
| Returns ns_e_type(). | ||||
|  | ||||
| =item $bayhub->e_vendor()  | ||||
| =item $bayhub->e_vendor() | ||||
|  | ||||
| Returns ns_e_vendor(). | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| # 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 | ||||
| @@ -31,46 +30,114 @@ | ||||
| package SNMP::Info::Layer1::Cyclades; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer1; | ||||
|  | ||||
| @SNMP::Info::Layer1::Cyclades::ISA       = qw/SNMP::Info::Layer1 Exporter/; | ||||
| @SNMP::Info::Layer1::Cyclades::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %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 | ||||
|  | ||||
| @@ -299,7 +486,7 @@ Eric Miller | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -308,13 +495,8 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Cyclades device through SNMP. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
| my $cyclades = new SNMP::Info::Layer1::Cyclades(...); | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Cyclades/Avocent device through SNMP. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| @@ -328,12 +510,22 @@ my $cyclades = new SNMP::Info::Layer1::Cyclades(...); | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<ACS-MIB> | ||||
|  | ||||
| =item F<ACS6000-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS-SYS-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS-CONF-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS-INFO-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS5K-SYS-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS5K-CONF-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS5K-INFO-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
| @@ -348,11 +540,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 +552,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 +571,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 | ||||
|  | ||||
| @@ -406,34 +599,37 @@ to a hash. | ||||
|  | ||||
| =item $cyclades->i_index() | ||||
|  | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| 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 | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer1::S3000 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::Layer1::S3000; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer1::S3000::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer1::S3000::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -373,7 +373,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -382,15 +382,10 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Bay hub device through SNMP.  Also provides device MAC to port mapping through | ||||
| the proprietary MIB. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
| my $s3000 = new SNMP::Info::Layer1::S3000(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
| @@ -447,7 +442,7 @@ Returns the firmware version. (C<s3AgentFwVer>) | ||||
|  | ||||
| =item $s3000->mac() | ||||
|  | ||||
| Returns MAC of the advertised IP address of the device.  | ||||
| Returns MAC of the advertised IP address of the device. | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -477,7 +472,7 @@ to a hash. | ||||
|  | ||||
| =item $s3000->i_index() | ||||
|  | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
|  | ||||
| Since hubs do not support C<ifIndex>, the interface index is created using the | ||||
| formula (board * 256 + port).  This is required to support devices with more | ||||
| @@ -485,11 +480,11 @@ than one module. | ||||
|  | ||||
| =item $s3000->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to physical ports.  | ||||
| Returns reference to map of IIDs to physical ports. | ||||
|  | ||||
| =item $s3000->i_duplex() | ||||
|  | ||||
| Returns half, hubs do not support full duplex.  | ||||
| Returns half, hubs do not support full duplex. | ||||
|  | ||||
| =item $s3000->i_duplex_admin() | ||||
|  | ||||
| @@ -516,7 +511,7 @@ State choices are 'up' or 'down' | ||||
|  | ||||
| Example: | ||||
|   my %if_map = reverse %{$s3000->interfaces()}; | ||||
|   $s3000->set_i_up_admin('down', $if_map{'1.1'})  | ||||
|   $s3000->set_i_up_admin('down', $if_map{'1.1'}) | ||||
|       or die "Couldn't change port state. ",$s3000->error(1); | ||||
|  | ||||
| =item $s3000->bp_index() | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on | ||||
| # | ||||
| @@ -33,30 +32,33 @@ | ||||
| package SNMP::Info::Layer2; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::Entity; | ||||
| use SNMP::Info::PowerEthernet; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::DocsisHE; | ||||
|  | ||||
| @SNMP::Info::Layer2::ISA | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet SNMP::Info::LLDP Exporter/; | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet SNMP::Info::LLDP SNMP::Info::DocsisHE Exporter/; | ||||
| @SNMP::Info::Layer2::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,         %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS,   %SNMP::Info::DocsisHE::MIBS, | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     %SNMP::Info::Bridge::GLOBALS, | ||||
|     %SNMP::Info::DocsisHE::GLOBALS, | ||||
|     %SNMP::Info::Entity::GLOBALS, | ||||
|     %SNMP::Info::PowerEthernet::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
| @@ -67,7 +69,7 @@ $VERSION = '3.45'; | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS,         %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS,   %SNMP::Info::DocsisHE::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
| @@ -75,6 +77,7 @@ $VERSION = '3.45'; | ||||
|     # Inherit all the built in munging | ||||
|     %SNMP::Info::MUNGE, | ||||
|     %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::DocsisHE::MUNGE, | ||||
|     %SNMP::Info::Entity::MUNGE, | ||||
|     %SNMP::Info::PowerEthernet::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| @@ -83,7 +86,7 @@ $VERSION = '3.45'; | ||||
| # Method OverRides | ||||
|  | ||||
| # $l2->model() - Looks at sysObjectID which gives the oid of the system | ||||
| #       name, contained in a propriatry MIB. | ||||
| #       name, contained in a proprietary MIB. | ||||
| sub model { | ||||
|     my $l2    = shift; | ||||
|     my $id    = $l2->id(); | ||||
| @@ -118,24 +121,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 { | ||||
| @@ -148,15 +145,25 @@ sub interfaces { | ||||
|     # Replace the Index with the ifDescr field. | ||||
|     # Check for duplicates in ifDescr, if so uniquely identify by adding | ||||
|     # ifIndex to repeated values | ||||
|     my %seen; | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|     my (%seen, %first_seen_as); | ||||
|     foreach my $iid ( sort keys %$i_descr ) { | ||||
|         my $port = $i_descr->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $port = SNMP::Info::munge_null($port); | ||||
|         $port =~ s/^\s+//; $port =~ s/\s+$//; | ||||
|         next unless length $port; | ||||
|  | ||||
|         if ( $seen{$port}++ ) { | ||||
|             # (#320) also fixup the port this is a duplicate of | ||||
|             $interfaces->{ $first_seen_as{$port} } | ||||
|               = sprintf( "%s (%d)", $port, $first_seen_as{$port} ); | ||||
|  | ||||
|             $interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid ); | ||||
|         } | ||||
|         else { | ||||
|             $interfaces->{$iid} = $port; | ||||
|             $first_seen_as{$port} = $iid; | ||||
|         } | ||||
|     } | ||||
|     return $interfaces; | ||||
| @@ -175,14 +182,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $l2 = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $l2->class(); | ||||
| @@ -205,11 +212,11 @@ This class is usually used as a superclass for more specific device classes | ||||
| listed under SNMP::Info::Layer2::*   Please read all docs under SNMP::Info | ||||
| first. | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Layer2 device through SNMP.  Information is stored in a number of MIBs. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
|  | ||||
|  my $l2 = new SNMP::Info::Layer2(...); | ||||
|  | ||||
| @@ -221,10 +228,14 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| =item SNMP::Info::Bridge | ||||
|  | ||||
| =item SNMP::Info::DocsisHE | ||||
|  | ||||
| =item SNMP::Info::Entity | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =item SNMP::Info::PowerEthernet | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
| @@ -249,7 +260,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $l2->model() | ||||
|  | ||||
| Cross references $l2->id() with product IDs in the  | ||||
| Cross references $l2->id() with product IDs in the | ||||
| Cisco MIBs. | ||||
|  | ||||
| For HP devices, removes C<'hpswitch'> from the name | ||||
| @@ -262,13 +273,13 @@ 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 | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
|  | ||||
| @@ -302,7 +313,7 @@ Defaults to C<ifDescr> but checks and overrides with C<ifName> | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
|  | ||||
|   | ||||
| @@ -1,40 +1,63 @@ | ||||
| # SNMP::Info::Layer2::3Com - SNMP Interface to 3Com Devices | ||||
| # | ||||
| # Copyright (c) 2019 by The Netdisco Developer Team. | ||||
| # | ||||
| # 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::3Com; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::CDP; | ||||
|  | ||||
| @SNMP::Info::Layer2::3Com::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::3Com::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::3Com::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'A3Com-products-MIB' => 'wlanAP7760', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| ); | ||||
|  | ||||
|  | ||||
| sub os { | ||||
|     return '3Com'; | ||||
| } | ||||
| @@ -49,6 +72,7 @@ sub serial { | ||||
|             return $e_serial->{$e}; | ||||
|         } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
| @@ -61,21 +85,25 @@ sub os_ver { | ||||
|             return $e_swver->{$e}; | ||||
|         } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return '3Com'; | ||||
|     return '3com'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|  | ||||
|     my $dsmodel = shift; | ||||
|     my $descr = $dsmodel->description(); | ||||
|     if ( $descr =~ /^([\S ]+) Software.*/){ | ||||
|  | ||||
|     if (defined ($descr)) { | ||||
|       if ($descr =~ /^([\S ]+) Software.*/) { | ||||
|         return $1; | ||||
|     } else { | ||||
|       } else { | ||||
|         return $descr; | ||||
|       } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| @@ -97,7 +125,7 @@ Max Kosmach | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -138,7 +166,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $device->vendor() | ||||
|  | ||||
| Returns '3Com' | ||||
| Returns '3com' | ||||
|  | ||||
| =item $device->os() | ||||
|  | ||||
|   | ||||
| @@ -1,43 +1,69 @@ | ||||
| # SNMP::Info::Layer2::Adtran - SNMP Interface to Adtran Devices | ||||
| # | ||||
| # Copyright (c) 2019 by The Netdisco Developer Team. | ||||
| # | ||||
| # 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::Adtran; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| 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::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Adtran::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| # This will be filled in with the device's index into the EntPhysicalEntry | ||||
| # table by the serial() function. | ||||
| our $index = undef; | ||||
|  | ||||
| %MIBS = (  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     'ADTRAN-GENEVC-MIB'     => 'adGenEVCMIB', | ||||
|     'ADTRAN-GENMEF-MIB'     => 'adGenMEFMIB', | ||||
|     'ADTRAN-GENPORT-MIB'    => 'adGenPort', | ||||
| #    '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, | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::Layer3::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', | ||||
| @@ -47,7 +73,7 @@ our $index = undef; | ||||
|            'ad_genportcustuse' => 'adGenPortCustomerUse', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, %SNMP::Info::Layer3::MUNGE ); | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'adtran'; | ||||
| @@ -58,11 +84,11 @@ sub os { | ||||
|  | ||||
| sub layers { | ||||
|     my $adtran = shift; | ||||
|      | ||||
|  | ||||
|     my $layers = $adtran->SUPER::layers(); | ||||
|     # Some netvantas don't report L2 properly  | ||||
|     # Some netvantas don't report L2 properly | ||||
|     my $macs   = $adtran->fw_mac(); | ||||
|      | ||||
|  | ||||
|     if (keys %$macs) { | ||||
|         my $l = substr $layers, 6, 1, "1"; | ||||
|     } | ||||
| @@ -77,7 +103,7 @@ sub os_ver { | ||||
|     my $aos_ver = $adtran->adAOSDeviceVersion(); | ||||
|     return $aos_ver; | ||||
| } | ||||
| sub model {  | ||||
| sub model { | ||||
|     my $adtran = shift; | ||||
|     my $id = $adtran->id(); | ||||
|     my $mod = $adtran->adProdName() || undef; | ||||
| @@ -85,7 +111,7 @@ sub model { | ||||
|     my $model = $adtran->adAOSDeviceProductName() || undef; | ||||
|     return $model; | ||||
| } | ||||
| sub serial {  | ||||
| sub serial { | ||||
|     my $adtran = shift; | ||||
|     my $e_serial = $adtran->e_serial() || {}; | ||||
|     my $serial2 = $e_serial->{1} || undef; | ||||
| @@ -96,19 +122,19 @@ sub serial { | ||||
| sub i_name { | ||||
|     my $adtran = shift; | ||||
|     my $partial = shift; | ||||
|     my $i_name = $adtran->SUPER::i_alias() || undef;  | ||||
|     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}; | ||||
|     if (defined $adname) { | ||||
|         foreach my $port (keys %$adname) { | ||||
|             my @splitout = split(/\./,$port); | ||||
|             $i_name->{$splitout[1]} = $adname->{$port}; | ||||
|         } | ||||
|     } | ||||
|     return $i_name; | ||||
| } | ||||
| sub i_vlan {  | ||||
| sub i_vlan { | ||||
|     my $adtran = shift; | ||||
|     my $partial = shift; | ||||
|     my $uniports = $adtran->ad_evcmapuniport() || undef; | ||||
| @@ -127,14 +153,14 @@ sub i_vlan { | ||||
|         return $i_vlan; | ||||
|     } | ||||
|     return {}; | ||||
|          | ||||
|  | ||||
| } | ||||
|          | ||||
| sub i_vlan_membership {          | ||||
|  | ||||
| sub i_vlan_membership { | ||||
|     my $adtran  = shift; | ||||
|     my $partial = shift; | ||||
|     my $i_vlan = $adtran->ad_menport(); | ||||
|     if (defined $i_vlan) {  | ||||
|     if (defined $i_vlan) { | ||||
|         my $vlans = {}; | ||||
|         my $v_name = $adtran->v_name(); | ||||
|         foreach my $vid (keys %$v_name) { | ||||
| @@ -142,9 +168,9 @@ sub i_vlan_membership { | ||||
|         } | ||||
|         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 @splitout = split(/(\.0)+\./,$entry); | ||||
|             my $name = pack("C*", split(/\./,$splitout[0])); | ||||
|             push @{$if_vlans->{$splitout[2]}}, $vlans->{$name}; | ||||
|         } | ||||
|         my $mgmtevcports = $adtran->ad_mgmtevcports(); | ||||
|         my $mgmtevcid = $adtran->ad_mgmtevcvid(); | ||||
| @@ -174,14 +200,14 @@ SNMP::Info::Layer2::Adtran - SNMP Interface to Adtran Devices | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # 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(); | ||||
| @@ -195,17 +221,17 @@ Subclass for adtran Devices running JUNOS | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements. | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| @@ -245,10 +271,6 @@ Returns serial number. | ||||
|  | ||||
| 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 | ||||
| @@ -275,12 +297,12 @@ IDs.  These are the VLANs which are members of the egress list for the port. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::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 | ||||
|   | ||||
							
								
								
									
										511
									
								
								lib/SNMP/Info/Layer2/Aerohive.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										511
									
								
								lib/SNMP/Info/Layer2/Aerohive.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,511 @@ | ||||
| # 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 warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Aerohive::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Aerohive::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %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', | ||||
|     # not documented in the most recent mib, | ||||
|     # but this is the base mac for the device | ||||
|     'ah_mac' => '.1.3.6.1.4.1.26928.1.3.2.0', | ||||
| ); | ||||
|  | ||||
| %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, ); | ||||
|  | ||||
| # hiveos does not have sysServices | ||||
| sub layers { | ||||
|     return '00000111'; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'aerohive'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'hiveos'; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $aerohive = shift; | ||||
|  | ||||
|     return $aerohive->ahSystemSerial() | ||||
|       || $aerohive->SUPER::serial(); | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $aerohive = shift; | ||||
|     my $descr    = $aerohive->description(); | ||||
|  | ||||
|     if ( defined ($descr) && $descr =~ m/\bHiveOS\s(\d\.\w+)\b/ix ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub mac { | ||||
|     my $aerohive = shift; | ||||
|     my $ahmac = $aerohive->ah_mac(); | ||||
|  | ||||
|     # newer hiveos version just return the mac address | ||||
|     if (defined $ahmac) { | ||||
|       # aerohive has a 0000:0000:0000 mac format by default, | ||||
|       # change to 00:00:00:00:00:00 | ||||
|       $ahmac =~ s/(..)(..:?)/$1:$2/g; | ||||
|       return $ahmac; | ||||
|     } | ||||
|  | ||||
|     my @macs; | ||||
|     my $macs = $aerohive->i_mac(); | ||||
|     foreach my $iid (keys %$macs) { | ||||
|       if (defined $macs->{$iid}) { | ||||
|         push( @macs, $macs->{$iid} ); | ||||
|       } | ||||
|       @macs = sort(@macs); | ||||
|     } | ||||
|     return $macs[0]; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $aerohive = shift; | ||||
|     my $descr    = $aerohive->description(); | ||||
|  | ||||
|     if ( defined ($descr) && $descr =~ m/\b(?:Hive|)(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; | ||||
|  | ||||
|     # somewhere caching is doing something strange, without load_ | ||||
|     # netdisco can't find bp_index mappings & will not registerer | ||||
|     # any clients. netdisco/netdisco#496 | ||||
|     my $i_index = $aerohive->load_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. | ||||
|  | ||||
| =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 'hiveos'. | ||||
|  | ||||
| =item $aerohive->serial() | ||||
|  | ||||
| Returns the serial number extracted from C<ahSystemSerial>. | ||||
|  | ||||
| =item $aerohive->os_ver() | ||||
|  | ||||
| Returns the OS version extracted from C<sysDescr>. | ||||
|  | ||||
| =item $aerohive->os_bin() | ||||
|  | ||||
| Returns the firmware version extracted from C<ahFirmwareVersion>. | ||||
|  | ||||
| =item $aerohive->mac() | ||||
|  | ||||
| Returns the base mac address of the aerohive unit from an undocumented | ||||
| snmp oid. if this oid is not available it will walk all interfaces and | ||||
| return the lowest numbered mac address. | ||||
|  | ||||
| =item $aerohive->model() | ||||
|  | ||||
| Returns the model extracted from C<sysDescr>. | ||||
|  | ||||
| =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 | ||||
| @@ -29,8 +29,8 @@ | ||||
| package SNMP::Info::Layer2::Airespace; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::CDP; | ||||
| use SNMP::Info::Airespace; | ||||
|  | ||||
| @@ -38,9 +38,9 @@ use SNMP::Info::Airespace; | ||||
|     = qw/SNMP::Info::Airespace SNMP::Info::CDP SNMP::Info::Bridge Exporter/; | ||||
| @SNMP::Info::Layer2::Airespace::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,      %SNMP::Info::Bridge::MIBS, | ||||
| @@ -166,11 +166,11 @@ sub cd11_mac { | ||||
|  | ||||
| sub cd11_txrate { | ||||
|     my $airespace = shift; | ||||
|      | ||||
|  | ||||
|     my $rates  = $airespace->client_txrate() || {}; | ||||
|     my $protos = $airespace->cd11_proto()    || {}; | ||||
|     my $bws    = $airespace->cd11n_ch_bw()   || {}; | ||||
|      | ||||
|  | ||||
|     my $cd11_txrate = {}; | ||||
|     foreach my $idx ( keys %$rates ) { | ||||
| 	my $rate = $rates->{$idx} || '0.0'; | ||||
| @@ -193,7 +193,7 @@ sub cd11_txrate { | ||||
|  | ||||
| sub munge_cd11n_ch_bw { | ||||
|     my $bw = shift; | ||||
|      | ||||
|  | ||||
|     if ( $bw =~ /forty/ ) { | ||||
| 	return 40; | ||||
|     } | ||||
| @@ -202,7 +202,7 @@ sub munge_cd11n_ch_bw { | ||||
|  | ||||
| sub munge_cd11_proto { | ||||
|     my $bw = shift; | ||||
|      | ||||
|  | ||||
|     return 2 if ( $bw eq 'dot11n5' ); | ||||
|  | ||||
|     return 1; | ||||
| @@ -260,7 +260,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -269,14 +269,9 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from  | ||||
| Provides abstraction to the configuration information obtainable from | ||||
| Cisco (Airespace) Wireless Controllers 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 $airespace = new SNMP::Info::Layer2::Airespace(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
| @@ -346,7 +341,7 @@ See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over  | ||||
| =over | ||||
|  | ||||
| =item cd11_mac() | ||||
|  | ||||
| @@ -356,7 +351,7 @@ Returns client radio interface MAC addresses. | ||||
|  | ||||
| Returns client transmission speed in Mbs. | ||||
|  | ||||
| =back  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Aironet | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,9 +32,9 @@ | ||||
| package SNMP::Info::Layer2::Aironet; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::Entity; | ||||
| use SNMP::Info::EtherLike; | ||||
| use SNMP::Info::CiscoStats; | ||||
| use SNMP::Info::CiscoConfig; | ||||
| @@ -43,31 +42,28 @@ use SNMP::Info::CDP; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
|  | ||||
| @SNMP::Info::Layer2::Aironet::ISA | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::EtherLike | ||||
|     SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/; | ||||
| @SNMP::Info::Layer2::Aironet::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::IEEE802dot11::GLOBALS, | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::Entity::GLOBALS, | ||||
|     %SNMP::Info::EtherLike::GLOBALS, | ||||
|     %SNMP::Info::CiscoStats::GLOBALS, | ||||
|     %SNMP::Info::CiscoConfig::GLOBALS, | ||||
|     %SNMP::Info::CDP::GLOBALS, | ||||
|     'serial' => 'entPhysicalSerialNum.1', | ||||
|     'descr'  => 'sysDescr', | ||||
|     'ps1_type' => 'cpoePdCurrentPowerSource' | ||||
|     'ps1_type' => 'cpoePdCurrentPowerSource', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::IEEE802dot11::FUNCS, | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::Entity::FUNCS, | ||||
|     %SNMP::Info::EtherLike::FUNCS, | ||||
|     %SNMP::Info::CiscoStats::FUNCS, | ||||
|     %SNMP::Info::CiscoConfig::FUNCS, | ||||
| @@ -89,7 +85,6 @@ $VERSION = '3.45'; | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::IEEE802dot11::MIBS, | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::Entity::MIBS, | ||||
|     %SNMP::Info::EtherLike::MIBS, | ||||
|     %SNMP::Info::CiscoStats::MIBS, | ||||
|     %SNMP::Info::CiscoConfig::MIBS, | ||||
| @@ -104,7 +99,6 @@ $VERSION = '3.45'; | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::IEEE802dot11::MUNGE, | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     %SNMP::Info::Entity::MUNGE, | ||||
|     %SNMP::Info::EtherLike::MUNGE, | ||||
|     %SNMP::Info::CiscoStats::MUNGE, | ||||
|     %SNMP::Info::CiscoConfig::MUNGE, | ||||
| @@ -119,7 +113,6 @@ $VERSION = '3.45'; | ||||
|     = \&SNMP::Info::IEEE802dot11::dot11_cur_tx_pwr_mw; | ||||
|  | ||||
| sub vendor { | ||||
|  | ||||
|     # Sorry, but it's true. | ||||
|     return 'cisco'; | ||||
| } | ||||
| @@ -136,11 +129,16 @@ 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}; | ||||
|  | ||||
|     if (defined $e_descr->{1}) { | ||||
|       if (defined $descr) { | ||||
|         $descr = "$e_descr->{1}  $descr" | ||||
|       } else { | ||||
|         $descr = "$e_descr->{1}" | ||||
|       } | ||||
|     } | ||||
|     return $descr; | ||||
| } | ||||
|  | ||||
| @@ -444,7 +442,7 @@ sub i_ssidmac { | ||||
|     my $partial    = shift; | ||||
|     my $mbss_mac_addr = $aironet->mbss_mac_addr(); | ||||
|  | ||||
|     # Same logic as i_ssidbcast to return same indexes as i_ssidlist  | ||||
|     # Same logic as i_ssidbcast to return same indexes as i_ssidlist | ||||
|     my $map = {}; | ||||
|     foreach my $key ( keys %$mbss_mac_addr ) { | ||||
|         my ( $interface, @idx ) = split( /\./, $key ); | ||||
| @@ -485,14 +483,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $aironet = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $aironet->class(); | ||||
| @@ -518,7 +516,7 @@ This class is for devices running Cisco IOS software (newer) | ||||
| =back | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
|  | ||||
| my $aironet = new SNMP::Info::Layer2::Aironet(...); | ||||
|  | ||||
| @@ -528,8 +526,6 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...); | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =item SNMP::Info::Entity | ||||
|  | ||||
| =item SNMP::Info::EtherLike | ||||
|  | ||||
| =item SNMP::Info::CiscoStats | ||||
| @@ -542,6 +538,16 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...); | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<CISCO-DOT11-ASSOCIATION-MIB> | ||||
|  | ||||
| =item F<CISCO-DOT11-IF-MIB> | ||||
|  | ||||
| =item F<CISCO-DOT11-SSID-SECURITY-MIB> | ||||
|  | ||||
| =item F<CISCO-POE-PD-MIB> | ||||
|  | ||||
| =item F<CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB> | ||||
|  | ||||
| =item Inherited Classes | ||||
|  | ||||
| MIBs required by the inherited classes listed above. | ||||
| @@ -568,10 +574,6 @@ System description. Adds info from method e_descr() from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::EtherLike | ||||
|  | ||||
| See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details. | ||||
| @@ -656,11 +658,11 @@ being broadcast. | ||||
| =item $aironet->i_ssidmac() | ||||
|  | ||||
| With the same keys as i_ssidlist, returns the Basic service set | ||||
| identification (BSSID), MAC address, the AP is using for the SSID.  | ||||
| identification (BSSID), MAC address, the AP is using for the SSID. | ||||
|  | ||||
| =item $aironet ps1_status() | ||||
|  | ||||
| Returns the PoE injector status based on C<cpoePdSupportedPower> and  | ||||
| Returns the PoE injector status based on C<cpoePdSupportedPower> and | ||||
| C<cpoePdSupportedPowerMode>. | ||||
|  | ||||
| =back | ||||
| @@ -669,10 +671,6 @@ C<cpoePdSupportedPowerMode>. | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::EtherLike | ||||
|  | ||||
| See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details. | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Allied | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -31,6 +30,7 @@ | ||||
| package SNMP::Info::Layer2::Allied; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::Layer1; | ||||
| @@ -38,9 +38,9 @@ use SNMP::Info::Layer1; | ||||
| @SNMP::Info::Layer2::Allied::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Allied::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %GLOBALS = ( %SNMP::Info::Layer2::GLOBALS ); | ||||
|  | ||||
| @@ -70,17 +70,17 @@ sub os_ver { | ||||
|     my $allied = shift; | ||||
|     my $descr  = $allied->description(); | ||||
|  | ||||
|     if ( $descr =~ m/version (\d+\.\d+)/ ) { | ||||
|     if ( defined ($descr) && $descr =~ m/version (\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $allied = shift; | ||||
|  | ||||
|     my $desc = $allied->description(); | ||||
|  | ||||
|     if ( $desc =~ /(AT-80\d{2}\S*)/ ) { | ||||
|     if ( defined ($desc) &&  $desc =~ /(AT-80\d{2}\S*)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| @@ -137,14 +137,14 @@ Max Baker, Dmitry Sergienko <dmitry@trifle.net> | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $allied = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myhub', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $allied->class(); | ||||
| @@ -152,8 +152,8 @@ Max Baker, Dmitry Sergienko <dmitry@trifle.net> | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Allied device through SNMP. See inherited classes' documentation for  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Allied device through SNMP. See inherited classes' documentation for | ||||
| inherited methods. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
| @@ -190,11 +190,11 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $allied->vendor() | ||||
|  | ||||
| Returns 'allied' :) | ||||
| Returns 'allied' | ||||
|  | ||||
| =item $allied->os() | ||||
|  | ||||
| Returns 'allied'  | ||||
| Returns 'allied' | ||||
|  | ||||
| =item $allied->os_ver() | ||||
|  | ||||
| @@ -212,7 +212,7 @@ Tries to cull out C<AT-nnnnX> out of the description field. | ||||
|  | ||||
| =item $allied->mac() | ||||
|  | ||||
| Returns device MAC.  | ||||
| Returns device MAC. | ||||
|  | ||||
| =back | ||||
|  | ||||
|   | ||||
							
								
								
									
										168
									
								
								lib/SNMP/Info/Layer2/Atmedia.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								lib/SNMP/Info/Layer2/Atmedia.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | ||||
| # SNMP::Info::Layer2::Atmedia | ||||
| # | ||||
| # Copyright (c) 2018 Netdisco Developers | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Atmedia; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Atmedia::ISA       = qw/SNMP::Info::Layer2/; | ||||
| @SNMP::Info::Layer2::Atmedia::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer2::MIBS ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     'os_ver'          => '.1.3.6.1.4.1.13458.1.2.1.0', | ||||
|     'atm_serial'      => '.1.3.6.1.4.1.13458.1.1.2.0', | ||||
|     'atm_hardversion' => '.1.3.6.1.4.1.13458.1.3.1.0', | ||||
|     'atm_model'       => '.1.3.6.1.4.1.13458.1.1.6.0', | ||||
| ); | ||||
|  | ||||
| %FUNCS = (%SNMP::Info::Layer2::FUNCS); | ||||
|  | ||||
| %MUNGE = (%SNMP::Info::Layer2::MUNGE); | ||||
|  | ||||
| sub serial { | ||||
|     my $atmedia = shift; | ||||
|  | ||||
|     return $atmedia->atm_serial(); | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'Atmedia-OS'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $atmedia = shift; | ||||
|  | ||||
|     my $atmedia_model = $atmedia->atm_model(); | ||||
|     if (defined $atmedia_model) { | ||||
|       $atmedia_model =~ s/\<|\>//g; | ||||
|       $atmedia_model =~ s/\//_/g; | ||||
|       return $atmedia_model; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'atmedia'; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Atmedia - SNMP Interface to atmedia encryptors | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Netdisco Developers | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $atmedia = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myhub', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $atmedia->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to information obtainable from a atmedia encryptor | ||||
| through SNMP. See inherited classes' documentation for inherited methods. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =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 | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $atmedia->vendor() | ||||
|  | ||||
| Returns 'atmedia' | ||||
|  | ||||
| =item $atmedia->os() | ||||
|  | ||||
| Returns 'Atmedia-OS' | ||||
|  | ||||
| =item $atmedia->os_ver() | ||||
|  | ||||
| (C<acSoftVersion>) | ||||
|  | ||||
| =item $atmedia->model() | ||||
|  | ||||
| (C<acDescr>) | ||||
|  | ||||
| =item $atmedia->serial() | ||||
|  | ||||
| (C<acSerialNumber>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Baystack | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # All rights reserved. | ||||
| @@ -31,38 +30,38 @@ | ||||
| package SNMP::Info::Layer2::Baystack; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::SONMP; | ||||
| use SNMP::Info::NortelStack; | ||||
| use SNMP::Info::RapidCity; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer2::Baystack::ISA | ||||
|     = qw/SNMP::Info::SONMP SNMP::Info::NortelStack | ||||
|     SNMP::Info::RapidCity SNMP::Info::LLDP | ||||
|     SNMP::Info::RapidCity | ||||
|     SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer2::Baystack::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS,    %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS, | ||||
|     %SNMP::Info::SONMP::MIBS, | ||||
|     'BAY-STACK-PETH-EXT-MIB' => 'bspePethPsePortExtMeasuredPower', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS,    %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::RapidCity::GLOBALS, %SNMP::Info::NortelStack::GLOBALS, | ||||
|     %SNMP::Info::SONMP::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS,    %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS, | ||||
|     %SNMP::Info::SONMP::FUNCS, | ||||
|     'peth_port_power' => 'bspePethPsePortExtMeasuredPower', | ||||
| @@ -74,7 +73,7 @@ $SNMP::Info::SPEED_MAP{200_000_000}   = '100 Mbps'; | ||||
| $SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps'; | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE,    %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::RapidCity::MUNGE, %SNMP::Info::NortelStack::MUNGE, | ||||
|     %SNMP::Info::SONMP::MUNGE, | ||||
| ); | ||||
| @@ -136,7 +135,7 @@ sub model { | ||||
|     return '303' if ( defined $descr and $descr =~ /\D303\D/ ); | ||||
|     return '304' if ( defined $descr and $descr =~ /\D304\D/ ); | ||||
|     return 'BPS' if ( $model =~ /BPS2000/i ); | ||||
|      | ||||
|  | ||||
|     # Pull sreg- from all | ||||
|     $model =~ s/^sreg-//; | ||||
|     # Strip ES/ERS/BayStack etc. from those families | ||||
| @@ -341,7 +340,7 @@ sub peth_port_ifindex { | ||||
|     return \%peth_port_ifindex; | ||||
| } | ||||
|  | ||||
| # Currently only ERS 4800 v5.8+ support the rcBridgeSpbmMacTable  | ||||
| # Currently only ERS 4800 v5.8+ support the rcBridgeSpbmMacTable | ||||
| # which holds the FDB for a SPBM edge deployment. | ||||
| # | ||||
| # Q-BRIDGE still holds some entries when the rcBridgeSpbmMacTable is in use | ||||
| @@ -353,7 +352,7 @@ sub fw_mac { | ||||
|     my $qb = $rapidcity->SUPER::fw_mac() || {}; | ||||
|     my $spbm = $rapidcity->rc_spbm_fw_mac() || {}; | ||||
|     my $fw_mac = { %$qb, %$spbm }; | ||||
|      | ||||
|  | ||||
|     return $fw_mac; | ||||
| } | ||||
|  | ||||
| @@ -363,17 +362,17 @@ sub fw_port { | ||||
|     my $qb = $rapidcity->SUPER::fw_port() || {}; | ||||
|     my $spbm = $rapidcity->rc_spbm_fw_port() || {}; | ||||
|     my $fw_port = { %$qb, %$spbm }; | ||||
|      | ||||
|  | ||||
|     return $fw_port; | ||||
| } | ||||
|  | ||||
| sub fw_status { | ||||
|     my $rapidcity = shift; | ||||
|  | ||||
|     my $qb = $rapidcity->SUPER::fw_status() || {};     | ||||
|     my $qb = $rapidcity->SUPER::fw_status() || {}; | ||||
|     my $spbm = $rapidcity->rc_spbm_fw_status() || {}; | ||||
|     my $fw_status = { %$qb, %$spbm }; | ||||
|      | ||||
|  | ||||
|     return $fw_status; | ||||
| } | ||||
|  | ||||
| @@ -383,7 +382,7 @@ sub qb_fw_vlan { | ||||
|     my $qb = $rapidcity->SUPER::qb_fw_vlan() || {}; | ||||
|     my $spbm = $rapidcity->rc_spbm_fw_vlan() || {}; | ||||
|     my $qb_fw_vlan = { %$qb, %$spbm }; | ||||
|      | ||||
|  | ||||
|     return $qb_fw_vlan; | ||||
| } | ||||
|  | ||||
| @@ -417,7 +416,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|   or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $baystack->class(); | ||||
| @@ -427,12 +426,7 @@ Eric Miller | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from an | ||||
| Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series | ||||
| through SNMP.  | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
| my $baystack = new SNMP::Info::Layer2::Baystack(...); | ||||
| through SNMP. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| @@ -444,8 +438,6 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...); | ||||
|  | ||||
| =item SNMP::Info::RapidCity | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
| @@ -454,7 +446,7 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...); | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<BAY-STACK-PETH-EXT-MIBB> | ||||
| =item F<BAY-STACK-PETH-EXT-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -466,8 +458,6 @@ See L<SNMP::Info::NortelStack/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::RapidCity/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
| @@ -500,7 +490,7 @@ Returns the firmware version extracted from C<sysDescr>. | ||||
|  | ||||
| =item $baystack->stp_ver() | ||||
|  | ||||
| Returns the particular STP version running on this device.   | ||||
| Returns the particular STP version running on this device. | ||||
|  | ||||
| Values: C<nortelStpg>, C<pvst>, C<rstp>, C<mstp>, C<ieee8021d> | ||||
|  | ||||
| @@ -537,10 +527,6 @@ See L<SNMP::Info::NortelStack/"GLOBALS"> for details. | ||||
|  | ||||
| See L<SNMP::Info::RapidCity/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| @@ -560,10 +546,10 @@ Returns reference to the map between IID and physical Port. | ||||
|  | ||||
|   Slot and port numbers on the Baystack switches are determined by the | ||||
|   formula: | ||||
|    | ||||
|  | ||||
|   port = (Interface index % Index factor) | ||||
|   slot = (int(Interface index / Index factor)) + Slot offset | ||||
|   | ||||
|  | ||||
|   The physical port name is returned as slot.port. | ||||
|  | ||||
| =item $baystack->i_ignore() | ||||
| @@ -572,9 +558,9 @@ Returns reference to hash of IIDs to ignore. | ||||
|  | ||||
| =item $baystack->i_mac() | ||||
|  | ||||
| Returns the C<ifPhysAddress> table entries.  | ||||
| Returns the C<ifPhysAddress> table entries. | ||||
|  | ||||
| Removes all entries matching '00:00:00:00:00:00' -- Certain  | ||||
| Removes all entries matching '00:00:00:00:00:00' -- Certain | ||||
| revisions of Baystack firmware report all zeros for each port mac. | ||||
|  | ||||
| =item $baystack->i_name() | ||||
| @@ -602,60 +588,60 @@ L<SNMP::Info::NortelStack/"TABLE METHODS"> for details on ns_e_* methods. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $baystack->e_index()  | ||||
| =item $baystack->e_index() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalDescr>, this will try ns_e_index(). | ||||
| Note that this is based on C<entPhysicalDescr> due to implementation | ||||
| details of SNMP::Info::Entity::e_index(). | ||||
|  | ||||
| =item $baystack->e_class()  | ||||
| =item $baystack->e_class() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalClass>, this will try ns_e_class(). | ||||
|  | ||||
| =item $baystack->e_descr()  | ||||
| =item $baystack->e_descr() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalDescr>, this will try ns_e_descr(). | ||||
|  | ||||
| =item $baystack->e_name()  | ||||
| =item $baystack->e_name() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalName>, this will try ns_e_name(). | ||||
|  | ||||
| =item $baystack->e_fwver()  | ||||
| =item $baystack->e_fwver() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalFirmwareRev>, this will try | ||||
| ns_e_fwver(). | ||||
|  | ||||
| =item $baystack->e_hwver()  | ||||
| =item $baystack->e_hwver() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalHardwareRev>, this will try | ||||
| ns_e_hwver(). | ||||
|  | ||||
| =item $baystack->e_parent()  | ||||
| =item $baystack->e_parent() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalContainedIn>, this will try | ||||
| ns_e_parent(). | ||||
|  | ||||
| =item $baystack->e_pos()  | ||||
| =item $baystack->e_pos() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalParentRelPos>, this will try | ||||
| ns_e_pos(). | ||||
|  | ||||
| =item $baystack->e_serial()  | ||||
| =item $baystack->e_serial() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalSerialNum>, this will try | ||||
| ns_e_serial(). | ||||
|  | ||||
| =item $baystack->e_swver()  | ||||
| =item $baystack->e_swver() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalSoftwareRev>, this will try | ||||
| ns_e_swver(). | ||||
|  | ||||
| =item $baystack->e_type()  | ||||
| =item $baystack->e_type() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalVendorType>, this will try | ||||
| ns_e_type(). | ||||
|  | ||||
| =item $baystack->e_vendor()  | ||||
| =item $baystack->e_vendor() | ||||
|  | ||||
| If the device doesn't support C<entPhysicalMfgName>, this will try | ||||
| ns_e_vendor(). | ||||
| @@ -700,10 +686,6 @@ See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details. | ||||
|  | ||||
| See L<SNMP::Info::RapidCity/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::C1900 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,6 +32,7 @@ | ||||
| package SNMP::Info::Layer2::C1900; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::CDP; | ||||
| use SNMP::Info::CiscoStats; | ||||
| @@ -46,9 +46,9 @@ use SNMP::Info::Layer2; | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer2::C1900::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %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; | ||||
| @@ -289,14 +291,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $c1900 = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $c1900->class(); | ||||
| @@ -309,11 +311,6 @@ Catalyst 1900 device through SNMP.  See SNMP::Info for full documentation | ||||
|  | ||||
| Note that most of these devices only talk SNMP version 1, but not all. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $c1900 = new SNMP::Info::Layer2::C1900(...); | ||||
|  | ||||
| =head2 Inherited classes | ||||
|  | ||||
| =over | ||||
| @@ -340,8 +337,6 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| F<ESSWITCH-MIB> is included in the Version 1 MIBs from Cisco. | ||||
|  | ||||
| They can be found at ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
| @@ -377,14 +372,14 @@ Returns 'catalyst' | ||||
|  | ||||
| =item $c1900->os_ver() | ||||
|  | ||||
| Returns CatOS version if obtainable.  First tries to use  | ||||
| SNMP::Info::CiscoStats->os_ver() .  If that fails then it  | ||||
| Returns CatOS version if obtainable.  First tries to use | ||||
| SNMP::Info::CiscoStats->os_ver() .  If that fails then it | ||||
| checks for the presence of $c1900->c1900_flash_status() and culls | ||||
| the version from there. | ||||
|  | ||||
| =item $c1900->vendor() | ||||
|  | ||||
| Returns 'cisco' :) | ||||
| Returns 'cisco' | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -418,10 +413,6 @@ See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details. | ||||
|  | ||||
| See L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoAgg | ||||
|  | ||||
| See L<SNMP::Info::CiscoAgg/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| @@ -465,7 +456,7 @@ bridge group IDs. | ||||
|   Example: | ||||
|   my $interfaces = $c1900->interfaces(); | ||||
|   my $vlans      = $c1900->i_vlan_membership(); | ||||
|    | ||||
|  | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
| @@ -508,7 +499,7 @@ Gives admin setting for Duplex Info | ||||
|  | ||||
| =item $c1900->c1900_p_name() | ||||
|  | ||||
| Gives human set name for port  | ||||
| Gives human set name for port | ||||
|  | ||||
| (C<swPortName>) | ||||
|  | ||||
| @@ -561,7 +552,7 @@ See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
|  | ||||
| =over | ||||
|  | ||||
| @@ -572,7 +563,7 @@ choices are 'auto', 'half', 'full'. | ||||
|  | ||||
|   Example: | ||||
|   my %if_map = reverse %{$c1900->interfaces()}; | ||||
|   $c1900->set_i_duplex_admin('auto', $if_map{'1'})  | ||||
|   $c1900->set_i_duplex_admin('auto', $if_map{'1'}) | ||||
|     or die "Couldn't change port duplex. ",$c1900->error(1); | ||||
|  | ||||
| =back | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::C2900 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Layer2::C2900; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2::Cisco; | ||||
|  | ||||
| @SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::Layer2::Cisco Exporter/; | ||||
| @SNMP::Info::Layer2::C2900::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %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; | ||||
| @@ -226,7 +225,7 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $c2900 = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -234,7 +233,7 @@ Max Baker | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $c2900->class(); | ||||
| @@ -242,13 +241,8 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| C2900 device through SNMP.  | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $c2900 = new SNMP::Info::Layer2::C2900(...); | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| C2900 device through SNMP. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| @@ -282,7 +276,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $c2900->vendor() | ||||
|  | ||||
| Returns 'cisco' :) | ||||
| Returns 'cisco' | ||||
|  | ||||
| =item $c2900->cisco_comm_indexing() | ||||
|  | ||||
| @@ -310,8 +304,8 @@ Returns reference to the map between IID and physical Port. | ||||
| On the 2900 devices i_name isn't reliable, so we override to just the | ||||
| description. | ||||
|  | ||||
| Next all dots are changed for forward slashes so that the physical port name  | ||||
| is the same as the broad-casted CDP port name.  | ||||
| Next all dots are changed for forward slashes so that the physical port name | ||||
| is the same as the broad-casted CDP port name. | ||||
|     (Ethernet0.1 -> Ethernet0/1) | ||||
|  | ||||
| Also, any weird characters are removed, as I saw a few pop up. | ||||
| @@ -334,7 +328,7 @@ Returns reference to hash of IIDs to admin speed setting. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 F<C2900-MIB> Port Entry Table  | ||||
| =head2 F<C2900-MIB> Port Entry Table | ||||
|  | ||||
| =over | ||||
|  | ||||
| @@ -358,7 +352,7 @@ Gives admin setting for Duplex Info | ||||
|  | ||||
| =item $c2900->c2900_p_speed_admin() | ||||
|  | ||||
| Gives Admin speed of port  | ||||
| Gives Admin speed of port | ||||
|  | ||||
| (C<c2900PortAdminSpeed>) | ||||
|  | ||||
| @@ -373,7 +367,7 @@ See L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
|  | ||||
| =over | ||||
|  | ||||
| @@ -388,7 +382,7 @@ port C<ifIndex>. | ||||
|  | ||||
|     Example: | ||||
|     my %if_map = reverse %{$c2900->interfaces()}; | ||||
|     $c2900->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})  | ||||
|     $c2900->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'}) | ||||
|         or die "Couldn't change port speed. ",$c2900->error(1); | ||||
|  | ||||
| =item $c2900->set_i_duplex_admin(duplex, ifIndex) | ||||
| @@ -402,7 +396,7 @@ port C<ifIndex>. | ||||
|  | ||||
|     Example: | ||||
|     my %if_map = reverse %{$c2900->interfaces()}; | ||||
|     $c2900->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})  | ||||
|     $c2900->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) | ||||
|         or die "Couldn't change port duplex. ",$c2900->error(1); | ||||
|  | ||||
| =back | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Catalyst | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2002,2003 Regents of the University of California | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond | ||||
| @@ -32,6 +31,7 @@ | ||||
| package SNMP::Info::Layer2::Catalyst; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::CiscoStack; | ||||
| use SNMP::Info::Layer2::Cisco; | ||||
| @@ -40,9 +40,9 @@ use SNMP::Info::Layer2::Cisco; | ||||
|     = qw/SNMP::Info::CiscoStack SNMP::Info::Layer2::Cisco Exporter/; | ||||
| @SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::Cisco::MIBS, | ||||
| @@ -64,13 +64,13 @@ $VERSION = '3.45'; | ||||
|     %SNMP::Info::CiscoStack::MUNGE, | ||||
| ); | ||||
|  | ||||
| # Overidden Methods | ||||
| # Overridden Methods | ||||
|  | ||||
| # i_physical sets a hash entry as true if the iid is a physical port | ||||
| 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 ) { | ||||
| @@ -173,14 +173,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $cat = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $cat->class(); | ||||
| @@ -206,7 +206,7 @@ Note:  Some older Catalyst switches will only talk SNMP version 1.  Some | ||||
| newer ones will not return all their data if connected via Version 1. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
|  | ||||
|  my $cat = new SNMP::Info::Layer2::Catalyst(...); | ||||
|  | ||||
| @@ -246,7 +246,7 @@ Returns 'catalyst' | ||||
|  | ||||
| =item $cat->os_ver() | ||||
|  | ||||
| Tries to use the value from SNMP::Info::CiscoStats->os_ver() and if it fails  | ||||
| Tries to use the value from SNMP::Info::CiscoStats->os_ver() and if it fails | ||||
| it grabs $cat->m_swver()->{1} and uses that. | ||||
|  | ||||
| =item $cat->vendor() | ||||
| @@ -279,11 +279,11 @@ to a hash. | ||||
| =item $cat->interfaces() | ||||
|  | ||||
| Returns the map between SNMP Interface Identifier (iid) and physical port | ||||
| name.  | ||||
| name. | ||||
|  | ||||
| =item $cat->i_name() | ||||
|  | ||||
| Returns reference to hash of iid to human set name.  | ||||
| Returns reference to hash of iid to human set name. | ||||
|  | ||||
| C<portName> | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Centillion | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,9 +30,9 @@ | ||||
| package SNMP::Info::Layer2::Centillion; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::NortelStack; | ||||
| use SNMP::Info::SONMP; | ||||
|  | ||||
| @@ -41,9 +40,9 @@ use SNMP::Info::SONMP; | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/; | ||||
| @SNMP::Info::Layer2::Centillion::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -274,14 +273,14 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $centillion = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $centillion->class(); | ||||
| @@ -289,14 +288,9 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Centillion device through SNMP.  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Centillion device through SNMP. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $centillion = new SNMP::Info::Layer2::centillion(...); | ||||
|   | ||||
| Note:  This class supports version 4.X and 5.X which are VLAN based rather | ||||
| than bridge group based. | ||||
|  | ||||
| @@ -328,7 +322,7 @@ than bridge group based. | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
| See L<SNMP::Info/"REQUIREMENTS"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| @@ -346,7 +340,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $centillion->vendor() | ||||
|  | ||||
| Returns 'Nortel' | ||||
| Returns 'nortel' | ||||
|  | ||||
| =item $centillion->model() | ||||
|  | ||||
| @@ -357,7 +351,7 @@ Removes C<sreg-> from the model name | ||||
|  | ||||
| =item $centillion->os() | ||||
|  | ||||
| Returns 'Centillion' | ||||
| Returns 'centillion' | ||||
|  | ||||
| =item $centillion->tftp_action() | ||||
|  | ||||
| @@ -399,7 +393,7 @@ start at 0.  Returns 0. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
|  | ||||
| @@ -430,7 +424,7 @@ to a hash. | ||||
|     formula: | ||||
|       port = index % 256 | ||||
|       slot = int(index / 256) | ||||
|   | ||||
|  | ||||
|     The physical port name is returned as slot.port. | ||||
|  | ||||
| =item $centillion->i_duplex() | ||||
| @@ -469,13 +463,13 @@ Returns a mapping between C<ifIndex> and the VLAN. | ||||
|  | ||||
| =item $centillion->centillion_p_index() | ||||
|  | ||||
| Returns reference to hash.  Maps table IIDs to Interface IIDs  | ||||
| Returns reference to hash.  Maps table IIDs to Interface IIDs | ||||
|  | ||||
| (C<cnDot3ExtnIfIndex>) | ||||
|  | ||||
| =item $centillion->centillion_p_duplex() | ||||
|  | ||||
| Returns reference to hash.  Maps port operational duplexes to IIDs  | ||||
| Returns reference to hash.  Maps port operational duplexes to IIDs | ||||
|  | ||||
| (C<cnDot3ExtnIfOperConnectionType>) | ||||
|  | ||||
| @@ -493,19 +487,19 @@ Returns reference to hash.  Maps port admin duplexes to IIDs | ||||
|  | ||||
| =item $centillion->centillion_i_vlan_index() | ||||
|  | ||||
| Returns reference to hash.  Key: Table entry, Value: Index  | ||||
| Returns reference to hash.  Key: Table entry, Value: Index | ||||
|  | ||||
| (C<cnVlanPortMemberIfIndex>) | ||||
|  | ||||
| =item $centillion->centillion_i_vlan() | ||||
|  | ||||
| Returns reference to hash.  Key: Table entry, Value: VLAN ID  | ||||
| Returns reference to hash.  Key: Table entry, Value: VLAN ID | ||||
|  | ||||
| (C<cnVlanPortMemberVID>) | ||||
|  | ||||
| =item $centillion->centillion_i_vlan_type() | ||||
|  | ||||
| Returns reference to hash.  Key: Table entry, Value: VLAN Type  | ||||
| Returns reference to hash.  Key: Table entry, Value: VLAN Type | ||||
|  | ||||
| (C<cnVlanPortMemberIngressType>) | ||||
|  | ||||
| @@ -513,7 +507,7 @@ Returns reference to hash.  Key: Table entry, Value: VLAN Type | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Cisco | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -31,6 +30,7 @@ | ||||
| package SNMP::Info::Layer2::Cisco; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::CiscoVTP; | ||||
| use SNMP::Info::CDP; | ||||
| @@ -50,9 +50,9 @@ use SNMP::Info::Layer2; | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -117,7 +117,7 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $cisco = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -125,7 +125,7 @@ Max Baker | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $cisco->class(); | ||||
| @@ -194,7 +194,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $cisco->vendor() | ||||
|  | ||||
|     Returns 'cisco' | ||||
| Returns 'cisco' | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -226,10 +226,6 @@ See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details. | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoAgg | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoAgg/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::CiscoSB | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2013 Nic Bernstein | ||||
| # | ||||
| @@ -35,61 +34,60 @@ | ||||
| package SNMP::Info::Layer2::CiscoSB; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::Entity; | ||||
| use SNMP::Info::EtherLike; | ||||
| use SNMP::Info::CiscoStats; | ||||
| use SNMP::Info::CiscoConfig; | ||||
| use SNMP::Info::CDP; | ||||
|  | ||||
| @SNMP::Info::Layer2::CiscoSB::ISA | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::EtherLike | ||||
|     SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/; | ||||
| @SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::Entity::GLOBALS, | ||||
|     %SNMP::Info::EtherLike::GLOBALS, | ||||
|     %SNMP::Info::CiscoStats::GLOBALS, | ||||
|     %SNMP::Info::CiscoConfig::GLOBALS, | ||||
|     %SNMP::Info::CDP::GLOBALS, | ||||
|     'descr'  => 'sysDescr' | ||||
|     'descr'  => 'sysDescr', | ||||
|     'mac'    => 'rndBasePhysicalAddress', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::Entity::FUNCS, | ||||
|     %SNMP::Info::EtherLike::FUNCS, | ||||
|     %SNMP::Info::CiscoStats::FUNCS, | ||||
|     %SNMP::Info::CiscoConfig::FUNCS, | ||||
|     %SNMP::Info::CDP::FUNCS, | ||||
|     'peth_port_power' => 'rlPethPsePortOutputPower', | ||||
| ); | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::Entity::MIBS, | ||||
|     %SNMP::Info::EtherLike::MIBS, | ||||
|     %SNMP::Info::CiscoStats::MIBS, | ||||
|     %SNMP::Info::CiscoConfig::MIBS, | ||||
|     %SNMP::Info::CDP::MIBS, | ||||
|     'CISCOSB-POE-MIB'          => 'rlPethPsePortOutputPower', | ||||
|     'CISCOSB-DEVICEPARAMS-MIB' => 'rndBasePhysicalAddress', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     %SNMP::Info::Entity::MUNGE, | ||||
|     %SNMP::Info::EtherLike::MUNGE, | ||||
|     %SNMP::Info::CiscoStats::MUNGE, | ||||
|     %SNMP::Info::CiscoConfig::MUNGE, | ||||
|     %SNMP::Info::CDP::MUNGE, | ||||
| ); | ||||
|  | ||||
|  | ||||
| sub vendor { | ||||
|     return 'cisco'; | ||||
| } | ||||
| @@ -138,6 +136,26 @@ sub model { | ||||
|     return $ciscosb->description(); | ||||
| } | ||||
|  | ||||
| # CISCOSBinterfaces.mib also contains duplex info if needed | ||||
| sub i_duplex { | ||||
|     my $ciscosb = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $el_duplex = $ciscosb->el_duplex($partial); | ||||
|  | ||||
|     if ( defined $el_duplex and scalar( keys %$el_duplex ) ) { | ||||
|         my %i_duplex; | ||||
|         foreach my $el_port ( keys %$el_duplex ) { | ||||
|             my $duplex = $el_duplex->{$el_port}; | ||||
|             next unless defined $duplex; | ||||
|  | ||||
|             $i_duplex{$el_port} = 'half' if $duplex =~ /half/i; | ||||
|             $i_duplex{$el_port} = 'full' if $duplex =~ /full/i; | ||||
|         } | ||||
|         return \%i_duplex; | ||||
|     } | ||||
| } | ||||
|  | ||||
| # ifDescr is the same for all interfaces in a class, but the ifName is | ||||
| # unique, so let's use that for port name. | ||||
| sub interfaces { | ||||
| @@ -149,7 +167,6 @@ sub interfaces { | ||||
|     return $interfaces; | ||||
| } | ||||
|  | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| @@ -185,15 +202,15 @@ managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises( | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
| =item SNMP::Info::CDP | ||||
|  | ||||
| =item SNMP::Info::Entity | ||||
|  | ||||
| =item SNMP::Info::EtherLike | ||||
| =item SNMP::Info::CiscoConfig | ||||
|  | ||||
| =item SNMP::Info::CiscoStats | ||||
|  | ||||
| =item SNMP::Info::CiscoConfig | ||||
| =item SNMP::Info::EtherLike | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -201,6 +218,10 @@ managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises( | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<CISCOSB-DEVICEPARAMS-MIB> | ||||
|  | ||||
| =item F<CISCOSB-POE-MIB> | ||||
|  | ||||
| =item Inherited Classes | ||||
|  | ||||
| MIBs required by the inherited classes listed above. | ||||
| @@ -209,17 +230,13 @@ MIBs required by the inherited classes listed above. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
| These are methods that return scalar value from SNMP. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ciscosb->vendor() | ||||
| =item $ciscosb->mac() | ||||
|  | ||||
| Returns 'cisco' | ||||
|  | ||||
| =item $ciscosb->os() | ||||
|  | ||||
| Returns 'ros' | ||||
| Returns mac from (C<rndBasePhysicalAddress>) | ||||
|  | ||||
| =item $ciscosb->os_ver() | ||||
|  | ||||
| @@ -236,20 +253,43 @@ Returns model and hardware revision of unit | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ciscosb->vendor() | ||||
|  | ||||
| Returns 'cisco'. | ||||
|  | ||||
| =item $ciscosb->os() | ||||
|  | ||||
| Returns 'ros'. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::EtherLike | ||||
|  | ||||
| See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ciscosb->peth_port_power() | ||||
|  | ||||
| Power supplied by PoE ports, in milliwatts. | ||||
| (C<rlPethPsePortOutputPower>) | ||||
|  | ||||
| =item $ciscosb->i_duplex() | ||||
|  | ||||
| Return duplex based upon the result of EtherLike->el_duplex(). | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
| @@ -264,10 +304,6 @@ Uses the i_name() field. | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::EtherLike | ||||
|  | ||||
| See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details. | ||||
|   | ||||
							
								
								
									
										201
									
								
								lib/SNMP/Info/Layer2/Exinda.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								lib/SNMP/Info/Layer2/Exinda.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
| # SNMP::Info::Layer2::Exinda | ||||
| # | ||||
| # Copyright (c) 2018 nick nauwelaerts | ||||
| # 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::Exinda; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
|  | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Exinda::ISA = qw/ | ||||
|     SNMP::Info::Layer2 | ||||
|     Exporter | ||||
| /; | ||||
| @SNMP::Info::Layer2::Exinda::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'EXINDA-MIB' => 'systemVersion', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     # EXINDA-MIB | ||||
|     'exinda_model' => 'hardwareSeries', | ||||
|     'serial1'      => 'systemHostId', | ||||
|     'uptime'       => 'systemUptime', | ||||
|     'os_ver'       => 'systemVersion', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
| ); | ||||
|  | ||||
|  | ||||
| # layer 2: bridged shaping and failopen interfaces | ||||
| # layer 3/4: ip and layer 4 protocol fiddling and accell | ||||
| # layer 7: wccp support | ||||
| sub layers { | ||||
|     return '01001110'; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'exinda'; | ||||
| } | ||||
|  | ||||
| # overwrite l2->model, hardwareSeries returns a plain string | ||||
| sub model { | ||||
|     my $exinda = shift; | ||||
|     return $exinda->exinda_model; | ||||
| } | ||||
|  | ||||
| # systemHostId (and thus serial1) is actually also a mac address | ||||
| sub mac { | ||||
|     my $exinda = shift; | ||||
|     my $exinda_mac = $exinda->serial1; | ||||
|  | ||||
|     return unless (defined $exinda_mac && (length $exinda_mac) == 12); | ||||
|     return join(":", $exinda_mac =~ m/\w{2}/g); | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'exos'; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Exinda - SNMP Interface to exinda / gfi traffic shapers. | ||||
|  | ||||
| =head1 AUTHORS | ||||
|  | ||||
| nick nauwelaerts | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|     # Let SNMP::Info determine the correct subclass for you. | ||||
|     my $exinda = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|     my $class      = $exinda->class(); | ||||
|     print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for exinda / gfi network orchestrator traffic shapers. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<EXINDA-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 $exinda->layers() | ||||
|  | ||||
| Returns '01001110'. | ||||
|  | ||||
| =item $exinda->mac() | ||||
|  | ||||
| Returns a mac address extracted from C<systemHostId>. | ||||
|  | ||||
| =item $exinda->model() | ||||
|  | ||||
| Returns C<hardwareSeries>. | ||||
|  | ||||
| =item $exinda->os() | ||||
|  | ||||
| Returns 'exos'. | ||||
|  | ||||
| =item $exinda->os_ver() | ||||
|  | ||||
| Returns C<systemVersion>. | ||||
|  | ||||
| =item $exinda->uptime() | ||||
|  | ||||
| Returns the uptime extracted from C<systemUptime>. | ||||
|  | ||||
| =item $exinda->vendor() | ||||
|  | ||||
| Returns 'exinda'. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE ENTRIES | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::HP - SNMP Interface to HP ProCurve Switches | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,6 +32,7 @@ | ||||
| package SNMP::Info::Layer2::HP; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::MAU; | ||||
| @@ -41,31 +41,33 @@ use SNMP::Info::Aggregate 'agg_ports_ifstack'; | ||||
|  | ||||
| @SNMP::Info::Layer2::HP::ISA = qw/ | ||||
|     SNMP::Info::Aggregate | ||||
|     SNMP::Info::Layer3  | ||||
|     SNMP::Info::MAU  | ||||
|     SNMP::Info::CDP  | ||||
|     SNMP::Info::Layer3 | ||||
|     SNMP::Info::MAU | ||||
|     SNMP::Info::CDP | ||||
|     Exporter | ||||
| /; | ||||
| @SNMP::Info::Layer2::HP::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MODEL_MAP, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %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 = ( | ||||
| @@ -105,7 +107,7 @@ $VERSION = '3.45'; | ||||
|     'hp_s_oid'    => 'hpicfSensorObjectId', | ||||
|     'hp_s_name'   => 'hpicfSensorDescr', | ||||
|     'hp_s_status' => 'hpicfSensorStatus', | ||||
|      | ||||
|  | ||||
|     # HP-ICF-POE-MIB | ||||
|     'peth_port_power'   => 'hpicfPoePethPsePortPower', | ||||
| ); | ||||
| @@ -121,7 +123,7 @@ $VERSION = '3.45'; | ||||
|  | ||||
|  | ||||
| # Model map, reverse sorted by common model name (sort -k2 -r) | ||||
| # Potential sources for model information: http://www.hp.com/rnd/software/switches.htm or HP-ICF-OID MIB  | ||||
| # Potential sources for model information: http://www.hp.com/rnd/software/switches.htm or HP-ICF-OID MIB | ||||
| %MODEL_MAP = ( | ||||
|     'J8131A' => 'WAP-420-WW', | ||||
|     'J8130A' => 'WAP-420-NA', | ||||
| @@ -156,6 +158,12 @@ $VERSION = '3.45'; | ||||
|     'J8771A' => '4202vl-48G', | ||||
|     'J4865A' => '4108GL', | ||||
|     'J4887A' => '4104GL', | ||||
|     'JL074A' => '3810M-48G-PoE+', | ||||
|     'JL072A' => '3810M-48G', | ||||
|     'JL076A' => '3810M-40G-8SR-PoE+', | ||||
|     'JL073A' => '3810M-24G-PoE+', | ||||
|     'JL071A' => '3810M-24G', | ||||
|     'JL075A' => '3810M-16SFP+', | ||||
|     'J9588A' => '3800-48G-PoE+-4XG', | ||||
|     'J9574A' => '3800-48G-PoE+-4SFP+', | ||||
|     'J9586A' => '3800-48G-4XG', | ||||
| @@ -175,6 +183,23 @@ $VERSION = '3.45'; | ||||
|     'J4905A' => '3400cl-24G', | ||||
|     'J4815A' => '3324XL', | ||||
|     'J4851A' => '3124', | ||||
|     'JL322A' => '2930M-48G-PoE+', | ||||
|     'JL321A' => '2930M-48G', | ||||
|     'JL323A' => '2930M-40G-8SR-PoE+', | ||||
|     'JL320A' => '2930M-24G-PoE+', | ||||
|     'JL324A' => '2930M-24G-8SR-PoE+', | ||||
|     'JL319A' => '2930M-24G', | ||||
|     'JL258A' => '2930F-8G-PoE+-2SFP+', | ||||
|     'JL558A' => '2930F-48G-PoE+-4SFP+-740W', | ||||
|     'JL557A' => '2930F-48G-PoE+-4SFP-740W', | ||||
|     'JL256A' => '2930F-48G-PoE+-4SFP+', | ||||
|     'JL262A' => '2930F-48G-PoE+-4SFP', | ||||
|     'JL254A' => '2930F-48G-4SFP+', | ||||
|     'JL260A' => '2930F-48G-4SFP', | ||||
|     'JL255A' => '2930F-24G-PoE+-4SFP+', | ||||
|     'JL261A' => '2930F-24G-PoE+-4SFP', | ||||
|     'JL253A' => '2930F-24G-4SFP+', | ||||
|     'JL259A' => '2930F-24G-4SFP', | ||||
|     'J9729A' => '2920-48G-PoE+', | ||||
|     'J9729A' => '2920-48G-PoE+', | ||||
|     'J9728A' => '2920-48G', | ||||
| @@ -214,6 +239,11 @@ $VERSION = '3.45'; | ||||
|     'J9086A' => '2610-24/12PWR', | ||||
|     'J9085A' => '2610-24', | ||||
|     'J8762A' => '2600-8-PWR', | ||||
|     'JL357A' => '2540-48G-PoE+-4SFP+', | ||||
|     'JL355A' => '2540-48G-4SFP+', | ||||
|     'JL356A' => '2540-24G-PoE+-4SFP+', | ||||
|     'JL354A' => '2540-24G-4SFP+', | ||||
|     'JL070A' => '2530-8-PoE+ Internal PS', | ||||
|     'J9780A' => '2530-8-PoE+', | ||||
|     'J9774A' => '2530-8G-PoEP', | ||||
|     'J9777A' => '2530-8G', | ||||
| @@ -285,7 +315,7 @@ sub os_ver { | ||||
|     return; | ||||
| } | ||||
|  | ||||
| # Regular managed ProCurve switches have the serial num in entity mib,  | ||||
| # Regular managed ProCurve switches have the serial num in entity mib, | ||||
| # the web-managed models in the semi mib (hphttpmanageable). | ||||
| sub serial { | ||||
|     my $hp = shift; | ||||
| @@ -303,7 +333,7 @@ sub model { | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|     return $id unless defined $model; | ||||
|  | ||||
|     $model =~ s/^hpswitch//i; | ||||
|     $model =~ s/^(hp|aruba)switch//i; | ||||
|  | ||||
|     return defined $MODEL_MAP{$model} ? $MODEL_MAP{$model} : $model; | ||||
| } | ||||
| @@ -565,14 +595,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $hp = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $hp->class(); | ||||
| @@ -580,15 +610,15 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| HP ProCurve Switch via SNMP.  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| HP ProCurve Switch via SNMP. | ||||
|  | ||||
| Note:  Some HP Switches will connect via SNMP version 1, but a lot of config | ||||
| data will not be available.  Make sure you try and connect with Version 2 | ||||
| first, and then fail back to version 1. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
|  | ||||
|  my $hp = new SNMP::Info::Layer2::HP(...); | ||||
|  | ||||
| @@ -624,6 +654,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 | ||||
| @@ -836,7 +874,7 @@ to a hash. | ||||
|  | ||||
| =over 4 | ||||
|  | ||||
| =item $hp->interfaces()  | ||||
| =item $hp->interfaces() | ||||
|  | ||||
| Uses $hp->i_description() | ||||
|  | ||||
| @@ -893,7 +931,7 @@ Munge for c_id which handles CDP and LLDP. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
|  | ||||
| =over | ||||
|  | ||||
|   | ||||
| @@ -32,6 +32,7 @@ | ||||
| package SNMP::Info::Layer2::HP4000; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::MAU; | ||||
| @@ -42,14 +43,13 @@ use SNMP::Info::CDP; | ||||
|     SNMP::Info::CDP Exporter/; | ||||
| @SNMP::Info::Layer2::HP4000::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MODEL_MAP, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::CDP::MIBS, | ||||
|     'RFC1271-MIB'    => 'logDescription', | ||||
|     'HP-ICF-OID'     => 'hpSwitch4000', | ||||
| @@ -386,7 +386,7 @@ sub i_vlan_membership_untagged { | ||||
|         my $vlan = $vlans->{$port}; | ||||
|         push( @{ $i_vlan_membership->{$port} }, $vlan ); | ||||
|     } | ||||
|      | ||||
|  | ||||
|     return $i_vlan_membership; | ||||
| } | ||||
|  | ||||
| @@ -427,7 +427,7 @@ sub set_i_vlan { | ||||
|                     $hp->error_throw("Error removing previous untagged vlan from port, should never happen...\n") unless defined $rv; | ||||
|                 } | ||||
|             } else { | ||||
|                 # If vlan change was not succesful, try to revert to the old situation. | ||||
|                 # If vlan change was not successful, try to revert to the old situation. | ||||
|                 if (defined $old_untagged) { | ||||
|                     $rv = $hp->set_hp_v_if_tag(2, $old_untagged) if defined $old_untagged; | ||||
|                     if (defined $rv) { | ||||
| @@ -482,14 +482,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $hp = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $hp->class(); | ||||
| @@ -497,18 +497,13 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| HP ProCurve Switch via SNMP.  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| HP ProCurve Switch via SNMP. | ||||
|  | ||||
| Note:  Some HP Switches will connect via SNMP version 1, but a lot of config | ||||
| data will not be available.  Make sure you try and connect with Version 2 | ||||
| first, and then fail back to version 1. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $hp = new SNMP::Info::Layer2::HP4000(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
| @@ -583,7 +578,7 @@ Returns bytes of used memory | ||||
| Returns the model number of the HP Switch.  Will translate between the HP Part | ||||
| number and the common model number with this map : | ||||
|  | ||||
|  %MODEL_MAP = (  | ||||
|  %MODEL_MAP = ( | ||||
|                 'J4093A' => '2424M', | ||||
|                 'J4110A' => '8000M', | ||||
|                 'J4120A' => '1600M', | ||||
| @@ -652,7 +647,7 @@ to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $hp->interfaces()  | ||||
| =item $hp->interfaces() | ||||
|  | ||||
| Uses $hp->i_description() | ||||
|  | ||||
| @@ -687,7 +682,7 @@ It is the union of tagged, untagged, and auto ports. | ||||
|   Example: | ||||
|   my $interfaces = $hp->interfaces(); | ||||
|   my $vlans      = $hp->i_vlan_membership(); | ||||
|    | ||||
|  | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
| @@ -731,7 +726,7 @@ See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
|  | ||||
| =over | ||||
|  | ||||
|   | ||||
| @@ -31,21 +31,20 @@ | ||||
| package SNMP::Info::Layer2::HPVC; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::LLDP; | ||||
|  | ||||
| @SNMP::Info::Layer2::HPVC::ISA | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::LLDP Exporter/; | ||||
|     = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'HPVC-MIB'       => 'vcDomainName', | ||||
|     'CPQSINFO-MIB'   => 'cpqSiSysSerialNum', | ||||
|     'HPVCMODULE-MIB' => 'vcModuleDomainName', | ||||
| @@ -53,7 +52,6 @@ $VERSION = '3.45'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'serial1'      => 'cpqSiSysSerialNum.0', | ||||
|     'os_ver'       => 'cpqHoSWRunningVersion.1', | ||||
|     'os_bin'       => 'cpqHoFwVerVersion.1', | ||||
| @@ -62,17 +60,13 @@ $VERSION = '3.45'; | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|      | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     # Inherit all the built in munging | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| ); | ||||
|  | ||||
|  | ||||
| # Method Overrides | ||||
|  | ||||
| sub os { | ||||
| @@ -102,14 +96,14 @@ Jeroen van Ingen | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $hp = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $hp->class(); | ||||
| @@ -117,13 +111,8 @@ Jeroen van Ingen | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| HP Virtual Connect Switch via SNMP.  | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $hp = new SNMP::Info::Layer2::HPVC(...); | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| HP Virtual Connect Switch via SNMP. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| @@ -188,27 +177,15 @@ See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head1 MUNGES | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 SET METHODS | ||||
|  | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -28,15 +28,16 @@ package SNMP::Info::Layer2::Kentrox; | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Kentrox::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Kentrox::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -57,36 +58,38 @@ $VERSION = '3.45'; | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, ); | ||||
|  | ||||
| sub os { | ||||
|     return 'Kentrox'; | ||||
|     return 'kentrox'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $dsver = shift; | ||||
|     my $descr = $dsver->description(); | ||||
|     if ( $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){ | ||||
|     if ( defined ($descr) && $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){ | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $dsserial = shift; | ||||
|     my $serial = $dsserial->ds_sysinfo(); | ||||
|     if ( $serial =~ /SERIAL\s(\S+)/){ | ||||
|     if ( defined ($serial) && $serial =~ /SERIAL\s(\S+)/){ | ||||
|         my $str = substr($1,8,10); | ||||
|         return $str; | ||||
|     } | ||||
|  | ||||
|     return; | ||||
| } | ||||
| sub vendor { | ||||
|     return 'Kentrox'; | ||||
|     return 'kentrox'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $dsmodel = shift; | ||||
|     my $descr = $dsmodel->description(); | ||||
|     if ( $descr =~ /^(\S+\s\S+)/){ | ||||
|     if ( defined ($descr) && $descr =~ /^(\S+\s\S+)/){ | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| @@ -108,7 +111,7 @@ phishphreek@gmail.com | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -166,12 +169,6 @@ See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::N2270 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,38 +30,42 @@ | ||||
| package SNMP::Info::Layer2::N2270; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::SONMP; | ||||
| use SNMP::Info::Airespace; | ||||
|  | ||||
| @SNMP::Info::Layer2::N2270::ISA | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::SONMP SNMP::Info::Airespace Exporter/; | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::SONMP SNMP::Info::Airespace Exporter/; | ||||
| @SNMP::Info::Layer2::N2270::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD, $INIT, $DEBUG); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,        %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::SONMP::MIBS, %SNMP::Info::Airespace::MIBS, | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::SONMP::MIBS, | ||||
|     %SNMP::Info::Airespace::MIBS, | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS,        %SNMP::Info::Bridge::GLOBALS, | ||||
|     %SNMP::Info::SONMP::GLOBALS, %SNMP::Info::Airespace::GLOBALS, | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::SONMP::GLOBALS, | ||||
|     %SNMP::Info::Airespace::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS,        %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::SONMP::FUNCS, %SNMP::Info::Airespace::FUNCS, | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::SONMP::FUNCS, | ||||
|     %SNMP::Info::Airespace::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::MUNGE,        %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::SONMP::MUNGE, %SNMP::Info::Airespace::MUNGE, | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     %SNMP::Info::SONMP::MUNGE, | ||||
|     %SNMP::Info::Airespace::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub os { | ||||
| @@ -114,7 +117,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -123,21 +126,14 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Nortel 2270 Series Wireless Switch 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 $n2270 = new SNMP::Info::Layer2::N2270(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info | ||||
|  | ||||
| =item SNMP::Info::Bridge | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =item SNMP::Info::SONMP | ||||
|  | ||||
| @@ -151,9 +147,7 @@ my $n2270 = new SNMP::Info::Layer2::N2270(...); | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements. | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| @@ -200,13 +194,9 @@ start at 0.  Returns 0. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
|  | ||||
| See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details. | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::SONMP | ||||
|  | ||||
| @@ -229,13 +219,9 @@ to a hash. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
|  | ||||
| See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::SONMP | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::NAP222x | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,6 +30,7 @@ | ||||
| package SNMP::Info::Layer2::NAP222x; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::SONMP; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
| @@ -40,9 +40,9 @@ use SNMP::Info::Layer2; | ||||
|     = qw/SNMP::Info::SONMP SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::NAP222x::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS, | ||||
| @@ -375,14 +375,14 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $nap222x = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $nap222x->class(); | ||||
| @@ -391,12 +391,7 @@ Eric Miller | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a Nortel | ||||
| 2220 series wireless Access Points 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 $nap222x = new SNMP::Info::Layer2::NAP222x(...); | ||||
| 2220 series wireless Access Points through SNMP. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| @@ -526,7 +521,7 @@ to a hash. | ||||
|  | ||||
| =item $nap222x->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to physical ports.  | ||||
| Returns reference to map of IIDs to physical ports. | ||||
|  | ||||
| =item $nap222x->i_duplex() | ||||
|  | ||||
| @@ -548,7 +543,7 @@ Returns a human name based upon port description. | ||||
|  | ||||
| Returns a mapping between C<ifIndex> and the Bridge Table.  This does not | ||||
| exist in the MIB and bridge port index is not the same as C<ifIndex> so it is | ||||
| created.  | ||||
| created. | ||||
|  | ||||
| =item $nap222x->i_ssidlist() | ||||
|  | ||||
|   | ||||
| @@ -29,39 +29,37 @@ | ||||
| package SNMP::Info::Layer2::NWSS2300; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::NWSS2300::ISA | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge Exporter/; | ||||
|     = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::NWSS2300::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|     %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'NTWS-REGISTRATION-DEVICES-MIB' => 'ntwsSwitch2380', | ||||
|     'NTWS-AP-STATUS-MIB'            => 'ntwsApStatNumAps', | ||||
|     'NTWS-CLIENT-SESSION-MIB'       => 'ntwsClSessTotalSessions', | ||||
|     'NTWS-SYSTEM-MIB'               => 'ntwsSysCpuAverageLoad', | ||||
|     'NTWS-BASIC-MIB'                => 'ntwsVersionString', | ||||
|     'NTWS-AP-CONFIG-MIB'            => 'ntwsApConfServProfBeaconEnabled', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     %SNMP::Info::Bridge::GLOBALS, | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     'os_ver' => 'ntwsVersionString', | ||||
|     'serial' => 'ntwsSerialNumber', | ||||
|     'mac'    => 'dot1dBaseBridgeAddress', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS, | ||||
|     %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|  | ||||
|     # NTWS-AP-STATUS-MIB::ntwsApStatApStatusTable | ||||
|     'nwss2300_ap_mac'      => 'ntwsApStatApStatusBaseMac', | ||||
| @@ -124,8 +122,7 @@ $VERSION = '3.45'; | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::MUNGE, | ||||
|     %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     'nwss2300_apif_mac'      => \&SNMP::Info::munge_mac, | ||||
|     'nwss2300_apif_bssid'    => \&SNMP::Info::munge_mac, | ||||
| ); | ||||
| @@ -158,7 +155,7 @@ sub model { | ||||
|     return $id unless defined $model; | ||||
|  | ||||
|     $model =~ s/^ntwsSwitch//i; | ||||
|     return $model;     | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| sub _ap_serial { | ||||
| @@ -388,7 +385,7 @@ sub bp_index { | ||||
| sub fw_mac { | ||||
|     my $nwss2300 = shift; | ||||
|     my $partial  = shift; | ||||
|      | ||||
|  | ||||
|     my $serials = $nwss2300->nwss2300_sta_serial($partial) || {}; | ||||
|  | ||||
|     my %fw_mac; | ||||
| @@ -400,7 +397,7 @@ sub fw_mac { | ||||
| 	 | ||||
|         $fw_mac{$iid} = $mac; | ||||
|     } | ||||
|     return \%fw_mac;     | ||||
|     return \%fw_mac; | ||||
| } | ||||
|  | ||||
| sub fw_port { | ||||
| @@ -493,7 +490,7 @@ sub dot11_cur_tx_pwr_mw { | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $cur = $nwss2300->nwss2300_apif_power($partial); | ||||
|      | ||||
|  | ||||
|     my $dot11_cur_tx_pwr_mw = {}; | ||||
|     foreach my $idx ( keys %$cur ) { | ||||
|         my $pwr_dbm = $cur->{$idx}; | ||||
| @@ -501,7 +498,7 @@ sub dot11_cur_tx_pwr_mw { | ||||
| 	#Convert to milliWatts = 10(dBm/10) | ||||
|         my $pwr = int (10 ** ($pwr_dbm / 10)); | ||||
| 	 | ||||
|         $dot11_cur_tx_pwr_mw->{$idx} = $pwr;  | ||||
|         $dot11_cur_tx_pwr_mw->{$idx} = $pwr; | ||||
|     } | ||||
|     return $dot11_cur_tx_pwr_mw; | ||||
| } | ||||
| @@ -513,7 +510,7 @@ sub e_index { | ||||
|  | ||||
|     # Try new first, fall back to depreciated | ||||
|     my $ap_num = $nwss2300->nwss2300_ap_num() || $nwss2300->nwss2300_ap_dapnum() || {}; | ||||
|    | ||||
|  | ||||
|     my %e_index; | ||||
|  | ||||
|     # Chassis | ||||
| @@ -796,7 +793,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -805,25 +802,18 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from  | ||||
| Provides abstraction to the configuration information obtainable from | ||||
| Avaya (Trapeze) Wireless Controllers through SNMP. | ||||
|  | ||||
| This class emulates bridge functionality for the wireless switch. This enables | ||||
| end station MAC addresses collection and correlation to the thin access point | ||||
| the end station is using for communication. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
| my $nwss2300 = new SNMP::Info::Layer2::NWSS2300(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info | ||||
|  | ||||
| =item SNMP::Info::Bridge | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -845,9 +835,7 @@ my $nwss2300 = new SNMP::Info::Layer2::NWSS2300(...); | ||||
|  | ||||
| =head2 Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements. | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| @@ -894,20 +882,16 @@ proprietary MIBs. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info | ||||
| =head2 Global Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
|  | ||||
| See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details. | ||||
| 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  | ||||
| =over | ||||
|  | ||||
| =item $nwss2300->i_ssidlist() | ||||
|  | ||||
| @@ -1138,15 +1122,11 @@ These emulate the F<CISCO-DOT11-MIB> | ||||
|  | ||||
| (C<ntwsClSessClientSessStatsUniPktOut>) | ||||
|  | ||||
| =back  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
|  | ||||
| See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| @@ -1154,14 +1134,14 @@ See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
|  | ||||
| =item $nwss2300->i_index() | ||||
|  | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
|  | ||||
| Extends C<ifIndex> to support thin APs and WLAN virtual interfaces as device | ||||
| interfaces. | ||||
|  | ||||
| =item $nwss2300->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device  | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device | ||||
| interfaces.  The thin AP MAC address and Slot ID nwss2300_apif_slot() are | ||||
| used as the port identifier. | ||||
|  | ||||
| @@ -1206,7 +1186,7 @@ the interface iid. | ||||
| =item $nwss2300->fw_port() | ||||
|  | ||||
| Returns reference to a hash, value being mac and | ||||
| nwss2300_sta_slot() combined to match the interface iid.   | ||||
| nwss2300_sta_slot() combined to match the interface iid. | ||||
|  | ||||
| =item $nwss2300->fw_mac() | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Netgear | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bill Fenner | ||||
| # All rights reserved. | ||||
| @@ -31,33 +30,33 @@ | ||||
| package SNMP::Info::Layer2::Netgear; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::LLDP; | ||||
|  | ||||
| @SNMP::Info::Layer2::Netgear::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Netgear::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| # 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::LLDP::MIBS, ); | ||||
| %MIBS = ( %SNMP::Info::Layer2::MIBS, ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     ng_fsosver   => '.1.3.6.1.4.1.4526.11.11.1.0', | ||||
|     ng_gsmserial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0', | ||||
|     ng_gsmosver  => '.1.3.6.1.4.1.4526.10.1.1.1.13.0', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::LLDP::FUNCS, ); | ||||
| %FUNCS = ( %SNMP::Info::Layer2::FUNCS, ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, ); | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'netgear'; | ||||
| @@ -74,7 +73,7 @@ sub os { | ||||
| sub serial { | ||||
|     my $netgear = shift; | ||||
|     my $serial = undef; | ||||
|      | ||||
|  | ||||
|     my $e_serial = $netgear->e_serial(); | ||||
|     if (defined($e_serial)) { # This unit sports the Entity-MIB | ||||
|         # Find entity table entry for this unit | ||||
| @@ -87,9 +86,9 @@ sub serial { | ||||
|         return $e_serial->{$index} if defined $index; | ||||
|     } | ||||
|  | ||||
|     # Without Enitity-MIB, we've got to work our way through a bunch of | ||||
|     # Without Entity-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'; | ||||
| } | ||||
|  | ||||
| @@ -108,8 +107,8 @@ sub model { | ||||
| } | ||||
|  | ||||
| # 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. | ||||
| # unique, so let's use that for port name.  If all else fails, | ||||
| # concatenate ifDesc and ifIndex. | ||||
| sub interfaces { | ||||
|     my $netgear = shift; | ||||
|     my $partial = shift; | ||||
| @@ -139,7 +138,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 +147,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; | ||||
| } | ||||
|  | ||||
| @@ -162,20 +161,20 @@ SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
|  Bill Fenner and Zoltan Erszenyi,  | ||||
|  Hacked in LLDP support from Baystack.pm by  | ||||
|  Bill Fenner and Zoltan Erszenyi, | ||||
|  Hacked in LLDP support from Baystack.pm by | ||||
|  Nic Bernstein <nic@onlight.com> | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $netgear = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $netgear->class(); | ||||
| @@ -183,8 +182,8 @@ SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Netgear device through SNMP. See inherited classes' documentation for  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Netgear device through SNMP. See inherited classes' documentation for | ||||
| inherited methods. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
| @@ -192,8 +191,6 @@ inherited methods. | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
| =item SNMP::Info::Entity | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -206,10 +203,6 @@ inherited methods. | ||||
| MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited | ||||
| classes. | ||||
|  | ||||
| See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
| @@ -226,11 +219,11 @@ Returns 'netgear' | ||||
|  | ||||
| =item $netgear->os() | ||||
|  | ||||
| Returns 'netgear'  | ||||
| Returns 'netgear' | ||||
|  | ||||
| =item $netgear->model() | ||||
|  | ||||
| Returns concatenation of $e_model and $e_hwver if Entity MIB present,  | ||||
| Returns concatenation of $e_model and $e_hwver if Entity MIB present, | ||||
| otherwise returns description() | ||||
|  | ||||
| =item $netgear->os_ver() | ||||
| @@ -248,14 +241,6 @@ serial number). | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of | ||||
| @@ -275,12 +260,4 @@ Uses the i_name() field. | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
|   | ||||
							
								
								
									
										249
									
								
								lib/SNMP/Info/Layer2/Nexans.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										249
									
								
								lib/SNMP/Info/Layer2/Nexans.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,249 @@ | ||||
| # 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 warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Nexans::ISA = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Nexans::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %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 | ||||
|  | ||||
| =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 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Orinoco | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,6 +30,7 @@ | ||||
| package SNMP::Info::Layer2::Orinoco; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
| use SNMP::Info::Layer2; | ||||
| @@ -39,15 +39,13 @@ use SNMP::Info::Layer2; | ||||
|     = qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Orinoco::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::IEEE802dot11::MIBS, | ||||
|  | ||||
|     #'ORiNOCO-MIB' => 'orinoco', | ||||
| ); | ||||
|  | ||||
| %GLOBALS | ||||
| @@ -56,12 +54,6 @@ $VERSION = '3.45'; | ||||
| %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__ | ||||
|  | ||||
| @@ -194,14 +170,14 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $orinoco = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $orinoco->class(); | ||||
| @@ -213,11 +189,6 @@ Provides abstraction to the configuration information obtainable from | ||||
| Orinoco Access Point through SNMP.  Orinoco devices have been manufactured | ||||
| by Proxim, Agere, and Lucent. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $orinoco = new SNMP::Info::Layer2::Orinoco(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
| @@ -258,7 +229,7 @@ Returns the model extracted from C<sysDescr>. | ||||
|  | ||||
| =item $orinoco->os() | ||||
|  | ||||
| Returns 'Orinoco' | ||||
| Returns 'orinoco' | ||||
|  | ||||
| =item $orinoco->os_ver() | ||||
|  | ||||
| @@ -293,7 +264,7 @@ to a hash. | ||||
|  | ||||
| =item $orinoco->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to physical ports.  | ||||
| Returns reference to map of IIDs to physical ports. | ||||
|  | ||||
| =item $orinoco->i_ignore() | ||||
|  | ||||
|   | ||||
							
								
								
									
										178
									
								
								lib/SNMP/Info/Layer2/Sixnet.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								lib/SNMP/Info/Layer2/Sixnet.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,178 @@ | ||||
| # 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 warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Sixnet::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Sixnet::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %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. | ||||
|  | ||||
| =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 | ||||
| @@ -29,43 +29,37 @@ | ||||
| package SNMP::Info::Layer2::Trapeze; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Trapeze::ISA | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::LLDP Exporter/; | ||||
|     = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Trapeze::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|     %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'TRAPEZE-NETWORKS-REGISTRATION-DEVICES-MIB' => 'wirelessLANController', | ||||
|     'TRAPEZE-NETWORKS-AP-STATUS-MIB'            => 'trpzApStatNumAps', | ||||
|     'TRAPEZE-NETWORKS-CLIENT-SESSION-MIB'       => 'trpzClSessTotalSessions', | ||||
|     'TRAPEZE-NETWORKS-SYSTEM-MIB'               => 'trpzSysCpuAverageLoad', | ||||
|     'TRAPEZE-NETWORKS-BASIC-MIB'                => 'trpzVersionString', | ||||
|     'TRAPEZE-NETWORKS-AP-CONFIG-MIB'  => 'trpzApConfServProfBeaconEnabled', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     %SNMP::Info::Bridge::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     'os_ver' => 'trpzVersionString', | ||||
|     'serial' => 'trpzSerialNumber', | ||||
|     'mac'    => 'dot1dBaseBridgeAddress', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS, | ||||
|     %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     # TRAPEZE-NETWORKS-AP-STATUS-MIB::trpzApStatApStatusTable | ||||
|     'trapeze_ap_mac'      => 'trpzApStatApStatusBaseMac', | ||||
|     'trapeze_ap_name'     => 'trpzApStatApStatusApName', | ||||
| @@ -127,9 +121,7 @@ $VERSION = '3.45'; | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::MUNGE, | ||||
|     %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     'trapeze_apif_mac'      => \&SNMP::Info::munge_mac, | ||||
|     'trapeze_apif_bssid'    => \&SNMP::Info::munge_mac, | ||||
| ); | ||||
| @@ -162,7 +154,7 @@ sub model { | ||||
|     return $id unless defined $model; | ||||
|  | ||||
|     $model =~ s/^wirelessLANController//i; | ||||
|     return $model;     | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| sub _ap_serial { | ||||
| @@ -392,7 +384,7 @@ sub bp_index { | ||||
| sub fw_mac { | ||||
|     my $trapeze = shift; | ||||
|     my $partial  = shift; | ||||
|      | ||||
|  | ||||
|     my $serials = $trapeze->trapeze_sta_serial($partial) || {}; | ||||
|  | ||||
|     my %fw_mac; | ||||
| @@ -404,7 +396,7 @@ sub fw_mac { | ||||
| 	 | ||||
|         $fw_mac{$iid} = $mac; | ||||
|     } | ||||
|     return \%fw_mac;     | ||||
|     return \%fw_mac; | ||||
| } | ||||
|  | ||||
| sub fw_port { | ||||
| @@ -497,7 +489,7 @@ sub dot11_cur_tx_pwr_mw { | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $cur = $trapeze->trapeze_apif_power($partial); | ||||
|      | ||||
|  | ||||
|     my $dot11_cur_tx_pwr_mw = {}; | ||||
|     foreach my $idx ( keys %$cur ) { | ||||
|         my $pwr_dbm = $cur->{$idx}; | ||||
| @@ -505,7 +497,7 @@ sub dot11_cur_tx_pwr_mw { | ||||
| 	#Convert to milliWatts = 10(dBm/10) | ||||
|         my $pwr = int (10 ** ($pwr_dbm / 10)); | ||||
| 	 | ||||
|         $dot11_cur_tx_pwr_mw->{$idx} = $pwr;  | ||||
|         $dot11_cur_tx_pwr_mw->{$idx} = $pwr; | ||||
|     } | ||||
|     return $dot11_cur_tx_pwr_mw; | ||||
| } | ||||
| @@ -517,7 +509,7 @@ sub e_index { | ||||
|  | ||||
|     # Try new first, fall back to depreciated | ||||
|     my $ap_num = $trapeze->trapeze_ap_num() || $trapeze->trapeze_ap_dapnum() || {}; | ||||
|    | ||||
|  | ||||
|     my %e_index; | ||||
|  | ||||
|     # Chassis | ||||
| @@ -800,7 +792,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -809,25 +801,18 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from  | ||||
| Provides abstraction to the configuration information obtainable from | ||||
| Juniper (Trapeze) Wireless Controllers through SNMP. | ||||
|  | ||||
| This class emulates bridge functionality for the wireless switch. This enables | ||||
| end station MAC addresses collection and correlation to the thin access point | ||||
| the end station is using for communication. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
| my $trapeze = new SNMP::Info::Layer2::Trapeze(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info | ||||
|  | ||||
| =item SNMP::Info::Bridge | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -849,9 +834,7 @@ my $trapeze = new SNMP::Info::Layer2::Trapeze(...); | ||||
|  | ||||
| =head2 Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements. | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| @@ -898,20 +881,16 @@ proprietary MIBs. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info | ||||
| =head2 Global Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
|  | ||||
| See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details. | ||||
| 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  | ||||
| =over | ||||
|  | ||||
| =item $trapeze->i_ssidlist() | ||||
|  | ||||
| @@ -1142,15 +1121,11 @@ These emulate the F<CISCO-DOT11-MIB> | ||||
|  | ||||
| (C<trpzClSessClientSessStatsUniPktOut>) | ||||
|  | ||||
| =back  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
|  | ||||
| See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| @@ -1158,14 +1133,14 @@ See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
|  | ||||
| =item $trapeze->i_index() | ||||
|  | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
|  | ||||
| Extends C<ifIndex> to support thin APs and WLAN virtual interfaces as device | ||||
| interfaces. | ||||
|  | ||||
| =item $trapeze->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device  | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device | ||||
| interfaces.  The thin AP MAC address and Slot ID trapeze_apif_slot() are | ||||
| used as the port identifier. | ||||
|  | ||||
| @@ -1210,7 +1185,7 @@ the interface iid. | ||||
| =item $trapeze->fw_port() | ||||
|  | ||||
| Returns reference to a hash, value being mac and | ||||
| trapeze_sta_slot() combined to match the interface iid.   | ||||
| trapeze_sta_slot() combined to match the interface iid. | ||||
|  | ||||
| =item $trapeze->fw_mac() | ||||
|  | ||||
|   | ||||
| @@ -1,10 +1,35 @@ | ||||
| # SNMP::Info::Layer2::Ubiquiti | ||||
| # $Id$ | ||||
| # SNMP::Info::Layer2::Ubiquiti - SNMP Interface to Ubiquiti Devices | ||||
| # | ||||
| # Copyright (c) 2019 by The Netdisco Developer Team. | ||||
| # | ||||
| # 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::Ubiquiti; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
| use SNMP::Info::Layer2; | ||||
| @@ -16,23 +41,23 @@ use SNMP::Info::Layer3;  # only used in sub mac() | ||||
|     = qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Ubiquiti::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::IEEE802dot11::MIBS, | ||||
|  | ||||
| ); | ||||
|  | ||||
| %GLOBALS | ||||
|     = ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, ); | ||||
| %GLOBALS = ( | ||||
|   %SNMP::Info::Layer2::GLOBALS, | ||||
|   %SNMP::Info::IEEE802dot11::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::IEEE802dot11::FUNCS, | ||||
|  | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, ); | ||||
| @@ -46,14 +71,14 @@ sub os { | ||||
|         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 | ||||
|                 } | ||||
|         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 | ||||
| @@ -65,35 +90,54 @@ sub os { | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $dot11 = shift; | ||||
|     my $ubnt = shift; | ||||
|  | ||||
|     my $versions = $dot11->dot11_prod_ver(); | ||||
|     my $versions = $ubnt->dot11_prod_ver(); | ||||
|  | ||||
|     foreach my $iid ( keys %$versions ) { | ||||
|         my $ver = $versions->{$iid}; | ||||
|         next unless defined $ver; | ||||
|         my $os = $ubnt->os; | ||||
|         if($os == 'AirOS'){ | ||||
|             ## pretty up the version reporting for AirOS to include hardware (XW, XM, etc) and three major groups of firmware | ||||
|             my @firmware =  split(/v/, $ver); | ||||
|             my @firmwareSplit = split(/\./, $firmware[1]); | ||||
|             my @prefix = split(/\./, $ver); | ||||
|             $ver = $prefix[0] . '-v' . join('.', @firmwareSplit[0,1,2]); | ||||
|         } | ||||
|         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; | ||||
|         } | ||||
|         #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 $myver[1]; | ||||
|     my $ver = $ubnt->description() || ''; | ||||
|     if((lc $ver) =~ /^edgeswitch/){ | ||||
|         ## EdgeSwitch OS version is second field split by comma and bootcode version is last | ||||
|         my @myver = split(/, /, $ver); | ||||
|         my @firmware = split(/\./, $myver[1]); | ||||
|         my @bootcode = split(/\./, $myver[-1]); | ||||
|  | ||||
|         ## Return only three major version groupings and include bootcode version | ||||
|         return join('.', @firmware[0,1,2]) . '.-b' . join('.', @bootcode[0,1,2]); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     ## EdgeRouter OS version is second field split by space | ||||
|     my @myver = split(/ /, $ver); | ||||
|     my @firmware = split(/\./, $myver[1]); | ||||
|  | ||||
|     return $myver[1]; | ||||
|     if($firmware[2] =~ /hotfix$/){ | ||||
|         # edge case where EdgeOS has hotfix versions in format "EdgeOS v1.9.7+hotfix.4.5024004.171005.0403" | ||||
|         $firmware[2] = $firmware[2] . '.' . $firmware[3] | ||||
|     } | ||||
|     ## Return only three major version groupings | ||||
|     return join('.', @firmware[0,1,2]); | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'Ubiquiti Networks, Inc.'; | ||||
|     return 'ubiquiti'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
| @@ -106,11 +150,11 @@ sub model { | ||||
|         next unless defined $prod; | ||||
|         return $prod; | ||||
|     } | ||||
|      | ||||
|  | ||||
|     my $desc = $ubnt->description() || ''; | ||||
|      | ||||
|  | ||||
|     ## Pull Model from beginning of description, separated by comma (EdgeSwitch) | ||||
|     if((lc $desc) =~ /^edgeswitch/){     | ||||
|     if((lc $desc) =~ /^edgeswitch/){ | ||||
|         my @mydesc = split(/, /, $desc); | ||||
|         return $mydesc[0]; | ||||
|     } | ||||
| @@ -118,7 +162,7 @@ sub model { | ||||
|     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 | ||||
|         # EdgeSwitch includes model directly and edgeos logic is in else statement | ||||
|         return ; | ||||
|     }else{ | ||||
|         ## do some logic to determine ER model based on tech specs from ubnt: | ||||
| @@ -127,15 +171,15 @@ sub model { | ||||
|         my $ethCount = 0; | ||||
|         my $switchCount = 0; | ||||
|         #my $sfpCount = 0; | ||||
|         #my $poeCount = 0;   | ||||
|         my $memTotalReal = $ubnt->memTotalReal;    | ||||
|         #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}; | ||||
| @@ -148,13 +192,16 @@ sub model { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ## If people have other models to further fine-tune this logic that would be great.  | ||||
|         ## 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" | ||||
|         }if($ethCount eq 12){ | ||||
|             ## ER-12 | ||||
|             return "EdgeRouter 12-Port" | ||||
|         }elsif($ethCount eq 5 and $cpuCount eq 4){ | ||||
|             ## Could be ER-X or ER-X-SFP | ||||
|             return "EdgeRouter X 5-Port" | ||||
| @@ -166,7 +213,7 @@ sub model { | ||||
|             ## failback string | ||||
|             return "EdgeRouter eth-$ethCount switch-$switchCount mem-$memTotalReal cpuNum-$cpuCount"; | ||||
|         } | ||||
|          | ||||
|  | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -186,25 +233,68 @@ sub serial { | ||||
| sub mac { | ||||
|     my $ubnt = shift; | ||||
|     my $ifDescs = $ubnt->ifDescr; | ||||
|     my $erModel = $ubnt->model; | ||||
|  | ||||
|     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'){ | ||||
|         ## eth0 will have primary MAC for linux-based UBNT devices, except ER-12 which is eth11 | ||||
|         if($ifDesc =~ /CPU/ or ($ifDesc eq 'eth0' and !($erModel =~ /EdgeRouter 12/)) or ($ifDesc eq 'eth11' and ($erModel =~ /EdgeRouter 12/))){ | ||||
|             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;   | ||||
|              | ||||
|             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 $ubnt = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $ubnt->i_index($partial)       || {}; | ||||
|     my $i_descr    = $ubnt->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; | ||||
| @@ -220,14 +310,14 @@ Max Kosmach | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $ubnt = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $ubnt->class(); | ||||
| @@ -238,11 +328,6 @@ Max Kosmach | ||||
| Provides abstraction to the configuration information obtainable from | ||||
| Ubiquiti Access Point through SNMP. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $ubnt = new SNMP::Info::Layer2::Ubiquiti(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
| @@ -271,11 +356,11 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $ubnt->vendor() | ||||
|  | ||||
| Returns 'Ubiquiti Networks, Inc.' | ||||
| Returns 'ubiquiti' | ||||
|  | ||||
| =item $ubnt->model() | ||||
|  | ||||
| Returns the model extracted from C<dot11manufacturerProductName>, with failback to some complex logic for EdgeMax devices | ||||
| Returns the model extracted from C<dot11manufacturerProductName>, with fallback to some complex logic for EdgeMax devices | ||||
|  | ||||
| =item $ubnt->serial() | ||||
|  | ||||
| @@ -287,11 +372,11 @@ Bridge MAC address. | ||||
|  | ||||
| =item $ubnt->os() | ||||
|  | ||||
| Returns 'Ubiquiti Networks, Inc.' | ||||
| Returns C<AirOS>, C<UniFi> or C<EdgeOS> depending on model. | ||||
|  | ||||
| =item $ubnt->os_ver() | ||||
|  | ||||
| Returns the software version extracted from C<dot11manufacturerProductVersion>, with failback to description splitting for EdgeMax devices | ||||
| Returns the software version extracted from C<dot11manufacturerProductVersion>, with fallback to description splitting for EdgeMax devices | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -308,6 +393,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 $ubnt->interfaces() | ||||
|  | ||||
| Uses the i_name() field. | ||||
|  | ||||
| =item $ubnt->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. | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::ZyXEL_DSLAM | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -31,22 +30,23 @@ | ||||
| package SNMP::Info::Layer2::ZyXEL_DSLAM; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::ZyXEL_DSLAM::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::ZyXEL_DSLAM::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| # 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.45'; | ||||
|  | ||||
| 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 | ||||
| @@ -77,7 +77,7 @@ sub os_ver { | ||||
|     my $zyxel = shift; | ||||
|     my $descr = $zyxel->description(); | ||||
|  | ||||
|     if ( $descr =~ m/version (\S+) / ) { | ||||
|     if ( defined ($descr) && $descr =~ m/version (\S+) / ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| @@ -88,11 +88,13 @@ sub model { | ||||
|  | ||||
|     my $desc = $zyxel->description(); | ||||
|  | ||||
|     if ( $desc =~ /8-port ADSL Module\(Annex A\)/ ) { | ||||
|     if (defined $desc) { | ||||
|       if ($desc =~ /8-port ADSL Module\(Annex A\)/) { | ||||
|         return "AAM1008-61"; | ||||
|     } | ||||
|     elsif ( $desc =~ /8-port ADSL Module\(Annex B\)/ ) { | ||||
|       } | ||||
|       elsif ($desc =~ /8-port ADSL Module\(Annex B\)/) { | ||||
|         return "AAM1008-63"; | ||||
|       } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| @@ -102,7 +104,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}$/ ); | ||||
| @@ -122,23 +126,23 @@ Dmitry Sergienko (C<dmitry@trifle.net>) | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $zyxel = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myhub', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $l2->class(); | ||||
|  my $class      = $zyxel->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| ZyXEL device through SNMP. See inherited classes' documentation for  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| ZyXEL device through SNMP. See inherited classes' documentation for | ||||
| inherited methods. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
| @@ -172,11 +176,11 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $zyxel->vendor() | ||||
|  | ||||
| Returns 'ZyXEL' :) | ||||
| Returns 'zyxel' | ||||
|  | ||||
| =item $zyxel->os() | ||||
|  | ||||
| Returns 'ZyXEL'  | ||||
| Returns 'zyxel' | ||||
|  | ||||
| =item $zyxel->os_ver() | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3 - SNMP Interface to Layer3 devices | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on | ||||
| # | ||||
| @@ -33,6 +32,7 @@ | ||||
| package SNMP::Info::Layer3; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| @@ -42,23 +42,25 @@ use SNMP::Info::PowerEthernet; | ||||
| use SNMP::Info::IPv6; | ||||
| use SNMP::Info::AdslLine; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::DocsisHE; | ||||
|  | ||||
| @SNMP::Info::Layer3::ISA = qw/ | ||||
|     SNMP::Info::PowerEthernet SNMP::Info::IPv6 | ||||
|     SNMP::Info::Entity SNMP::Info::EtherLike | ||||
|     SNMP::Info::Bridge SNMP::Info::AdslLine | ||||
|     SNMP::Info::LLDP | ||||
|     SNMP::Info::LLDP SNMP::Info::DocsisHE | ||||
|     SNMP::Info Exporter/; | ||||
| @SNMP::Info::Layer3::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|     %SNMP::Info::AdslLine::MIBS, | ||||
|     %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::DocsisHE::MIBS, | ||||
|     %SNMP::Info::EtherLike::MIBS, | ||||
|     %SNMP::Info::Entity::MIBS, | ||||
|     %SNMP::Info::PowerEthernet::MIBS, | ||||
| @@ -66,6 +68,7 @@ $VERSION = '3.45'; | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'IP-MIB'   => 'ipNetToMediaIfIndex', | ||||
|     'OSPF-MIB' => 'ospfRouterId', | ||||
|     'ISIS-MIB' => 'isisSysID', | ||||
|     'BGP4-MIB' => 'bgpIdentifier', | ||||
| ); | ||||
|  | ||||
| @@ -75,6 +78,7 @@ $VERSION = '3.45'; | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     %SNMP::Info::AdslLine::GLOBALS, | ||||
|     %SNMP::Info::Bridge::GLOBALS, | ||||
|     %SNMP::Info::DocsisHE::GLOBALS, | ||||
|     %SNMP::Info::EtherLike::GLOBALS, | ||||
|     %SNMP::Info::Entity::GLOBALS, | ||||
|     %SNMP::Info::PowerEthernet::GLOBALS, | ||||
| @@ -92,6 +96,7 @@ $VERSION = '3.45'; | ||||
|     %SNMP::Info::FUNCS, | ||||
|     %SNMP::Info::AdslLine::FUNCS, | ||||
|     %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::DocsisHE::FUNCS, | ||||
|     %SNMP::Info::EtherLike::FUNCS, | ||||
|     %SNMP::Info::Entity::FUNCS, | ||||
|     %SNMP::Info::PowerEthernet::FUNCS, | ||||
| @@ -123,6 +128,20 @@ $VERSION = '3.45'; | ||||
|     'ospf_peer_id'    => 'ospfNbrRtrId', | ||||
|     'ospf_peer_state' => 'ospfNbrState', | ||||
|  | ||||
|     # ISIS-MIB::isisCircTable | ||||
|     'isis_circ_if_idx'      => 'isisCircIfIndex' , | ||||
|     'isis_circ_admin'       => 'isisCircAdminState', | ||||
|     'isis_circ_type'        => 'isisCircType', | ||||
|     'isis_circ_level_type'  => 'isisCircLevelType', | ||||
|  | ||||
|     # ISIS-MIB::isisISAdjTable | ||||
|     'isis_adj_state'   => 'isisISAdjState', | ||||
|     'isis_adj_type'    => 'isisISAdjNeighSysType', | ||||
|     'isis_adj_usage'   => 'isisISAdjUsage', | ||||
|     'isis_adj_id'      => 'isisISAdjNeighSysID', | ||||
|     'isis_adj_ip_type' => 'isisISAdjIPAddrType', | ||||
|     'isis_adj'         => 'isisISAdjIPAddrAddress', | ||||
|  | ||||
|     # BGP4-MIB::bgpPeerTable | ||||
|     'bgp_peers'               => 'bgpPeerLocalAddr', | ||||
|     'bgp_peer_id'             => 'bgpPeerIdentifier', | ||||
| @@ -152,6 +171,7 @@ $VERSION = '3.45'; | ||||
|     %SNMP::Info::AdslLine::MUNGE, | ||||
|     %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::EtherLike::MUNGE, | ||||
|     %SNMP::Info::DocsisHE::MUNGE, | ||||
|     %SNMP::Info::Entity::MUNGE, | ||||
|     %SNMP::Info::PowerEthernet::MUNGE, | ||||
|     %SNMP::Info::IPv6::MUNGE, | ||||
| @@ -161,6 +181,32 @@ $VERSION = '3.45'; | ||||
|     'n2p_paddr'    => \&SNMP::Info::munge_mac, | ||||
| ); | ||||
|  | ||||
| sub isis_peers { | ||||
|     my $l3 = shift; | ||||
|  | ||||
|     my $isis_peers = {}; | ||||
|  | ||||
|     # Returns hexstrings. Need to convert to IPv4 dotted or IPv6 hex notation | ||||
|     my $adjacencies = $l3->isis_adj(); | ||||
|     foreach my $key (keys %$adjacencies) { | ||||
|         my $hexstr = $adjacencies->{$key}; | ||||
|         my $l = length $hexstr; | ||||
|         my $ip; | ||||
|         # 4 bytes = IPv4 | ||||
|         if ($l == 4) { | ||||
|             $ip = join(".", unpack("C*", $hexstr)); | ||||
|             $isis_peers->{$key} = $ip; | ||||
|         } | ||||
|         # 16 bytes = IPv6 | ||||
|         elsif ($l == 16) { | ||||
|             $ip = unpack("H*", $hexstr); | ||||
|             $ip =~ s/....(?=.)\K/:/sg ; | ||||
|             $isis_peers->{$key} = $ip; | ||||
|         } | ||||
|     } | ||||
|     return $isis_peers; | ||||
| } | ||||
|  | ||||
| # Method OverRides | ||||
|  | ||||
| sub root_ip { | ||||
| @@ -194,32 +240,18 @@ sub root_ip { | ||||
| sub serial { | ||||
|     my $l3 = shift; | ||||
|  | ||||
|     my $serial1 = $l3->serial1(); | ||||
|     my $e_parent = $l3->e_parent() || {}; | ||||
|     my $e_class  = $l3->e_class() || {}; | ||||
|  | ||||
|     foreach my $iid ( 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 = $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 | ||||
| @@ -298,15 +330,25 @@ sub interfaces { | ||||
|  | ||||
|     # Check for duplicates in ifDescr, if so uniquely identify by adding | ||||
|     # ifIndex to repeated values | ||||
|     my %seen; | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|     my (%seen, %first_seen_as); | ||||
|     foreach my $iid ( sort keys %$i_descr ) { | ||||
|         my $port = $i_descr->{$iid}; | ||||
|         next unless defined $port; | ||||
|  | ||||
|         $port = SNMP::Info::munge_null($port); | ||||
|         $port =~ s/^\s+//; $port =~ s/\s+$//; | ||||
|         next unless length $port; | ||||
|  | ||||
|         if ( $seen{$port}++ ) { | ||||
|             # (#320) also fixup the port this is a duplicate of | ||||
|             $interfaces->{ $first_seen_as{$port} } | ||||
|               = sprintf( "%s (%d)", $port, $first_seen_as{$port} ); | ||||
|  | ||||
|             $interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid ); | ||||
|         } | ||||
|         else { | ||||
|             $interfaces->{$iid} = $port; | ||||
|             $first_seen_as{$port} = $iid; | ||||
|         } | ||||
|     } | ||||
|     return $interfaces; | ||||
| @@ -365,14 +407,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $l3 = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $l3->class(); | ||||
| @@ -395,11 +437,11 @@ This class is usually used as a superclass for more specific device classes | ||||
| listed under SNMP::Info::Layer3::*   Please read all docs under SNMP::Info | ||||
| first. | ||||
|  | ||||
| Provides generic methods for accessing SNMP data for Layer 3 network devices.  | ||||
| Includes support for Layer2+3 devices.  | ||||
| Provides generic methods for accessing SNMP data for Layer 3 network devices. | ||||
| Includes support for Layer2+3 devices. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
|  | ||||
|  my $l3 = new SNMP::Info::Layer3(...); | ||||
|  | ||||
| @@ -421,6 +463,10 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =item SNMP::Info::DocsisHE | ||||
|  | ||||
| =item SNMP::Info::AdslLine | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
| @@ -429,6 +475,8 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| =item F<IP-MIB> | ||||
|  | ||||
| =item F<ISIS-MIB> | ||||
|  | ||||
| =item F<OSPF-MIB> | ||||
|  | ||||
| =item F<BGP4-MIB> | ||||
| @@ -437,7 +485,7 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
|  | ||||
| See L<SNMP::Info/"Required MIBs"> for its MIB requirements. | ||||
| See L<SNMP::Info/"REQUIREMENTS"> for its MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| @@ -451,6 +499,10 @@ See L<SNMP::Info::IPv6/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::DocsisHE/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::AdslLine/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
| @@ -475,7 +527,7 @@ Returns the BGP identifier of the local system | ||||
|  | ||||
| =item $l3->bgp_local_as() | ||||
|  | ||||
| Returns the local autonomous system number  | ||||
| Returns the local autonomous system number | ||||
|  | ||||
| (C<bgpLocalAs.0>) | ||||
|  | ||||
| @@ -493,8 +545,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() | ||||
|  | ||||
| @@ -510,7 +561,7 @@ found:  OSPF Router ID (C<ospfRouterId>) or any OSPF Host IP Address | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info | ||||
|  | ||||
| See L<SNMP::Info/"GLOBALS"> for details. | ||||
| See L<SNMP::Info/"USAGE"> for details. | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::Bridge | ||||
|  | ||||
| @@ -536,6 +587,14 @@ See L<SNMP::Info::IPv6/"GLOBALS"> for details. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::DocsisHE | ||||
|  | ||||
| See L<SNMP::Info::DocsisHE/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::AdslLine | ||||
|  | ||||
| See L<SNMP::Info::AdslLine/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| @@ -548,13 +607,13 @@ to a hash. | ||||
| =item $l3->interfaces() | ||||
|  | ||||
| Returns the map between SNMP Interface Identifier (iid) and physical port | ||||
| name.  | ||||
| name. | ||||
|  | ||||
| Only returns those iids that have a description listed in $l3->i_description() | ||||
|  | ||||
| =item $l3->i_name() | ||||
|  | ||||
| Returns reference to hash of iid to human set name.  | ||||
| Returns reference to hash of iid to human set name. | ||||
|  | ||||
| Defaults to C<ifName>, but checks for an C<ifAlias> | ||||
|  | ||||
| @@ -562,10 +621,10 @@ Defaults to C<ifName>, but checks for an C<ifAlias> | ||||
|  | ||||
| Returns reference to hash of iid to current link duplex setting. | ||||
|  | ||||
| Maps $l3->el_index() to $l3->el_duplex, then culls out  | ||||
| full,half, or auto and sets the map to that value.  | ||||
| Maps $l3->el_index() to $l3->el_duplex, then culls out | ||||
| full,half, or auto and sets the map to that value. | ||||
|  | ||||
| See L<SNMP::Info::Etherlike> for the el_index() and el_duplex() methods. | ||||
| See L<SNMP::Info::EtherLike> for the el_index() and el_duplex() methods. | ||||
|  | ||||
| =back | ||||
|  | ||||
| @@ -575,7 +634,7 @@ See L<SNMP::Info::Etherlike> for the el_index() and el_duplex() methods. | ||||
|  | ||||
| =item $l3->at_index() | ||||
|  | ||||
| Returns reference to hash.  Maps ARP table entries to Interface IIDs  | ||||
| Returns reference to hash.  Maps ARP table entries to Interface IIDs | ||||
|  | ||||
| (C<ipNetToMediaIfIndex>) | ||||
|  | ||||
| @@ -584,7 +643,7 @@ the deprecated C<atIfIndex>. | ||||
|  | ||||
| =item $l3->at_paddr() | ||||
|  | ||||
| Returns reference to hash.  Maps ARP table entries to MAC addresses.  | ||||
| Returns reference to hash.  Maps ARP table entries to MAC addresses. | ||||
|  | ||||
| (C<ipNetToMediaPhysAddress>) | ||||
|  | ||||
| @@ -593,7 +652,7 @@ the deprecated C<atPhysAddress>. | ||||
|  | ||||
| =item $l3->at_netaddr() | ||||
|  | ||||
| Returns reference to hash.  Maps ARP table entries to IP addresses.  | ||||
| Returns reference to hash.  Maps ARP table entries to IP addresses. | ||||
|  | ||||
| (C<ipNetToMediaNetAddress>) | ||||
|  | ||||
| @@ -781,9 +840,85 @@ routers | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 IS-IS Circuit Table | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $l3->isis_circ_if_idx() | ||||
|  | ||||
| Returns reference to hash of the interface index associated with the IS-IS | ||||
| circuit | ||||
| (C<isisCircIfIndex>) | ||||
|  | ||||
| =item $l3->isis_circ_admin() | ||||
|  | ||||
| Returns reference to hash of the IS-IS circuit's admin status | ||||
|  | ||||
| (C<isisCircAdminState>) | ||||
|  | ||||
| =item $l3->isis_circ_type() | ||||
|  | ||||
| Returns reference to hash of the IS-IS circuit's type | ||||
|  | ||||
| (C<isisCircType>) | ||||
|  | ||||
| =item $l3->isis_circ_level_type() | ||||
|  | ||||
| Returns reference to hash of the IS-IS circuit's level | ||||
|  | ||||
| (C<isisCircLevelType>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 IS-IS Adjacency Table | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $l3->isis_adj_id() | ||||
|  | ||||
| Returns reference to hash of the peer id of adjacencies. | ||||
|  | ||||
| (C<isisISAdjNeighSysID>) | ||||
|  | ||||
| =item $l3->isis_adj_type() | ||||
|  | ||||
| Returns reference to hash of the type of adjacencies (Level 1 | ||||
| Intermediate System, Level 2 Intermediate System, Level 1+2 | ||||
| Intermediate System, unknown) | ||||
|  | ||||
| (C<isisISAdjNeighSysType>) | ||||
|  | ||||
| =item $l3->isis_adj_usage() | ||||
|  | ||||
| Returns reference to hash of the type of adjacencies in use | ||||
| (undefined, Level 1, Level 2, Level1+2) | ||||
|  | ||||
| (C<isisISAdjNeighUsage>) | ||||
|  | ||||
| =item $l3->isis_adj_ip_type() | ||||
|  | ||||
| Returns reference to hash of type of address (IPv4, IPv6, etc) on adjacencies. | ||||
|  | ||||
| (C<isisISAdjIPAddrType>) | ||||
|  | ||||
| =item $l3->isis_adj() | ||||
|  | ||||
| Returns reference to hash of addresses (IPv4, IPv6, etc) on adjacencies. | ||||
| Note this returns hash-strings, for IPs, use $l3->isis_peers() | ||||
|  | ||||
| (C<isisISAdjIPAddrAddress>) | ||||
|  | ||||
| =item $l3->isis_peers() | ||||
|  | ||||
| Returns reference to hash of addresses (IPv4, IPv6) on adjacencies. | ||||
| Convert hash strings from isis_adj to proper | ||||
| IP (v4 and v6) formatting. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
|  | ||||
| See L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| See L<SNMP::Info/"USAGE"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
|  | ||||
| @@ -809,4 +944,12 @@ See L<SNMP::Info::IPv6/"TABLE METHODS"> for details. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::DocsisHE | ||||
|  | ||||
| See L<SNMP::Info::DocsisHE/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::AdslLine | ||||
|  | ||||
| See L<SNMP::Info::AdslLine/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::Aironet | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Layer3::Aironet; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer3::Aironet::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Aironet::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -69,8 +69,8 @@ $VERSION = '3.45'; | ||||
|     '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', | ||||
| @@ -224,14 +224,14 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $aironet = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $aironet->class(); | ||||
| @@ -257,7 +257,7 @@ This class is for devices running Cisco IOS software (newer) | ||||
| =back | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
|  | ||||
|  my $aironet = new SNMP::Info::Layer3::Aironet(...); | ||||
|  | ||||
| @@ -279,9 +279,6 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| =back | ||||
|  | ||||
| These MIBs are now included in the v2.tar.gz archive available from | ||||
| ftp.cisco.com.  Make sure you have a current version.  | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
| @@ -296,7 +293,7 @@ C<awcEtherDuplex.0> | ||||
|  | ||||
| =item $aironet->mac() | ||||
|  | ||||
| Gives the MAC Address of the wireless side  | ||||
| Gives the MAC Address of the wireless side | ||||
|  | ||||
| C<dot11StationID.2> | ||||
|  | ||||
| @@ -364,13 +361,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() | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::AlcatelLucent | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bill Fenner | ||||
| # | ||||
| @@ -30,6 +29,7 @@ | ||||
| package SNMP::Info::Layer3::AlcatelLucent; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
|  | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| @@ -47,9 +47,9 @@ use SNMP::Info::LLDP; | ||||
|     SNMP::Info::MAU SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::AlcatelLucent::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -112,15 +112,15 @@ sub vendor { | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $alu = shift; | ||||
|    my $alu = shift; | ||||
|  | ||||
|     my $descr = $alu->description(); | ||||
|     if ( $descr =~ m/^(\S+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|    my $descr = $alu->description(); | ||||
|    if (defined ($descr)) { | ||||
|      return $1 if $descr =~ m/\b(\d[\.\d]+R\d+) (?:GA|Service Release), /; | ||||
|    } | ||||
|  | ||||
|     # No clue what this will try but hey | ||||
|     return $alu->SUPER::os_ver(); | ||||
|    # No clue what this will try but hey | ||||
|    return $alu->SUPER::os_ver(); | ||||
| } | ||||
|  | ||||
| # ps1_type, ps1_status, ps2_type, ps2_status: | ||||
| @@ -308,7 +308,7 @@ Bill Fenner | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $alu = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -316,7 +316,7 @@ Bill Fenner | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $alu->class(); | ||||
| @@ -372,7 +372,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $alu->vendor() | ||||
|  | ||||
|     Returns 'alcatel-lucent' | ||||
| Returns 'alcatel-lucent' | ||||
|  | ||||
| =item $alu->model() | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::AlteonAD | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All Rights Reserved | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::Layer3::AlteonAD; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer3::AlteonAD::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::AlteonAD::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -163,14 +163,14 @@ sub ps1_status { | ||||
|     my $alteon = shift; | ||||
|     my $old_ps = $alteon->old_ps1_stat(); | ||||
|     my $new_ps = $alteon->new_ps_stat(); | ||||
|      | ||||
|  | ||||
|     return $old_ps if $old_ps; | ||||
|      | ||||
|  | ||||
|     if ($new_ps) { | ||||
|         return 'ok' if ($new_ps eq 'singlePowerSupplyOk'); | ||||
|         return 'failed' if ($new_ps eq 'firstPowerSupplyFailed'); | ||||
|     } | ||||
|      | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| @@ -178,9 +178,9 @@ sub ps2_status { | ||||
|     my $alteon = shift; | ||||
|     my $old_ps = $alteon->old_ps2_stat(); | ||||
|     my $new_ps = $alteon->new_ps_stat(); | ||||
|      | ||||
|  | ||||
|     return $old_ps if $old_ps; | ||||
|      | ||||
|  | ||||
|     if ($new_ps) { | ||||
|         return 'ok' if ($new_ps eq 'doublePowerSupplyOk'); | ||||
|         return 'failed' if ($new_ps eq 'secondPowerSupplyFailed'); | ||||
| @@ -242,19 +242,19 @@ sub i_duplex { | ||||
| sub i_duplex_admin { | ||||
|     my $alteon = shift; | ||||
|  | ||||
|     my $ag_pref  | ||||
|     my $ag_pref | ||||
|         = $alteon->new_ag_p_cfg_pref() | ||||
|         || $alteon->old_ag_p_cfg_pref() | ||||
|         || {}; | ||||
|     my $ag_fe_auto  | ||||
|     my $ag_fe_auto | ||||
|         = $alteon->new_ag_p_cfg_fe_auto() | ||||
|         || $alteon->old_ag_p_cfg_fe_auto() | ||||
|         || {}; | ||||
|     my $ag_fe_mode  | ||||
|     my $ag_fe_mode | ||||
|         = $alteon->new_ag_p_cfg_fe_mode() | ||||
|         || $alteon->old_ag_p_cfg_fe_mode() | ||||
|         || {}; | ||||
|     my $ag_ge_auto  | ||||
|     my $ag_ge_auto | ||||
|         = $alteon->new_ag_p_cfg_ge_auto() | ||||
|         || $alteon->old_ag_p_cfg_ge_auto() | ||||
|         || {}; | ||||
| @@ -395,7 +395,7 @@ sub i_vlan_membership_untagged { | ||||
|         my $vlan = $vlans->{$port}; | ||||
|         push( @{ $i_vlan_membership->{$port} }, $vlan ); | ||||
|     } | ||||
|      | ||||
|  | ||||
|     return $i_vlan_membership; | ||||
| } | ||||
|  | ||||
| @@ -432,14 +432,14 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $alteon = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $alteon->class(); | ||||
| @@ -450,11 +450,6 @@ Eric Miller | ||||
| Abstraction subclass for Radware Alteon Series ADC switches and | ||||
| Nortel BladeCenter Layer2-3 GbE Switch Modules. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $alteon = new SNMP::Info::Layer3::AlteonAD(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
| @@ -581,7 +576,7 @@ IDs.  These are the VLANs which are members of the egress list for the port. | ||||
|   Example: | ||||
|   my $interfaces = $alteon->interfaces(); | ||||
|   my $vlans      = $alteon->i_vlan_membership(); | ||||
|    | ||||
|  | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
|   | ||||
| @@ -1,23 +1,22 @@ | ||||
| # SNMP::Info::Layer3::Altiga | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Jeroen van Ingen Schenau | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without  | ||||
| # 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  | ||||
| #     * 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   | ||||
| # | ||||
| # 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 | ||||
| @@ -31,22 +30,23 @@ | ||||
| package SNMP::Info::Layer3::Altiga; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer3::Altiga::ISA = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Altiga::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE  | ||||
|             $int_include_vpn $fake_idx $type_class/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE, | ||||
|             $int_include_vpn, $fake_idx, $type_class); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|             %SNMP::Info::Layer3::MIBS, | ||||
|             'ALTIGA-VERSION-STATS-MIB'  => 'alVersionString', | ||||
|             'ALTIGA-SESSION-STATS-MIB'  => 'alActiveSessionCount', | ||||
|             'ALTIGA-HARDWARE-STATS-MIB' => 'alHardwarePs1Type',   | ||||
|             'ALTIGA-HARDWARE-STATS-MIB' => 'alHardwarePs1Type', | ||||
|     ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| @@ -70,7 +70,7 @@ $VERSION = '3.45'; | ||||
|             'fan1_alarm'      => 'alHardwareFan1RpmAlarm', | ||||
|             'fan2_alarm'      => 'alHardwareFan2RpmAlarm', | ||||
|             'fan3_alarm'      => 'alHardwareFan3RpmAlarm', | ||||
|              | ||||
|  | ||||
|        ); | ||||
|  | ||||
| %FUNCS = ( | ||||
| @@ -189,7 +189,7 @@ sub interfaces { | ||||
|     if ($int_include_vpn) { | ||||
|         my $tun_type = $altiga->vpn_sess_protocol(); | ||||
|         my $peer = $altiga->vpn_sess_peer_ip(); | ||||
|         my $remote = $altiga->vpn_sess_rem_ip();  | ||||
|         my $remote = $altiga->vpn_sess_rem_ip(); | ||||
|         my $group = $altiga->vpn_sess_gid(); | ||||
|         foreach my $tunnel (keys %$tun_type) { | ||||
|             if ($type_class->{$tun_type->{$tunnel}} eq 1) { | ||||
| @@ -197,7 +197,7 @@ sub interfaces { | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|              | ||||
|  | ||||
|     return \%interfaces; | ||||
| } | ||||
|  | ||||
| @@ -275,14 +275,14 @@ Jeroen van Ingen Schenau | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $altiga = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'my_vpn_host', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $altiga->class(); | ||||
| @@ -304,6 +304,12 @@ Subclass for Cisco (formerly Altiga) VPN concentrators | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<ALTIGA-VERSION-STATS-MIB> | ||||
|  | ||||
| =item F<ALTIGA-SESSION-STATS-MIB> | ||||
|  | ||||
| =item F<ALTIGA-HARDWARE-STATS-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
| @@ -366,7 +372,7 @@ to a hash. | ||||
| =item $altiga->interfaces() | ||||
|  | ||||
| This method overrides the interfaces() method inherited from SNMP::Info. | ||||
| It provides a mapping between the Interface Table Index (iid) and the physical  | ||||
| It provides a mapping between the Interface Table Index (iid) and the physical | ||||
| port name, adding a port number to the port name to prevent duplicate names. | ||||
|  | ||||
| =item $altiga->i_lastchange() | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::Arista | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Arista Networks, Inc. | ||||
| # All rights reserved. | ||||
| @@ -31,49 +30,44 @@ | ||||
| package SNMP::Info::Layer3::Arista; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
|  | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::MAU; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::Aggregate 'agg_ports_ifstack'; | ||||
|  | ||||
| @SNMP::Info::Layer3::Arista::ISA = qw/ | ||||
|     SNMP::Info::Aggregate | ||||
|     SNMP::Info::LLDP | ||||
|     SNMP::Info::MAU | ||||
|     SNMP::Info::Layer3 Exporter | ||||
|     SNMP::Info::Layer3 | ||||
|     Exporter | ||||
| /; | ||||
| @SNMP::Info::Layer3::Arista::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %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 = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::MAU::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::MAU::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::MAU::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| ); | ||||
|  | ||||
| # use MAU-MIB for admin. duplex and admin. speed | ||||
| @@ -92,11 +86,14 @@ sub os { | ||||
|  | ||||
| sub os_ver { | ||||
|     my $arista = shift; | ||||
|     my $descr   = $arista->description(); | ||||
|     my $os_ver  = undef; | ||||
|     my $descr  = $arista->description(); | ||||
|  | ||||
|     $os_ver = $1 if ( $descr =~ /\s+EOS\s+version\s+(\S+)\s+/ ); | ||||
|     return $os_ver; | ||||
|     if (defined ($descr)) { | ||||
|       my $os_ver = undef; | ||||
|       $os_ver = $1 if ($descr =~ /\s+EOS\s+version\s+(\S+)\s+/); | ||||
|       return $os_ver; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
| @@ -146,7 +143,7 @@ Bill Fenner | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $arista = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -154,7 +151,7 @@ Bill Fenner | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
| 		 	) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $arista->class(); | ||||
| @@ -174,8 +171,6 @@ Subclass for Arista Networks EOS-based devices | ||||
|  | ||||
| =item SNMP::Info::MAU | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
| @@ -192,8 +187,6 @@ See L<SNMP::Info::Aggregate/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
| @@ -204,7 +197,7 @@ These are methods that return scalar values from SNMP | ||||
|  | ||||
| =item $arista->vendor() | ||||
|  | ||||
|     Returns 'Arista Networks, Inc.' | ||||
| Returns 'arista' | ||||
|  | ||||
| =item $arista->model() | ||||
|  | ||||
| @@ -230,10 +223,6 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| @@ -269,8 +258,4 @@ See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::Aruba | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2013 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,20 +30,19 @@ | ||||
| package SNMP::Info::Layer3::Aruba; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::LLDP; | ||||
|  | ||||
| @SNMP::Info::Layer3::Aruba::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Aruba::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Aruba::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'WLSR-AP-MIB'        => 'wlsrHideSSID', | ||||
|     'WLSX-IFEXT-MIB'     => 'ifExtVlanName', | ||||
|     'WLSX-POE-MIB'       => 'wlsxPseSlotPowerAvailable', | ||||
| @@ -58,7 +56,6 @@ $VERSION = '3.45'; | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'aruba_serial_old' => 'wlsxSwitchLicenseSerialNumber', | ||||
|     'aruba_serial_new' => 'wlsxSysExtLicenseSerialNumber', | ||||
|     'aruba_model'      => 'wlsxModelName', | ||||
| @@ -67,7 +64,6 @@ $VERSION = '3.45'; | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|  | ||||
|     # WLSR-AP-MIB::wlsrConfigTable | ||||
|     'aruba_ap_ssidbcast' => 'wlsrHideSSID', | ||||
| @@ -143,7 +139,6 @@ $VERSION = '3.45'; | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     'aruba_ap_fqln'       => \&munge_aruba_fqln, | ||||
|     'aruba_ap_type'       => \&SNMP::Info::munge_e_type, | ||||
|     'aruba_card_type'     => \&SNMP::Info::munge_e_type, | ||||
| @@ -170,10 +165,9 @@ sub vendor { | ||||
|     $id = $1 if ( defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/ ); | ||||
|  | ||||
|     if ( defined($id) and exists( $oidmap{$id} ) ) { | ||||
| 	return $oidmap{$id}; | ||||
|     } | ||||
|     else { | ||||
| 	return 'aruba'; | ||||
|       return $oidmap{$id}; | ||||
|     } else { | ||||
|       return 'aruba'; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -183,7 +177,7 @@ sub os_ver { | ||||
|     return unless defined $descr; | ||||
|  | ||||
|     if ( $descr =~ m/Version\s+(\d+\.\d+\.\d+\.\d+)/ ) { | ||||
| 	return $1; | ||||
|       return $1; | ||||
|     } | ||||
|  | ||||
|     return; | ||||
| @@ -1403,7 +1397,7 @@ Eric Miller | ||||
| 			  DestHost    => 'myswitch', | ||||
| 			  Community   => 'public', | ||||
| 			  Version     => 2 | ||||
| 			)  | ||||
| 			) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -1421,11 +1415,6 @@ This class emulates bridge functionality for the wireless switch. This enables | ||||
| end station MAC addresses collection and correlation to the thin access point | ||||
| the end station is using for communication. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $aruba = new SNMP::Info::Layer3::Aruba(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
| @@ -1466,7 +1455,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $aruba->model() | ||||
|  | ||||
| Returns model type.  Cross references $aruba->id() with product IDs in the  | ||||
| Returns model type.  Cross references $aruba->id() with product IDs in the | ||||
| Aruba MIB. | ||||
|  | ||||
| =item $aruba->vendor() | ||||
| @@ -1540,7 +1529,7 @@ false. | ||||
| =item $aruba->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.  | ||||
| identification (BSSID), MAC address, the AP is using for the SSID. | ||||
|  | ||||
| =item $aruba->cd11_mac() | ||||
|  | ||||
| @@ -1578,7 +1567,7 @@ Total packets transmitted by the wireless client. | ||||
|  | ||||
| =item $aruba->i_index() | ||||
|  | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
|  | ||||
| Extends C<ifIndex> to support APs as device interfaces. | ||||
|  | ||||
| @@ -1614,7 +1603,7 @@ interfaces. | ||||
| =item $aruba->i_up_admin() | ||||
|  | ||||
| Returns reference to map of IIDs to administrative status of the interface. | ||||
| Returns C<ifAdminStatus> for Ethernet interfaces and C<wlanAPStatus>  | ||||
| Returns C<ifAdminStatus> for Ethernet interfaces and C<wlanAPStatus> | ||||
| for AP interfaces. | ||||
|  | ||||
| =item $aruba->i_mac() | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::BayRS | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,24 +30,21 @@ | ||||
| package SNMP::Info::Layer3::BayRS; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::Bridge; | ||||
|  | ||||
| @SNMP::Info::Layer3::BayRS::ISA = qw/SNMP::Info SNMP::Info::Layer3 | ||||
|     SNMP::Info::Bridge Exporter/; | ||||
| @SNMP::Info::Layer3::BayRS::ISA = qw/SNMP::Info::Layer3 | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer3::BayRS::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE %MODEL_MAP | ||||
|     %MODID_MAP %PROCID_MAP/; | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE, %MODEL_MAP, | ||||
|     %MODID_MAP, %PROCID_MAP); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::Bridge::MIBS, | ||||
|     'Wellfleet-HARDWARE-MIB'        => 'wfHwBpIdOpt', | ||||
|     'Wellfleet-OSPF-MIB'            => 'wfOspfRouterId', | ||||
|     'Wellfleet-DOT1QTAG-CONFIG-MIB' => 'wfDot1qTagCfgVlanName', | ||||
| @@ -57,18 +53,14 @@ $VERSION = '3.45'; | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::Bridge::GLOBALS, | ||||
|     'bp_id'       => 'wfHwBpIdOpt', | ||||
|     'bp_serial'   => 'wfHwBpSerialNumber', | ||||
|     'ospf_rtr_id' => 'wfOspfRouterId', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS, | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::Bridge::FUNCS, | ||||
|  | ||||
|     # From Wellfleet-CSMACD-MIB::wfCSMACDTable | ||||
|     'wf_csmacd_cct'  => 'wfCSMACDCct', | ||||
| @@ -107,9 +99,7 @@ $VERSION = '3.45'; | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::MUNGE, | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::Bridge::MUNGE, | ||||
|     'wf_hw_boot'     => \&munge_hw_rev, | ||||
|     'wf_hw_diag'     => \&munge_hw_rev, | ||||
|     'wf_hw_mobo_ser' => \&munge_wf_serial, | ||||
| @@ -541,7 +531,10 @@ sub model { | ||||
|     my $bayrs = shift; | ||||
|     my $bp_id = $bayrs->bp_id(); | ||||
|  | ||||
|     return defined $MODEL_MAP{$bp_id} ? $MODEL_MAP{$bp_id} : $bp_id; | ||||
|     if (defined $bp_id) { | ||||
|       return defined $MODEL_MAP{$bp_id} ? $MODEL_MAP{$bp_id} : $bp_id; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
| @@ -776,7 +769,7 @@ sub e_index { | ||||
|     my $bp_id = $bayrs->bp_id(); | ||||
|  | ||||
|     # Don't like polling all these columns to build the index, can't think of | ||||
|     # a better way right now.  Luckly all this data will be cached for the | ||||
|     # a better way right now.  Luckily all this data will be cached for the | ||||
|     # rest of the e_* methods | ||||
|  | ||||
|     # Using mib leafs so we don't have to define everything in FUNCS | ||||
| @@ -805,7 +798,7 @@ sub e_index { | ||||
|     my @slots = ( $wf_mb, $wf_db, $wf_bb, $wf_mod, $wf_mod1, $wf_mod2 ); | ||||
|     my @mods = ( $wf_mm, $wf_dm ); | ||||
|  | ||||
|     # We're going to hack an index: Slot/Module/Postion | ||||
|     # We're going to hack an index: Slot/Module/Position | ||||
|     my %wf_e_index; | ||||
|  | ||||
|     # Chassis on BN types | ||||
| @@ -1389,14 +1382,14 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $bayrs = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $bayrs->class(); | ||||
| @@ -1404,21 +1397,12 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for routers running Avaya/Nortel BayRS.   | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $bayrs = new SNMP::Info::Layer3::BayRS(...); | ||||
| Abstraction subclass for routers running Avaya/Nortel BayRS. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info | ||||
|  | ||||
| =item SNMP::Info::Bridge | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
| @@ -1441,10 +1425,6 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
|  | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
| @@ -1458,7 +1438,7 @@ These are methods that return scalar value from SNMP | ||||
| Returns the model of the BayRS router.  Will translate between the MIB model | ||||
| and the common model with this map : | ||||
|  | ||||
|     C<%MODEL_MAP = (  | ||||
|     C<%MODEL_MAP = ( | ||||
|         'acefn'     => 'FN', | ||||
|         'aceln'     => 'LN', | ||||
|         'acecn'     => 'CN', | ||||
| @@ -1500,14 +1480,6 @@ undefined. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
|  | ||||
| See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| @@ -1529,8 +1501,8 @@ passed but the entire table will be returned. | ||||
| Returns reference to the map between IID and physical Port. | ||||
|  | ||||
| The physical port name is stripped to letter and numbers to signify | ||||
| port type and slot port (S11) if the default platform naming was  | ||||
| maintained.  Otherwise the port is the interface description.  | ||||
| port type and slot port (S11) if the default platform naming was | ||||
| maintained.  Otherwise the port is the interface description. | ||||
|  | ||||
| =item $bayrs->i_name() | ||||
|  | ||||
| @@ -1540,7 +1512,7 @@ interfaces. | ||||
| =item $bayrs->i_duplex() | ||||
|  | ||||
| Returns reference to hash.  Maps port operational duplexes to IIDs for | ||||
| Ethernet interfaces.  | ||||
| Ethernet interfaces. | ||||
|  | ||||
| =item $bayrs->i_duplex_admin() | ||||
|  | ||||
| @@ -1625,14 +1597,6 @@ is not contained in any other entity. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
|  | ||||
| See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|   | ||||
| @@ -28,15 +28,16 @@ package SNMP::Info::Layer3::BlueCoatSG; | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer3::BlueCoatSG::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::BlueCoatSG::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS, | ||||
| @@ -55,7 +56,7 @@ $VERSION = '3.45'; | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE, ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'Blue Coat'; | ||||
|     return 'bluecoat'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
| @@ -65,7 +66,7 @@ sub os { | ||||
| sub os_ver { | ||||
|     my $sg = shift; | ||||
|     my $os_string = $sg->sw_ver(); | ||||
|     if ($os_string =~ /^Version:\s(\w+)\s([\d\.]+)/) { | ||||
|     if (defined ($os_string) && $os_string =~ /^Version:\s(\w+)\s([\d\.]+)/) { | ||||
|         return $2; | ||||
|     } else { | ||||
|         return ''; # perhaps we can try sysDescr or some other object... | ||||
| @@ -92,7 +93,7 @@ Jeroen van Ingen | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| @@ -113,10 +114,10 @@ Subclass for Blue Coat SG Series proxy devices | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
|  BLUECOAT-SG-PROXY-MIB | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<BLUECOAT-SG-PROXY-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
| @@ -133,7 +134,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $router->vendor() | ||||
|  | ||||
| Returns C<'Blue Coat'> | ||||
| Returns C<'bluecoat'> | ||||
|  | ||||
| =item $router->os() | ||||
|  | ||||
| @@ -154,12 +155,6 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::C3550 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond. | ||||
| # Copyright (c) 2004 Regents of the University of California | ||||
| @@ -37,7 +36,7 @@ use Exporter; | ||||
| use SNMP::Info::CiscoStack; | ||||
| use SNMP::Info::Layer3::CiscoSwitch; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| # NOTE : Top-most items gets precedence for @ISA | ||||
| @SNMP::Info::Layer3::C3550::ISA = qw/ | ||||
| @@ -47,7 +46,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| @SNMP::Info::Layer3::C3550::EXPORT_OK = qw//; | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| # NOTE: Order creates precedence | ||||
| #       Example: v_name exists in Bridge.pm and CiscoVTP.pm | ||||
| @@ -96,8 +95,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; | ||||
|     } | ||||
|  | ||||
| @@ -105,7 +104,7 @@ sub ports { | ||||
|     return $ports; | ||||
| } | ||||
|  | ||||
| #  Verions prior to 12.1(22)EA1a use the older CiscoStack method | ||||
| #  Versions prior to 12.1(22)EA1a use the older CiscoStack method | ||||
| #  Newer versions use the ETHERLIKE-MIB to report operational duplex. | ||||
| #  See http://www.ciscosystems.com/en/US/products/hw/switches/ps646/prod_release_note09186a00802a08ee.html | ||||
|  | ||||
| @@ -206,7 +205,7 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $c3550 = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -214,7 +213,7 @@ Max Baker | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $c3550->class(); | ||||
| @@ -222,17 +221,12 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for Cisco Catalyst 3550 Layer 2/3 Switches.   | ||||
| Abstraction subclass for Cisco Catalyst 3550 Layer 2/3 Switches. | ||||
|  | ||||
| These devices run IOS but have some of the same characteristics as the | ||||
| Catalyst WS-C family (5xxx,6xxx).  For example, forwarding tables are held in | ||||
| VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $c3550 = new SNMP::Info::Layer3::C3550(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
| @@ -304,7 +298,7 @@ Software version 12.1(22)EA1a or greater returns duplex based upon the | ||||
| result of $c3550->el_duplex().  Otherwise it uses the result of | ||||
| the call to CiscoStack::i_duplex(). | ||||
|  | ||||
| See L<SNMP::Info::Etherlike> for el_duplex() method and | ||||
| See L<SNMP::Info::EtherLike> for el_duplex() method and | ||||
| L<SNMP::Info::CiscoStack> for its i_duplex() method. | ||||
|  | ||||
| =item $c3550->i_duplex_admin() | ||||
| @@ -327,7 +321,7 @@ Crosses $c3550->p_port() with $c3550->p_duplex() to utilize port C<ifIndex>. | ||||
|  | ||||
|     Example: | ||||
|     my %if_map = reverse %{$c3550->interfaces()}; | ||||
|     $c3550->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})  | ||||
|     $c3550->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) | ||||
|         or die "Couldn't change port duplex. ",$c3550->error(1); | ||||
|  | ||||
| =back | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::C4000 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bill Fenner | ||||
| # All rights reserved. | ||||
| @@ -42,9 +41,9 @@ use SNMP::Info::MAU; | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer3::C4000::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
| @@ -111,7 +110,7 @@ Bill Fenner | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $c4000 = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -119,7 +118,7 @@ Bill Fenner | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $c4000->class(); | ||||
| @@ -127,12 +126,7 @@ Bill Fenner | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for Cisco Catalyst 4000 Layer 2/3 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 $c4000 = new SNMP::Info::Layer3::C4000(...); | ||||
| Abstraction subclass for Cisco Catalyst 4000 Layer 2/3 Switches. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::C6500 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008-2009 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -37,7 +36,7 @@ use SNMP::Info::CiscoStack; | ||||
| use SNMP::Info::Layer3::CiscoSwitch; | ||||
| use SNMP::Info::MAU; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| # NOTE : Top-most items gets precedence for @ISA | ||||
| @SNMP::Info::Layer3::C6500::ISA = qw/ | ||||
| @@ -49,9 +48,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| @SNMP::Info::Layer3::C6500::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| # NOTE: Order creates precedence | ||||
| #       Example: v_name exists in Bridge.pm and CiscoVTP.pm | ||||
| @@ -179,7 +176,7 @@ sub set_i_duplex_admin { | ||||
|  | ||||
|     my $c6500 = shift; | ||||
|     my ( $duplex, $iid ) = @_; | ||||
|   | ||||
|  | ||||
|     if ( $c6500->is_virtual_switch() ) { | ||||
|  | ||||
|         # VSS -> MAU | ||||
| @@ -188,7 +185,7 @@ sub set_i_duplex_admin { | ||||
|         # 2. Disable ifMauAutoNegAdminStatus | ||||
|         # If the second set is not done, this is not going to be | ||||
|         # working... Cisco Bug id CSCty97033. | ||||
|         # SXI is not working (up to at least relase SXI9). | ||||
|         # SXI is not working (up to at least release SXI9). | ||||
|         # SXJ is working at SXJ3 (not before). | ||||
|  | ||||
|         return $c6500->mau_set_i_duplex_admin( $duplex, $iid ); | ||||
| @@ -226,7 +223,7 @@ sub set_i_speed_admin { | ||||
|         # 2. Disable ifMauAutoNegAdminStatus | ||||
|         # If the second set is not done, this is not going to be working... | ||||
|         # Cisco Bug id CSCty97033. | ||||
|         # SXI is not working (at least up to relase SXI9). | ||||
|         # SXI is not working (at least up to release SXI9). | ||||
|         # SXJ is working at SXJ3 (not before). | ||||
|  | ||||
|         return $c6500->mau_set_i_speed_admin( $speed, $iid ); | ||||
| @@ -244,7 +241,8 @@ __END__ | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::C6500 - SNMP Interface to Cisco Catalyst 6500 Layer 2/3 | ||||
| Switches running IOS and/or CatOS | ||||
| Switches running IOS and/or CatOS. Also Cisco Catalyst 2960, 2970, 3750 and | ||||
| 3850 series and blade switch CBS30x0 and CBS31x0 series running IOS. | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| @@ -252,7 +250,7 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $c6500 = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -260,7 +258,7 @@ Max Baker | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $c6500->class(); | ||||
| @@ -268,16 +266,15 @@ Max Baker | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for Cisco Catalyst 6500 Layer 2/3 Switches.   | ||||
| Abstraction subclass for Cisco Catalyst 6500 Layer 2/3 Switches. | ||||
|  | ||||
| These devices run IOS but have some of the same characteristics as the | ||||
| Catalyst WS-C family (5xxx). For example, forwarding tables are held in | ||||
| VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $c6500 = new SNMP::Info::Layer3::C6500(...); | ||||
| It also supports the following IOS only series switches: Cisco Catalyst 2960, | ||||
| 2970, 3750 and 3850 series. Also blade switches from the CBS30x0 and CBS31x0 | ||||
| series. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| @@ -295,6 +292,8 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<CISCO-VIRTUAL-SWITCH-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements. | ||||
| @@ -314,7 +313,7 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $c6500->vendor() | ||||
|  | ||||
|     Returns 'cisco' | ||||
| Returns 'cisco' | ||||
|  | ||||
| =item $c6500->cvsSwitchMode() | ||||
|  | ||||
| @@ -359,7 +358,7 @@ Newer software versions return duplex based upon the result of | ||||
| $c6500->el_duplex().  Otherwise it uses the result of the call to | ||||
| CiscoStack::i_duplex(). | ||||
|  | ||||
| See L<SNMP::Info::Etherlike> for el_duplex() method and | ||||
| See L<SNMP::Info::EtherLike> for el_duplex() method and | ||||
| L<SNMP::Info::CiscoStack> for its i_duplex() method. | ||||
|  | ||||
| =item $c6500->i_duplex_admin() | ||||
| @@ -382,7 +381,7 @@ Crosses $c6500->p_port() with $c6500->p_duplex() to utilize port C<ifIndex>. | ||||
|  | ||||
|     Example: | ||||
|     my %if_map = reverse %{$c6500->interfaces()}; | ||||
|     $c6500->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})  | ||||
|     $c6500->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) | ||||
|         or die "Couldn't change port duplex. ",$c6500->error(1); | ||||
|  | ||||
| =item $c6500->set_i_speed_admin(speed, ifIndex) | ||||
| @@ -399,13 +398,11 @@ Crosses $c6500->p_port() with $c6500->p_speed() to utilize port C<ifIndex>. | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details. | ||||
|  | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3::CiscoSwitch | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"TABLE METHODS"> for | ||||
| details. | ||||
|  | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::MAU | ||||
|  | ||||
| See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details. | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::CheckPoint | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bill Fenner | ||||
| # All rights reserved. | ||||
| @@ -31,38 +30,38 @@ | ||||
| package SNMP::Info::Layer3::CheckPoint; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| 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::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::CheckPoint::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'CHECKPOINT-MIB'      => 'fwProduct', | ||||
|     'UCD-SNMP-MIB'        => 'versionTag', | ||||
|     'NET-SNMP-TC'         => 'netSnmpAgentOIDs', | ||||
|     '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', | ||||
|      | ||||
|     'serial_number'  => 'svnApplianceSerialNumber', | ||||
|     'product_name'   => 'svnApplianceProductName', | ||||
|     'manufacturer'   => 'svnApplianceManufacturer', | ||||
|     'version'        => 'svnVersion', | ||||
| ); | ||||
|  | ||||
| %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', | ||||
| @@ -70,11 +69,16 @@ $VERSION = '3.45'; | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'checkpoint'; | ||||
|     my $ckp = shift; | ||||
|  | ||||
|     if (defined $ckp->manufacturer) { | ||||
|         return lc $ckp->manufacturer; | ||||
|     } else { | ||||
|         return 'checkpoint'; | ||||
|     } | ||||
| } | ||||
|  | ||||
| sub model { | ||||
| @@ -83,7 +87,9 @@ sub model { | ||||
|  | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|  | ||||
|     if (defined $model) { | ||||
|     if (defined $ckp->product_name) { | ||||
|         return $ckp->product_name; | ||||
|     } elsif (defined $model) { | ||||
|         $model =~ s/^checkPoint//; | ||||
|         return $model; | ||||
|     } else { | ||||
| @@ -97,41 +103,48 @@ sub os { | ||||
|  | ||||
| sub os_ver { | ||||
|     my $ckp = shift; | ||||
|     my $extend_table = $ckp->extend_output_table() || {}; | ||||
|     if (defined $ckp->version) { | ||||
|         return $ckp->version; | ||||
|     } else { | ||||
|         my $extend_table = $ckp->extend_output_table() || {}; | ||||
|  | ||||
|     my $descr   = $ckp->description(); | ||||
|     my $vers    = $ckp->netsnmp_vers(); | ||||
|     my $os_ver  = undef; | ||||
|         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; | ||||
|         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; | ||||
|         $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; | ||||
|     } | ||||
|  | ||||
|     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; | ||||
|     if (defined $ckp->serial_number) { | ||||
|         return $ckp->serial_number; | ||||
|     } else { | ||||
|         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 ''; | ||||
| } | ||||
|  | ||||
| @@ -184,14 +197,14 @@ Ambroise Rosset | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # 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(); | ||||
| @@ -199,11 +212,13 @@ Ambroise Rosset | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Generic Net-SNMP devices | ||||
| Subclass for CheckPoint 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: | ||||
| To correctly and completely work on IPSO based devices, 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 | ||||
| @@ -221,8 +236,12 @@ To correctly and completelly work, you should add the following line in the file | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<CHECKPOINT-MIB> | ||||
|  | ||||
| =item F<UCD-SNMP-MIB> | ||||
|  | ||||
| =item F<NET-SNMP-EXTEND-MIB> | ||||
|  | ||||
| =item F<NET-SNMP-TC> | ||||
|  | ||||
| =item F<HOST-RESOURCES-MIB> | ||||
| @@ -231,8 +250,6 @@ To correctly and completelly work, you should add the following line in the file | ||||
|  | ||||
| See L<SNMP::Info::Layer3> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
| @@ -243,11 +260,12 @@ These are methods that return scalar value from SNMP | ||||
|  | ||||
| =item $ckp->vendor() | ||||
|  | ||||
| Returns 'checkpoint'. | ||||
| Returns C<svnApplianceManufacturer> in lowercase, else 'checkpoint'. | ||||
|  | ||||
| =item $ckp->model() | ||||
|  | ||||
| Return the model type of the CheckPoint device (Based on the sysObjectOID translation). | ||||
| Returns C<svnApplianceProductName>, else the model type based on the | ||||
| sysObjectOID translation. | ||||
|  | ||||
| =item $ckp->os() | ||||
|  | ||||
| @@ -255,8 +273,8 @@ 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. | ||||
| Returns C<svnVersion>, else the software version is extracted from | ||||
| C<sysDescr>, along with the Net-SNMP version. | ||||
|  | ||||
| =item $ckp->uptime() | ||||
|  | ||||
| @@ -266,8 +284,9 @@ 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. | ||||
| Returns <svnApplianceSerialNumber>, else the serial number of the | ||||
| device if the SNMP server is configured as indicated previously. | ||||
| Returns '' in other case. | ||||
|  | ||||
| =item $ckp->layers() | ||||
|  | ||||
| @@ -279,10 +298,6 @@ Return '01001100'. | ||||
|  | ||||
| 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 | ||||
| @@ -304,12 +319,12 @@ Ignores loopback | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP> for details. | ||||
|  | ||||
| =head1 NOTES | ||||
|  | ||||
| If your device is not recognized by SNMP::Info as being in the class | ||||
| L<SNMP::Info::Layer3::CheckPoint> you might need additional snmp | ||||
| configuration on the CheckPoint device. | ||||
|  | ||||
| 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 | ||||
|   | ||||
							
								
								
									
										325
									
								
								lib/SNMP/Info/Layer3/Ciena.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										325
									
								
								lib/SNMP/Info/Layer3/Ciena.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,325 @@ | ||||
| # SNMP::Info::Layer3::Ciena - SNMP Interface to Ciena Devices | ||||
| # | ||||
| # Copyright (c) 2019 by The Netdisco Developer Team. | ||||
| # | ||||
| # 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::Ciena; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer3::Ciena::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Ciena::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     'WWP-LEOS-SW-XGRADE-MIB' => 'wwpLeosBladeRunPackageVer', | ||||
|     'WWP-LEOS-BLADE-MIB'     => 'wwpLeosBladeId', | ||||
|     'WWP-LEOS-CHASSIS-MIB'   => 'wwpLeosChassisDeviceId', | ||||
|     'WWP-LEOS-FLOW-MIB'      => 'wwpLeosFlowLearnType', | ||||
|     'WWP-LEOS-PORT-MIB'      => 'wwpLeosEtherIngressPvid', | ||||
|     'WWP-LEOS-VLAN-TAG-MIB'  => 'wwpLeosNumVlans', | ||||
|     'WWP-PRODUCTS-MIB'       => 'wwpProductsMIB' | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     'ciena_serial' => 'wwpLeosSystemSerialNumber', | ||||
|     'mac'          => 'dot1dBaseBridgeAddress' | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     'v_name'     => 'wwpLeosVlanName', | ||||
|     'ps_type'    => 'wwpLeosChassisPowerSupplyType', | ||||
|     'ps_status'  => 'wwpLeosChassisPowerSupplyState', | ||||
|     'ps_name'    => 'wwpLeosChassisPowerSupplyModuleLabel', | ||||
|     'fan_type'   => 'wwpLeosChassisFanModuleType', | ||||
|     'fan_status' => 'wwpLeosChassisFanModuleStatus', | ||||
|     'fan_name'   => 'wwpLeosChassisFanModuleNum' | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'ciena'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'saos'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $ciena = shift; | ||||
|     my $version = $ciena->wwpLeosBladeRunPackageVer || {}; | ||||
|     return values(%$version); | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $ciena = shift; | ||||
|     return $ciena->ciena_serial(); | ||||
| } | ||||
|  | ||||
| # Override lldp_if function to translate the port with bp_index | ||||
| sub lldp_if { | ||||
|     my $ciena = shift; | ||||
|     my $lldp = $ciena->SUPER::lldp_if; | ||||
|     my $bp_index = $ciena->bp_index; | ||||
|     foreach my $iface (keys %$lldp) { | ||||
|         my $orig_iface = $lldp->{$iface}; | ||||
|         $lldp->{$iface} = $bp_index->{$orig_iface}; | ||||
|     } | ||||
|     return $lldp; | ||||
| } | ||||
|  | ||||
| sub i_vlan { | ||||
|     my $ciena = shift; | ||||
|     my $i_vlan = {}; | ||||
|     my $pvid = $ciena->wwpLeosEtherIngressPvid() || undef; | ||||
|  | ||||
|     # bp_index needed to resolve correct port id | ||||
|     my $bp_index = $ciena->bp_index; | ||||
|     if (defined $pvid) { | ||||
|         foreach my $i (keys %$pvid) { | ||||
|             $i_vlan->{$bp_index->{$i}} = $pvid->{$i}; | ||||
|         } | ||||
|     } | ||||
|     return $i_vlan; | ||||
| } | ||||
|  | ||||
| sub i_vlan_membership { | ||||
|     my $ciena = shift; | ||||
|     my $i_vlan_membership = {}; | ||||
|  | ||||
|     my $vlans = $ciena->wwpLeosVlanMemberPortId(); | ||||
|     # bp_index needed to resolve correct port id | ||||
|     my $bp_index = $ciena->bp_index; | ||||
|     foreach my $vlan (keys %$vlans) { | ||||
|         push @{$i_vlan_membership->{$bp_index->{$vlans->{$vlan}}}} , (split(/\./,$vlan))[0]; | ||||
|     } | ||||
|     return $i_vlan_membership; | ||||
| } | ||||
|  | ||||
| sub qb_fw_vlan { | ||||
|     my $ciena = shift; | ||||
|     my $qb_fw_vlan = {}; | ||||
|     my $learn_entries = $ciena->wwpLeosFlowLearnType(); | ||||
|     foreach my $entry (keys %$learn_entries) { | ||||
|         my @params = (split(/\./, $entry)); | ||||
|         $qb_fw_vlan->{join('.', @params[1..6])} = $params[8]; | ||||
|     } | ||||
|     return $qb_fw_vlan; | ||||
| } | ||||
|  | ||||
| sub fan { | ||||
|     my $ciena = shift; | ||||
|  | ||||
|     my $fan_status = $ciena->fan_status || {}; | ||||
|     my $fan_type = $ciena->fan_type; | ||||
|     my $fan_name = $ciena->fan_name; | ||||
|     my @messages; | ||||
|  | ||||
|     foreach my $fan (keys %$fan_status) { | ||||
|         if ($fan_status->{$fan} ne "ok") { | ||||
|             push @messages, sprintf("%s fan %s failed.", $fan_type->{$fan}, $fan_name->{$fan}); | ||||
|         } | ||||
|     } | ||||
|     return sprintf("%s fans OK", scalar keys %$fan_status) if scalar @messages  == 0; | ||||
|  | ||||
|     return join(", ", @messages); | ||||
| } | ||||
| sub ps1_type { | ||||
|     my $ciena = shift; | ||||
|     my $ps_type = $ciena->ps_type; | ||||
|     return $ps_type->{'1'} if defined $ps_type->{'1'}; | ||||
| } | ||||
|  | ||||
| sub ps1_status { | ||||
|     my $ciena = shift; | ||||
|     my $ps_status = $ciena->ps_status; | ||||
|     return $ps_status->{'1'} if defined $ps_status->{'1'}; | ||||
| } | ||||
| sub ps2_type { | ||||
|     my $ciena = shift; | ||||
|     my $ps_type = $ciena->ps_type; | ||||
|     return $ps_type->{'2'} if defined $ps_type->{'2'}; | ||||
| } | ||||
|  | ||||
| sub ps2_status { | ||||
|     my $ciena = shift; | ||||
|     my $ps_status = $ciena->ps_status; | ||||
|     return $ps_status->{'2'} if defined $ps_status->{'2'}; | ||||
| } | ||||
| =head1 DESCRIPTION | ||||
| Subclass for Ciena Devices running SAOS | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<WWP-LEOS-SW-XGRADE-MIB> | ||||
|  | ||||
| =item F<WWP-LEOS-BLADE-MIB> | ||||
|  | ||||
| =item F<WWP-LEOS-CHASSIS-MIB> | ||||
|  | ||||
| =item F<WWP-LEOS-FLOW-MIB> | ||||
|  | ||||
| =item F<WWP-LEOS-PORT-MIB> | ||||
|  | ||||
| =item F<WWP-LEOS-VLAN-TAG-MIB> | ||||
|  | ||||
| =item F<WWP-PRODUCTS-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ciena->vendor() | ||||
|  | ||||
| Returns 'ciena' | ||||
|  | ||||
| =item $ciena->os() | ||||
|  | ||||
| Returns 'saos' | ||||
|  | ||||
| =item $ciena->os_ver() | ||||
|  | ||||
| Returns the running software package extracted with C<wwpLeosBladeRunPackageVer> | ||||
|  | ||||
| =item $ciena->serial() | ||||
|  | ||||
| Returns serial number | ||||
| (C<wwpLeosSystemSerialNumber>) | ||||
|  | ||||
| =item $ciena->mac() | ||||
|  | ||||
| Returns the MAC address used by this bridge when it must be referred | ||||
| to in a unique fashion. | ||||
|  | ||||
| (C<dot1dBaseBridgeAddress>) | ||||
|  | ||||
| =item $huawei->fan() | ||||
|  | ||||
| Return the status of all fans. Returns a string indicating the number of fans 'OK'  or | ||||
| identification of any fan without a 'normal' operating status. | ||||
|  | ||||
| =item $ciena->ps1_status() | ||||
|  | ||||
| Return the status of the first power supply | ||||
|  | ||||
| =item $ciena->ps1_type() | ||||
|  | ||||
| Return the type of the first power supply | ||||
|  | ||||
| =item $ciena->ps2_status() | ||||
|  | ||||
| Return the status of the second power supply | ||||
|  | ||||
| =item $ciena->ps2_type() | ||||
|  | ||||
| Return the type of the second power supply | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $ciena->lldp_if() | ||||
|  | ||||
| Returns the mapping to the SNMP Interface Table. Overridden to translate to correct ethernet port with bp_index | ||||
|  | ||||
| =item $ciena->i_vlan() | ||||
|  | ||||
| Returns a mapping between C<ifIndex> and the PVID or default VLAN. | ||||
|  | ||||
| =item $ciena->i_vlan_membership() | ||||
|  | ||||
| Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN | ||||
| IDs. | ||||
|  | ||||
| =item $ciena->qb_fw_vlan() | ||||
|  | ||||
| Returns reference to hash of forwarding table entries VLAN ID, using C<wwpLeosFlowLearnType> | ||||
|  | ||||
| =item $ciena->ps_name() | ||||
|  | ||||
| Returns reference to hash of the power supplies and their names. | ||||
|  | ||||
| =item $ciena->ps_type() | ||||
|  | ||||
| Returns reference to hash of the power supplies and their type (ex. AC, DC, etc.) | ||||
|  | ||||
| =item $ciena->ps_status() | ||||
|  | ||||
| Returns reference to hash of the power supplies and their status. | ||||
|  | ||||
| =item $ciena->fan_name() | ||||
|  | ||||
| Returns reference to hash of fans and their names. In this case, it is simply a number. | ||||
|  | ||||
| =item $ciena->fan_type() | ||||
|  | ||||
| Returns reference to hash of fans and their types (ex. fixed, modular, etc.) | ||||
|  | ||||
| =item $ciena->fan_status) | ||||
|  | ||||
| Returns reference to hash of fans and their status | ||||
|  | ||||
| =back | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::Cisco | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -34,7 +33,6 @@ use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::CiscoVTP; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::CDP; | ||||
| use SNMP::Info::CiscoStats; | ||||
| use SNMP::Info::CiscoRTT; | ||||
| @@ -45,7 +43,7 @@ use SNMP::Info::CiscoStpExtensions; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer3::Cisco::ISA = qw/SNMP::Info::CiscoVTP | ||||
|     SNMP::Info::LLDP SNMP::Info::CDP | ||||
|     SNMP::Info::CDP | ||||
|     SNMP::Info::CiscoStats SNMP::Info::CiscoRTT | ||||
|     SNMP::Info::CiscoQOS SNMP::Info::CiscoConfig | ||||
|     SNMP::Info::CiscoPower SNMP::Info::CiscoStpExtensions | ||||
| @@ -53,9 +51,9 @@ use SNMP::Info::Layer3; | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer3::Cisco::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -66,7 +64,6 @@ $VERSION = '3.45'; | ||||
|     %SNMP::Info::CiscoRTT::MIBS, | ||||
|     %SNMP::Info::CiscoStats::MIBS, | ||||
|     %SNMP::Info::CDP::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::CiscoVTP::MIBS, | ||||
|     'CISCO-EIGRP-MIB' => 'cEigrpAsRouterId', | ||||
| ); | ||||
| @@ -80,7 +77,6 @@ $VERSION = '3.45'; | ||||
|     %SNMP::Info::CiscoRTT::GLOBALS, | ||||
|     %SNMP::Info::CiscoStats::GLOBALS, | ||||
|     %SNMP::Info::CDP::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::CiscoVTP::GLOBALS, | ||||
|     'eigrp_id' => 'cEigrpAsRouterId', | ||||
| ); | ||||
| @@ -94,25 +90,19 @@ $VERSION = '3.45'; | ||||
|     %SNMP::Info::CiscoRTT::FUNCS, | ||||
|     %SNMP::Info::CiscoStats::FUNCS, | ||||
|     %SNMP::Info::CDP::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::CiscoVTP::FUNCS, | ||||
|  | ||||
|     # EIGRP | ||||
|     'eigrp_peers' => 'cEigrpPeerAddr', | ||||
|     # CISCO-EIGRP-MIB::cEigrpPeerTable | ||||
|     'c_eigrp_peer_types' => 'cEigrpPeerAddrType', | ||||
|     'c_eigrp_peers'      => 'cEigrpPeerAddr', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::CiscoStpExtensions::MUNGE, | ||||
|     %SNMP::Info::CiscoPower::MUNGE, | ||||
|     %SNMP::Info::CiscoConfig::MUNGE, | ||||
|     %SNMP::Info::CiscoQOS::MUNGE, | ||||
|     %SNMP::Info::CiscoRTT::MUNGE, | ||||
|     %SNMP::Info::CiscoStats::MUNGE, | ||||
|     %SNMP::Info::CDP::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::Layer3::MUNGE,     %SNMP::Info::CiscoStpExtensions::MUNGE, | ||||
|     %SNMP::Info::CiscoPower::MUNGE, %SNMP::Info::CiscoConfig::MUNGE, | ||||
|     %SNMP::Info::CiscoQOS::MUNGE,   %SNMP::Info::CiscoRTT::MUNGE, | ||||
|     %SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE, | ||||
|     %SNMP::Info::CiscoVTP::MUNGE, | ||||
|     'eigrp_peers' => \&SNMP::Info::munge_ip, | ||||
| ); | ||||
|  | ||||
| sub i_vlan { | ||||
| @@ -128,19 +118,53 @@ 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; | ||||
| } | ||||
|  | ||||
| sub cisco_comm_indexing {  | ||||
| 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; | ||||
| } | ||||
|  | ||||
| sub eigrp_peers { | ||||
|     my $cisco = shift; | ||||
|  | ||||
|     my $peers = $cisco->c_eigrp_peers()      || {}; | ||||
|     my $types = $cisco->c_eigrp_peer_types() || {}; | ||||
|  | ||||
|     my %eigrp_peers; | ||||
|     foreach my $idx ( keys %$peers ) { | ||||
|         my $type = $types->{$idx}; | ||||
|         next unless $type; | ||||
|         my $peer = $peers->{$idx}; | ||||
|         next unless $peer; | ||||
|  | ||||
|         my $ip = NetAddr::IP::Lite->new($peer); | ||||
|  | ||||
|         if ($ip) { | ||||
|             $eigrp_peers{$idx} = $ip->addr; | ||||
|         } | ||||
|         elsif ( $type eq 'ipv4' ) { | ||||
|             $eigrp_peers{$idx} = SNMP::Info::munge_ip($peer); | ||||
|         } | ||||
|         next; | ||||
|     } | ||||
|     return \%eigrp_peers; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| @@ -159,7 +183,7 @@ Max Baker | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $cisco = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -167,7 +191,7 @@ Max Baker | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $cisco->class(); | ||||
| @@ -184,8 +208,6 @@ for other device specific L3 Cisco classes. | ||||
|  | ||||
| =item SNMP::Info::CiscoVTP | ||||
|  | ||||
| =item SNMP::Info::LLDP | ||||
|  | ||||
| =item SNMP::Info::CDP | ||||
|  | ||||
| =item SNMP::Info::CiscoStats | ||||
| @@ -214,8 +236,6 @@ for other device specific L3 Cisco classes. | ||||
|  | ||||
| See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements. | ||||
| @@ -255,10 +275,6 @@ Determined by checking C<vtpVersion>. | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details. | ||||
| @@ -314,10 +330,6 @@ Returns a mapping between C<ifIndex> and the PVID or default VLAN. | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::CDP | ||||
|  | ||||
| See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details. | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::CiscoASA | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2013 Moe Kraus | ||||
| # All rights reserved. | ||||
| @@ -43,9 +42,9 @@ use SNMP::Info::Layer3; | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer3::CiscoASA::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, ); | ||||
|  | ||||
| @@ -113,7 +112,7 @@ Moe Kraus | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $cisco = new SNMP::Info( | ||||
|  my $asa = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
|                         # These arguments are passed directly to SNMP::Session | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::CiscoFWSM | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2010 Brian De Wolf | ||||
| # All rights reserved. | ||||
| @@ -41,9 +40,9 @@ use SNMP::Info::Layer3; | ||||
| 	Exporter/; | ||||
| @SNMP::Info::Layer3::CiscoFWSM::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, ); | ||||
|  | ||||
| @@ -141,7 +140,7 @@ Brian De Wolf | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $fwsm = new SNMP::Info( | ||||
| 						AutoSpecify => 1, | ||||
| 						Debug       => 1, | ||||
| @@ -149,7 +148,7 @@ Brian De Wolf | ||||
| 						DestHost    => 'myswitch', | ||||
| 						Community   => 'public', | ||||
| 						Version     => 2 | ||||
| 						)  | ||||
| 						) | ||||
| 	or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $fwsm->class(); | ||||
| @@ -196,10 +195,6 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::CiscoSwitch | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2014 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -37,7 +36,7 @@ use SNMP::Info::CiscoAgg; | ||||
| use SNMP::Info::CiscoPortSecurity; | ||||
| use SNMP::Info::Layer3::Cisco; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| @SNMP::Info::Layer3::CiscoSwitch::ISA = qw/ | ||||
|     SNMP::Info::CiscoAgg | ||||
| @@ -48,9 +47,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| @SNMP::Info::Layer3::CiscoSwitch::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::Cisco::MIBS, | ||||
| @@ -91,7 +88,7 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $switch = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -99,7 +96,7 @@ Eric Miller | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $switch->class(); | ||||
| @@ -107,14 +104,14 @@ Eric Miller | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Base subclass for Cisco Layer 2/3 Switches.   | ||||
| Base subclass for Cisco Layer 2/3 Switches. | ||||
|  | ||||
| These devices have switch specific characteristics beyond those in | ||||
| traditional routers covered by L<SNMP::Info::Layer3::Cisco>. For example, | ||||
| port security interface information from L<SNMP::Info::CiscoPortSecurity>. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
|  | ||||
|  my $swich = new SNMP::Info::Layer3::CiscoSwitch(...); | ||||
|  | ||||
| @@ -157,10 +154,6 @@ Returns 1.  Use vlan indexing. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::CiscoAgg | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoAgg/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::CiscoPortSecurity | ||||
|  | ||||
| See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details. | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::Contivity | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2010 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,36 +30,32 @@ | ||||
| package SNMP::Info::Layer3::Contivity; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::Entity; | ||||
|  | ||||
| @SNMP::Info::Layer3::Contivity::ISA | ||||
|     = qw/SNMP::Info SNMP::Info::Layer3 SNMP::Info::Entity Exporter/; | ||||
|     = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Contivity::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.45'; | ||||
| $VERSION = '3.71'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS, | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS, %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::Entity::GLOBALS, | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS, %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::Entity::FUNCS, | ||||
|   %SNMP::Info::Layer3::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::MUNGE, %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::Entity::MUNGE, | ||||
|   %SNMP::Info::Layer3::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub layers { | ||||
| @@ -101,7 +96,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; | ||||
| @@ -171,14 +166,14 @@ Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $contivity = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $contivity->class(); | ||||
| @@ -187,23 +182,14 @@ Eric Miller | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for Avaya/Nortel VPN Routers (formerly Contivity | ||||
| Extranet Switch).   | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
|  my $contivity = new SNMP::Info::Layer3::Contivity(...); | ||||
| Extranet Switch). | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =item SNMP::Info::Entity | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
| @@ -212,12 +198,8 @@ after determining a more specific class using the method above. | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Entity/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
| @@ -238,7 +220,7 @@ Returns the chassis name. | ||||
|  | ||||
| =item $contivity->os() | ||||
|  | ||||
| Returns C<'CES'> | ||||
| Returns C<'contivity'> | ||||
|  | ||||
| =item $contivity->os_ver() | ||||
|  | ||||
| @@ -267,18 +249,10 @@ layers. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| @@ -299,16 +273,8 @@ Interface Name field.  Skips loopback and tunnel interfaces. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
|  | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
|  | ||||
| =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::Entity | ||||
|  | ||||
| See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user