Compare commits
	
		
			1654 Commits
		
	
	
		
			ver_0_1
			...
			159ab659cb
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					159ab659cb | ||
| 
						 | 
					82032a10e1 | ||
| 
						 | 
					84c870f911 | ||
| 
						 | 
					2b1b53e539 | ||
| 
						 | 
					b019f3fa06 | ||
| 
						 | 
					4cb3083993 | ||
| 
						 | 
					bed7dac4ac | ||
| 
						 | 
					316a799fdb | ||
| 
						 | 
					f2cbd163c9 | ||
| 
						 | 
					e756091565 | ||
| 
						 | 
					02f667a05b | ||
| 
						 | 
					14e9da0fb7 | ||
| 
						 | 
					08a632c053 | ||
| 
						 | 
					fbf0bbe880 | ||
| 
						 | 
					4ce3fd8fb6 | ||
| 
						 | 
					cae9878c60 | ||
| 
						 | 
					cda629bf39 | ||
| 
						 | 
					396eb87b57 | ||
| 
						 | 
					db06c8e75b | ||
| 
						 | 
					3fd9f1deda | ||
| 
						 | 
					b0e9185cca | ||
| 
						 | 
					b73f0d8d57 | ||
| 
						 | 
					5655486b80 | ||
| 
						 | 
					cc935a580d | ||
| 
						 | 
					40ff825a3a | ||
| 
						 | 
					4bb40483e6 | ||
| 
						 | 
					8c98750541 | ||
| 
						 | 
					57aa73f613 | ||
| 
						 | 
					fe3bc6afe0 | ||
| 
						 | 
					10e0a53b3c | ||
| 
						 | 
					98d2005bae | ||
| 
						 | 
					272b56d625 | ||
| 
						 | 
					aa44871f83 | ||
| 
						 | 
					27930d5e50 | ||
| 
						 | 
					a0d3cdcf9f | ||
| 
						 | 
					8317923f28 | ||
| 
						 | 
					fc71e2d88d | ||
| 
						 | 
					f96d0df182 | ||
| 
						 | 
					1dc4baf1d9 | ||
| 
						 | 
					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 | ||
| 
						 | 
					0f00322e03 | ||
| 
						 | 
					e2b688077e | ||
| 
						 | 
					4afbd37cbd | ||
| 
						 | 
					40d3340ac5 | ||
| 
						 | 
					9bb71d3df7 | ||
| 
						 | 
					4860447b06 | ||
| 
						 | 
					445b3f19a3 | ||
| 
						 | 
					32efd26999 | ||
| 
						 | 
					f2f95150bd | ||
| 
						 | 
					f210bf8812 | ||
| 
						 | 
					c30e1a2446 | ||
| 
						 | 
					10392fc08e | ||
| 
						 | 
					df10473fb5 | ||
| 
						 | 
					6505e7e85f | ||
| 
						 | 
					ffd80722b8 | ||
| 
						 | 
					6bd5bb3dda | ||
| 
						 | 
					83dec3c1d6 | ||
| 
						 | 
					82f2a83eec | ||
| 
						 | 
					5194af9d91 | ||
| 
						 | 
					a4c76d2fb9 | ||
| 
						 | 
					57a35075fa | ||
| 
						 | 
					fb69a60b45 | ||
| 
						 | 
					2625381e5b | ||
| 
						 | 
					1c048320a6 | ||
| 
						 | 
					c5c25cee7f | ||
| 
						 | 
					dee8177a67 | ||
| 
						 | 
					abbe040351 | ||
| 
						 | 
					29a0f849f1 | ||
| 
						 | 
					7e524f46c6 | ||
| 
						 | 
					1146e99de2 | ||
| 
						 | 
					6740929d41 | ||
| 
						 | 
					831788c1c9 | ||
| 
						 | 
					7e9d4520af | ||
| 
						 | 
					c4317e6e6b | ||
| 
						 | 
					e4e3debce0 | ||
| 
						 | 
					a5b7431070 | ||
| 
						 | 
					054808f59d | ||
| 
						 | 
					0b313d627e | ||
| 
						 | 
					9813b9db90 | ||
| 
						 | 
					9a4e024abb | ||
| 
						 | 
					04a669157f | ||
| 
						 | 
					a364c1512d | ||
| 
						 | 
					0451e6f0a6 | ||
| 
						 | 
					b7f87d9e82 | ||
| 
						 | 
					e2713fb57a | ||
| 
						 | 
					c8eff78d34 | ||
| 
						 | 
					04ca5793fa | ||
| 
						 | 
					83d00ee9c7 | ||
| 
						 | 
					bf56ed2540 | ||
| 
						 | 
					e75aba14b4 | ||
| 
						 | 
					5d2d2d416f | ||
| 
						 | 
					62799bfc9d | ||
| 
						 | 
					df8fbc3c03 | ||
| 
						 | 
					604de81ab8 | ||
| 
						 | 
					ed14b09567 | ||
| 
						 | 
					800758815c | ||
| 
						 | 
					058b74bd63 | ||
| 
						 | 
					02a52a4e09 | ||
| 
						 | 
					74ddc93f7f | ||
| 
						 | 
					eb8af0c81b | ||
| 
						 | 
					bd49274808 | ||
| 
						 | 
					8b1547c589 | ||
| 
						 | 
					c093f83848 | ||
| 
						 | 
					c0b28c38c5 | ||
| 
						 | 
					4621a0898f | ||
| 
						 | 
					6f02e1035f | ||
| 
						 | 
					d4ae9237a6 | ||
| 
						 | 
					914eb05a60 | ||
| 
						 | 
					4da17227c1 | ||
| 
						 | 
					20014cab29 | ||
| 
						 | 
					9d62361c8a | ||
| 
						 | 
					260992b7bf | ||
| 
						 | 
					b9cd429551 | ||
| 
						 | 
					2d18a75ad7 | ||
| 
						 | 
					0cfc501f83 | ||
| 
						 | 
					44b19153f1 | ||
| 
						 | 
					433b87b9df | ||
| 
						 | 
					f9464bcd6c | ||
| 
						 | 
					f5c5ec202a | ||
| 
						 | 
					4b64a70830 | ||
| 
						 | 
					4c8f7e298e | ||
| 
						 | 
					2d539be214 | ||
| 
						 | 
					c35d5814b4 | ||
| 
						 | 
					7d19ad401b | ||
| 
						 | 
					985577ce79 | ||
| 
						 | 
					24e20101d5 | ||
| 
						 | 
					76c884eb9f | ||
| 
						 | 
					7041dbab27 | ||
| 
						 | 
					661051fde4 | ||
| 
						 | 
					36cba5ce18 | ||
| 
						 | 
					4753f30c53 | ||
| 
						 | 
					d719e240d2 | ||
| 
						 | 
					e35faee278 | ||
| 
						 | 
					fd3417a09a | ||
| 
						 | 
					1719709648 | ||
| 
						 | 
					d37aa3378e | ||
| 
						 | 
					f017d32860 | ||
| 
						 | 
					7b23edcb29 | ||
| 
						 | 
					e48c4b4e84 | ||
| 
						 | 
					aeca44c7aa | ||
| 
						 | 
					af6ae8e419 | ||
| 
						 | 
					5cf88ba3b7 | ||
| 
						 | 
					f901ba5591 | ||
| 
						 | 
					7deea96bc3 | ||
| 
						 | 
					48dfb9bd08 | ||
| 
						 | 
					85372559fa | ||
| 
						 | 
					98972b80ef | ||
| 
						 | 
					d950244232 | ||
| 
						 | 
					fd898829c3 | ||
| 
						 | 
					b0158628bb | ||
| 
						 | 
					0f69a7b391 | ||
| 
						 | 
					72773117e5 | ||
| 
						 | 
					06806f5a6e | ||
| 
						 | 
					a01c785ec8 | ||
| 
						 | 
					502e206371 | ||
| 
						 | 
					8fba1bc6a9 | ||
| 
						 | 
					f43803d6d4 | ||
| 
						 | 
					338cba6350 | ||
| 
						 | 
					2a15066062 | ||
| 
						 | 
					add86bc566 | ||
| 
						 | 
					e9b4eaaeb9 | ||
| 
						 | 
					07605051f5 | ||
| 
						 | 
					998356484b | ||
| 
						 | 
					e97617ad60 | ||
| 
						 | 
					9685c3afa8 | ||
| 
						 | 
					c209b9a72f | ||
| 
						 | 
					4999b769ba | ||
| 
						 | 
					d8b5ba2161 | ||
| 
						 | 
					6f4a4a91cf | ||
| 
						 | 
					0049f0d72e | ||
| 
						 | 
					4ea66fc0fd | ||
| 
						 | 
					8426620572 | ||
| 
						 | 
					76aece0a3f | ||
| 
						 | 
					508e7f77a0 | ||
| 
						 | 
					d250a829cb | ||
| 
						 | 
					2fada0c31c | ||
| 
						 | 
					e6ad08733d | ||
| 
						 | 
					a8d83b5e1c | ||
| 
						 | 
					9392b74cbc | ||
| 
						 | 
					e09624efd0 | ||
| 
						 | 
					d4d7429de4 | ||
| 
						 | 
					b97cef86a3 | ||
| 
						 | 
					70615a172b | ||
| 
						 | 
					d399ca90d3 | ||
| 
						 | 
					bbc9695075 | ||
| 
						 | 
					c8fceeb75b | ||
| 
						 | 
					036cb4556e | ||
| 
						 | 
					e7b06a0b06 | ||
| 
						 | 
					c0067113e9 | ||
| 
						 | 
					ce4349a188 | ||
| 
						 | 
					224085dfca | ||
| 
						 | 
					9b3262a5fe | ||
| 
						 | 
					86856b6d54 | ||
| 
						 | 
					d5bf08329e | ||
| 
						 | 
					60efce8404 | ||
| 
						 | 
					83164f456a | ||
| 
						 | 
					c0141bcfee | ||
| 
						 | 
					8dfe9ef1cf | ||
| 
						 | 
					73d713b670 | ||
| 
						 | 
					db6c3573c1 | ||
| 
						 | 
					c8cbdaef8a | ||
| 
						 | 
					2c7243b87d | ||
| 
						 | 
					46515dd5d3 | ||
| 
						 | 
					7eb799adc6 | ||
| 
						 | 
					c85b61bbd0 | ||
| 
						 | 
					045ff8b789 | ||
| 
						 | 
					7b7f197439 | ||
| 
						 | 
					9e1c462836 | ||
| 
						 | 
					e97e8309cb | ||
| 
						 | 
					8c5be1a47d | ||
| 
						 | 
					afef2e6732 | ||
| 
						 | 
					7b2051b55c | ||
| 
						 | 
					8e470a2d72 | ||
| 
						 | 
					35213d5cb2 | ||
| 
						 | 
					b24f1a8ac4 | ||
| 
						 | 
					5454ab577e | ||
| 
						 | 
					046c15a074 | ||
| 
						 | 
					ddb9dda894 | ||
| 
						 | 
					d7047bda13 | ||
| 
						 | 
					c7934f4d10 | ||
| 
						 | 
					c97dc06177 | ||
| 
						 | 
					76b1faa159 | ||
| 
						 | 
					1e0438857e | ||
| 
						 | 
					b6494effa6 | ||
| 
						 | 
					a359184b83 | ||
| 
						 | 
					ce50a3f627 | ||
| 
						 | 
					ee7d254329 | ||
| 
						 | 
					d674b22b39 | ||
| 
						 | 
					47954aba8e | ||
| 
						 | 
					09e18e9b64 | ||
| 
						 | 
					163ba86196 | ||
| 
						 | 
					e57e7d99d5 | ||
| 
						 | 
					7ad449303b | ||
| 
						 | 
					49b853de1a | ||
| 
						 | 
					03a81ad4be | ||
| 
						 | 
					eb046b6a61 | ||
| 
						 | 
					1bf62f9524 | ||
| 
						 | 
					9aca213a5f | ||
| 
						 | 
					ce8bb68200 | ||
| 
						 | 
					7ee562c5ac | ||
| 
						 | 
					bdb719004d | ||
| 
						 | 
					842ac96d48 | ||
| 
						 | 
					5bb9011fb4 | ||
| 
						 | 
					97564f50b8 | ||
| 
						 | 
					efcf6a0db3 | ||
| 
						 | 
					9e813784f7 | ||
| 
						 | 
					aaca03062b | ||
| 
						 | 
					c1242017e2 | ||
| 
						 | 
					5f1426a0a3 | ||
| 
						 | 
					e84225fb23 | ||
| 
						 | 
					32c0e64bfb | ||
| 
						 | 
					0793ff31f5 | ||
| 
						 | 
					d3c2c1b607 | ||
| 
						 | 
					893def7910 | ||
| 
						 | 
					f875639435 | ||
| 
						 | 
					70bb263d79 | ||
| 
						 | 
					536d7d6901 | ||
| 
						 | 
					6ea34316b0 | ||
| 
						 | 
					aeebe5c95c | ||
| 
						 | 
					eb62f95636 | ||
| 
						 | 
					c7ee746fe6 | ||
| 
						 | 
					9a062499b3 | ||
| 
						 | 
					0c876452d8 | ||
| 
						 | 
					3b6088f454 | ||
| 
						 | 
					719f14984b | ||
| 
						 | 
					2e480dbec5 | ||
| 
						 | 
					66910c7827 | ||
| 
						 | 
					0f5319bc52 | ||
| 
						 | 
					cd54b07e09 | ||
| 
						 | 
					b197e9739b | ||
| 
						 | 
					8dd32c0dd7 | ||
| 
						 | 
					08e049eb31 | ||
| 
						 | 
					d09e4a125c | ||
| 
						 | 
					8353db2bc4 | ||
| 
						 | 
					250d2a0c0a | ||
| 
						 | 
					46b3127bb5 | ||
| 
						 | 
					f1e9e3423d | ||
| 
						 | 
					158ee40f1b | ||
| 
						 | 
					713d052b64 | ||
| 
						 | 
					0e28436086 | ||
| 
						 | 
					3f7229f4e7 | ||
| 
						 | 
					1ae7f8c8a2 | ||
| 
						 | 
					8e63954c3f | ||
| 
						 | 
					0fbcd5f8b1 | ||
| 
						 | 
					71f84d48dc | ||
| 
						 | 
					867a635ab8 | ||
| 
						 | 
					3d2c9ceaf5 | ||
| 
						 | 
					47736b08ce | ||
| 
						 | 
					3f49e5f8ef | ||
| 
						 | 
					7c8575bfa5 | ||
| 
						 | 
					102a7e10cc | ||
| 
						 | 
					9148764d20 | ||
| 
						 | 
					ce619415de | ||
| 
						 | 
					745807007f | ||
| 
						 | 
					e85b3f70aa | ||
| 
						 | 
					edc0fe4fbe | ||
| 
						 | 
					3cceec9044 | ||
| 
						 | 
					18602855da | ||
| 
						 | 
					72c223f72e | ||
| 
						 | 
					c6b3c45412 | ||
| 
						 | 
					c60a04f530 | ||
| 
						 | 
					f7430ab1a6 | ||
| 
						 | 
					827398228c | ||
| 
						 | 
					a264bb36cb | ||
| 
						 | 
					c24e63ec4c | ||
| 
						 | 
					6519570839 | ||
| 
						 | 
					2c88544158 | ||
| 
						 | 
					d0722d3677 | ||
| 
						 | 
					d2b404763b | ||
| 
						 | 
					88fb9e4df3 | ||
| 
						 | 
					440ec276d3 | ||
| 
						 | 
					6e91b90c48 | ||
| 
						 | 
					0bfc8c5ed6 | ||
| 
						 | 
					63547c2ea1 | ||
| 
						 | 
					efecf1bbb7 | ||
| 
						 | 
					682b8c2a9c | ||
| 
						 | 
					88295e8c1e | ||
| 
						 | 
					6764f15fd0 | ||
| 
						 | 
					8b8ee8693e | ||
| 
						 | 
					fe89001166 | ||
| 
						 | 
					416a18377c | ||
| 
						 | 
					8fda38184c | ||
| 
						 | 
					280e9260f7 | ||
| 
						 | 
					22642c1095 | ||
| 
						 | 
					d68b2047b0 | ||
| 
						 | 
					7240f034e5 | ||
| 
						 | 
					97ce41e363 | ||
| 
						 | 
					31a8abc3b8 | ||
| 
						 | 
					6b49bfd4c4 | ||
| 
						 | 
					985b4aab3f | ||
| 
						 | 
					a4e7c3a61a | ||
| 
						 | 
					d82d8781c4 | ||
| 
						 | 
					b4c3f92ba3 | ||
| 
						 | 
					1c57d2eab8 | ||
| 
						 | 
					409de77b2c | ||
| 
						 | 
					3e22e24dc9 | ||
| 
						 | 
					17b1bdacfe | ||
| 
						 | 
					b570fdbc89 | ||
| 
						 | 
					cceb0f4e5e | ||
| 
						 | 
					04f8c7f7e2 | ||
| 
						 | 
					37aca89af7 | ||
| 
						 | 
					5445a496db | ||
| 
						 | 
					0ab93b142c | ||
| 
						 | 
					d39dc76949 | ||
| 
						 | 
					c6abd7b62b | ||
| 
						 | 
					0e572db832 | ||
| 
						 | 
					602bb15b47 | ||
| 
						 | 
					b4882285c4 | ||
| 
						 | 
					834b27bdad | ||
| 
						 | 
					7db148a5a1 | ||
| 
						 | 
					9e332095a2 | ||
| 
						 | 
					7bf950026b | ||
| 
						 | 
					f246444d89 | ||
| 
						 | 
					8e84aea1bf | ||
| 
						 | 
					d6a7a944cc | ||
| 
						 | 
					fb478d3c7b | ||
| 
						 | 
					24f8a8fdba | ||
| 
						 | 
					28bbe0ee19 | ||
| 
						 | 
					c21ca2062e | ||
| 
						 | 
					e3e289a27c | ||
| 
						 | 
					9540f6b9d3 | ||
| 
						 | 
					539943fb0f | ||
| 
						 | 
					7a8ebffd40 | ||
| 
						 | 
					3d48f4e210 | ||
| 
						 | 
					667cdbea13 | ||
| 
						 | 
					f5fb4dd3b0 | ||
| 
						 | 
					5a2722d049 | ||
| 
						 | 
					f3b6cfbd01 | ||
| 
						 | 
					e239a6057c | ||
| 
						 | 
					9b1c439e15 | ||
| 
						 | 
					074f2e7c8f | ||
| 
						 | 
					4b1533e925 | ||
| 
						 | 
					6812a60668 | ||
| 
						 | 
					6f0cb846f0 | ||
| 
						 | 
					c79307692b | ||
| 
						 | 
					08b2f50ac7 | ||
| 
						 | 
					3577fa1e42 | ||
| 
						 | 
					cb6630582a | ||
| 
						 | 
					ca5fff31a7 | ||
| 
						 | 
					69b1f1e29e | ||
| 
						 | 
					4e2b642ed1 | ||
| 
						 | 
					3c26ce2a55 | ||
| 
						 | 
					7d2cf97c06 | ||
| 
						 | 
					cfce6296fb | ||
| 
						 | 
					1601703ff2 | ||
| 
						 | 
					905ad3e2b7 | ||
| 
						 | 
					15b7e95545 | ||
| 
						 | 
					247f6f038d | ||
| 
						 | 
					7c6df7cce3 | ||
| 
						 | 
					1a92306d51 | ||
| 
						 | 
					59e9fae1d5 | ||
| 
						 | 
					998094241d | ||
| 
						 | 
					d6c3313138 | ||
| 
						 | 
					b7e252b91a | ||
| 
						 | 
					6071beb15d | ||
| 
						 | 
					cda830686d | ||
| 
						 | 
					a29b888620 | ||
| 
						 | 
					ae5a4d413d | ||
| 
						 | 
					03c4d1e81f | ||
| 
						 | 
					4efa0fd509 | ||
| 
						 | 
					c3a727ce10 | ||
| 
						 | 
					afa97d845b | ||
| 
						 | 
					8671f65bfd | ||
| 
						 | 
					37737a6494 | ||
| 
						 | 
					0ce8a55b88 | ||
| 
						 | 
					22dd49c1dc | ||
| 
						 | 
					fd5812aefc | ||
| 
						 | 
					f4e37cdabe | ||
| 
						 | 
					5324760463 | ||
| 
						 | 
					27120045d2 | ||
| 
						 | 
					abfd93ea1b | ||
| 
						 | 
					070d911c60 | ||
| 
						 | 
					8b14776c9a | ||
| 
						 | 
					2d62372c7f | ||
| 
						 | 
					3eae0b9d5c | ||
| 
						 | 
					9a722bb2f8 | ||
| 
						 | 
					d3e39a4132 | ||
| 
						 | 
					d82d495dcf | ||
| 
						 | 
					198df7cee4 | ||
| 
						 | 
					46cdb4c166 | ||
| 
						 | 
					62005c52d2 | ||
| 
						 | 
					ca7651628d | ||
| 
						 | 
					6358b7ad70 | ||
| 
						 | 
					8aca1d97c0 | ||
| 
						 | 
					275a533843 | ||
| 
						 | 
					21bd4c662d | ||
| 
						 | 
					47d9d091d1 | ||
| 
						 | 
					da2ea09e84 | ||
| 
						 | 
					9c71bdbcef | ||
| 
						 | 
					318f9518b1 | ||
| 
						 | 
					19e9fb5f67 | ||
| 
						 | 
					41833c1f29 | ||
| 
						 | 
					4e2f950e41 | ||
| 
						 | 
					ebe3f39ea1 | ||
| 
						 | 
					c6521d0b48 | ||
| 
						 | 
					74b5c9f0e3 | ||
| 
						 | 
					4bfebe1563 | ||
| 
						 | 
					2ac4e65827 | ||
| 
						 | 
					b7a135db10 | ||
| 
						 | 
					d4c460fd3d | ||
| 
						 | 
					8f0ac35381 | ||
| 
						 | 
					a9a3229c22 | ||
| 
						 | 
					5da622ff88 | ||
| 
						 | 
					32f33f5150 | ||
| 
						 | 
					242013f3b0 | ||
| 
						 | 
					e46deb505f | ||
| 
						 | 
					5d443fd1be | ||
| 
						 | 
					d53152858c | ||
| 
						 | 
					aefb31fb58 | ||
| 
						 | 
					0be8219b9c | ||
| 
						 | 
					cbb8bc5d77 | ||
| 
						 | 
					6969dcbfec | ||
| 
						 | 
					9e463ddddf | ||
| 
						 | 
					5ec034c475 | ||
| 
						 | 
					1694e648fc | ||
| 
						 | 
					16aa96ebf4 | ||
| 
						 | 
					43d06e184d | ||
| 
						 | 
					3ff432034a | ||
| 
						 | 
					0325bb1f25 | ||
| 
						 | 
					b9aebf7e9e | ||
| 
						 | 
					e1e693a7c8 | ||
| 
						 | 
					c8c548fe97 | ||
| 
						 | 
					ddf971ed54 | ||
| 
						 | 
					61e8f47986 | ||
| 
						 | 
					3ce9f403e6 | ||
| 
						 | 
					3741010044 | ||
| 
						 | 
					badfb12243 | ||
| 
						 | 
					0713a6457c | ||
| 
						 | 
					9abe744dac | ||
| 
						 | 
					b4974aeacd | ||
| 
						 | 
					688a0de498 | ||
| 
						 | 
					7cef8465fa | ||
| 
						 | 
					532279d2b8 | ||
| 
						 | 
					d67ffc3a6c | ||
| 
						 | 
					c6776b1755 | ||
| 
						 | 
					49566977ad | ||
| 
						 | 
					daf512e33e | ||
| 
						 | 
					74816fc043 | ||
| 
						 | 
					c88e37e9b5 | ||
| 
						 | 
					c1c448f3df | ||
| 
						 | 
					4f168a538b | ||
| 
						 | 
					d94630af35 | ||
| 
						 | 
					999dd1f468 | ||
| 
						 | 
					c3d5631c3c | ||
| 
						 | 
					9dae6b20d7 | ||
| 
						 | 
					4005640a2b | ||
| 
						 | 
					ca446faacf | ||
| 
						 | 
					240539bd24 | ||
| 
						 | 
					08e335f39c | ||
| 
						 | 
					a9cc14b265 | ||
| 
						 | 
					9505f119b3 | ||
| 
						 | 
					683edf1668 | ||
| 
						 | 
					d9c52c1a88 | ||
| 
						 | 
					0f1a76a564 | ||
| 
						 | 
					15cd354bae | ||
| 
						 | 
					91d67ed0ae | ||
| 
						 | 
					0740a7bd5e | ||
| 
						 | 
					84493a99b4 | ||
| 
						 | 
					f730fa3325 | ||
| 
						 | 
					4b1007cb66 | ||
| 
						 | 
					436f7442b6 | ||
| 
						 | 
					3af05ebba5 | ||
| 
						 | 
					c7db0371aa | ||
| 
						 | 
					53860aaa46 | ||
| 
						 | 
					829a4bf16a | ||
| 
						 | 
					a83bc1bcb2 | ||
| 
						 | 
					af65bb3a2b | ||
| 
						 | 
					f2d9f6be27 | ||
| 
						 | 
					ecea4ef4a4 | ||
| 
						 | 
					e4e099510a | ||
| 
						 | 
					de28ff96c2 | ||
| 
						 | 
					6692ddcf1f | ||
| 
						 | 
					ba7a105eb1 | ||
| 
						 | 
					b9fb232859 | ||
| 
						 | 
					6f54cb429e | ||
| 
						 | 
					ae3398b11a | ||
| 
						 | 
					e97693d12d | ||
| 
						 | 
					435bb7dbe2 | ||
| 
						 | 
					70bc5e78e9 | ||
| 
						 | 
					a163e5b82c | ||
| 
						 | 
					5eb66fe442 | ||
| 
						 | 
					b6cf462b16 | ||
| 
						 | 
					ead15a1cde | ||
| 
						 | 
					9c19c70029 | ||
| 
						 | 
					0862047241 | ||
| 
						 | 
					6cfce1916d | ||
| 
						 | 
					1e37bfa8ce | ||
| 
						 | 
					87197067a0 | ||
| 
						 | 
					8264f68f6c | ||
| 
						 | 
					3e21357e8d | ||
| 
						 | 
					ee5953d743 | ||
| 
						 | 
					46f941b416 | ||
| 
						 | 
					225e12e979 | ||
| 
						 | 
					912ba274a6 | ||
| 
						 | 
					18f59db2b9 | ||
| 
						 | 
					f0ca1a5fa3 | ||
| 
						 | 
					446e5a13f7 | ||
| 
						 | 
					e8a9d18445 | ||
| 
						 | 
					6256f33079 | ||
| 
						 | 
					b5c4bd99bf | ||
| 
						 | 
					56dae91c8a | ||
| 
						 | 
					0661b1307a | ||
| 
						 | 
					cd112f4925 | ||
| 
						 | 
					14bf6b84d3 | ||
| 
						 | 
					5c22a29e40 | ||
| 
						 | 
					f1806f227b | ||
| 
						 | 
					025e7b72b5 | ||
| 
						 | 
					97b398051f | ||
| 
						 | 
					e21d8516fb | ||
| 
						 | 
					2972c70177 | ||
| 
						 | 
					50b4274f68 | ||
| 
						 | 
					75dc93f2c0 | ||
| 
						 | 
					73fd627815 | ||
| 
						 | 
					9e84141983 | ||
| 
						 | 
					bd6591db7b | ||
| 
						 | 
					515e876491 | ||
| 
						 | 
					6105046ae9 | ||
| 
						 | 
					f0eb0a9ded | ||
| 
						 | 
					a227db586b | ||
| 
						 | 
					04eafd3e61 | ||
| 
						 | 
					3b25711e1f | ||
| 
						 | 
					63687b5f8f | ||
| 
						 | 
					cac2224fa1 | ||
| 
						 | 
					44da7544b7 | ||
| 
						 | 
					13478343cd | ||
| 
						 | 
					a7aeae0aa2 | ||
| 
						 | 
					876fb9946b | ||
| 
						 | 
					e5853962b5 | ||
| 
						 | 
					3eaa2ae230 | ||
| 
						 | 
					cd1acd023e | ||
| 
						 | 
					e2a314b553 | ||
| 
						 | 
					102a2a03e8 | ||
| 
						 | 
					8be0f9e06f | ||
| 
						 | 
					40239ea078 | ||
| 
						 | 
					47032cbb4a | ||
| 
						 | 
					11dbeb2741 | ||
| 
						 | 
					5242d16e02 | ||
| 
						 | 
					428c007543 | ||
| 
						 | 
					d0fbfdea86 | ||
| 
						 | 
					b3fb18eee6 | ||
| 
						 | 
					7d470fd0e8 | ||
| 
						 | 
					295e6fb283 | ||
| 
						 | 
					9e545e8cf8 | ||
| 
						 | 
					182589745f | ||
| 
						 | 
					bdfc430564 | ||
| 
						 | 
					2da37f06ea | ||
| 
						 | 
					eb5a492eb9 | ||
| 
						 | 
					e79f031cb7 | ||
| 
						 | 
					86909ae236 | ||
| 
						 | 
					69861e7660 | ||
| 
						 | 
					5054b1b5b5 | ||
| 
						 | 
					a2496a536d | ||
| 
						 | 
					f4ebe6a102 | ||
| 
						 | 
					b10b922aa0 | ||
| 
						 | 
					a8673cc076 | ||
| 
						 | 
					2dd1cdc281 | ||
| 
						 | 
					ccd03ae6d2 | ||
| 
						 | 
					7e0771e065 | ||
| 
						 | 
					e9fd3731a9 | ||
| 
						 | 
					a5f242c28f | ||
| 
						 | 
					43d1718618 | ||
| 
						 | 
					d64f0d4a5e | ||
| 
						 | 
					4a13ee8991 | ||
| 
						 | 
					8764916086 | ||
| 
						 | 
					78b0b77e38 | ||
| 
						 | 
					8a7376f6df | ||
| 
						 | 
					c9a36f12e6 | ||
| 
						 | 
					8199e2a973 | ||
| 
						 | 
					e1f3fb3a44 | ||
| 
						 | 
					52275e92af | ||
| 
						 | 
					5d9eec0992 | ||
| 
						 | 
					cd9c637ba5 | ||
| 
						 | 
					0bc405792a | ||
| 
						 | 
					8fb36625bc | ||
| 
						 | 
					674eca23b9 | ||
| 
						 | 
					cfc1ead848 | ||
| 
						 | 
					c41ffdfd2d | ||
| 
						 | 
					df4708383b | ||
| 
						 | 
					497c81a0c6 | ||
| 
						 | 
					2c2f4a9ea1 | ||
| 
						 | 
					feffa6d47e | ||
| 
						 | 
					3bb33fa8d4 | ||
| 
						 | 
					30a73c035a | ||
| 
						 | 
					5c44fc0b28 | ||
| 
						 | 
					a54b446dae | ||
| 
						 | 
					631010ed3f | ||
| 
						 | 
					8506638e5c | ||
| 
						 | 
					c0f3a8eb2b | ||
| 
						 | 
					662d870ad7 | ||
| 
						 | 
					08746d6b10 | ||
| 
						 | 
					bc8c8a6061 | ||
| 
						 | 
					d09e5de229 | ||
| 
						 | 
					1df1bda641 | ||
| 
						 | 
					e8612e3779 | ||
| 
						 | 
					a58d060310 | ||
| 
						 | 
					a77c539f38 | ||
| 
						 | 
					b5107b5634 | ||
| 
						 | 
					6c880bb7b3 | ||
| 
						 | 
					9297c70d11 | ||
| 
						 | 
					bfafdc99d9 | ||
| 
						 | 
					ab111a8e93 | ||
| 
						 | 
					c2ce3d81e1 | ||
| 
						 | 
					fb9813af51 | ||
| 
						 | 
					4fb63d8a7b | ||
| 
						 | 
					77982188bd | ||
| 
						 | 
					8748932460 | ||
| 
						 | 
					6c88df1ac0 | ||
| 
						 | 
					cacb0777b7 | ||
| 
						 | 
					bdf5a80868 | ||
| 
						 | 
					ad1f1933e2 | ||
| 
						 | 
					d7fe49a028 | ||
| 
						 | 
					e802ccdc6e | ||
| 
						 | 
					af2a881142 | ||
| 
						 | 
					0ccf5409ca | ||
| 
						 | 
					2529305803 | ||
| 
						 | 
					bb8fb9d01a | ||
| 
						 | 
					665f33a482 | ||
| 
						 | 
					e5f948acda | ||
| 
						 | 
					c28bbd5728 | ||
| 
						 | 
					262fa5a3cd | ||
| 
						 | 
					a58b774443 | ||
| 
						 | 
					6deceb6bd1 | ||
| 
						 | 
					808d3fd5c6 | ||
| 
						 | 
					b82d3b82d9 | ||
| 
						 | 
					cb8d780d70 | ||
| 
						 | 
					01cd78c75d | ||
| 
						 | 
					e7b289c399 | ||
| 
						 | 
					a9b28c2270 | ||
| 
						 | 
					5b059e6286 | ||
| 
						 | 
					2c84636b7f | ||
| 
						 | 
					2aba8dd8f1 | ||
| 
						 | 
					41d68936b0 | ||
| 
						 | 
					cb750624f9 | ||
| 
						 | 
					bf3a37195b | ||
| 
						 | 
					1e37f80368 | ||
| 
						 | 
					5f9c2d3e62 | ||
| 
						 | 
					c88449151e | ||
| 
						 | 
					9c4f031581 | ||
| 
						 | 
					3cac59adf4 | ||
| 
						 | 
					77bcf720d3 | ||
| 
						 | 
					e6b4c607e0 | ||
| 
						 | 
					cbeb41c728 | ||
| 
						 | 
					101aaa0a68 | ||
| 
						 | 
					2233511fad | ||
| 
						 | 
					8efa868ca3 | ||
| 
						 | 
					e738d502ef | ||
| 
						 | 
					2a7d5b51d9 | ||
| 
						 | 
					67c4f160aa | ||
| 
						 | 
					6d87313283 | ||
| 
						 | 
					98e07690be | ||
| 
						 | 
					c0bc769be9 | ||
| 
						 | 
					01d9b0f291 | ||
| 
						 | 
					2539692016 | ||
| 
						 | 
					3a3fc548ca | ||
| 
						 | 
					84d6cd18fb | ||
| 
						 | 
					2d7b94e5a7 | ||
| 
						 | 
					98eceb7c57 | ||
| 
						 | 
					be92ec0379 | ||
| 
						 | 
					34d4ec66a3 | ||
| 
						 | 
					35c8ed6038 | ||
| 
						 | 
					dd10a88ee2 | ||
| 
						 | 
					71f0947988 | ||
| 
						 | 
					d7cd3ff9e7 | ||
| 
						 | 
					2567d6a5c9 | ||
| 
						 | 
					5831d9e4ae | ||
| 
						 | 
					690bc6bfa0 | ||
| 
						 | 
					5f0e73bcb4 | ||
| 
						 | 
					b1a7b67ae7 | ||
| 
						 | 
					f0539d51ff | ||
| 
						 | 
					1af34e3e25 | ||
| 
						 | 
					0510dbfafc | ||
| 
						 | 
					ca35689475 | ||
| 
						 | 
					2ac1cc2308 | ||
| 
						 | 
					0eebef47b0 | ||
| 
						 | 
					29ef1301fb | ||
| 
						 | 
					cfd5c5d9d7 | ||
| 
						 | 
					347e1f9f59 | ||
| 
						 | 
					2575320ec5 | ||
| 
						 | 
					6c8ec356ec | ||
| 
						 | 
					6e0712b189 | ||
| 
						 | 
					906b1cb52f | ||
| 
						 | 
					1eff8f8224 | ||
| 
						 | 
					6a1f6d43cf | ||
| 
						 | 
					8ab37354ff | ||
| 
						 | 
					64340bf92e | ||
| 
						 | 
					f0d490539e | ||
| 
						 | 
					808464a7d0 | ||
| 
						 | 
					3b8b70f760 | ||
| 
						 | 
					cb58701af2 | ||
| 
						 | 
					f05fbae8fc | ||
| 
						 | 
					f1589d2ffe | ||
| 
						 | 
					2d1df6c0e4 | ||
| 
						 | 
					158596cede | ||
| 
						 | 
					6c7df418af | ||
| 
						 | 
					4e666d63b3 | ||
| 
						 | 
					d1674dade2 | ||
| 
						 | 
					ecb26a8b68 | ||
| 
						 | 
					03785c4365 | ||
| 
						 | 
					58c1d01b4a | ||
| 
						 | 
					dc48aa08ba | ||
| 
						 | 
					53f9cc8c3d | ||
| 
						 | 
					0db888ef88 | ||
| 
						 | 
					2ee8817103 | ||
| 
						 | 
					71b0e7c60f | ||
| 
						 | 
					740707539e | ||
| 
						 | 
					ba088bf717 | ||
| 
						 | 
					aa58a2ba56 | ||
| 
						 | 
					ca9caf6e12 | ||
| 
						 | 
					5a983c9600 | ||
| 
						 | 
					d02c6ab450 | ||
| 
						 | 
					4284cb8ea0 | ||
| 
						 | 
					0743d4bce9 | ||
| 
						 | 
					66ce0da9bc | ||
| 
						 | 
					3e4f700a70 | ||
| 
						 | 
					7518408d89 | ||
| 
						 | 
					c5caffc75e | ||
| 
						 | 
					086fea0349 | ||
| 
						 | 
					f436c9f69c | ||
| 
						 | 
					a153913d29 | ||
| 
						 | 
					5189871fde | ||
| 
						 | 
					daa0162639 | ||
| 
						 | 
					4e6a452c87 | ||
| 
						 | 
					a70a895a29 | ||
| 
						 | 
					84bc3f5269 | ||
| 
						 | 
					27f2bd1b26 | ||
| 
						 | 
					38c63a3086 | ||
| 
						 | 
					2c5301b676 | ||
| 
						 | 
					1b85820314 | ||
| 
						 | 
					3855c92564 | ||
| 
						 | 
					ba85dc670b | ||
| 
						 | 
					6221228d1f | ||
| 
						 | 
					a901d9a61c | ||
| 
						 | 
					0a0fac4ddb | ||
| 
						 | 
					0e16cfecf6 | ||
| 
						 | 
					838eb71a15 | ||
| 
						 | 
					e373b1f74e | ||
| 
						 | 
					b03e292d95 | ||
| 
						 | 
					2139cb0212 | ||
| 
						 | 
					35392a8c5c | ||
| 
						 | 
					b7fab49da2 | ||
| 
						 | 
					d0061b4ec9 | ||
| 
						 | 
					2ffa82aff9 | ||
| 
						 | 
					1c33f38323 | ||
| 
						 | 
					4bb41fc368 | ||
| 
						 | 
					c666fe30d8 | ||
| 
						 | 
					1813e60cec | ||
| 
						 | 
					4ae8f31c8f | ||
| 
						 | 
					df466ac2eb | ||
| 
						 | 
					846b3201b7 | ||
| 
						 | 
					a2ab73c24a | ||
| 
						 | 
					98e6693525 | ||
| 
						 | 
					fed85592cb | ||
| 
						 | 
					2b4a296128 | ||
| 
						 | 
					c1b0e81b6c | ||
| 
						 | 
					9a0915f3a1 | ||
| 
						 | 
					a9481c86d2 | ||
| 
						 | 
					5f0148dd72 | ||
| 
						 | 
					dedefde79f | ||
| 
						 | 
					8c421d333a | ||
| 
						 | 
					97fbd36c6a | ||
| 
						 | 
					e81344c357 | ||
| 
						 | 
					33450039c7 | ||
| 
						 | 
					5849f4ce3d | ||
| 
						 | 
					70f20d2330 | ||
| 
						 | 
					48e9b0b030 | ||
| 
						 | 
					11db00b66c | ||
| 
						 | 
					89dc775392 | ||
| 
						 | 
					6d5f27fd3a | ||
| 
						 | 
					e1ab8a43ba | ||
| 
						 | 
					081325c68d | ||
| 
						 | 
					004de3d29b | ||
| 
						 | 
					8b5ba1e959 | ||
| 
						 | 
					149e97c2d6 | ||
| 
						 | 
					60cb2b8c20 | ||
| 
						 | 
					a714c46fba | ||
| 
						 | 
					692ccd0e97 | ||
| 
						 | 
					e0aa0835cd | ||
| 
						 | 
					845a0c4121 | ||
| 
						 | 
					57a6ec56e3 | ||
| 
						 | 
					4d53aa41e2 | ||
| 
						 | 
					214534b211 | ||
| 
						 | 
					5ac0d946a7 | ||
| 
						 | 
					bd908a6952 | ||
| 
						 | 
					400e94ea27 | ||
| 
						 | 
					1d286d8388 | ||
| 
						 | 
					bf79dd333f | ||
| 
						 | 
					c882e63dad | ||
| 
						 | 
					710e7afbe6 | ||
| 
						 | 
					e51c9c1da2 | ||
| 
						 | 
					b17f04e762 | ||
| 
						 | 
					a6d16bdfc9 | ||
| 
						 | 
					b6377596f8 | ||
| 
						 | 
					b5d1210f72 | ||
| 
						 | 
					af038c491b | ||
| 
						 | 
					4af016ea4f | ||
| 
						 | 
					a2d94315c3 | ||
| 
						 | 
					e87e076b6a | ||
| 
						 | 
					dfbc7cfd07 | ||
| 
						 | 
					696efaad82 | ||
| 
						 | 
					b435382a5e | ||
| 
						 | 
					ea65ed57af | ||
| 
						 | 
					f3058e4e9c | ||
| 
						 | 
					75b570af95 | ||
| 
						 | 
					840d8a48ba | ||
| 
						 | 
					b5fec8dbde | ||
| 
						 | 
					123dc84f05 | ||
| 
						 | 
					98ceee3212 | ||
| 
						 | 
					ab08aa1de1 | ||
| 
						 | 
					e8c0a78e67 | ||
| 
						 | 
					0c583b7838 | ||
| 
						 | 
					7515cb0ab0 | ||
| 
						 | 
					fc4d9cac24 | ||
| 
						 | 
					8d496beceb | ||
| 
						 | 
					ce1fac9e86 | ||
| 
						 | 
					659d38b0db | ||
| 
						 | 
					56a4238632 | ||
| 
						 | 
					4c9f9d9876 | ||
| 
						 | 
					533104ce55 | ||
| 
						 | 
					06fd442dce | ||
| 
						 | 
					8955e25c4f | ||
| 
						 | 
					f543768c7b | ||
| 
						 | 
					4c33cfecff | ||
| 
						 | 
					2070f9b9e0 | ||
| 
						 | 
					069695f570 | ||
| 
						 | 
					ad300684c3 | ||
| 
						 | 
					98d120717a | ||
| 
						 | 
					1ebe34ce90 | ||
| 
						 | 
					9565c908c6 | ||
| 
						 | 
					85f36d3831 | ||
| 
						 | 
					77aca4b628 | ||
| 
						 | 
					7602c30d96 | ||
| 
						 | 
					c5b2894d23 | ||
| 
						 | 
					508a86b563 | ||
| 
						 | 
					01faf96ccb | ||
| 
						 | 
					3edb813da7 | ||
| 
						 | 
					8cae0c74fb | ||
| 
						 | 
					feefe2dcee | ||
| 
						 | 
					7a40aa02ed | ||
| 
						 | 
					5d9ac88750 | ||
| 
						 | 
					93c54da5ba | ||
| 
						 | 
					d9c87bdfbd | ||
| 
						 | 
					6bbc902c75 | ||
| 
						 | 
					79a4a55265 | ||
| 
						 | 
					67081eed26 | ||
| 
						 | 
					be37a24fc9 | ||
| 
						 | 
					269d2b7be9 | ||
| 
						 | 
					749ad55af1 | ||
| 
						 | 
					866d28a36d | ||
| 
						 | 
					1a3b3ae009 | ||
| 
						 | 
					b5edc85a56 | ||
| 
						 | 
					bb9e6f5101 | ||
| 
						 | 
					9d37614f66 | ||
| 
						 | 
					669989434c | ||
| 
						 | 
					fb44b0b4b1 | ||
| 
						 | 
					09f80eeed7 | ||
| 
						 | 
					e5c81896aa | ||
| 
						 | 
					7ad7d1e338 | ||
| 
						 | 
					1b0c212a95 | ||
| 
						 | 
					0dc9174c83 | ||
| 
						 | 
					70197f35ee | ||
| 
						 | 
					5c0cefefba | ||
| 
						 | 
					54633a7b99 | ||
| 
						 | 
					cde34cfc99 | ||
| 
						 | 
					41dac34246 | ||
| 
						 | 
					b1e0261216 | ||
| 
						 | 
					84b1160c23 | ||
| 
						 | 
					0cededc7ba | ||
| 
						 | 
					0b932064ed | ||
| 
						 | 
					c4c0cbb597 | ||
| 
						 | 
					24662f2352 | ||
| 
						 | 
					d460c5a473 | ||
| 
						 | 
					87063bc4d3 | ||
| 
						 | 
					948921930b | ||
| 
						 | 
					dc494ff038 | ||
| 
						 | 
					a98e163c7c | ||
| 
						 | 
					e6428abc0b | ||
| 
						 | 
					9597095b50 | ||
| 
						 | 
					905272a3bc | ||
| 
						 | 
					5da4035b03 | ||
| 
						 | 
					435af3cf82 | ||
| 
						 | 
					afc53b176b | ||
| 
						 | 
					8624b0d63a | ||
| 
						 | 
					1ac5cdd110 | ||
| 
						 | 
					1be0292e78 | ||
| 
						 | 
					523deb988a | ||
| 
						 | 
					4ae815c6f9 | ||
| 
						 | 
					d46b124674 | ||
| 
						 | 
					df9a335052 | ||
| 
						 | 
					038a6c7714 | ||
| 
						 | 
					301d14acf0 | ||
| 
						 | 
					c5a0e40065 | ||
| 
						 | 
					b8c03fa9c1 | ||
| 
						 | 
					3da742fa1d | ||
| 
						 | 
					a1199f6ff0 | ||
| 
						 | 
					4dc43891df | ||
| 
						 | 
					7aede0a35e | ||
| 
						 | 
					8b0239fdde | ||
| 
						 | 
					ab632849bf | ||
| 
						 | 
					cec6e00384 | ||
| 
						 | 
					3656c6e42a | ||
| 
						 | 
					b93278fa93 | ||
| 
						 | 
					ff37bab36d | ||
| 
						 | 
					f3783daf05 | ||
| 
						 | 
					8c01484a5d | ||
| 
						 | 
					d8994dc737 | ||
| 
						 | 
					88890649bf | ||
| 
						 | 
					d46842bd8e | ||
| 
						 | 
					c240cfc854 | ||
| 
						 | 
					81f5534a6a | ||
| 
						 | 
					e60a1a6931 | ||
| 
						 | 
					72e8f46633 | ||
| 
						 | 
					d7c0959d27 | ||
| 
						 | 
					862e8b6006 | ||
| 
						 | 
					c9b47de8d1 | ||
| 
						 | 
					0dd90a24dd | ||
| 
						 | 
					9cfc0bcd64 | ||
| 
						 | 
					1820299dcf | ||
| 
						 | 
					acbfa7484b | ||
| 
						 | 
					67fd776431 | ||
| 
						 | 
					c04dd5b3b5 | ||
| 
						 | 
					b8b2d337d5 | ||
| 
						 | 
					8b0ffdf079 | ||
| 
						 | 
					eb8328c36d | ||
| 
						 | 
					2ab9bb0053 | ||
| 
						 | 
					fae8e8396f | ||
| 
						 | 
					cdccde0c7d | ||
| 
						 | 
					ee829539c2 | ||
| 
						 | 
					832679ac4f | ||
| 
						 | 
					45af60459f | ||
| 
						 | 
					2586fc9309 | ||
| 
						 | 
					01cafebf89 | ||
| 
						 | 
					9d530e2a62 | ||
| 
						 | 
					c130b9a49e | ||
| 
						 | 
					c10bf98500 | ||
| 
						 | 
					83fb73389a | ||
| 
						 | 
					f9933dcb4f | ||
| 
						 | 
					74ccc599fe | ||
| 
						 | 
					362acb9217 | ||
| 
						 | 
					a3038adbd0 | ||
| 
						 | 
					8015e59161 | ||
| 
						 | 
					7a94ddcc26 | ||
| 
						 | 
					4e73ff2bae | ||
| 
						 | 
					257eb48e70 | ||
| 
						 | 
					cf1564d598 | ||
| 
						 | 
					e83380c7c5 | ||
| 
						 | 
					799a06b63a | ||
| 
						 | 
					b55e15a568 | ||
| 
						 | 
					6b3edc3232 | ||
| 
						 | 
					f65332f9cc | ||
| 
						 | 
					3416928233 | ||
| 
						 | 
					4d262872c8 | ||
| 
						 | 
					795ae41d68 | ||
| 
						 | 
					2e17b5c64a | ||
| 
						 | 
					ddca296e2a | ||
| 
						 | 
					af5d1d6c03 | ||
| 
						 | 
					2f07667560 | ||
| 
						 | 
					1fac4cb13c | ||
| 
						 | 
					aa8c86ddcd | ||
| 
						 | 
					83751acf91 | ||
| 
						 | 
					01dc21e338 | ||
| 
						 | 
					0b8f6db97a | ||
| 
						 | 
					23dd87c294 | ||
| 
						 | 
					9a19d3a6f6 | ||
| 
						 | 
					ba6e02ea5e | ||
| 
						 | 
					1426f7656d | ||
| 
						 | 
					53ebeacc09 | ||
| 
						 | 
					bd6cc8d7f4 | ||
| 
						 | 
					19018f364e | ||
| 
						 | 
					be0391bfa8 | ||
| 
						 | 
					bfc36df82b | ||
| 
						 | 
					5134f4163c | ||
| 
						 | 
					4939a18a6c | ||
| 
						 | 
					8aee915872 | ||
| 
						 | 
					eeac8fd9a2 | ||
| 
						 | 
					07db467827 | ||
| 
						 | 
					8bed2081b9 | ||
| 
						 | 
					f0e0b9063c | ||
| 
						 | 
					41907297f8 | ||
| 
						 | 
					2e0392a6db | ||
| 
						 | 
					3c4b8911f5 | ||
| 
						 | 
					3db7164f9f | ||
| 
						 | 
					cfe3c34ab6 | ||
| 
						 | 
					ceac50e33e | ||
| 
						 | 
					b71ba01d32 | ||
| 
						 | 
					5cc00d443c | ||
| 
						 | 
					4edb3115e5 | ||
| 
						 | 
					33435d89e4 | ||
| 
						 | 
					f5c93b3413 | ||
| 
						 | 
					59fbe71c56 | ||
| 
						 | 
					4f6b5f0883 | ||
| 
						 | 
					23eb3b596d | ||
| 
						 | 
					55b2a27f40 | ||
| 
						 | 
					5e46120b52 | ||
| 
						 | 
					4b70bfa7c8 | ||
| 
						 | 
					c530e25e02 | ||
| 
						 | 
					409065375e | ||
| 
						 | 
					32ccc2857f | ||
| 
						 | 
					c1025cb76f | ||
| 
						 | 
					1f6a738cda | ||
| 
						 | 
					8f10a4f16e | ||
| 
						 | 
					50d9fdefb3 | ||
| 
						 | 
					d777d98396 | ||
| 
						 | 
					75e7b0c6b0 | ||
| 
						 | 
					9fc965d095 | ||
| 
						 | 
					10b4611e81 | ||
| 
						 | 
					f416f7cc49 | ||
| 
						 | 
					50d9070f36 | ||
| 
						 | 
					14db80441c | ||
| 
						 | 
					6193e661f5 | ||
| 
						 | 
					3e69394cca | ||
| 
						 | 
					88cdcebe2d | ||
| 
						 | 
					20024f8c50 | ||
| 
						 | 
					40caf6cc0e | ||
| 
						 | 
					2d3b28b973 | ||
| 
						 | 
					325b087bd1 | ||
| 
						 | 
					0703a5f777 | ||
| 
						 | 
					c4a4749bcf | ||
| 
						 | 
					1fd0facbe0 | ||
| 
						 | 
					bc9ab17f2d | ||
| 
						 | 
					22fd4f73a9 | ||
| 
						 | 
					4de346fa39 | ||
| 
						 | 
					e14c749f66 | ||
| 
						 | 
					c0f1872f04 | ||
| 
						 | 
					70944f0589 | ||
| 
						 | 
					d2b4c85d37 | ||
| 
						 | 
					a4cc2f5514 | ||
| 
						 | 
					fa8f91d508 | ||
| 
						 | 
					7966400cf2 | ||
| 
						 | 
					3227540322 | ||
| 
						 | 
					183f8bde3a | ||
| 
						 | 
					62133dfedf | ||
| 
						 | 
					eb833c69e3 | ||
| 
						 | 
					53d96a2e32 | ||
| 
						 | 
					efc1682877 | ||
| 
						 | 
					8846bb2f0f | ||
| 
						 | 
					558c80aa84 | ||
| 
						 | 
					f905638e5b | ||
| 
						 | 
					d1636f0fe9 | ||
| 
						 | 
					1d1193c459 | ||
| 
						 | 
					4a2e62be2d | ||
| 
						 | 
					137cc84ca6 | ||
| 
						 | 
					e744df1dca | ||
| 
						 | 
					378dc6bc19 | ||
| 
						 | 
					3f2f722dab | ||
| 
						 | 
					25f57d65a5 | ||
| 
						 | 
					f5dba96839 | ||
| 
						 | 
					3a1d04eb38 | ||
| 
						 | 
					adac25b3dd | ||
| 
						 | 
					9b2229e3eb | ||
| 
						 | 
					bf040dffa9 | ||
| 
						 | 
					86a12cd2a6 | ||
| 
						 | 
					bfcb56f06d | ||
| 
						 | 
					9a4a336c78 | ||
| 
						 | 
					6696eeeb9d | ||
| 
						 | 
					4da90c4f9b | ||
| 
						 | 
					88f31110a7 | ||
| 
						 | 
					afab6191b2 | ||
| 
						 | 
					7ce87ebd3d | ||
| 
						 | 
					d8e1e932ae | ||
| 
						 | 
					089430de17 | ||
| 
						 | 
					dce0a40ebb | ||
| 
						 | 
					2347edad82 | ||
| 
						 | 
					0ab5eb2bf1 | ||
| 
						 | 
					d314ffe897 | ||
| 
						 | 
					1162dc3a7b | ||
| 
						 | 
					0967634043 | ||
| 
						 | 
					133355bc9d | ||
| 
						 | 
					76c734dc01 | ||
| 
						 | 
					3128e3e5f6 | ||
| 
						 | 
					c9ebd5ae28 | ||
| 
						 | 
					b6efcd86dd | ||
| 
						 | 
					a0323aacd2 | ||
| 
						 | 
					258b7551ff | ||
| 
						 | 
					7a023554eb | ||
| 
						 | 
					b557c9d890 | ||
| 
						 | 
					8dae0aad96 | ||
| 
						 | 
					902383cab7 | ||
| 
						 | 
					a1eb6e5831 | ||
| 
						 | 
					3656d4c514 | ||
| 
						 | 
					e899f76249 | ||
| 
						 | 
					d38bfcbbf7 | ||
| 
						 | 
					0f654f5aaa | ||
| 
						 | 
					6cab3ad6b3 | ||
| 
						 | 
					6685e4dd77 | ||
| 
						 | 
					2b42f25d1e | ||
| 
						 | 
					85359ddf59 | ||
| 
						 | 
					1e198a8d8e | ||
| 
						 | 
					6bd545d307 | ||
| 
						 | 
					bc53167731 | ||
| 
						 | 
					9a5135b9e1 | ||
| 
						 | 
					8193143459 | ||
| 
						 | 
					61ac00d7fb | ||
| 
						 | 
					7944613d42 | ||
| 
						 | 
					ff07325a05 | ||
| 
						 | 
					afe5436749 | ||
| 
						 | 
					ade9d7ef32 | ||
| 
						 | 
					6a397d7c72 | ||
| 
						 | 
					933bbaf00b | ||
| 
						 | 
					1bd53dda51 | ||
| 
						 | 
					5595fea427 | ||
| 
						 | 
					31661b1374 | ||
| 
						 | 
					780965728e | ||
| 
						 | 
					a7570d9e58 | ||
| 
						 | 
					b6989e8ada | ||
| 
						 | 
					f9f4daea94 | ||
| 
						 | 
					ab175a747c | ||
| 
						 | 
					2a10991980 | ||
| 
						 | 
					95d3d45e66 | ||
| 
						 | 
					d808fc1e6f | ||
| 
						 | 
					e8f81b17fa | ||
| 
						 | 
					db871c590c | ||
| 
						 | 
					de464b2e6a | ||
| 
						 | 
					e0acc5ce90 | ||
| 
						 | 
					a1f913d91e | ||
| 
						 | 
					d19b71073d | ||
| 
						 | 
					ed66350c27 | ||
| 
						 | 
					51d57b39f5 | ||
| 
						 | 
					68524eb337 | ||
| 
						 | 
					58f8ed29c7 | ||
| 
						 | 
					3b96232e13 | ||
| 
						 | 
					19b5d34c10 | ||
| 
						 | 
					5bb4252cf0 | ||
| 
						 | 
					8191d5f957 | ||
| 
						 | 
					1c458c9ca9 | ||
| 
						 | 
					36f84e357e | ||
| 
						 | 
					c1b7d7dfc0 | ||
| 
						 | 
					bbd45f82ab | ||
| 
						 | 
					02f3e91c5d | ||
| 
						 | 
					d5afa9f592 | ||
| 
						 | 
					dceec4f537 | ||
| 
						 | 
					51b09605df | ||
| 
						 | 
					dc00c7d907 | ||
| 
						 | 
					c6df2928a1 | ||
| 
						 | 
					86bf9fd360 | ||
| 
						 | 
					505de8c6dc | ||
| 
						 | 
					70744f3df2 | ||
| 
						 | 
					96393d5781 | ||
| 
						 | 
					598c075670 | ||
| 
						 | 
					ac8eef8f73 | ||
| 
						 | 
					f5eb4e8bb6 | ||
| 
						 | 
					abb7fe7f3c | ||
| 
						 | 
					440bb002b6 | ||
| 
						 | 
					6dd3f4b21a | ||
| 
						 | 
					1278117b05 | ||
| 
						 | 
					5c6c75b42e | ||
| 
						 | 
					d78e5d6656 | ||
| 
						 | 
					094c2d548d | ||
| 
						 | 
					4913ac6cdd | ||
| 
						 | 
					ac9efcf8ba | ||
| 
						 | 
					6b4444d97a | ||
| 
						 | 
					607d5f04bd | ||
| 
						 | 
					b46aa416a0 | ||
| 
						 | 
					800aa0b4f0 | ||
| 
						 | 
					a0e0be2d68 | ||
| 
						 | 
					3fa47dc2e6 | ||
| 
						 | 
					25141d3c8e | ||
| 
						 | 
					1f02aeaec4 | ||
| 
						 | 
					5d4aada8f5 | ||
| 
						 | 
					3bd7f78277 | ||
| 
						 | 
					3994706465 | ||
| 
						 | 
					12bf18ac02 | ||
| 
						 | 
					5c6a8f3c45 | ||
| 
						 | 
					ddddb703aa | ||
| 
						 | 
					5ef4c78f8a | ||
| 
						 | 
					05a7f104a4 | ||
| 
						 | 
					da1183b4fa | ||
| 
						 | 
					a51ad7ee88 | ||
| 
						 | 
					df3e0e3b3a | ||
| 
						 | 
					c156584417 | ||
| 
						 | 
					74e649a033 | ||
| 
						 | 
					342a45a424 | ||
| 
						 | 
					7076c236ea | ||
| 
						 | 
					0d90383ea3 | ||
| 
						 | 
					fe59f88dd3 | ||
| 
						 | 
					2f4704b18d | ||
| 
						 | 
					c8c94bbd8b | ||
| 
						 | 
					054e27e827 | ||
| 
						 | 
					766f14d2bf | ||
| 
						 | 
					4e52756a41 | ||
| 
						 | 
					55fc398ddf | ||
| 
						 | 
					a5e8e6c7cd | ||
| 
						 | 
					bb8762835f | ||
| 
						 | 
					7c8b1a8853 | ||
| 
						 | 
					be8140a142 | ||
| 
						 | 
					f7c57860b7 | ||
| 
						 | 
					c44fc3ddbe | ||
| 
						 | 
					c2fd3bd3a4 | ||
| 
						 | 
					dfff2624ac | ||
| 
						 | 
					91c40fddb6 | ||
| 
						 | 
					cafeb36418 | ||
| 
						 | 
					fa56c7b332 | ||
| 
						 | 
					a52f1f3d37 | ||
| 
						 | 
					476053c539 | ||
| 
						 | 
					0530c5d9e9 | ||
| 
						 | 
					b982e95c42 | ||
| 
						 | 
					de286cbfa0 | ||
| 
						 | 
					a94c685c6d | ||
| 
						 | 
					58feb21dec | ||
| 
						 | 
					81f0b821e3 | ||
| 
						 | 
					ea8275677b | ||
| 
						 | 
					c0891ec8c0 | ||
| 
						 | 
					9dd38845a6 | ||
| 
						 | 
					0d8aa25e63 | ||
| 
						 | 
					f57c9333da | ||
| 
						 | 
					f060b67b4a | ||
| 
						 | 
					c59e13ac35 | ||
| 
						 | 
					a49d1522b0 | ||
| 
						 | 
					39e618f761 | ||
| 
						 | 
					3d812e0eae | ||
| 
						 | 
					4f1ac32865 | ||
| 
						 | 
					d176570b1d | ||
| 
						 | 
					393fb71b1a | ||
| 
						 | 
					bd1be7e258 | ||
| 
						 | 
					e296e93b23 | ||
| 
						 | 
					bd457307ff | ||
| 
						 | 
					f988cecc4d | ||
| 
						 | 
					d2f67b2db2 | ||
| 
						 | 
					c4a4c3d5e6 | ||
| 
						 | 
					fa38fdbc2b | ||
| 
						 | 
					2e03e3faca | ||
| 
						 | 
					e448915e0b | ||
| 
						 | 
					37836bedac | ||
| 
						 | 
					a60663b238 | ||
| 
						 | 
					5e879b6822 | ||
| 
						 | 
					c672b914db | ||
| 
						 | 
					f703bdc910 | ||
| 
						 | 
					0752a2403c | ||
| 
						 | 
					f0dc4c4b31 | ||
| 
						 | 
					7269476bad | ||
| 
						 | 
					42d56e62e1 | ||
| 
						 | 
					873fd257cd | ||
| 
						 | 
					43d01c5060 | ||
| 
						 | 
					1d45ab5522 | ||
| 
						 | 
					2674536a55 | ||
| 
						 | 
					cc13a0f850 | ||
| 
						 | 
					f9a97d7a3b | ||
| 
						 | 
					d5f1a1ae95 | ||
| 
						 | 
					466c0daec0 | ||
| 
						 | 
					e127beb2d7 | ||
| 
						 | 
					ff9cab9fe7 | ||
| 
						 | 
					6d9ce57032 | ||
| 
						 | 
					77d854f58f | ||
| 
						 | 
					9e2ac2d880 | ||
| 
						 | 
					4a52fccc20 | ||
| 
						 | 
					d7e524b4a3 | ||
| 
						 | 
					6da7d340a9 | ||
| 
						 | 
					e9fa153e45 | ||
| 
						 | 
					fa99cb39ae | ||
| 
						 | 
					622a35de01 | ||
| 
						 | 
					74c85cae9e | ||
| 
						 | 
					3eba4c6c79 | ||
| 
						 | 
					3f179aa21a | ||
| 
						 | 
					a6a8ed4c55 | ||
| 
						 | 
					d7b6fa2179 | ||
| 
						 | 
					69645321cd | ||
| 
						 | 
					f2754b80bb | ||
| 
						 | 
					1f1ba32c1b | ||
| 
						 | 
					39ed601300 | ||
| 
						 | 
					c2bbd03c2f | ||
| 
						 | 
					3c3c040471 | ||
| 
						 | 
					af51ee7ea4 | ||
| 
						 | 
					e4e039e2e1 | ||
| 
						 | 
					6dac5dffb3 | ||
| 
						 | 
					ddeb705f13 | ||
| 
						 | 
					b86cf86fa6 | ||
| 
						 | 
					0cd3ba27c0 | ||
| 
						 | 
					fe6157f900 | ||
| 
						 | 
					b4c1bf0900 | ||
| 
						 | 
					7f2e79c634 | ||
| 
						 | 
					947c8679c8 | ||
| 
						 | 
					919906516d | ||
| 
						 | 
					ad70c2345e | ||
| 
						 | 
					3035a9df7a | ||
| 
						 | 
					556441ba09 | ||
| 
						 | 
					97eeeb4ae4 | ||
| 
						 | 
					e0c1c79ce8 | ||
| 
						 | 
					c5fe50aa67 | ||
| 
						 | 
					7d29cf4c13 | ||
| 
						 | 
					7a8967d924 | ||
| 
						 | 
					c5b1b3c3d2 | ||
| 
						 | 
					95912047f7 | ||
| 
						 | 
					a1286a02f9 | ||
| 
						 | 
					543fc51d2f | ||
| 
						 | 
					e2b0f18b28 | ||
| 
						 | 
					2b56fdbb85 | ||
| 
						 | 
					3371ef7727 | ||
| 
						 | 
					fd7cf06a07 | 
							
								
								
									
										56
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
<!---
 | 
			
		||||
 | 
			
		||||
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 -->
 | 
			
		||||
<!--- If you're suggesting a change/improvement, tell us how it should work -->
 | 
			
		||||
 | 
			
		||||
## Current Behavior
 | 
			
		||||
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
 | 
			
		||||
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
 | 
			
		||||
 | 
			
		||||
## Possible Solution
 | 
			
		||||
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
 | 
			
		||||
<!--- or ideas how to implement the addition or change -->
 | 
			
		||||
 | 
			
		||||
## Steps to Reproduce (for bugs)
 | 
			
		||||
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
 | 
			
		||||
<!--- reproduce this bug. Include code to reproduce, if relevant, or attach screenshots -->
 | 
			
		||||
1. 
 | 
			
		||||
2. 
 | 
			
		||||
3. 
 | 
			
		||||
4. 
 | 
			
		||||
 | 
			
		||||
## Context
 | 
			
		||||
<!--- 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: 
 | 
			
		||||
* Netdisco version (if used): 
 | 
			
		||||
							
								
								
									
										13
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
*.swp
 | 
			
		||||
*.pid
 | 
			
		||||
test.pl
 | 
			
		||||
MYMETA.*
 | 
			
		||||
*.tar.gz
 | 
			
		||||
MANIFEST.*
 | 
			
		||||
*.komodo*
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										39
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
language: perl
 | 
			
		||||
perl:
 | 
			
		||||
  - "5.30"
 | 
			
		||||
  - "5.10"
 | 
			
		||||
os: linux
 | 
			
		||||
dist: trusty
 | 
			
		||||
addons:
 | 
			
		||||
  apt:
 | 
			
		||||
    packages:
 | 
			
		||||
      - jq
 | 
			
		||||
      - libsnmp-dev
 | 
			
		||||
branches:
 | 
			
		||||
  only:
 | 
			
		||||
    - /^3\.\d{2}$/
 | 
			
		||||
    - 'master'
 | 
			
		||||
before_install:
 | 
			
		||||
  - mkdir ~/netdisco-mibs
 | 
			
		||||
  - cd ~/netdisco-mibs
 | 
			
		||||
install:
 | 
			
		||||
  - 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:
 | 
			
		||||
  - >
 | 
			
		||||
    perl Build.PL &&
 | 
			
		||||
    PERL_MM_USE_DEFAULT=1 ./Build installdeps --cpan_client 'cpanm --quiet --notest' &&
 | 
			
		||||
    ./Build test --test_files t/ --test_files xt/
 | 
			
		||||
notifications:
 | 
			
		||||
  irc:
 | 
			
		||||
    on_success: change
 | 
			
		||||
    on_failure: change
 | 
			
		||||
    channels:
 | 
			
		||||
      - 'chat.freenode.net#netdisco'
 | 
			
		||||
#  email:
 | 
			
		||||
#    on_success: always
 | 
			
		||||
#    on_failure: always
 | 
			
		||||
#    recipients:
 | 
			
		||||
#      - 'snmp-info-cvs@lists.sourceforge.net'
 | 
			
		||||
							
								
								
									
										54
									
								
								Build.PL
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								Build.PL
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Module::Build;
 | 
			
		||||
 | 
			
		||||
Module::Build->new(
 | 
			
		||||
  module_name => 'SNMP::Info',
 | 
			
		||||
  license     => 'bsd',
 | 
			
		||||
  dist_author => 'Eric A. Miller <emiller@cpan.org>',
 | 
			
		||||
  # dynamic_config => 1,
 | 
			
		||||
  create_readme => 1,
 | 
			
		||||
  configure_requires => {
 | 
			
		||||
    'Module::Build' => '0.42',
 | 
			
		||||
  },
 | 
			
		||||
  # build_requires => {
 | 
			
		||||
  # },
 | 
			
		||||
  requires => {
 | 
			
		||||
    'SNMP' => '0',
 | 
			
		||||
    'Math::BigInt' => '0',
 | 
			
		||||
    'NetAddr::IP' => '4.068',
 | 
			
		||||
  },
 | 
			
		||||
  recommends => {
 | 
			
		||||
    'PPI' => '0',
 | 
			
		||||
    'Class::ISA' => '0',
 | 
			
		||||
    'Module::Info' => '0',
 | 
			
		||||
    'Module::Load' => '0',
 | 
			
		||||
    'File::Slurp' => '0',
 | 
			
		||||
  },
 | 
			
		||||
  test_requires => {
 | 
			
		||||
    'Test::More' => '0.88',
 | 
			
		||||
    'Test::Distribution' => '0',
 | 
			
		||||
    'Test::Class::Most'  => '0',
 | 
			
		||||
    'Test::MockObject::Extends' => '0',
 | 
			
		||||
    'File::Find' => '0',
 | 
			
		||||
    'Path::Class' => '0',
 | 
			
		||||
    'File::Slurper' => '0',
 | 
			
		||||
    'Test::Exception' => '0.43',
 | 
			
		||||
    'Class::Inspector' => '0',
 | 
			
		||||
    'NetSNMP::default_store' => '0',
 | 
			
		||||
    'Module::Find' => '0',
 | 
			
		||||
    'Hook::LexWrap' => '0',
 | 
			
		||||
  },
 | 
			
		||||
  # script_files => [
 | 
			
		||||
  # ],
 | 
			
		||||
  # share_dir => 'share',
 | 
			
		||||
  meta_merge => {
 | 
			
		||||
    resources => {
 | 
			
		||||
      homepage => 'http://netdisco.org/',
 | 
			
		||||
      bugtracker => 'https://github.com/netdisco/snmp-info/issues',
 | 
			
		||||
      repository => 'https://github.com/netdisco/snmp-info',
 | 
			
		||||
      MailingList => 'https://lists.sourceforge.net/lists/listinfo/snmp-info-users',
 | 
			
		||||
      IRC => 'irc://irc.freenode.org/#netdisco',
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
)->create_build_script;
 | 
			
		||||
							
								
								
									
										196
									
								
								Info/Bridge.pm
									
									
									
									
									
								
							
							
						
						
									
										196
									
								
								Info/Bridge.pm
									
									
									
									
									
								
							@@ -1,196 +0,0 @@
 | 
			
		||||
# SNMP::Info::Bridge
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Bridge;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
 | 
			
		||||
@SNMP::Info::Bridge::ISA = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Bridge::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
%MIBS = ('BRIDGE-MIB' => 'dot1dBaseBridgeAddress');
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            'b_mac'   => 'dot1dBaseBridgeAddress',
 | 
			
		||||
            'b_ports' => 'dot1dBaseNumPorts',
 | 
			
		||||
            'b_type'  => 'dot1dBaseType'
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
          # Forwarding Table: Dot1dTpFdbEntry 
 | 
			
		||||
          'fw_mac'    => 'dot1dTpFdbAddress',
 | 
			
		||||
          'fw_port'   => 'dot1dTpFdbPort',
 | 
			
		||||
          'fw_status' => 'dot1dTpFdbStatus',
 | 
			
		||||
          # Bridge Port Table: Dot1dBasePortEntry
 | 
			
		||||
          'bp_index'  => 'dot1dBasePortIfIndex',
 | 
			
		||||
          'bp_port'   => 'dot1dBasePortCircuit ',
 | 
			
		||||
          # Bridge Static (Destination-Address Filtering) Database
 | 
			
		||||
          'bs_mac'     => 'dot1dStaticAddress',
 | 
			
		||||
          'bs_port'   => 'dot1dStaticReceivePort',
 | 
			
		||||
          'bs_to'     => 'dot1dStaticAllowedToGoTo',
 | 
			
		||||
          'bs_status' => 'dot1dStaticStatus',
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
          # Inherit all the built in munging
 | 
			
		||||
          %SNMP::Info::MUNGE,
 | 
			
		||||
          # Add ones for our class
 | 
			
		||||
          'fw_mac' => \&SNMP::Info::munge_mac,
 | 
			
		||||
          'bs_mac' => \&SNMP::Info::munge_mac,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Bridge - Perl5 Interface to BRIDGE-MIB 
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
BRIDGE-MIB is used by most Layer 2 devices like Switches 
 | 
			
		||||
 | 
			
		||||
Inherits all methods from SNMP::Info
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $bridge = new SNMP::Info::Bridge(DestHost  => 'myswitch',
 | 
			
		||||
                               Community => 'public');
 | 
			
		||||
 my $mac = $bridge->mac(); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Bridge()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $bridge = new SNMP::Info::Bridge(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $bridge;
 | 
			
		||||
 | 
			
		||||
=item  $bridge->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $bridge->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $bridge->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Bridge Global Configuration Values
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bridge->b_mac()
 | 
			
		||||
 | 
			
		||||
Returns the MAC Address of the root bridge port
 | 
			
		||||
 | 
			
		||||
(B<dot1dBaseBridgeAddress>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->b_ports()
 | 
			
		||||
 | 
			
		||||
Returns the number of ports in device
 | 
			
		||||
 | 
			
		||||
(B<dot1dBaseNumPorts>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->b_type()
 | 
			
		||||
 | 
			
		||||
Returns the type? of the device
 | 
			
		||||
 | 
			
		||||
(B<dot1dBaseType>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Forwarding Table (dot1dTpFdbEntry)
 | 
			
		||||
 | 
			
		||||
=over 
 | 
			
		||||
 | 
			
		||||
=item $bridge->fw_mac()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table MAC Addresses
 | 
			
		||||
 | 
			
		||||
(B<dot1dTpFdbAddress>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries port interface identifier (iid)
 | 
			
		||||
 | 
			
		||||
(B<dot1dTpFdbPort>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->fw_status()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwading table entries status
 | 
			
		||||
 | 
			
		||||
(B<dot2dTpFdbStatus>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Bridge Port Table (dot1dBasePortEntry)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bridge->bp_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of bridge port table entries map back to interface identifier (iid)
 | 
			
		||||
 | 
			
		||||
(B<dot1dBasePortIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->bp_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of bridge port table entries physical port name.
 | 
			
		||||
 | 
			
		||||
(B<dot1dBasePortCircuit>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										258
									
								
								Info/CDP.pm
									
									
									
									
									
								
							
							
						
						
									
										258
									
								
								Info/CDP.pm
									
									
									
									
									
								
							@@ -1,258 +0,0 @@
 | 
			
		||||
# SNMP::Info::CDP
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CDP;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use Carp;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MIBS_V1 %MUNGE $INIT/;
 | 
			
		||||
# Debug
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
 | 
			
		||||
# Five data structures required by SNMP::Info
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
%MIBS    = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
 | 
			
		||||
%MIBS_V1 = ( 'CISCO-CDP-MIB-V1SMI' => 'cdpGlobalRun' );
 | 
			
		||||
# Notice we dont inherit the default GLOBALS and FUNCS
 | 
			
		||||
# only the default MUNGE.
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            'cdp_run'      => 'cdpGlobalRun',
 | 
			
		||||
            'cdp_interval' => 'cdpGlobalMessageInterval',
 | 
			
		||||
            'cdp_holdtime' => 'cdpGlobalHoldTime',
 | 
			
		||||
            'cdp_id'       => 'cdpGlobalDeviceId',
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%FUNCS  = (
 | 
			
		||||
            'c_if'           => 'cdpCacheIfIndex',
 | 
			
		||||
            'c_proto'        => 'cdpCacheAddressType',
 | 
			
		||||
            'c_ip'           => 'cdpCacheAddress',
 | 
			
		||||
            'c_ver'          => 'cdpCacheVersion',
 | 
			
		||||
            'c_id'           => 'cdpCacheDeviceId',
 | 
			
		||||
            'c_port'         => 'cdpCacheDevicePort',
 | 
			
		||||
            'c_platform'     => 'cdpCachePlatform',
 | 
			
		||||
            'c_capabilities' => 'cdpCacheCapabilities',
 | 
			
		||||
            'c_domain'       => 'cdpCacheVTPMgmtDomain',
 | 
			
		||||
            'c_vlan'         => 'cdpCacheNativeVLAN',
 | 
			
		||||
            'c_duplex'       => 'cdpCacheDuplex'
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
          'c_capabilities' => \&SNMP::Info::munge_octet2hex,
 | 
			
		||||
          'c_ip'           => \&SNMP::Info::munge_ip
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $cdp = shift;
 | 
			
		||||
 | 
			
		||||
    my $ver = $cdp->{_version};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    # SNMP v1 clients dont have the globals
 | 
			
		||||
    if (defined $ver and $ver == 1){
 | 
			
		||||
        my $c_ip = $cdp->c_ip();
 | 
			
		||||
        # See if anything in cdp cache, if so we have cdp
 | 
			
		||||
        return 1 if (defined $c_ip and scalar(keys %$c_ip)) ;
 | 
			
		||||
        return undef;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return $cdp->cdp_run();
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CDP - Perl5 Interface to Cisco Discovery Protocol (CDP) using SNMP
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
CDP provides Layer 2 discovery of attached devices that also
 | 
			
		||||
speak CDP, including switches, routers and hubs.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $cdp = new SNMP::Info::CDP( DestHost  => 'router' , 
 | 
			
		||||
                          Community => 'public' );
 | 
			
		||||
 $hascdp = $cdp->hasCDP() ? 'yes' : 'no';
 | 
			
		||||
 @neighbor_ips = values( %{$cdp->ip()} );
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item new SNMP::Info::CDP()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $cdp = new SNMP::Info::CDP(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public'
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $cdp;
 | 
			
		||||
 | 
			
		||||
=item  $cdp->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $cdp->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $cdp->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Your Device May Vary
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=head1 CDP GLOBAL VALUES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  $cdp->hasCDP()
 | 
			
		||||
 | 
			
		||||
Is CDP is active in this device?  
 | 
			
		||||
 | 
			
		||||
Accounts for SNMP version 1 devices which may have CDP but not cdp_run()
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_run()
 | 
			
		||||
 | 
			
		||||
Is CDP enabled on this device?
 | 
			
		||||
 | 
			
		||||
(B<cdpGlobalRun>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_interval()
 | 
			
		||||
 | 
			
		||||
Interval in seconds at which CDP messages are generated.
 | 
			
		||||
 | 
			
		||||
(B<cdpGlobalMessageInterval>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_holdtime()
 | 
			
		||||
 | 
			
		||||
Time in seconds that CDP messages are kept. 
 | 
			
		||||
 | 
			
		||||
(B<cdpGlobalHoldTime>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->cdp_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().
 | 
			
		||||
 | 
			
		||||
(B<cdpGlobalDeviceId>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 CDP CACHE ENTRIES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  $cdp->c_proto()
 | 
			
		||||
 | 
			
		||||
Returns remote address type received.  Usually IP.
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheAddressType>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IP address
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_ver() 
 | 
			
		||||
 | 
			
		||||
Returns remote hardware version
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheVersion>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_id()
 | 
			
		||||
 | 
			
		||||
Returns remote device id string
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
(B<cdpDevicePort>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_platform() 
 | 
			
		||||
 | 
			
		||||
Returns remote platform id 
 | 
			
		||||
 | 
			
		||||
(B<cdpCachePlatform>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_capabilities()
 | 
			
		||||
 | 
			
		||||
Returns Device Functional Capabilities bitmap.  
 | 
			
		||||
 | 
			
		||||
Anyone know where I can get info on how to decode this?
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheCapabilities>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_domain()
 | 
			
		||||
 | 
			
		||||
Returns remote VTP Management Domain as defined in CISCO-VTP-MIB::managementDomainName
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheVTPMgmtDomain>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_vlan()
 | 
			
		||||
 | 
			
		||||
Returns the remote interface native VLAN.
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheNativeVLAN>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_duplex() 
 | 
			
		||||
 | 
			
		||||
Returns the port duplex status from remote devices.
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheDuplex>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,141 +0,0 @@
 | 
			
		||||
# SNMP::Info::EtherLike
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::EtherLike;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
 | 
			
		||||
@SNMP::Info::EtherLike::ISA = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::EtherLike::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
 | 
			
		||||
# Same info in both rfc1398 and this?
 | 
			
		||||
%MIBS = ('ETHERLIKE-MIB' => 'etherMIB' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
          # EtherLike StatsTable
 | 
			
		||||
          'el_index'  => 'dot3StatsIndex',
 | 
			
		||||
          'el_duplex' => 'dot3StatsDuplexStatus',
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::MUNGE );
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::EtherLike - Perl5 Interface to SNMP ETHERLIKE-MIB 
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
ETHERLIKE-MIB is used by some Layer 3 Devices such as Cisco routers.
 | 
			
		||||
 | 
			
		||||
Inherits all methods from SNMP::Info
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $el = new SNMP::Info::EtherLike(DestHost  => 'myrouter',
 | 
			
		||||
                                    Community => 'public');
 | 
			
		||||
 | 
			
		||||
 my $el_decoder = $el->el_index();
 | 
			
		||||
 my $el_duplex = $el->el_duplex(); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::EtherLike()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $el = new SNMP::Info::EtherLike(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $el;
 | 
			
		||||
 | 
			
		||||
=item  $el->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $el->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $el->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item None
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 ETHERLIKE STATS TABLE (dot3StatsTable)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $el->el_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Indexes Stats Table to the interface index (iid).
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsIndex>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Indexes Stats Table to Duplex Status of port.
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsDuplexStatus>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										294
									
								
								Info/Layer1.pm
									
									
									
									
									
								
							
							
						
						
									
										294
									
								
								Info/Layer1.pm
									
									
									
									
									
								
							@@ -1,294 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices 
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer1;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer1::ISA = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Layer1::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
 | 
			
		||||
# See SNMP::Info for the details of these data structures and 
 | 
			
		||||
#       the interworkings.
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS, 
 | 
			
		||||
          'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex'
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::GLOBALS,
 | 
			
		||||
            'ports_managed'  => 'ifNumber',
 | 
			
		||||
            'rptr_slots'     => 'rptrGroupCapacity',
 | 
			
		||||
            'slots'          => 'rptrGroupCapacity'
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (
 | 
			
		||||
            %SNMP::Info::FUNCS,
 | 
			
		||||
            'i_up2'         => 'ifOperStatus',
 | 
			
		||||
            'i_up_admin2'   => 'ifAdminStatus',
 | 
			
		||||
            'rptr_ports'    => 'rptrGroupPortCapacity',
 | 
			
		||||
            'rptr_port'     => 'rptrPortIndex',
 | 
			
		||||
            'rptr_slot'     => 'rptrPortGroupIndex',
 | 
			
		||||
            'rptr_up_admin' => 'rptrPortAdminStatus',
 | 
			
		||||
            'rptr_up'       => 'rptrPortOperStatus',
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
            # Inherit all the built in munging
 | 
			
		||||
            %SNMP::Info::MUNGE,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
# assuming managed ports aren't in repeater ports?
 | 
			
		||||
sub ports {
 | 
			
		||||
    my $l1 = shift;
 | 
			
		||||
 | 
			
		||||
    my $ports         = $l1->ports_managed();
 | 
			
		||||
    my $rptr_ports    = $l1->rptr_ports();
 | 
			
		||||
 | 
			
		||||
    foreach my $group (keys %$rptr_ports){
 | 
			
		||||
        $ports += $rptr_ports->{$group}; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $ports;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $l1->model() - Looks at sysObjectID which gives the oid of the system
 | 
			
		||||
#       name, contained in a propriatry MIB. 
 | 
			
		||||
sub model {
 | 
			
		||||
    my $l1 = shift;
 | 
			
		||||
    my $id = $l1->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    
 | 
			
		||||
    # HP
 | 
			
		||||
    $model =~ s/^hpswitch//i;
 | 
			
		||||
 | 
			
		||||
    # Cisco
 | 
			
		||||
    $model =~ s/sysid$//i;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $l1 = shift;
 | 
			
		||||
    my $descr = $l1->description();
 | 
			
		||||
 | 
			
		||||
    return 'hp' if ($descr =~ /hp/i);
 | 
			
		||||
    return 'cisco' if ($descr =~ /(catalyst|cisco|ios)/i);
 | 
			
		||||
    return 'allied' if ($descr =~ /allied/i);
 | 
			
		||||
    return 'asante' if ($descr =~ /asante/i);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# By Default we'll use the description field
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $l1 = shift;
 | 
			
		||||
    my $interfaces = $l1->i_index();
 | 
			
		||||
    my $rptr_port  = $l1->rptr_port();
 | 
			
		||||
 | 
			
		||||
    foreach my $port (keys %$rptr_port){
 | 
			
		||||
        $interfaces->{$port} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return $interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up_admin {
 | 
			
		||||
    my $l1 = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_up_admin = $l1->i_up_admin2();
 | 
			
		||||
    my $rptr_up_admin = $l1->rptr_up_admin();
 | 
			
		||||
 | 
			
		||||
    foreach my $key (keys %$rptr_up_admin){
 | 
			
		||||
        my $up = $rptr_up_admin->{$key};
 | 
			
		||||
        $i_up_admin->{$key} = 'up' if $up =~ /enabled/; 
 | 
			
		||||
        $i_up_admin->{$key} = 'down' if $up =~ /disabled/; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_up_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $l1 = shift;
 | 
			
		||||
    my $i_up = $l1->i_up2();
 | 
			
		||||
    my $rptr_up = $l1->rptr_up();
 | 
			
		||||
 | 
			
		||||
    foreach my $key (keys %$rptr_up){
 | 
			
		||||
        my $up = $rptr_up->{$key};
 | 
			
		||||
        $i_up->{$key} = 'up' if $up =~ /operational/; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_up;
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1 - Perl5 Interface to Layer1 network devices.
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Layer1 device through SNMP.  Information is stored in a number of MIBs.
 | 
			
		||||
 | 
			
		||||
See super classes for descriptions of other available methods.
 | 
			
		||||
 | 
			
		||||
Inherits from: 
 | 
			
		||||
 | 
			
		||||
 SNMP::Info
 | 
			
		||||
 | 
			
		||||
MIBS: 
 | 
			
		||||
 | 
			
		||||
 MIBS listed in SNMP::Info
 | 
			
		||||
 | 
			
		||||
Cisco MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $l1 = new SNMP::Info::Layer1(DestHost  => 'mybridge' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer1()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $l1 = new SNMP::Info::Layer1(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $l1;
 | 
			
		||||
 | 
			
		||||
=item  $l1->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $l1->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $l1->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l1->vendor()
 | 
			
		||||
 | 
			
		||||
Trys to discover the vendor from $l1->model() and $l1->vendor()
 | 
			
		||||
 | 
			
		||||
=item $l1->ports_managed()
 | 
			
		||||
 | 
			
		||||
Gets the number of ports under the interface mib 
 | 
			
		||||
 | 
			
		||||
(B<ifNumber>)
 | 
			
		||||
 | 
			
		||||
=item $l1->ports()
 | 
			
		||||
 | 
			
		||||
Adds the values from rptr_ports() and ports_managed()
 | 
			
		||||
 | 
			
		||||
=item $l1->slots()
 | 
			
		||||
 | 
			
		||||
Number of 'groups' in the Repeater MIB
 | 
			
		||||
 | 
			
		||||
(B<rptrGroupCapacity>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l1->interfaces()
 | 
			
		||||
 | 
			
		||||
=item $l1->i_up()
 | 
			
		||||
 | 
			
		||||
=item $l1->i_up_admin()
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Repeater MIB
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_ports()
 | 
			
		||||
 | 
			
		||||
Number of ports in each group.
 | 
			
		||||
 | 
			
		||||
(B<rptrGroupPortCapacity>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_port()
 | 
			
		||||
 | 
			
		||||
Port number in Group
 | 
			
		||||
 | 
			
		||||
(B<rptrPortIndex>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_slot()
 | 
			
		||||
 | 
			
		||||
Group (slot) Number for given port.
 | 
			
		||||
 | 
			
		||||
(B<rptrPortGroupIndex>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_up_admin()
 | 
			
		||||
 | 
			
		||||
(B<rptrPortAdminStatus>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_up()
 | 
			
		||||
 | 
			
		||||
(B<rptrPortOperStatus>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,218 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer1::Allied
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer1::Allied;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
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 $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer1::GLOBALS,
 | 
			
		||||
            'root_ip'   => 'actualIPAddr',
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (%SNMP::Info::Layer1::FUNCS,
 | 
			
		||||
            'i_name2'    => 'ifName',
 | 
			
		||||
            'ati_p_name' => 'portName',
 | 
			
		||||
            'ati_up'     => 'linkTestLED',
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            %SNMP::Info::Layer1::MIBS,
 | 
			
		||||
            'ATI-MIB' => 'atiPortGroupIndex'
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (%SNMP::Info::Layer1::MUNGE,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'allied';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
 | 
			
		||||
    my $desc = $allied->description();
 | 
			
		||||
 | 
			
		||||
    if ($desc =~ /(AT-\d{4}\S{1}?)/){
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name{
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_name = $allied->i_name2();
 | 
			
		||||
 | 
			
		||||
    my $ati_p_name = $allied->ati_p_name();
 | 
			
		||||
 | 
			
		||||
    foreach my $port (keys %$ati_p_name){
 | 
			
		||||
        my $name = $ati_p_name->{$port};
 | 
			
		||||
        $i_name->{$port} = $name if (defined $name and $name !~ /^\s*$/);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return $i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_up = SNMP::Info::Layer1::i_up($allied);
 | 
			
		||||
    my $ati_up = $allied->ati_up();
 | 
			
		||||
 | 
			
		||||
    foreach my $port (keys %$ati_up){
 | 
			
		||||
        my $up = $ati_up->{$port};
 | 
			
		||||
        $i_up->{$port} = 'down' if $up eq 'linktesterror';
 | 
			
		||||
        $i_up->{$port} = 'up' if $up eq 'nolinktesterror';
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return $i_up;
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1::Allied - SNMP Interface to old Allied Hubs
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Allied device through SNMP. See inherited classes' documentation for 
 | 
			
		||||
inherited methods.
 | 
			
		||||
 | 
			
		||||
Inherits from:
 | 
			
		||||
 | 
			
		||||
 SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
Required MIBs:
 | 
			
		||||
 | 
			
		||||
 ATI-MIB - Download for your device from http://www.allied-telesyn.com/allied/support/
 | 
			
		||||
 | 
			
		||||
 MIBs listed in SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $allied = new SNMP::Info::Layer1::Allied(DestHost  => 'mycat1900' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer1::Allied()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $allied = new SNMP::Info::Layer1::Allied(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $allied;
 | 
			
		||||
 | 
			
		||||
=item  $allied->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $allied->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $allied->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $allied->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'allied' :)
 | 
			
		||||
 | 
			
		||||
=item $allied->root_ip()
 | 
			
		||||
 | 
			
		||||
Returns IP Address of Managed Hub.
 | 
			
		||||
 | 
			
		||||
(B<actualIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $allied->model()
 | 
			
		||||
 | 
			
		||||
Trys to cull out AT-nnnnX out of the description field.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $allied->i_name()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to human-set port name.
 | 
			
		||||
 | 
			
		||||
=item $allied->i_up()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to link status.  Changes
 | 
			
		||||
the values of ati_up() to 'up' and 'down'.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Allied MIB
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $allied->ati_p_name()
 | 
			
		||||
 | 
			
		||||
(B<portName>)
 | 
			
		||||
 | 
			
		||||
=item $allied->ati_up()
 | 
			
		||||
 | 
			
		||||
(B<linkTestLED>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,261 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer1::Asante
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer1::Asante;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
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 $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer1::GLOBALS,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (%SNMP::Info::Layer1::FUNCS,
 | 
			
		||||
            'i_speed2'     => 'ifSpeed',
 | 
			
		||||
            'i_mac2'       => 'ifPhysAddress',
 | 
			
		||||
            'i_descr2'     => 'ifDescr',
 | 
			
		||||
            'i_name2'      => 'ifName',
 | 
			
		||||
            'asante_port'  => 'ePortIndex',
 | 
			
		||||
            'asante_group' => 'ePortGrpIndex',
 | 
			
		||||
            'i_type'       => 'ePortStateType',
 | 
			
		||||
            'asante_up'    => 'ePortStateLinkStatus',
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            %SNMP::Info::Layer1::MIBS,
 | 
			
		||||
            'ASANTE-HUB1012-MIB' => 'asante'
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (%SNMP::Info::Layer1::MUNGE,
 | 
			
		||||
            'i_mac2' => \&SNMP::Info::munge_mac,
 | 
			
		||||
            'i_speed2' => \&SNMP::Info::munge_speed,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
 | 
			
		||||
    my $rptr_port = $asante->rptr_port();
 | 
			
		||||
 | 
			
		||||
    my %interfaces;
 | 
			
		||||
 | 
			
		||||
    foreach my $port (keys %$rptr_port){
 | 
			
		||||
        $interfaces{$port} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'asante';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
 | 
			
		||||
    my $id = $asante->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
 | 
			
		||||
    my $asante_up = $asante->asante_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/;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return $i_up;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_speed = $asante->i_speed2();
 | 
			
		||||
 | 
			
		||||
    my %i_speed;
 | 
			
		||||
 | 
			
		||||
    $i_speed{"1.2"} = $i_speed->{1};
 | 
			
		||||
 | 
			
		||||
    return \%i_speed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_mac = $asante->i_mac2();
 | 
			
		||||
 | 
			
		||||
    my %i_mac;
 | 
			
		||||
 | 
			
		||||
    $i_mac{"1.2"} = $i_mac->{1};
 | 
			
		||||
 | 
			
		||||
    return \%i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_description {
 | 
			
		||||
    return undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_name = $asante->i_descr2();
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
 | 
			
		||||
    $i_name{"1.2"} = $i_name->{1};
 | 
			
		||||
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1::Asante - SNMP Interface to old Asante 1012 Hubs
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Asante device through SNMP. See inherited classes' documentation for 
 | 
			
		||||
inherited methods.
 | 
			
		||||
 | 
			
		||||
Inherits from:
 | 
			
		||||
 | 
			
		||||
 SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
Required MIBs:
 | 
			
		||||
 | 
			
		||||
ASANTE-HUB1012-MIB - Download from http://www.mibdepot.com
 | 
			
		||||
 | 
			
		||||
 MIBs listed in SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $asante = new SNMP::Info::Layer1::Asante(DestHost  => 'mycat1900' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer1::Asante()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $asante = new SNMP::Info::Layer1::Asante(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $asante;
 | 
			
		||||
 | 
			
		||||
=item  $asante->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $asante->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $asante->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $asante->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'asante' :)
 | 
			
		||||
 | 
			
		||||
=item $asante->root_ip()
 | 
			
		||||
 | 
			
		||||
Returns IP Address of Managed Hub.
 | 
			
		||||
 | 
			
		||||
(B<actualIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $asante->model()
 | 
			
		||||
 | 
			
		||||
Trys to cull out AT-nnnnX out of the description field.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $asante->i_name()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to human-set port name.
 | 
			
		||||
 | 
			
		||||
=item $asante->i_up()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to link status.  Changes
 | 
			
		||||
the values of ati_up() to 'up' and 'down'.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Asante MIB
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $asante->ati_p_name()
 | 
			
		||||
 | 
			
		||||
(B<portName>)
 | 
			
		||||
 | 
			
		||||
=item $asante->ati_up()
 | 
			
		||||
 | 
			
		||||
(B<linkTestLED>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										263
									
								
								Info/Layer2.pm
									
									
									
									
									
								
							
							
						
						
									
										263
									
								
								Info/Layer2.pm
									
									
									
									
									
								
							@@ -1,263 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices 
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::CDP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
 | 
			
		||||
# See SNMP::Info for the details of these data structures and 
 | 
			
		||||
#       the interworkings.
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS, 
 | 
			
		||||
          %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
          %SNMP::Info::CDP::MIBS,
 | 
			
		||||
          'CISCO-PRODUCTS-MIB' => 'sysName',
 | 
			
		||||
          'CISCO-STACK-MIB'    => 'wsc1900sysID',
 | 
			
		||||
          'HP-ICF-OID'         => 'hpSwitch4000',
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::GLOBALS,
 | 
			
		||||
            %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
            %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (
 | 
			
		||||
            %SNMP::Info::FUNCS,
 | 
			
		||||
            %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
            %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
            # Inherit all the built in munging
 | 
			
		||||
            %SNMP::Info::MUNGE,
 | 
			
		||||
            %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
            %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
# $l2->model() - Looks at sysObjectID which gives the oid of the system
 | 
			
		||||
#       name, contained in a propriatry MIB. 
 | 
			
		||||
sub model {
 | 
			
		||||
    my $l2 = shift;
 | 
			
		||||
    my $id = $l2->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    
 | 
			
		||||
    # HP
 | 
			
		||||
    $model =~ s/^hpswitch//i;
 | 
			
		||||
 | 
			
		||||
    # Cisco
 | 
			
		||||
    $model =~ s/sysid$//i;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $l2 = shift;
 | 
			
		||||
    my $model = $l2->model();
 | 
			
		||||
    my $descr = $l2->description();
 | 
			
		||||
 | 
			
		||||
    if ($model =~ /hp/i or $descr =~ /hp/i) {
 | 
			
		||||
        return 'hp';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i) {
 | 
			
		||||
        return 'cisco';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l2 = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_type = $l2->i_type();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore = ();
 | 
			
		||||
 | 
			
		||||
    foreach my $if (keys %$i_type){
 | 
			
		||||
        my $type = $i_type->{$if};
 | 
			
		||||
        $i_ignore{$if}++ 
 | 
			
		||||
            if $type =~ /(loopback|propvirtual|other|cpu)/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}    
 | 
			
		||||
 | 
			
		||||
# By Default we'll use the description field
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $l2 = shift;
 | 
			
		||||
    my $interfaces = $l2->i_index();
 | 
			
		||||
    my $i_descr    = $l2->i_description(); 
 | 
			
		||||
    my $i_name     = $l2->i_name();
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
        my $port = $i_descr->{$iid};
 | 
			
		||||
        my $name = $i_name->{$iid};
 | 
			
		||||
        $port = $name if (defined $name and $name !~ /^\s*$/);
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        # Cisco 1900 has a space in some of its port descr.
 | 
			
		||||
        # get rid of any weird characters
 | 
			
		||||
        $port =~ s/[^\d\/,()\w]+//gi;
 | 
			
		||||
    
 | 
			
		||||
        # Translate Cisco 2926,etc. from 1/5 to 1.5
 | 
			
		||||
        $port =~ s/\//\./ if ($port =~ /^\d+\/\d+$/);
 | 
			
		||||
 | 
			
		||||
        $if{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2 - Perl5 Interface to Layer2 network devices.
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Layer2 device through SNMP.  Information is stored in a number of MIBs.
 | 
			
		||||
 | 
			
		||||
See super classes for descriptions of other available methods.
 | 
			
		||||
 | 
			
		||||
Inherits from: 
 | 
			
		||||
 | 
			
		||||
 SNMP::Info
 | 
			
		||||
 SNMP::Info::Bridge
 | 
			
		||||
 SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
MIBS: 
 | 
			
		||||
 | 
			
		||||
 CISCO-PRODUCTS-MIB - Needed for ID of Cisco Products
 | 
			
		||||
 CISCO-STACK-MIB    - Needed for ID of Cisco Products
 | 
			
		||||
 HP-ICF-OID         - Needed for ID of HP    Products
 | 
			
		||||
 MIBS listed in SNMP::Info::Bridge and SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
Cisco MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
 | 
			
		||||
HP MIBs can be found at http://www.hp.com/rnd/software
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $l2 = new SNMP::Info::Layer2(DestHost  => 'mybridge' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer2()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $l2 = new SNMP::Info::Layer2(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $l2;
 | 
			
		||||
 | 
			
		||||
=item  $l2->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $l2->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $l2->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l2->model()
 | 
			
		||||
 | 
			
		||||
Cross references $l2->id() with product IDs in the 
 | 
			
		||||
Cisco and HP specific MIBs.
 | 
			
		||||
 | 
			
		||||
For HP devices, removes 'hpswitch' from the name
 | 
			
		||||
 | 
			
		||||
For Cisco devices, removes 'sysid' from the name
 | 
			
		||||
 | 
			
		||||
=item $l2->vendor()
 | 
			
		||||
 | 
			
		||||
Trys to discover the vendor from $l2->model() and $l2->vendor()
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l2->interfaces()
 | 
			
		||||
 | 
			
		||||
Creates a map between the interface identifier (iid) and the physical port name.
 | 
			
		||||
 | 
			
		||||
Defaults to B<ifDescr> but checks and overrides with B<ifName>
 | 
			
		||||
 | 
			
		||||
=item $l2->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Increments value of IID if port is to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores ports with B<ifType> of loopback,propvirtual,other, and cpu
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,428 +0,0 @@
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
# SNMP::Info::Layer2::Bay
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Bay;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Bay::ISA = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Bay::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
             'cdp_id'  => 's5EnMsTopIpAddr',
 | 
			
		||||
             'cdp_run' => 's5EnMsTopStatus',
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (%SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
            'imac2'      => 'ifPhysAddress',
 | 
			
		||||
            # S5-ETH-MULTISEG-TOPOLOGY-MIB::s5EnMsTopNmmTable
 | 
			
		||||
            'bay_topo_slot'     => 's5EnMsTopNmmSlot',
 | 
			
		||||
            'bay_topo_port'     => 's5EnMsTopNmmPort',
 | 
			
		||||
            'bay_topo_ip'       => 's5EnMsTopNmmIpAddr',
 | 
			
		||||
            'bay_topo_seg'      => 's5EnMsTopNmmSegId',
 | 
			
		||||
            'bay_topo_mac'      => 's5EnMsTopNmmMacAddr',
 | 
			
		||||
            'bay_topo_platform' => 's5EnMsTopNmmChassisType',
 | 
			
		||||
            'bay_topo_localseg' => 's5EnMsTopNmmLocalSeg',
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
            'SYNOPTICS-ROOT-MIB'           => 'synoptics',
 | 
			
		||||
            'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop'
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
delete $MIBS{'CISCO-CDP-MIB'};
 | 
			
		||||
# 450's report full duplex as speed = 20mbps?!
 | 
			
		||||
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
 | 
			
		||||
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (%SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
            'i_mac2' => \&SNMP::Info::munge_mac ,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    # or nortel, or synopsis?
 | 
			
		||||
    return 'bay';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
 | 
			
		||||
    my $i_type = $bay->i_type();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if (keys %$i_type){
 | 
			
		||||
        my $type = $i_type->{$if};  
 | 
			
		||||
        $i_ignore{$if}++ if $type =~ /(loopback|propvirtual|cpu)/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $i_index = $bay->i_index();
 | 
			
		||||
 | 
			
		||||
    return $i_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mac { 
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $i_mac = $bay->i_mac2();
 | 
			
		||||
 | 
			
		||||
    # Bay 303's with a hw rev < 2.11.4.5 report the mac as all zeros
 | 
			
		||||
    foreach my $iid (keys %$i_mac){
 | 
			
		||||
        my $mac = $i_mac->{$iid};
 | 
			
		||||
        delete $i_mac->{$iid} if $mac eq '00:00:00:00:00:00';
 | 
			
		||||
    }
 | 
			
		||||
    return $i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $id = $bay->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    $model =~ s/^sreg-//i;
 | 
			
		||||
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
 | 
			
		||||
    return '303' if ($descr =~ /\D303\D/);
 | 
			
		||||
    return '304' if ($descr =~ /\D304\D/);
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Hack in some CDP type stuff
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $entry (keys %$bay_topo_port){
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
        $c_if{"$port.1"} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $bay_topo_ip   = $bay->bay_topo_ip();
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
    my $ip = $bay->cdp_ip();
 | 
			
		||||
    
 | 
			
		||||
    # Count the number of devices seen on each port.
 | 
			
		||||
    #   more than one device seen means connected to a non-bay
 | 
			
		||||
    #   device, but other bay devices are squawking further away.
 | 
			
		||||
    my %ip_port;
 | 
			
		||||
    foreach my $entry (keys %$bay_topo_ip){
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
        my $ip   = $bay_topo_ip->{$entry};
 | 
			
		||||
        push(@{$ip_port{$port}},$ip);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $port (keys %ip_port){
 | 
			
		||||
        my $ips = $ip_port{$port};
 | 
			
		||||
        if (scalar @$ips == 1) {
 | 
			
		||||
            $c_ip{"$port.1"} = $ips->[0];
 | 
			
		||||
        } else {
 | 
			
		||||
            $c_ip{"$port.1"} = $ips;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
    my $bay_topo_seg = $bay->bay_topo_seg();
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $entry (keys %$bay_topo_seg){
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
 | 
			
		||||
        # For fake remotes (multiple IPs for a c_ip), use first found
 | 
			
		||||
        next if defined $c_port{"$port.1"};
 | 
			
		||||
 | 
			
		||||
        my $seg  = $bay_topo_seg->{$entry};
 | 
			
		||||
 | 
			
		||||
        # Segment id is (256 * remote slot_num) + (remote_port)
 | 
			
		||||
        my $remote_port = $seg % 256;
 | 
			
		||||
    
 | 
			
		||||
        $c_port{"$port.1"} = $remote_port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $bay_topo_port     = $bay->bay_topo_port();
 | 
			
		||||
    my $bay_topo_platform = $bay->bay_topo_platform();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $entry (keys %$bay_topo_platform){
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
 | 
			
		||||
        # For fake remotes (multiple IPs for a c_ip), use first found
 | 
			
		||||
        next if defined $c_platform{"$port.1"};
 | 
			
		||||
 | 
			
		||||
        my $platform  = $bay_topo_platform->{$entry};
 | 
			
		||||
 | 
			
		||||
        $c_platform{"$port.1"} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Bay - SNMP Interface to old Bay Network Switches
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Bay device through SNMP. 
 | 
			
		||||
 | 
			
		||||
Inherits from 
 | 
			
		||||
 | 
			
		||||
 SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
Required MIBs:
 | 
			
		||||
 | 
			
		||||
 SYNOPTICS-ROOT-MIB
 | 
			
		||||
 S5-ETH-MULTISEG-TOPOLOGY-MIB
 | 
			
		||||
 MIBS listed in SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
Bay MIBs can be found on the CD that came with your product.  
 | 
			
		||||
 | 
			
		||||
Or, if you still have a service contract they can be downloaded at
 | 
			
		||||
www.nortelnetworks.com
 | 
			
		||||
 | 
			
		||||
They have also been seen at : http://www.inotech.com/mibs/vendor/baynetworks/synoptics/synoptics.asp
 | 
			
		||||
 | 
			
		||||
Or http://www.oidview.com/mibs/detail.html under Synoptics.
 | 
			
		||||
 | 
			
		||||
You will need at least the two listed above, and probably a few more.  
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $bay = new SNMP::Info::Layer2::Bay(DestHost  => 'mybayswitch' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer2::Bay()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $bay = new SNMP::Info::Layer2::Bay(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $bay;
 | 
			
		||||
 | 
			
		||||
=item  $bay->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $bay->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $bay->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'bay' :)
 | 
			
		||||
 | 
			
		||||
=item $bay->model()
 | 
			
		||||
 | 
			
		||||
Cross references $bay->id() to the SYNOPTICS-MIB and returns
 | 
			
		||||
the results.  303s and 304s have the same ID, so we have a hack
 | 
			
		||||
to return depending on which it is. 
 | 
			
		||||
 | 
			
		||||
Removes sreg- from the model name
 | 
			
		||||
 | 
			
		||||
=item $bay->cdp_id()
 | 
			
		||||
 | 
			
		||||
Returns the IP that the device is sending out for its Nmm topology info.
 | 
			
		||||
 | 
			
		||||
(B<s5EnMsTopIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $bay->cdp_run()
 | 
			
		||||
 | 
			
		||||
Returns if the S5-ETH-MULTISEG-TOPOLOGY info is on for this device. 
 | 
			
		||||
 | 
			
		||||
(B<s5EnMsTopStatus>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to physical ports. 
 | 
			
		||||
 | 
			
		||||
Currently simply returns the B<ifIndex>
 | 
			
		||||
 | 
			
		||||
=item $bay->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to ignore.
 | 
			
		||||
 | 
			
		||||
Simply calls the SNMP::Info::Layer2::i_ignore() fn for this.
 | 
			
		||||
 | 
			
		||||
=item $bay->i_mac()
 | 
			
		||||
 | 
			
		||||
Returns the B<ifPhysAddress> table entries. 
 | 
			
		||||
 | 
			
		||||
Removes all entries matching '00:00:00:00:00:00' -- Certain 
 | 
			
		||||
older revisions of Bay 303 and 304 firmware report all zeros
 | 
			
		||||
for each port mac.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Psuedo CDP information
 | 
			
		||||
 | 
			
		||||
All entries with port=0 are local and ignored.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->c_if()
 | 
			
		||||
 | 
			
		||||
Returns referenece to hash.  Key: port.1 Value: port (iid)
 | 
			
		||||
 | 
			
		||||
=item $bay->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns referenece to hash.  Key: port.1 
 | 
			
		||||
 | 
			
		||||
The value of each hash entry can either be a scalar or an array.
 | 
			
		||||
A scalar value is most likely a direct neighbor to that port. 
 | 
			
		||||
It is possible that there is a non-bay device in between this device and the remote device.
 | 
			
		||||
 | 
			
		||||
An array value represents a list of seen devices.  The only time you will get an array
 | 
			
		||||
of nieghbors, is if there is a non-bay device in between two or more devices. 
 | 
			
		||||
 | 
			
		||||
Use the data from the Layer2 Topology Table below to dig deeper.
 | 
			
		||||
 | 
			
		||||
=item $bay->port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: port.1 Value: port
 | 
			
		||||
 | 
			
		||||
=item $bay->platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: port.1 Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Layer2 Topology info (s5EnMsTopNmmTable)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_slot()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:slot number
 | 
			
		||||
 | 
			
		||||
(B<s5EnMsTopNmmSlot>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Port Number (interface iid)
 | 
			
		||||
 | 
			
		||||
(B<s5EnMsTopNmmPort>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote IP address of entry
 | 
			
		||||
 | 
			
		||||
(B<s5EnMsTopNmmIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_seg()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote Segment ID
 | 
			
		||||
 | 
			
		||||
(B<s5EnMsTopNmmSegId>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_mac
 | 
			
		||||
(B<s5EnMsTopNmmMacAddr>)
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote MAC address
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_platform
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote Device Type
 | 
			
		||||
 | 
			
		||||
(B<s5EnMsTopNmmChassisType>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_localseg
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Boolean, if bay_topo_seg() is local
 | 
			
		||||
 | 
			
		||||
(B<s5EnMsTopNmmLocalSeg>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,293 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer2::C1900
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::C1900;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer2::GLOBALS
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (%SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
            'i_type2'              => 'ifType',
 | 
			
		||||
            # ESSWITCH-MIB
 | 
			
		||||
            'c1900_p_index'        => 'swPortIndex',
 | 
			
		||||
            'c1900_p_ifindex'      => 'swPortIfIndex',
 | 
			
		||||
            'c1900_p_duplex'       => 'swPortDuplexStatus', 
 | 
			
		||||
            'c1900_p_duplex_admin' => 'swPortFullDuplex', 
 | 
			
		||||
            'c1900_p_name'         => 'swPortName', 
 | 
			
		||||
            'c1900_p_up_admin'     => 'swPortAdminStatus', 
 | 
			
		||||
            'c1900_p_type'         => 'swPortMediaCapability',
 | 
			
		||||
            'c1900_p_media'        => 'swPortConnectorType',
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
            # Also known as the ESSWITCH-MIB
 | 
			
		||||
            'STAND-ALONE-ETHERNET-SWITCH-MIB' =>  'series2000'
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (%SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $c1900 = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $interfaces     = $c1900->interfaces();
 | 
			
		||||
    my $c1900_p_index  = $c1900->c1900_p_index();
 | 
			
		||||
    my $c1900_p_duplex = $c1900->c1900_p_duplex();
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
    my %reverse_1900 = reverse %$c1900_p_index;
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $if (keys %$interfaces){
 | 
			
		||||
        my $port_1900 = $reverse_1900{$if};
 | 
			
		||||
        next unless defined $port_1900;
 | 
			
		||||
        my $duplex = $c1900_p_duplex->{$port_1900};
 | 
			
		||||
        next unless defined $duplex; 
 | 
			
		||||
    
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $i_duplex{$if}=$duplex; 
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $c1900 = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $interfaces     = $c1900->interfaces();
 | 
			
		||||
    my $c1900_p_index  = $c1900->c1900_p_index();
 | 
			
		||||
    my $c1900_p_admin  = $c1900->c1900_p_duplex_admin();
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
    my %reverse_1900 = reverse %$c1900_p_index;
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $if (keys %$interfaces){
 | 
			
		||||
        my $port_1900 = $reverse_1900{$if};
 | 
			
		||||
        next unless defined $port_1900;
 | 
			
		||||
        my $duplex = $c1900_p_admin->{$port_1900};
 | 
			
		||||
        next unless defined $duplex; 
 | 
			
		||||
    
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /disabled/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /flow control/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /enabled/i;
 | 
			
		||||
        $duplex = 'auto' if $duplex =~ /auto/i;
 | 
			
		||||
        $i_duplex_admin{$if}=$duplex; 
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_type {
 | 
			
		||||
    my $c1900 = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_type        = $c1900->i_type2();
 | 
			
		||||
    my $c1900_p_index = $c1900->c1900_p_index();
 | 
			
		||||
    my $c1900_p_type  = $c1900->c1900_p_type();
 | 
			
		||||
    my $c1900_p_media = $c1900->c1900_p_media();
 | 
			
		||||
 | 
			
		||||
    foreach my $p_iid (keys %$c1900_p_index){
 | 
			
		||||
        my $port  = $c1900_p_index->{$p_iid};
 | 
			
		||||
        my $type  = $c1900_p_type->{$p_iid};
 | 
			
		||||
        my $media = $c1900_p_media->{$p_iid};
 | 
			
		||||
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next unless defined $type;
 | 
			
		||||
        next unless defined $media;
 | 
			
		||||
 | 
			
		||||
        $i_type->{$port} = "$type $media";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_type;
 | 
			
		||||
}
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::C1900 - SNMP Interface to old C1900 Network Switches
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
C1900 device through SNMP. See inherited classes' documentation for 
 | 
			
		||||
inherited methods.
 | 
			
		||||
 | 
			
		||||
Inherits from:
 | 
			
		||||
 | 
			
		||||
 SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
Required MIBs:
 | 
			
		||||
 | 
			
		||||
 STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)
 | 
			
		||||
 MIBs listed in SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $c1900 = new SNMP::Info::Layer2::C1900(DestHost  => 'mycat1900' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer2::C1900()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $c1900 = new SNMP::Info::Layer2::C1900(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $c1900;
 | 
			
		||||
 | 
			
		||||
=item  $c1900->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $c1900->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $c1900->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c1900->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco' :)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to current link duplex
 | 
			
		||||
 | 
			
		||||
Crosses $c1900->c1900_p_index() with $c1900->c1900_p_duplex;
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to admin duplex setting
 | 
			
		||||
 | 
			
		||||
Crosses $c1900->c1900_p_index() with $c1900->c1900_p_duplex_admin;
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IID to port type
 | 
			
		||||
 | 
			
		||||
Takes the default ifType and overrides it with 
 | 
			
		||||
 | 
			
		||||
c1900_p_type() and c1900_p_media()  if they exist.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 STAND-ALONE-ETHERNET-SWITCH-MIB Switch Port Table Entries:
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_index()
 | 
			
		||||
 | 
			
		||||
Maps the Switch Port Table to the IID
 | 
			
		||||
 | 
			
		||||
B<swPortIfIndex>
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_duplex()
 | 
			
		||||
 | 
			
		||||
Gives Port Duplex Info
 | 
			
		||||
 | 
			
		||||
B<swPortDuplexStatus>
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Gives admin setting for Duplex Info
 | 
			
		||||
 | 
			
		||||
B<swPortFullDuplex>
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_name()
 | 
			
		||||
 | 
			
		||||
Gives human set name for port 
 | 
			
		||||
 | 
			
		||||
B<swPortName>
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_up_admin()
 | 
			
		||||
 | 
			
		||||
Gives Admin status of port enabled.
 | 
			
		||||
 | 
			
		||||
B<swPortAdminStatus>
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_type()
 | 
			
		||||
 | 
			
		||||
Gives Type of port, ie. "general-ethernet"
 | 
			
		||||
 | 
			
		||||
B<swPortMediaCapability>
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_media()
 | 
			
		||||
 | 
			
		||||
Gives the media of the port , ie "fiber-sc"
 | 
			
		||||
 | 
			
		||||
B<swPortConnectorType>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,264 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer2::C2900
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::C2900;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer2::GLOBALS
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (%SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
            # C2900PortEntry
 | 
			
		||||
            'c2900_p_index' => 'c2900PortIfIndex',
 | 
			
		||||
            'c2900_p_duplex'   => 'c2900PortDuplexStatus',
 | 
			
		||||
            'c2900_p_duplex_admin'   => 'c2900PortDuplexState',
 | 
			
		||||
            'c2900_p_speed_admin'   => 'c2900PortAdminSpeed',
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
            'CISCO-C2900-MIB' =>  'ciscoC2900MIB'
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (%SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $c2900 = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $interfaces     = $c2900->interfaces();
 | 
			
		||||
    my $c2900_p_index  = $c2900->c2900_p_index();
 | 
			
		||||
    my $c2900_p_duplex = $c2900->c2900_p_duplex();
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
    my %reverse_2900 = reverse %$c2900_p_index;
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $if (keys %$interfaces){
 | 
			
		||||
        my $port_2900 = $reverse_2900{$if};
 | 
			
		||||
        next unless defined $port_2900;
 | 
			
		||||
        my $duplex = $c2900_p_duplex->{$port_2900};
 | 
			
		||||
        next unless defined $duplex; 
 | 
			
		||||
    
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $i_duplex{$if}=$duplex; 
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $c2900 = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $interfaces     = $c2900->interfaces();
 | 
			
		||||
    my $c2900_p_index  = $c2900->c2900_p_index();
 | 
			
		||||
    my $c2900_p_admin = $c2900->c2900_p_duplex_admin();
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
    my %reverse_2900 = reverse %$c2900_p_index;
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $if (keys %$interfaces){
 | 
			
		||||
        my $port_2900 = $reverse_2900{$if};
 | 
			
		||||
        next unless defined $port_2900;
 | 
			
		||||
        my $duplex = $c2900_p_admin->{$port_2900};
 | 
			
		||||
        next unless defined $duplex; 
 | 
			
		||||
    
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $duplex = 'auto' if $duplex =~ /auto/i;
 | 
			
		||||
        $i_duplex_admin{$if}=$duplex; 
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use i_descritption for port key, cuz i_name can be manually entered.
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $c2900 = shift;
 | 
			
		||||
    my $interfaces = $c2900->i_index();
 | 
			
		||||
    my $i_descr    = $c2900->i_description(); 
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
        my $port = $i_descr->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $port =~ s/\./\//g if( $port =~ /\d+\.\d+$/);
 | 
			
		||||
        $port =~ s/[^\d\/,()\w]+//gi;
 | 
			
		||||
    
 | 
			
		||||
        $if{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Network Switches
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
C2900 device through SNMP. 
 | 
			
		||||
 | 
			
		||||
MIBS:  CISCO-C2900-MIB
 | 
			
		||||
 | 
			
		||||
Inherits all SNMP::Info::Layer2 methods.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $c2900 = new SNMP::Info::Layer2::C2900(DestHost  => 'mycat2900' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer2::C2900()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $c2900 = new SNMP::Info::Layer2::C2900(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $c2900;
 | 
			
		||||
 | 
			
		||||
=item  $c2900->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $c2900->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $c2900->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c2900->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'cisco' :)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c2900->interfaces()
 | 
			
		||||
 | 
			
		||||
    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 broadcasted CDP port name. 
 | 
			
		||||
        (Ethernet0.1 -> Ethernet0/1)
 | 
			
		||||
 | 
			
		||||
    Also, any weird characters are removed, as I saw a few pop up.
 | 
			
		||||
 | 
			
		||||
=item $c2900->i_duplex()
 | 
			
		||||
 | 
			
		||||
    Returns reference to map of IIDs to current link duplex
 | 
			
		||||
 | 
			
		||||
    Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex;
 | 
			
		||||
 | 
			
		||||
=item $c2900->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
    Returns reference to hash of IIDs to admin duplex setting
 | 
			
		||||
    
 | 
			
		||||
    Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 C2900-MIB Port Entry Table 
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_index()
 | 
			
		||||
 | 
			
		||||
    Maps the Switch Port Table to the IID
 | 
			
		||||
 | 
			
		||||
    B<c2900PortIfIndex>
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_duplex()
 | 
			
		||||
 | 
			
		||||
    Gives Port Duplex Info
 | 
			
		||||
 | 
			
		||||
    B<c2900PortDuplexStatus>
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_duplex_admin()
 | 
			
		||||
 | 
			
		||||
    Gives admin setting for Duplex Info
 | 
			
		||||
 | 
			
		||||
    B<c2900PortDuplexState>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_speed_admin()
 | 
			
		||||
 | 
			
		||||
    Gives Admin speed of port 
 | 
			
		||||
 | 
			
		||||
    B<c2900PortAdminSpeed>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
@@ -1,508 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer2::Catalyst
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Catalyst;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT 
 | 
			
		||||
            %MYGLOBALS %MYMIBS %MYFUNCS %MYMUNGE %MUNGE $INIT/ ;
 | 
			
		||||
@SNMP::Info::Layer2::Catalyst::ISA = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
 | 
			
		||||
# See SNMP::Info for the details of these data structures and 
 | 
			
		||||
#       the interworkings.
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
 | 
			
		||||
%MYMIBS = (
 | 
			
		||||
          'CISCO-STACK-MIB' => 'moduleType',
 | 
			
		||||
          'CISCO-VTP-MIB'   => 'vtpVlanIndex'
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, 
 | 
			
		||||
          %MYMIBS );
 | 
			
		||||
 | 
			
		||||
%MYGLOBALS = (
 | 
			
		||||
            # these are in CISCO-STACK-MIB
 | 
			
		||||
            'sysip'       => 'sysIpAddr',    
 | 
			
		||||
            'netmask'     => 'sysNetMask',    
 | 
			
		||||
            'broadcast'   => 'sysBroadcast',
 | 
			
		||||
            'serial'      => 'chassisSerialNumberString',    
 | 
			
		||||
            'model'       => 'chassisModel',    
 | 
			
		||||
            'ps1_type'    => 'chassisPs1Type',    
 | 
			
		||||
            'ps1_status'  => 'chassisPs1Status',    
 | 
			
		||||
            'ps2_type'    => 'chassisPs2Type',    
 | 
			
		||||
            'ps2_status'  => 'chassisPs2Status',    
 | 
			
		||||
            'slots'       => 'chassisNumSlots',    
 | 
			
		||||
            'fan'         => 'chassisFanStatus'
 | 
			
		||||
             );
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
            %MYGLOBALS
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MYFUNCS = (
 | 
			
		||||
            'i_type2'        => 'ifType',
 | 
			
		||||
            # CISCO-STACK-MIB::moduleEntry
 | 
			
		||||
            #   These are blades in a catalyst device
 | 
			
		||||
            'm_type'         => 'moduleType',
 | 
			
		||||
            'm_model'        => 'moduleModel',
 | 
			
		||||
            'm_serial'       => 'moduleSerialNumber',
 | 
			
		||||
            'm_status'       => 'moduleStatus',
 | 
			
		||||
            'm_name'         => 'moduleName',
 | 
			
		||||
            'm_ports'        => 'moduleNumPorts',
 | 
			
		||||
            'm_ports_status' => 'modulePortStatus',
 | 
			
		||||
            'm_hwver'        => 'moduleHwVersion',
 | 
			
		||||
            'm_fwver'        => 'moduleFwVersion',
 | 
			
		||||
            'm_swver'        => 'moduleSwVersion',
 | 
			
		||||
            # Router Blades :
 | 
			
		||||
            'm_ip'           => 'moduleIPAddress',
 | 
			
		||||
            'm_sub1'         => 'moduleSubType',
 | 
			
		||||
            'm_sub2'         => 'moduleSubType2',
 | 
			
		||||
            # CISCO-STACK-MIB::portEntry 
 | 
			
		||||
            'p_name'    => 'portName',
 | 
			
		||||
            'p_type'    => 'portType',
 | 
			
		||||
            'p_status'  => 'portOperStatus',
 | 
			
		||||
            'p_status2' => 'portAdditionalStatus',
 | 
			
		||||
            'p_speed'   => 'portAdminSpeed',
 | 
			
		||||
            'p_duplex'  => 'portDuplex',
 | 
			
		||||
            'p_port'    => 'portIfIndex',
 | 
			
		||||
            # CISCO-STACK-MIB::PortCpbEntry
 | 
			
		||||
            'p_speed_admin'  => 'portCpbSpeed',
 | 
			
		||||
            'p_duplex_admin' => 'portCpbDuplex',
 | 
			
		||||
            # CISCO-VTP-MIB::VtpVlanEntry 
 | 
			
		||||
            'v_state'   => 'vtpVlanState',
 | 
			
		||||
            'v_type'    => 'vtpVlanType',
 | 
			
		||||
            'v_name'    => 'vtpVlanName',
 | 
			
		||||
            'v_mtu'     => 'vtpVlanMtu',
 | 
			
		||||
           );
 | 
			
		||||
%FUNCS   = (
 | 
			
		||||
            %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
            %MYFUNCS
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
%MYMUNGE = (
 | 
			
		||||
            'm_ports_status' => \&munge_port_status,
 | 
			
		||||
            'p_duplex_admin' => \&SNMP::Info::munge_bits,
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
            # Inherit all the built in munging
 | 
			
		||||
            %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
            %MYMUNGE
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
%PORTSTAT = (1 => 'other',
 | 
			
		||||
             2 => 'ok',
 | 
			
		||||
             3 => 'minorFault',
 | 
			
		||||
             4 => 'majorFault');
 | 
			
		||||
 | 
			
		||||
# Changes binary byte describing each port into ascii, and returns
 | 
			
		||||
# an ascii list separated by spaces.
 | 
			
		||||
sub munge_port_status {
 | 
			
		||||
    my $status = shift;
 | 
			
		||||
    my @vals = map($PORTSTAT{$_},unpack('C*',$status));
 | 
			
		||||
    return join(' ',@vals);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Overidden 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 %i_physical;
 | 
			
		||||
    foreach my $port (keys %$p_port) {
 | 
			
		||||
        my $iid = $p_port->{$port};
 | 
			
		||||
        $i_physical{$iid} = 1;  
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_physical;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_type {
 | 
			
		||||
    my $cat = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_port = $cat->p_port();
 | 
			
		||||
    my $p_type  = $cat->p_type();
 | 
			
		||||
 | 
			
		||||
    # Get more generic port types from IF-MIB
 | 
			
		||||
    my $i_type  = $cat->i_type2();
 | 
			
		||||
 | 
			
		||||
    # Now Override w/ port entries
 | 
			
		||||
    foreach my $port (keys %$p_type) {
 | 
			
		||||
        my $iid = $p_port->{$port};
 | 
			
		||||
        $i_type->{$iid} = $p_type->{$port};  
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# p_* functions are indexed to physical port.  let's index these
 | 
			
		||||
#   to snmp iid
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $cat = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_port = $cat->p_port();
 | 
			
		||||
    my $p_name  = $cat->p_name();
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
    foreach my $port (keys %$p_name) {
 | 
			
		||||
        my $iid = $p_port->{$port};
 | 
			
		||||
        $i_name{$iid} = $p_name->{$port};
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_name; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $cat = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_port = $cat->p_port();
 | 
			
		||||
    my $p_duplex  = $cat->p_duplex();
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $port (keys %$p_duplex) {
 | 
			
		||||
        my $iid = $p_port->{$port};
 | 
			
		||||
        $i_duplex{$iid} = $p_duplex->{$port};
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $cat = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_port          = $cat->p_port();
 | 
			
		||||
    my $p_duplex_admin  = $cat->p_duplex_admin();
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $port (keys %$p_duplex_admin) {
 | 
			
		||||
        my $iid = $p_port->{$port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        my $duplex = $p_duplex_admin->{$port};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
        my $string = 'other';
 | 
			
		||||
        # see CISCO-STACK-MIB for a description of the bits
 | 
			
		||||
        $string = 'half' if ($duplex =~ /001$/ or $duplex =~ /0100.$/);
 | 
			
		||||
        $string = 'full' if ($duplex =~ /010$/ or $duplex =~ /100.0$/);
 | 
			
		||||
        # we'll call it auto if both full and half are turned on, or if the
 | 
			
		||||
        #   specifically 'auto' flag bit is set.
 | 
			
		||||
        $string = 'auto' 
 | 
			
		||||
            if ($duplex =~ /1..$/ or $duplex =~ /110..$/ or $duplex =~ /..011$/);
 | 
			
		||||
       
 | 
			
		||||
        $i_duplex_admin{$iid} = $string;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $cat->interfaces() - Maps the ifIndex table to a physical port
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my $interfaces = $self->i_index();
 | 
			
		||||
    my $portnames  = $self->p_port();
 | 
			
		||||
    my %portmap = reverse %$portnames;
 | 
			
		||||
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid (keys %$interfaces) {
 | 
			
		||||
        my $if = $interfaces->{$iid};
 | 
			
		||||
        $interfaces{$if} = $portmap{$iid};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Catalyst - Perl5 Interface to Cisco devices running Catalyst OS 
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Catalyst device through SNMP.  Information is stored in a number of 
 | 
			
		||||
MIB's such as IF-MIB, CISCO-CDP-MIB, CISCO-STACK-MIB, CISCO-VTP-MIB,
 | 
			
		||||
and SWITCH-MIB.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $cat = new SNMP::Info::Layer2::Catalyst(DestHost  => 'router' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer2::Catalyst()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $cat = new SNMP::Info::Layer2::Catalyst(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $cat;
 | 
			
		||||
 | 
			
		||||
=item  $cat->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $cat->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $cat->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBAL Values
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cat->netmask()
 | 
			
		||||
(B<sysNetMask>)
 | 
			
		||||
 | 
			
		||||
=item $cat->broadcast()
 | 
			
		||||
(B<sysBroadcast>)
 | 
			
		||||
 | 
			
		||||
=item $cat->serial()
 | 
			
		||||
(B<chassisSerialNumberString>)
 | 
			
		||||
 | 
			
		||||
=item $cat->model()
 | 
			
		||||
(B<chassisModel>)
 | 
			
		||||
 | 
			
		||||
=item $cat->ps1_type()
 | 
			
		||||
(B<chassisPs1Type>)
 | 
			
		||||
 | 
			
		||||
=item $cat->ps2_type()
 | 
			
		||||
(B<chassisPs2Type>)
 | 
			
		||||
 | 
			
		||||
=item $cat->ps1_status()
 | 
			
		||||
(B<chassisPs1Status>)
 | 
			
		||||
 | 
			
		||||
=item $cat->ps2_status()
 | 
			
		||||
(B<chassisPs2Status>)
 | 
			
		||||
 | 
			
		||||
=item $cat->slots()
 | 
			
		||||
(B<chassisNumSlots>)
 | 
			
		||||
 | 
			
		||||
=item $cat->fan()
 | 
			
		||||
(B<chassisFanStatus>)
 | 
			
		||||
 | 
			
		||||
=item $cat->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cat->interfaces()
 | 
			
		||||
 | 
			
		||||
    Crosses p_port() with i_index() to get physical names.
 | 
			
		||||
 | 
			
		||||
=item $cat->i_physical()
 | 
			
		||||
 | 
			
		||||
    Returns a map to IID for ports that are physical ports, not vlans, etc.
 | 
			
		||||
 | 
			
		||||
=item $cat->i_type()
 | 
			
		||||
 | 
			
		||||
    Crosses p_port() with p_type() and returns the results. 
 | 
			
		||||
 | 
			
		||||
    Overrides with ifType if p_type() isn't available.
 | 
			
		||||
 | 
			
		||||
=item $cat->i_name()
 | 
			
		||||
 | 
			
		||||
    Crosses p_name with p_port and returns results.
 | 
			
		||||
 | 
			
		||||
=item $cat->i_duplex()
 | 
			
		||||
 | 
			
		||||
    Crosses p_duplex with p_port and returns results.
 | 
			
		||||
 | 
			
		||||
=item $cat->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
    Crosses p_duplex_admin with p_port.
 | 
			
		||||
 | 
			
		||||
    Munges bit_string returned from p_duplex_admin to get duplex settings.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Module table
 | 
			
		||||
 | 
			
		||||
This table holds configuration information for each of the blades installed in
 | 
			
		||||
the Catalyst device.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cat->m_type()
 | 
			
		||||
(B<moduleType>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_model()
 | 
			
		||||
(B<moduleModel>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_serial()
 | 
			
		||||
(B<moduleSerialNumber>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_status()
 | 
			
		||||
(B<moduleStatus>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_name()
 | 
			
		||||
(B<moduleName>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_ports()
 | 
			
		||||
(B<moduleNumPorts>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_ports_status()
 | 
			
		||||
 Returns a list of space separated status strings for the ports.
 | 
			
		||||
   To see the status of port 4 :
 | 
			
		||||
        @ports_status = split(' ', $cat->m_ports_status() );
 | 
			
		||||
        $port4 = $ports_status[3];
 | 
			
		||||
 | 
			
		||||
(B<modulePortStatus>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_ports_hwver()
 | 
			
		||||
(B<moduleHwVersion>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_ports_fwver()
 | 
			
		||||
(B<moduleFwVersion>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_ports_swver()
 | 
			
		||||
(B<moduleSwVersion>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_ports_ip()
 | 
			
		||||
(B<moduleIPAddress>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_ports_sub1()
 | 
			
		||||
(B<moduleSubType>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_ports_sub2()
 | 
			
		||||
(B<moduleSubType2>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Modules - Router Blades
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cat->m_ip()
 | 
			
		||||
(B<moduleIPAddress>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_sub1()
 | 
			
		||||
(B<moduleSubType>)
 | 
			
		||||
 | 
			
		||||
=item $cat->m_sub2()
 | 
			
		||||
(B<moduleSubType2>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Port Entry Table (CISCO-STACK-MIB::portTable)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cat->p_name()
 | 
			
		||||
(B<portName>)
 | 
			
		||||
 | 
			
		||||
=item $cat->p_type()
 | 
			
		||||
(B<portType>)
 | 
			
		||||
 | 
			
		||||
=item $cat->p_status()
 | 
			
		||||
(B<portOperStatus>)
 | 
			
		||||
 | 
			
		||||
=item $cat->p_status2()
 | 
			
		||||
(B<portAdditionalStatus>)
 | 
			
		||||
 | 
			
		||||
=item $cat->p_speed()
 | 
			
		||||
(B<portAdminSpeed>)
 | 
			
		||||
 | 
			
		||||
=item $cat->p_duplex()
 | 
			
		||||
(B<portDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $cat->p_port()
 | 
			
		||||
(B<portIfIndex>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Port Capability Table (CISCO-STACK-MIB::portCpbTable)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cat->p_speed_admin()
 | 
			
		||||
(B<portCpbSpeed>)
 | 
			
		||||
 | 
			
		||||
=item $cat->p_duplex_admin()
 | 
			
		||||
(B<portCpbDuplex>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 VLAN Entry Table
 | 
			
		||||
 | 
			
		||||
See ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-communityIndexing.html
 | 
			
		||||
for a good treaty of how to connect to the VLANs
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cat->v_state()
 | 
			
		||||
(B<vtpVlanState>)
 | 
			
		||||
 | 
			
		||||
=item $cat->v_type()
 | 
			
		||||
(B<vtpVlanType>)
 | 
			
		||||
 | 
			
		||||
=item $cat->v_name()
 | 
			
		||||
(B<vtpVlanName>)
 | 
			
		||||
 | 
			
		||||
=item $cat->v_mtu()
 | 
			
		||||
(B<vtpVlanMtu>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,547 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer2::HP - SNMP Interface to HP ProCurve Switches
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::HP;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT 
 | 
			
		||||
            %MYGLOBALS %MYMIBS %MYFUNCS %MYMUNGE %MUNGE $INIT/ ;
 | 
			
		||||
@SNMP::Info::Layer2::HP::ISA = qw/SNMP::Info::Layer2 SNMP::Info::MAU Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::HP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
 | 
			
		||||
# See SNMP::Info for the details of these data structures and 
 | 
			
		||||
#       the interworkings.
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
 | 
			
		||||
%MYMIBS = ( 'ENTITY-MIB'  => 'entPhysicalSerialNum',
 | 
			
		||||
            'RFC1271-MIB' => 'logDescription',
 | 
			
		||||
            'HP-ICF-OID'  => 'hpSwitch4000',
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
          %SNMP::Info::MAU::MIBS,
 | 
			
		||||
          %MYMIBS );
 | 
			
		||||
 | 
			
		||||
%MYGLOBALS = ('serial1' => 'entPhysicalSerialNum.1',
 | 
			
		||||
#              'model'  => 'entPhysicalModelName.1',
 | 
			
		||||
             );
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
            %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
            %MYGLOBALS
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
%MYFUNCS = (
 | 
			
		||||
            'i_type2'   => 'ifType',
 | 
			
		||||
            'e_map'     => 'entAliasMappingIdentifier',
 | 
			
		||||
            'e_name'    => 'entPhysicalName',
 | 
			
		||||
            'e_class'   => 'entPhysicalClass',
 | 
			
		||||
            'e_parent'  => 'entPhysicalContainedIn',
 | 
			
		||||
            'e_descr'   => 'entPhysicalDescr',
 | 
			
		||||
            'e_type'    => 'entPhysicalVendorType',
 | 
			
		||||
            'e_model'   => 'entPhysicalModelName',
 | 
			
		||||
            'e_hwver'   => 'entPhysicalHardwareRev',
 | 
			
		||||
            'e_swver'   => 'entPhysicalSoftwareRev',
 | 
			
		||||
            'e_fwver'   => 'entPhysicalFirmwareRev',
 | 
			
		||||
            'e_serial'  => 'entPhysicalSerialNum',
 | 
			
		||||
            # RFC1271
 | 
			
		||||
            'l_descr'   => 'logDescription'
 | 
			
		||||
 | 
			
		||||
           );
 | 
			
		||||
%FUNCS   = (
 | 
			
		||||
            %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
            %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
            %MYFUNCS
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
%MYMUNGE = (
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
            # Inherit all the built in munging
 | 
			
		||||
            %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
            %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
            %MYMUNGE
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Method Overrides
 | 
			
		||||
 | 
			
		||||
# Some have the serial num in entity mib, some dont.
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    
 | 
			
		||||
    # procurve 2xxx have this
 | 
			
		||||
    my $serial = $hp->serial1();
 | 
			
		||||
 | 
			
		||||
    # 4xxx dont
 | 
			
		||||
    return undef if $serial =~ /nosuchobject/i;
 | 
			
		||||
 | 
			
		||||
    return $serial; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $interfaces = $hp->i_index();
 | 
			
		||||
    my $i_descr    = $hp->i_description(); 
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
        my $descr = $i_descr->{$iid};
 | 
			
		||||
        next unless defined $descr;
 | 
			
		||||
        #$if{$iid} = $iid;
 | 
			
		||||
        $if{$iid} = $descr if (defined $descr and length $descr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# e_port maps EntityTable entries to IfTable
 | 
			
		||||
sub e_port {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $e_map = $hp->e_map();
 | 
			
		||||
 | 
			
		||||
    my %e_port;
 | 
			
		||||
 | 
			
		||||
    foreach my $e_id (keys %$e_map) {
 | 
			
		||||
        my $id = $e_id;
 | 
			
		||||
        $id =~ s/\.0$//;
 | 
			
		||||
 | 
			
		||||
        my $iid = $e_map->{$e_id};
 | 
			
		||||
        $iid =~ s/.*\.//;
 | 
			
		||||
 | 
			
		||||
        $e_port{$id} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%e_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_type {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $e_descr = $hp->e_descr();
 | 
			
		||||
    my $e_port = $hp->e_port();
 | 
			
		||||
 | 
			
		||||
    # Grab default values to pass through
 | 
			
		||||
    my $i_type = $hp->i_type2();
 | 
			
		||||
 | 
			
		||||
    # Now Stuff in the entity-table values
 | 
			
		||||
    foreach my $port (keys %$e_descr){
 | 
			
		||||
        my $iid = $e_port->{$port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        my $type = $e_descr->{$port};
 | 
			
		||||
        $type =~ s/^HP ?//;
 | 
			
		||||
        $i_type->{$iid} = $type;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return $i_type;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $i_alias    = $hp->i_alias();
 | 
			
		||||
    my $e_name     = $hp->e_name();
 | 
			
		||||
    my $e_port     = $hp->e_port();
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
 | 
			
		||||
    foreach my $port (keys %$e_name){
 | 
			
		||||
        my $iid = $e_port->{$port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        my $alias = $i_alias->{$iid};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        $i_name{$iid} = $e_name->{$port};
 | 
			
		||||
 | 
			
		||||
        # Check for alias
 | 
			
		||||
        $i_name{$iid} = $alias if (defined $alias and length($alias));
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'hp';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub log {
 | 
			
		||||
    my $hp=shift;
 | 
			
		||||
 | 
			
		||||
    my $log = $hp->l_descr();
 | 
			
		||||
 | 
			
		||||
    my $logstring = undef;
 | 
			
		||||
 | 
			
		||||
    foreach my $val (values %$log){
 | 
			
		||||
        next if $val =~ /^Link\s+(Up|Down)/;
 | 
			
		||||
        $logstring .= "$val\n"; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $logstring; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub slots {
 | 
			
		||||
    my $hp=shift;
 | 
			
		||||
    
 | 
			
		||||
    my $e_name = $hp->e_name();
 | 
			
		||||
 | 
			
		||||
    return undef unless defined $e_name;
 | 
			
		||||
 | 
			
		||||
    my $slots;
 | 
			
		||||
    foreach my $slot (keys %$e_name) {
 | 
			
		||||
        $slots++ if $e_name->{$slot} =~ /slot/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $slots;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#sub fan {
 | 
			
		||||
#    my $hp = shift;
 | 
			
		||||
#
 | 
			
		||||
#    my %ents = reverse %{$hp->e_name()};
 | 
			
		||||
#
 | 
			
		||||
#    my $fan = $ents{'Fan'};
 | 
			
		||||
#
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    my $mau_index = $hp->mau_index();
 | 
			
		||||
    my $mau_link = $hp->mau_link();
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $mau_port (keys %$mau_link){
 | 
			
		||||
        my $iid = $mau_index->{$mau_port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
 | 
			
		||||
        my $linkoid = $mau_link->{$mau_port};
 | 
			
		||||
        my $link = &SNMP::translateObj($linkoid);
 | 
			
		||||
        next unless defined $link;
 | 
			
		||||
 | 
			
		||||
        my $duplex = undef;
 | 
			
		||||
 | 
			
		||||
        if ($link =~ /fd$/i) {
 | 
			
		||||
            $duplex = 'full';
 | 
			
		||||
        } elsif ($link =~ /hd$/i){
 | 
			
		||||
            $duplex = 'half';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $i_duplex{$iid} = $duplex if defined $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces   = $hp->interfaces();
 | 
			
		||||
    my $mau_index    = $hp->mau_index();
 | 
			
		||||
    my $mau_auto     = $hp->mau_auto();
 | 
			
		||||
    my $mau_autostat = $hp->mau_autostat();
 | 
			
		||||
    my $mau_typeadmin = $hp->mau_type_admin();
 | 
			
		||||
    my $mau_autosent = $hp->mau_autosent();
 | 
			
		||||
 | 
			
		||||
    my %mau_reverse = reverse %$mau_index;
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
        my $mau_index = $mau_reverse{$iid};
 | 
			
		||||
        next unless defined $mau_index;
 | 
			
		||||
 | 
			
		||||
        my $autostat = $mau_autostat->{$mau_index};
 | 
			
		||||
        
 | 
			
		||||
        # HP25xx has this value
 | 
			
		||||
        if (defined $autostat and $autostat =~ /enabled/i){
 | 
			
		||||
            $i_duplex_admin{$iid} = 'auto';
 | 
			
		||||
            next;
 | 
			
		||||
        } 
 | 
			
		||||
        
 | 
			
		||||
        my $type = $mau_autosent->{$mau_index};
 | 
			
		||||
    
 | 
			
		||||
        next unless defined $type;
 | 
			
		||||
 | 
			
		||||
        if ($type == 0) {
 | 
			
		||||
            $i_duplex_admin{$iid} = 'none';
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $full = $hp->_isfullduplex($type);
 | 
			
		||||
        my $half = $hp->_ishalfduplex($type);
 | 
			
		||||
 | 
			
		||||
        if ($full and !$half){
 | 
			
		||||
            $i_duplex_admin{$iid} = 'full';
 | 
			
		||||
        } elsif ($half) {
 | 
			
		||||
            $i_duplex_admin{$iid} = 'half';
 | 
			
		||||
        } 
 | 
			
		||||
    } 
 | 
			
		||||
    
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#sub i_up_admin {
 | 
			
		||||
#    my $hp = shift;
 | 
			
		||||
#    
 | 
			
		||||
#    my $mau_index    = $hp->mau_index();
 | 
			
		||||
#    my $mau_status = $hp->mau_status();
 | 
			
		||||
#
 | 
			
		||||
#    my %i_up_admin;
 | 
			
		||||
#    foreach my $mau_port (keys %$mau_status){
 | 
			
		||||
#        my $iid = $mau_index->{$mau_port};
 | 
			
		||||
#        next unless defined $iid;
 | 
			
		||||
#        my $status = $mau_status->{$mau_port};
 | 
			
		||||
#        
 | 
			
		||||
#        $i_up_admin{$iid} = ($status =~ /shutdown/i) ? 
 | 
			
		||||
#                            'down' : 'up';
 | 
			
		||||
#    }
 | 
			
		||||
#
 | 
			
		||||
#    return \%i_up_admin;  
 | 
			
		||||
#
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::HP - SNMP Interface to HP Procurve Switches
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
HP device through SNMP.  Information is stored in a number of 
 | 
			
		||||
MIB's such as IF-MIB, ENTITY-MIB, RFC1271-MIB, HP-ICF-OID, MAU-MIB
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $hp = new SNMP::Info::Layer2::HP(DestHost  => 'router' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer2::HP()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $hp = new SNMP::Info::Layer2::HP(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $hp;
 | 
			
		||||
 | 
			
		||||
=item  $hp->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $hp->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $hp->session($newsession);
 | 
			
		||||
 | 
			
		||||
=item  $hp->all(), $hp->load_all()
 | 
			
		||||
 | 
			
		||||
Runs each of the HP List methods and returns a hash reference.
 | 
			
		||||
 | 
			
		||||
$hp->all() will call $hp->load_all() once and then return cahced valued.  
 | 
			
		||||
Use $hp->load_all() to reload from the device.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 HP Global Configuration Values
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp->name()
 | 
			
		||||
(B<sysName>)
 | 
			
		||||
 | 
			
		||||
=item $hp->ip()
 | 
			
		||||
(B<sysIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $hp->netmask()
 | 
			
		||||
(B<sysNetMask>)
 | 
			
		||||
 | 
			
		||||
=item $hp->broadcast()
 | 
			
		||||
(B<sysBroadcast>)
 | 
			
		||||
 | 
			
		||||
=item $hp->location()
 | 
			
		||||
(B<sysLocation>)
 | 
			
		||||
 | 
			
		||||
=item $hp->contact()
 | 
			
		||||
(B<sysContact>)
 | 
			
		||||
 | 
			
		||||
=item $hp->description()
 | 
			
		||||
(B<sysDescr>)
 | 
			
		||||
 | 
			
		||||
=item $hp->layers()
 | 
			
		||||
(B<sysServices>)
 | 
			
		||||
 | 
			
		||||
=item $hp->serial()
 | 
			
		||||
(B<chassisSerialNumberString>)
 | 
			
		||||
 | 
			
		||||
=item $hp->model()
 | 
			
		||||
(B<chassisModel>)
 | 
			
		||||
 | 
			
		||||
=item $hp->ps1_type()
 | 
			
		||||
(B<chassisPs1Type>)
 | 
			
		||||
 | 
			
		||||
=item $hp->ps2_type()
 | 
			
		||||
(B<chassisPs2Type>)
 | 
			
		||||
 | 
			
		||||
=item $hp->ps1_status()
 | 
			
		||||
(B<chassisPs1Status>)
 | 
			
		||||
 | 
			
		||||
=item $hp->ps2_status()
 | 
			
		||||
(B<chassisPs2Status>)
 | 
			
		||||
 | 
			
		||||
=item $hp->slots()
 | 
			
		||||
(B<chassisNumSlots>)
 | 
			
		||||
 | 
			
		||||
=item $hp->fan()
 | 
			
		||||
(B<chassisFanStatus>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 CATALYST TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Module table
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp->m_type(), $hp->load_m_type()
 | 
			
		||||
(B<moduleType>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_model(), $hp->load_m_model()
 | 
			
		||||
(B<moduleModel>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_serial(), $hp->load_m_serial()
 | 
			
		||||
(B<moduleSerialNumber>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_status(), $hp->load_m_status()
 | 
			
		||||
(B<moduleStatus>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_name(), $hp->load_m_name()
 | 
			
		||||
(B<moduleName>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_ports(), $hp->load_m_ports()
 | 
			
		||||
(B<moduleNumPorts>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_ports_status(), $hp->load_m_ports_status()
 | 
			
		||||
 Returns a list of space separated status strings for the ports.
 | 
			
		||||
   To see the status of port 4 :
 | 
			
		||||
        @ports_status = split(' ', $hp->m_ports_status() );
 | 
			
		||||
        $port4 = $ports_status[3];
 | 
			
		||||
 | 
			
		||||
(B<modulePortStatus>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_ports_hwver(), $hp->load_m_ports_hwver()
 | 
			
		||||
(B<moduleHwVersion>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_ports_fwver(), $hp->load_m_ports_fwver()
 | 
			
		||||
(B<moduleFwVersion>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_ports_swver(), $hp->load_m_ports_swver()
 | 
			
		||||
(B<moduleSwVersion>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_ports_ip(), $hp->load_m_ports_ip()
 | 
			
		||||
(B<moduleIPAddress>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_ports_sub1(), $hp->load_m_ports_sub1()
 | 
			
		||||
(B<moduleSubType>)
 | 
			
		||||
 | 
			
		||||
=item $hp->m_ports_sub2(), $hp->load_m_ports_sub2()
 | 
			
		||||
(B<moduleSubType2>)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Port Entry Table
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp->p_name(), $hp->load_p_name()
 | 
			
		||||
(B<portName>)
 | 
			
		||||
 | 
			
		||||
=item $hp->p_type(), $hp->load_p_type()
 | 
			
		||||
(B<portType>)
 | 
			
		||||
 | 
			
		||||
=item $hp->p_status(), $hp->load_p_status()
 | 
			
		||||
(B<portOperStatus>)
 | 
			
		||||
 | 
			
		||||
=item $hp->p_status2(), $hp->load_p_status2()
 | 
			
		||||
(B<portAdditionalStatus>)
 | 
			
		||||
 | 
			
		||||
=item $hp->p_speed(), $hp->load_p_speed()
 | 
			
		||||
(B<portAdminSpeed>)
 | 
			
		||||
 | 
			
		||||
=item $hp->p_duplex(), $hp->load_p_duplex()
 | 
			
		||||
(B<portDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $hp->p_port(), $hp->load_p_port()
 | 
			
		||||
(B<portIfIndex>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 VLAN Entry Table
 | 
			
		||||
 | 
			
		||||
ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-communityIndexing.html
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp->v_state(), $hp->load_v_state()
 | 
			
		||||
(B<vtpVlanState>)
 | 
			
		||||
 | 
			
		||||
=item $hp->v_type(), $hp->load_v_type()
 | 
			
		||||
(B<vtpVlanType>)
 | 
			
		||||
 | 
			
		||||
=item $hp->v_name(), $hp->load_v_name()
 | 
			
		||||
(B<vtpVlanName>)
 | 
			
		||||
 | 
			
		||||
=item $hp->v_mtu(), $hp->load_v_mtu()
 | 
			
		||||
(B<vtpVlanMtu>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
							
								
								
									
										377
									
								
								Info/Layer3.pm
									
									
									
									
									
								
							
							
						
						
									
										377
									
								
								Info/Layer3.pm
									
									
									
									
									
								
							@@ -1,377 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer3 - SNMP Interface to Layer3 devices
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
use SNMP::Info::EtherLike;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::ISA = qw/SNMP::Info SNMP::Info::CDP SNMP::Info::Bridge SNMP::Info::EtherLike Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS,
 | 
			
		||||
          %SNMP::Info::CDP::MIBS,
 | 
			
		||||
          %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
          %SNMP::Info::EtherLike::MIBS,
 | 
			
		||||
          'ENTITY-MIB'         => 'entPhysicalName',
 | 
			
		||||
          'HP-ICF-OID'         => 'hpSwitch4000',
 | 
			
		||||
          'CISCO-PRODUCTS-MIB' => 'sysName',
 | 
			
		||||
          'OSPF-MIB'           => 'ospfRouterId',
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            # Inherit the super class ones
 | 
			
		||||
            %SNMP::Info::GLOBALS,
 | 
			
		||||
            %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
            %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
            %SNMP::Info::EtherLike::GLOBALS,
 | 
			
		||||
            'mac'       => 'ifPhysAddress.1',
 | 
			
		||||
            'chassis'   => 'entPhysicalDescr.1',
 | 
			
		||||
            'router_ip' => 'ospfRouterId.0',
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (
 | 
			
		||||
            %SNMP::Info::FUNCS,
 | 
			
		||||
            %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
            %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
            %SNMP::Info::EtherLike::FUNCS,
 | 
			
		||||
            # IFMIB
 | 
			
		||||
            'i_name2'    => 'ifName',
 | 
			
		||||
            # Address Translation Table (ARP Cache)
 | 
			
		||||
            'at_index'   => 'atIfIndex',
 | 
			
		||||
            'at_paddr'   => 'atPhysAddress',
 | 
			
		||||
            'at_netaddr' => 'atNetAddress',
 | 
			
		||||
            'ospf_ip'    => 'ospfHostIpAddress'
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
            # Inherit all the built in munging
 | 
			
		||||
            %SNMP::Info::MUNGE,
 | 
			
		||||
            %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
            %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
            %SNMP::Info::EtherLike::MUNGE,
 | 
			
		||||
            'at_paddr' => \&SNMP::Info::munge_mac,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
sub root_ip {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
 | 
			
		||||
    my $router_ip  = $l3->router_ip();
 | 
			
		||||
    my $ospf_ip    = $l3->ospf_ip();
 | 
			
		||||
 | 
			
		||||
    # return the first one found here (should be only)
 | 
			
		||||
    if (defined $ospf_ip and scalar(keys %$ospf_ip)){
 | 
			
		||||
        foreach my $key (keys %$ospf_ip){
 | 
			
		||||
            my $ip = $ospf_ip->{$key};
 | 
			
		||||
            print " SNMP::Layer3::root_ip() using $ip\n" if $DEBUG;
 | 
			
		||||
            return $ip;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $router_ip if defined $router_ip;
 | 
			
		||||
    return undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $interfaces = $l3->interfaces();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if (keys %$interfaces) {
 | 
			
		||||
        # lo -> cisco aironet 350 loopback
 | 
			
		||||
        if ($interfaces->{$if} =~ /(tunnel|loopback|lo|null)/i){
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $chassis = $l3->chassis();
 | 
			
		||||
    
 | 
			
		||||
    return $1 if (defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $l3->model() - the sysObjectID returns an IID to an entry in 
 | 
			
		||||
#       the CISCO-PRODUCT-MIB.  Look it up and return it.
 | 
			
		||||
sub model {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
    my $id = $l3->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^cisco//i;
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
    my $i_index = $l3->i_index();
 | 
			
		||||
    my $i_alias = $l3->i_alias();
 | 
			
		||||
    my $i_name2  = $l3->i_name2();
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
    foreach my $iid (keys %$i_name2){
 | 
			
		||||
        my $name = $i_name2->{$iid};
 | 
			
		||||
        my $alias = $i_alias->{$iid};
 | 
			
		||||
        $i_name{$iid} = (defined $alias and $alias !~ /^\s*$/) ?
 | 
			
		||||
                        $alias : 
 | 
			
		||||
                        $name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
 | 
			
		||||
    my $el_index = $l3->el_index();
 | 
			
		||||
    my $el_duplex = $l3->el_duplex();
 | 
			
		||||
    
 | 
			
		||||
    my %i_index;
 | 
			
		||||
    foreach my $el_port (keys %$el_duplex){
 | 
			
		||||
        my $iid = $el_index->{$el_port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        my $duplex = $el_duplex->{$el_port};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
        $i_index{$iid} = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $i_index{$iid} = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $i_index{$iid} = 'auto' if $duplex =~ /auto/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $l3->interfaces() - Map the Interfaces to their physical names
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
    my $interfaces = $l3->i_index();
 | 
			
		||||
    my $descriptions = $l3->i_description();
 | 
			
		||||
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
        my $desc = $descriptions->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
 | 
			
		||||
        $interfaces{$iid} = $desc;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $l3->description();
 | 
			
		||||
 | 
			
		||||
    return 'cisco' if ($descr =~ /(cisco|ios)/i);
 | 
			
		||||
    return 'foundry' if ($descr =~ /foundry/i);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3 - Perl5 Interface to network devices using Layer3
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides generic methods for accessing SNMP data for Layer 3 network devices. 
 | 
			
		||||
Includes support for Layer2+3 devices. See super classes for other inherited
 | 
			
		||||
methods.
 | 
			
		||||
 | 
			
		||||
Inherits from:
 | 
			
		||||
 | 
			
		||||
 SNMP::Info
 | 
			
		||||
 SNMP::Info::Bridge
 | 
			
		||||
 SNMP::Info::CDP
 | 
			
		||||
 SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
Required MIBs:
 | 
			
		||||
 | 
			
		||||
 ENTITY-MIB         - For model identification
 | 
			
		||||
 CISCO-PRODUCTS-MIB - For model identification
 | 
			
		||||
 HP-ICF-OID         - For model identification
 | 
			
		||||
 MIBS listed in SNMP::Info::CDP, SNMP::Info::Bridge, and SNMP::Info::Etherlike
 | 
			
		||||
 | 
			
		||||
Cisco MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
 | 
			
		||||
HP MIBs can be found at http://www.hp.com/rnd/software
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $l3 = new SNMP::Info::Layer3(DestHost  => 'router' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer3()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $l3 = new SNMP::Info::Layer3(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $l3;
 | 
			
		||||
 | 
			
		||||
=item  $l3->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $l3->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $l3->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l3->mac()
 | 
			
		||||
 | 
			
		||||
Returns root port mac address
 | 
			
		||||
 | 
			
		||||
(B<ifPhysAddress.1>)
 | 
			
		||||
 | 
			
		||||
=item $l3->chassis()
 | 
			
		||||
 | 
			
		||||
Returns Chassis type (model).
 | 
			
		||||
 | 
			
		||||
(B<entPhysicalDescr.1>)
 | 
			
		||||
 | 
			
		||||
=item $l3->serial()
 | 
			
		||||
 | 
			
		||||
Trys to cull a serial number from $l3->chassis()
 | 
			
		||||
 | 
			
		||||
=item $l3->model()
 | 
			
		||||
 | 
			
		||||
Trys to reference $l3->id() to one of the product MIBs listed above
 | 
			
		||||
 | 
			
		||||
Removes 'cisco'  from cisco devices for readability.
 | 
			
		||||
 | 
			
		||||
=item $l3->vendor()
 | 
			
		||||
 | 
			
		||||
Trys to cull a Vendor name from B<sysDescr>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l3->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns the map between SNMP Interface Identifier (iid) and physical port name. 
 | 
			
		||||
 | 
			
		||||
Only returns those iids that have a description listed in $l3->i_description()
 | 
			
		||||
 | 
			
		||||
=item $l3->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Creates a key for each IID that should be ignored.
 | 
			
		||||
 | 
			
		||||
Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
 | 
			
		||||
 | 
			
		||||
=item $l3->i_name()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to human set name. 
 | 
			
		||||
 | 
			
		||||
Defaults to B<ifName>, but checks for an B<ifAlias>
 | 
			
		||||
 | 
			
		||||
=item $l3->i_duplex()
 | 
			
		||||
 | 
			
		||||
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. 
 | 
			
		||||
 | 
			
		||||
see SNMP::Info::Etherlike for the el_index() and el_duplex() methods.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 ARP Cache Entries
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l3->at_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IID to Arp Cache Entry
 | 
			
		||||
 | 
			
		||||
(B<atIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $l3->at_paddr()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of Arp Cache Entries to MAC address
 | 
			
		||||
 | 
			
		||||
(B<atPhysAddress>)
 | 
			
		||||
 | 
			
		||||
=item $l3->at_netaddr()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of Arp Cache Entries to IP Address
 | 
			
		||||
 | 
			
		||||
(B<atNetAddress>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,327 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer3::Aironet
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Aironet;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
 | 
			
		||||
@SNMP::Info::Layer3::Aironet::ISA = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Aironet::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
%MIBS =    (
 | 
			
		||||
            %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
            'AWCVX-MIB'        => 'awcIfTable',
 | 
			
		||||
            'IEEE802dot11-MIB' => 'dot11StationID',
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
            'mac'               => 'dot11StationID.2',
 | 
			
		||||
            # AWC Ethernet Table
 | 
			
		||||
            'awc_duplex'        => 'awcEtherDuplex.0',
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (  
 | 
			
		||||
            %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
            'i_mac2'    => 'ifPhysAddress',
 | 
			
		||||
            'i_mtu2'    => 'ifMtu',
 | 
			
		||||
            'i_ssid'    => 'dot11DesiredSSID',
 | 
			
		||||
            # Bridge-mib overrides  
 | 
			
		||||
            'fw_mac2'    => 'dot1dTpFdbAddress',
 | 
			
		||||
            'fw_port2'   => 'dot1dTpFdbPort',
 | 
			
		||||
            'bp_index2'  => 'dot1dBasePortIfIndex',
 | 
			
		||||
            # AWC Interface Table (awcIfTable)
 | 
			
		||||
            'awc_default_mac'   => 'awcIfDefaultPhyAddress',
 | 
			
		||||
            'awc_mac'           => 'awcIfPhyAddress',
 | 
			
		||||
            'awc_ip'            => 'awcIfIpAddress',
 | 
			
		||||
            'awc_netmask'       => 'awcIfIpNetMask',
 | 
			
		||||
            'awc_msdu'           => 'awcIfMSDUMaxLength',
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
          # Inherit all the built in munging
 | 
			
		||||
          %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
          'i_mac2'      => \&SNMP::Info::munge_mac,
 | 
			
		||||
          'awc_mac'     => \&SNMP::Info::munge_mac,
 | 
			
		||||
          'fw_mac2'     => \&SNMP::Info::munge_mac,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
# Override wireless port with static info
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $interfaces = $aironet->interfaces();
 | 
			
		||||
    my $bp_index = $aironet->bp_index2();
 | 
			
		||||
    
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
        my $port = $interfaces->{$iid};
 | 
			
		||||
 | 
			
		||||
        # Hardwire the wireless port to the transparent bridge port
 | 
			
		||||
        if ($port =~ /awc/){
 | 
			
		||||
            $bp_index->{0}=$iid;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return $bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Add the static table to the forwarding table
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $fw_mac  = $aironet->fw_mac2();
 | 
			
		||||
    my $fw_port = $aironet->fw_port2();
 | 
			
		||||
    my $bs_mac  = $aironet->bs_mac();    
 | 
			
		||||
 
 | 
			
		||||
    # remove port 0 forwarding table entries, only port 0 static entries
 | 
			
		||||
    foreach my $fw (keys %$fw_mac){
 | 
			
		||||
        my $port = $fw_port->{$fw};
 | 
			
		||||
        delete $fw_mac->{$fw} if $port == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $bs (keys %$bs_mac){
 | 
			
		||||
        $fw_mac->{$bs} = $bs_mac->{$bs};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $fw_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Add the static table to the forwarding table
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $fw_port = $aironet->fw_port2();
 | 
			
		||||
    my $bs_port = $aironet->bs_port();    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    foreach my $bs (keys %$bs_port){
 | 
			
		||||
        $fw_port->{$bs} = $bs_port->{$bs};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $fw_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $interfaces = $aironet->interfaces();
 | 
			
		||||
    my $awc_duplex = $aironet->awc_duplex();
 | 
			
		||||
    
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
        my $name = $interfaces->{$iid};
 | 
			
		||||
 | 
			
		||||
        if ($name =~ /fec/){
 | 
			
		||||
            $i_duplex{$iid} = $awc_duplex;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_mac   = $aironet->i_mac2();
 | 
			
		||||
    my $awc_mac = $aironet->awc_mac();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid (keys %$awc_mac){
 | 
			
		||||
        next unless defined $i_mac->{$iid};
 | 
			
		||||
        $i_mac->{$iid} = $awc_mac->{$iid};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $interfaces = $aironet->interfaces();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if (keys %$interfaces){
 | 
			
		||||
        $i_ignore{$if}++ if ($interfaces->{$if} =~ /(rptr|lo)/);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Aironet - Perl5 Interface to Cisco Aironet Wireless Devices
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Inherits all methods from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $aironet = new SNMP::Info::Layer3::Aironet(DestHost  => 'myswitch',
 | 
			
		||||
                               Community => 'public');
 | 
			
		||||
 my $mac = $aironet->mac(); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer3::Aironet()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $aironet = new SNMP::Info::Layer3::Aironet(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $aironet;
 | 
			
		||||
 | 
			
		||||
=item  $aironet->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $aironet->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $aironet->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Globals
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aironet->mac()
 | 
			
		||||
 | 
			
		||||
Gives the MAC Address of the wireless side 
 | 
			
		||||
 | 
			
		||||
B<dot11StationID.2>
 | 
			
		||||
 | 
			
		||||
=item $aironet->awc_duplex()
 | 
			
		||||
 | 
			
		||||
Gives the admin duplex setting for the Ethernet Port.
 | 
			
		||||
 | 
			
		||||
B<awcEtherDuplex.0>
 | 
			
		||||
 | 
			
		||||
=item $aironet->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Aironet specific items
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  $aironet->awc_default_mac()
 | 
			
		||||
 | 
			
		||||
Gives the default MAC address of each interface.
 | 
			
		||||
 | 
			
		||||
B<awcIfDefaultPhyAddress>
 | 
			
		||||
 | 
			
		||||
=item $aironet->awc_mac()
 | 
			
		||||
 | 
			
		||||
Gives the actual MAC address of each interface.
 | 
			
		||||
 | 
			
		||||
B<awcIfPhyAddress>
 | 
			
		||||
 | 
			
		||||
=item $aironet->awc_ip()
 | 
			
		||||
 | 
			
		||||
Gives the IP Address assigned to each interface.
 | 
			
		||||
 | 
			
		||||
B<awcIfIpAddress>
 | 
			
		||||
 | 
			
		||||
=item $aironet->awc_netmask()
 | 
			
		||||
 | 
			
		||||
Gives the NetMask for each interface.
 | 
			
		||||
 | 
			
		||||
B<awcIfIpNetMask>
 | 
			
		||||
 | 
			
		||||
=item $aironet->awc_msdu()
 | 
			
		||||
 | 
			
		||||
B<awcIfMSDUMaxLength>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aironet->bp_index()
 | 
			
		||||
 | 
			
		||||
Takes the bp_index() value from SNMP::Info::Bridge and overrides the wireless port 
 | 
			
		||||
to be assigned to the transparent bridge port (port 0)
 | 
			
		||||
 | 
			
		||||
=item $aironet->fw_mac()
 | 
			
		||||
 | 
			
		||||
Adds static table entries from bs_mac() to port 0 so that wireless MAC addresses will
 | 
			
		||||
be reported.  Forwarding table entries for port 0 are removed.
 | 
			
		||||
 | 
			
		||||
=item $aironet->fw_port()
 | 
			
		||||
 | 
			
		||||
Adds the static table port mappings to the forwarding table port mappings by adding 
 | 
			
		||||
bs_port() to fw_port()
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_duplex()
 | 
			
		||||
 | 
			
		||||
Adds the value of awc_duplex() to each Ethernet port seen.
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_mac()
 | 
			
		||||
 | 
			
		||||
Overrides the values for i_mac with the value from awc_mac() if they are set.
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_ignore()
 | 
			
		||||
 | 
			
		||||
Ignores ports that are of type ``rptr'' and ``lo''.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,428 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry devices
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Foundry;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info SNMP::Info::Bridge Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Foundry::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS,
 | 
			
		||||
          %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
          'FOUNDRY-SN-ROOT-MIB' => 'foundry',
 | 
			
		||||
          # IP-FORWARD-MIB
 | 
			
		||||
          # ETHERLIKE-MIB
 | 
			
		||||
          # RFC1398-MIB
 | 
			
		||||
          # RMON-MIB
 | 
			
		||||
          # IF-MIB
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            # Inherit the super class ones
 | 
			
		||||
            %SNMP::Info::GLOBALS,
 | 
			
		||||
            %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
            'mac'        => 'ifPhysAddress.1',
 | 
			
		||||
            'chassis'    => 'entPhysicalDescr.1',
 | 
			
		||||
            'serial'     => 'snChasSerNum',
 | 
			
		||||
            'temp'       => 'snChasActualTemperature',
 | 
			
		||||
            'ps1_type'   => 'snChasPwrSupplyDescription.1',
 | 
			
		||||
            'ps1_status' => 'snChasPwrSupplyOperStatus.1',
 | 
			
		||||
            'fan'        => 'snChasFanOperStatus.1',
 | 
			
		||||
            #'serial'   => 'enterprises.1991.1.1.1.1.2.0',
 | 
			
		||||
            #'temp'     => 'enterprises.1991.1.1.1.1.18.0',
 | 
			
		||||
            #'ps1_type' => 'enterprises.1991.1.1.1.2.1.1.2.1',
 | 
			
		||||
            #'ps1_status' => 'enterprises.1991.1.1.1.2.1.1.3.1',
 | 
			
		||||
            #'fan'   => 'enterprises.1991.1.1.1.3.1.1.3.1'
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (
 | 
			
		||||
            %SNMP::Info::FUNCS,
 | 
			
		||||
            %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
            'i_name2'    => 'ifName',
 | 
			
		||||
            # From RFC1213-MIB
 | 
			
		||||
            'at_index'    => 'ipNetToMediaIfIndex',
 | 
			
		||||
            'at_paddr'    => 'ipNetToMediaPhysAddress',
 | 
			
		||||
            'at_netaddr'  => 'ipNetToMediaNetAddress',
 | 
			
		||||
            # FOUNDRY-MIB
 | 
			
		||||
            #   snSwPortInfoTable - Switch Port Information Group
 | 
			
		||||
            'sw_index'    => 'snSwPortIfIndex',
 | 
			
		||||
            'sw_duplex'   => 'snSwPortInfoChnMode',
 | 
			
		||||
            'sw_type'     => 'snSwPortInfoMediaType',
 | 
			
		||||
            'sw_speed'    => 'snSwPortInfoSpeed',
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
            # Inherit all the built in munging
 | 
			
		||||
            %SNMP::Info::MUNGE,
 | 
			
		||||
            %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
            'at_paddr' => \&SNMP::Info::munge_mac,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
# Add our i_aliases if they are set (manually)
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $i_name = $foundry->i_name2();
 | 
			
		||||
 | 
			
		||||
    my $i_alias = $foundry->i_alias();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid (keys %$i_name){
 | 
			
		||||
        my $alias = $i_alias->{$iid};
 | 
			
		||||
        next unless defined $alias;
 | 
			
		||||
        next unless length($alias);
 | 
			
		||||
        $i_name->{$iid} = $i_alias->{$iid};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $interfaces = $foundry->interfaces();
 | 
			
		||||
    my $i_descr    = $foundry->i_descr();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if (keys %$interfaces) {
 | 
			
		||||
        # lo -> cisco aironet 350 loopback
 | 
			
		||||
        if ($interfaces->{$if} =~ /(tunnel|loopback|lo|lb|null)/i){
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $sw_index = $foundry->sw_index();
 | 
			
		||||
    my $sw_duplex= $foundry->sw_duplex();
 | 
			
		||||
    
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $sw_port (keys %$sw_duplex){
 | 
			
		||||
        my $iid = $sw_index->{$sw_port};
 | 
			
		||||
        my $duplex = $sw_duplex->{$sw_port};
 | 
			
		||||
        next if $duplex =~ /none/i;
 | 
			
		||||
        $i_duplex{$iid} = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $i_duplex{$iid} = 'full' if $duplex =~ /full/i;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_type {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $sw_index = $foundry->sw_index();
 | 
			
		||||
    my $sw_type= $foundry->sw_type();
 | 
			
		||||
    
 | 
			
		||||
    my %i_type;
 | 
			
		||||
    foreach my $sw_port (keys %$sw_type){
 | 
			
		||||
        my $iid = $sw_index->{$sw_port};
 | 
			
		||||
        my $type = $sw_type->{$sw_port};
 | 
			
		||||
        next unless defined $type;
 | 
			
		||||
        $i_type{$iid} = $type;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $sw_index = $foundry->sw_index();
 | 
			
		||||
    my $sw_speed= $foundry->sw_speed();
 | 
			
		||||
    
 | 
			
		||||
    my %i_speed;
 | 
			
		||||
    foreach my $sw_port (keys %$sw_speed){
 | 
			
		||||
        my $iid = $sw_index->{$sw_port};
 | 
			
		||||
        my $speed = $sw_speed->{$sw_port};
 | 
			
		||||
        next unless defined $speed;
 | 
			
		||||
        $speed = 'auto'     if $speed =~ /auto/i;
 | 
			
		||||
        $speed = '10 Mbps'  if $speed =~ /s10m/i;
 | 
			
		||||
        $speed = '100 Mbps' if $speed =~ /s100m/i;
 | 
			
		||||
        $speed = '1.0 Gbps' if $speed =~ /s1g/i;
 | 
			
		||||
        $speed = '45 Mbps' if $speed =~ /s45M/i;
 | 
			
		||||
        $speed = '155 Mbps' if $speed =~ /s155M/i;
 | 
			
		||||
        $i_speed{$iid} = $speed;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_speed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $foundry->model() - looks for xxnnnn in the description
 | 
			
		||||
sub model {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $id = $foundry->id();
 | 
			
		||||
    my $desc = $foundry->description();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    $model = $1 if $desc =~ /\s+([a-z]{2}\d{4})\D/i;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $foundry->interfaces() - Map the Interfaces to their physical names
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $interfaces = $foundry->i_index();
 | 
			
		||||
    
 | 
			
		||||
    my $descriptions = $foundry->i_description();
 | 
			
		||||
 | 
			
		||||
    my %ifs = ();
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
        $ifs{$iid} = $descriptions->{$iid}; 
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return \%ifs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'foundry';
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Foundry - Perl5 Interface to Foundry Network Devices
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This module provides limited functionality from older Foundry devices.
 | 
			
		||||
Specifically designed for a FI4802
 | 
			
		||||
 | 
			
		||||
Data comes RFC1213 and FOUNDRY-SN-ROOT-MIB
 | 
			
		||||
 | 
			
		||||
Inherits all methods from both SNMP::Info and SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $foundry = new SNMP::Info::Layer3::Foundry(DestHost  => 'switch' , 
 | 
			
		||||
                              Community => 'public' ); 
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::Layer3::Foundry()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $foundry = new SNMP::Info::Layer3::Foundry(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $foundry;
 | 
			
		||||
 | 
			
		||||
=item  $foundry->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $foundry->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $foundry->session($newsession);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBAL VALUES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->model()
 | 
			
		||||
 | 
			
		||||
    Returns model type.  Checks $foundry->id() against the 
 | 
			
		||||
    FOUNDRY-SN-ROOT-MIB and then parses out xxNNNN
 | 
			
		||||
 | 
			
		||||
=item $foundry->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'foundry' :)
 | 
			
		||||
 | 
			
		||||
=item $foundry->mac()
 | 
			
		||||
 | 
			
		||||
    Returns MAC Address of root port.
 | 
			
		||||
 | 
			
		||||
    (B<ifPhysAddress.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->chassis()
 | 
			
		||||
 | 
			
		||||
    Returns Chassis type.
 | 
			
		||||
 | 
			
		||||
    (B<entPhysicalDescr.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->serial()
 | 
			
		||||
 | 
			
		||||
    Returns serial number of device.
 | 
			
		||||
 | 
			
		||||
    (B<snChasSerNum>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->temp()
 | 
			
		||||
 | 
			
		||||
    Returns the chassis temperature
 | 
			
		||||
 | 
			
		||||
    (B<snChasActualTemperature>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->ps1_type()
 | 
			
		||||
 | 
			
		||||
    Returns the Description for the power supply
 | 
			
		||||
 | 
			
		||||
    (B<snChasPwrSupplyDescription.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->ps1_status()
 | 
			
		||||
 | 
			
		||||
    Returns the status of the power supply.
 | 
			
		||||
 | 
			
		||||
    (B<snChasPwrSupplyOperStatus.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->fan()
 | 
			
		||||
 | 
			
		||||
    Returns the status of the chassis fan.
 | 
			
		||||
 | 
			
		||||
    (B<snChasFanOperStatus.1>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->interfaces()
 | 
			
		||||
 | 
			
		||||
    Returns reference to hash of interface names to iids.
 | 
			
		||||
 | 
			
		||||
    Uses B<ifDescr>.
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_name()
 | 
			
		||||
 | 
			
		||||
   Returns reference to hash of interface names.  
 | 
			
		||||
   Trys for B<ifAlias> and Defaults to B<ifName>
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_ignore()
 | 
			
		||||
 | 
			
		||||
   Returns reference to hash of interfaces to be ignored.
 | 
			
		||||
 | 
			
		||||
   Ignores interfaces with descriptions of  tunnel,loopback,null 
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_duplex()
 | 
			
		||||
 | 
			
		||||
    Returns reference to hash of interface link duplex status. 
 | 
			
		||||
 | 
			
		||||
    Crosses $foundry->sw_duplex() with $foundry->sw_index()
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_type()
 | 
			
		||||
 | 
			
		||||
    Returns reference to hash of interface types.
 | 
			
		||||
    
 | 
			
		||||
    Crosses $foundry->sw_type() with $foundry->sw_index()
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_speed()
 | 
			
		||||
 | 
			
		||||
    Returns reference to hash of interface speeds .
 | 
			
		||||
 | 
			
		||||
    Crosses $foundry->sw_speeD() with $foundry->sw_index() and 
 | 
			
		||||
    does a little munging.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 RFC1213 Arp Cache Table (B<ipNetToMediaTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->at_index()
 | 
			
		||||
 | 
			
		||||
    Returns reference to hash.  Maps ARP table entries to Interface IIDs 
 | 
			
		||||
 | 
			
		||||
    (B<ipNetToMediaIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->at_paddr()
 | 
			
		||||
 | 
			
		||||
   Returns reference to hash.  Maps ARP table entries to MAC addresses. 
 | 
			
		||||
 | 
			
		||||
    (B<ipNetToMediaPhysAddress>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->at_netaddr()
 | 
			
		||||
 | 
			
		||||
   Returns reference to hash.  Maps ARP table entries to IPs 
 | 
			
		||||
 | 
			
		||||
    (B<ipNetToMediaNetAddress>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Foundry Switch Port Information Table (B<snSwPortIfTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_index()
 | 
			
		||||
 | 
			
		||||
    Returns reference to hash.  Maps Table to Interface IID. 
 | 
			
		||||
 | 
			
		||||
    (B<snSwPortIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_duplex()
 | 
			
		||||
 | 
			
		||||
   Returns reference to hash.   Current duplex status for switch ports. 
 | 
			
		||||
 | 
			
		||||
    (B<snSwPortInfoChnMode>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_type()
 | 
			
		||||
 | 
			
		||||
    Returns reference to hash.  Current Port Type .
 | 
			
		||||
 | 
			
		||||
    (B<snSwPortInfoMediaType>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_speed()
 | 
			
		||||
 | 
			
		||||
   Returns reference to hash.  Current Port Speed. 
 | 
			
		||||
 | 
			
		||||
    (B<snSwPortInfoSpeed>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										274
									
								
								Info/MAU.pm
									
									
									
									
									
								
							
							
						
						
									
										274
									
								
								Info/MAU.pm
									
									
									
									
									
								
							@@ -1,274 +0,0 @@
 | 
			
		||||
# SNMP::Info::MAU - Media Access Unit - RFC2668
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::MAU;
 | 
			
		||||
$VERSION = 0.1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
 | 
			
		||||
@SNMP::Info::MAU::ISA = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::MAU::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
 | 
			
		||||
%MIBS = ('MAU-MIB' => 'mauMod');
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
          # Interface MAU Table
 | 
			
		||||
          'mau_index'    => 'ifMauIfIndex',
 | 
			
		||||
          'mau_link'     => 'ifMauType',
 | 
			
		||||
          'mau_status'   => 'ifMauStatus',
 | 
			
		||||
          'mau_up'       => 'ifMauMediaAvailable',
 | 
			
		||||
          'mau_type'     => 'ifMauTypeList',
 | 
			
		||||
          'mau_type_admin'     => 'ifMauDefaultType',
 | 
			
		||||
          # Interface Auto-Negotiation Table
 | 
			
		||||
          'mau_auto'     => 'ifMauAutoNegSupported',
 | 
			
		||||
          'mau_autostat' => 'ifMauAutoNegAdminStatus',
 | 
			
		||||
          'mau_autosent' => 'ifMauAutoNegCapAdvertised',
 | 
			
		||||
          'mau_autorec'  => 'ifMauAutoNegCapReceived',
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
          # Inherit all the built in munging
 | 
			
		||||
          %SNMP::Info::MUNGE,
 | 
			
		||||
          # Add ones for our class
 | 
			
		||||
          'mau_type' => \&munge_int2bin,
 | 
			
		||||
          'mau_autosent' => \&munge_int2bin,
 | 
			
		||||
          'mau_autorec' => \&munge_int2bin,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub munge_int2bin {
 | 
			
		||||
    my $int = shift;
 | 
			
		||||
    return undef unless defined $int;
 | 
			
		||||
    return unpack("B32", pack("N", $int));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _isfullduplex{
 | 
			
		||||
    my $mau = shift;
 | 
			
		||||
    my $mautype = shift;
 | 
			
		||||
 | 
			
		||||
    my @full_types = qw/11 13 16 18 20/;
 | 
			
		||||
    foreach my $type ( @full_types ) {
 | 
			
		||||
        return 1 if (substr($mautype,32-$type,1) eq '1')
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _ishalfduplex{
 | 
			
		||||
    my $mau = shift;
 | 
			
		||||
    my $mautype = shift;
 | 
			
		||||
 | 
			
		||||
    my @half_types = qw/10 12 15 17 19/;
 | 
			
		||||
    foreach my $type ( @half_types ) {
 | 
			
		||||
        return 1 if (substr($mautype,32-$type,1) eq '1')
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::MAU - Perl5 Interface to SNMP Medium Access Unit (MAU) MIB (RFC2668) 
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
MAU-MIB is used by Layer 2 devices like HP Switches . The MAU table
 | 
			
		||||
contains link and duplex info for the port itself and the device
 | 
			
		||||
connected to that port.
 | 
			
		||||
 | 
			
		||||
Inherits all methods from SNMP::Info
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $mau = new SNMP::Info::MAU(      DestHost  => 'myswitch',
 | 
			
		||||
                               Community => 'public');
 | 
			
		||||
 | 
			
		||||
=head1 CREATING AN OBJECT
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  new SNMP::Info::MAU()
 | 
			
		||||
 | 
			
		||||
Arguments passed to new() are passed on to SNMP::Session::new()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $mau = new SNMP::Info::MAU(
 | 
			
		||||
        DestHost => $host,
 | 
			
		||||
        Community => 'public',
 | 
			
		||||
        Version => 3,...
 | 
			
		||||
        ) 
 | 
			
		||||
    die "Couldn't connect.\n" unless defined $mau;
 | 
			
		||||
 | 
			
		||||
=item  $mau->session()
 | 
			
		||||
 | 
			
		||||
Sets or returns the SNMP::Session object
 | 
			
		||||
 | 
			
		||||
    # Get
 | 
			
		||||
    my $sess = $mau->session();
 | 
			
		||||
 | 
			
		||||
    # Set
 | 
			
		||||
    my $newsession = new SNMP::Session(...);
 | 
			
		||||
    $mau->session($newsession);
 | 
			
		||||
 | 
			
		||||
=item  $mau->all(), $mau->load_all()
 | 
			
		||||
 | 
			
		||||
Queries each of the methods listed in %FUNCS and returns a hash reference.
 | 
			
		||||
 | 
			
		||||
$mau->all() will call $mau->load_all() once and then return cahced valued.  
 | 
			
		||||
Use $mau->load_all() to reload from the device.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 MAU Global Configuration Values
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item None
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 MAU INTERFACE TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_index() -  Returns a list of interfaces
 | 
			
		||||
and their index in the MAU IF Table.
 | 
			
		||||
 | 
			
		||||
(B<ifMauIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_link() - Returns the type of Media Access used.  
 | 
			
		||||
 | 
			
		||||
    This is essentially the type of link in use.  
 | 
			
		||||
    eg. dot3MauType100BaseTXFD - 100BaseT at Full Duplex
 | 
			
		||||
 | 
			
		||||
(B<ifMauType>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_status() - Returns the admin link condition as 
 | 
			
		||||
 | 
			
		||||
    1 - other
 | 
			
		||||
    2 - unknown
 | 
			
		||||
    3 - operational
 | 
			
		||||
    4 - standby
 | 
			
		||||
    5 - shutdown
 | 
			
		||||
    6 - reset
 | 
			
		||||
 | 
			
		||||
Use 5 and !5 to see if the link is up or down on the admin side.
 | 
			
		||||
 | 
			
		||||
(B<ifMauStatus>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_up() -  Returns the current link condition
 | 
			
		||||
 | 
			
		||||
 (B<ifMauMediaAvailable>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_type() - Returns a 32bit string reporting the capabilities
 | 
			
		||||
of the port from a MAU POV. 
 | 
			
		||||
 | 
			
		||||
  Directly from the MAU-MIB : 
 | 
			
		||||
          Bit   Capability
 | 
			
		||||
            0      other or unknown
 | 
			
		||||
            1      AUI
 | 
			
		||||
            2      10BASE-5
 | 
			
		||||
            3      FOIRL
 | 
			
		||||
            4      10BASE-2
 | 
			
		||||
            5      10BASE-T duplex mode unknown
 | 
			
		||||
            6      10BASE-FP
 | 
			
		||||
            7      10BASE-FB
 | 
			
		||||
            8      10BASE-FL duplex mode unknown
 | 
			
		||||
            9      10BROAD36
 | 
			
		||||
           10      10BASE-T  half duplex mode
 | 
			
		||||
           11      10BASE-T  full duplex mode
 | 
			
		||||
           12      10BASE-FL half duplex mode
 | 
			
		||||
           13      10BASE-FL full duplex mode
 | 
			
		||||
           14      100BASE-T4
 | 
			
		||||
           15      100BASE-TX half duplex mode
 | 
			
		||||
           16      100BASE-TX full duplex mode
 | 
			
		||||
           17      100BASE-FX half duplex mode
 | 
			
		||||
           18      100BASE-FX full duplex mode
 | 
			
		||||
           19      100BASE-T2 half duplex mode
 | 
			
		||||
           20      100BASE-T2 full duplex mode
 | 
			
		||||
 | 
			
		||||
(B<ifMauTypeList>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_auto() - Returns status of auto-negotiation mode for ports.
 | 
			
		||||
 | 
			
		||||
(B<ifMauAutoNegAdminStatus>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_autosent() - Returns a 32 bit bit-string representing the
 | 
			
		||||
capabilities we are broadcasting on that port 
 | 
			
		||||
 | 
			
		||||
    Uses the same decoder as $mau->mau_type().
 | 
			
		||||
 | 
			
		||||
(B<ifMauAutoNegCapAdvertised>)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_autorec() - Returns a 32 bit bit-string representing the 
 | 
			
		||||
capabilities of the device on the other end. 
 | 
			
		||||
 | 
			
		||||
    Uses the same decoder as $mau->mau_type().
 | 
			
		||||
 | 
			
		||||
(B<ifMauAutoNegCapReceived>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Utility Functions
 | 
			
		||||
 | 
			
		||||
=over 
 | 
			
		||||
 | 
			
		||||
=item munge_int2bin() - Unpacks an integer into a 32bit bit string.
 | 
			
		||||
 | 
			
		||||
=item $mau->_isfullduplex(bitstring)
 | 
			
		||||
 | 
			
		||||
    Boolean. Checks to see if any of the full_duplex types from mau_type() are
 | 
			
		||||
    high.  Currently bits 11,13,16,18,20.
 | 
			
		||||
 | 
			
		||||
=item $mau->_ishalfduplex(bitstring)
 | 
			
		||||
    
 | 
			
		||||
    Boolean.  Checks to see if any of the half_duplex types from mau_type() are
 | 
			
		||||
    high.  Currently bits 10,12,15,17,19.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,7 +1,12 @@
 | 
			
		||||
Copyright (c) 2002, Regents of the University of California
 | 
			
		||||
All code from version 0.7 on
 | 
			
		||||
Copyright (c) 2003-2016 Max Baker and SNMP::Info Developers
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
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
 | 
			
		||||
modification, are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
    * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
@@ -9,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.
 | 
			
		||||
							
								
								
									
										313
									
								
								MANIFEST
									
									
									
									
									
								
							
							
						
						
									
										313
									
								
								MANIFEST
									
									
									
									
									
								
							@@ -1,22 +1,293 @@
 | 
			
		||||
COPYRIGHT
 | 
			
		||||
Info.pm
 | 
			
		||||
Info/Bridge.pm
 | 
			
		||||
Info/CDP.pm
 | 
			
		||||
Info/EtherLike.pm
 | 
			
		||||
Info/Layer1.pm
 | 
			
		||||
Info/Layer1/Allied.pm
 | 
			
		||||
Info/Layer1/Asante.pm
 | 
			
		||||
Info/Layer2.pm
 | 
			
		||||
Info/Layer2/Bay.pm
 | 
			
		||||
Info/Layer2/C1900.pm
 | 
			
		||||
Info/Layer2/C2900.pm
 | 
			
		||||
Info/Layer2/Catalyst.pm
 | 
			
		||||
Info/Layer2/HP.pm
 | 
			
		||||
Info/Layer3.pm
 | 
			
		||||
Info/Layer3/Aironet.pm
 | 
			
		||||
Info/Layer3/Foundry.pm
 | 
			
		||||
Info/MAU.pm
 | 
			
		||||
MANIFEST
 | 
			
		||||
Makefile.PL
 | 
			
		||||
.perltidyrc
 | 
			
		||||
Build.PL
 | 
			
		||||
Changes
 | 
			
		||||
contrib/DEVELOP
 | 
			
		||||
contrib/util/docmunge
 | 
			
		||||
contrib/util/make_dev_matrix.pl
 | 
			
		||||
contrib/util/make_snmpdata.pl
 | 
			
		||||
contrib/util/push_ver
 | 
			
		||||
contrib/util/run_test
 | 
			
		||||
contrib/util/test_class.pl
 | 
			
		||||
contrib/util/test_class_mocked.pl
 | 
			
		||||
lib/SNMP/Info.pm
 | 
			
		||||
lib/SNMP/Info/AdslLine.pm
 | 
			
		||||
lib/SNMP/Info/Aggregate.pm
 | 
			
		||||
lib/SNMP/Info/Airespace.pm
 | 
			
		||||
lib/SNMP/Info/AMAP.pm
 | 
			
		||||
lib/SNMP/Info/Bridge.pm
 | 
			
		||||
lib/SNMP/Info/CDP.pm
 | 
			
		||||
lib/SNMP/Info/CiscoAgg.pm
 | 
			
		||||
lib/SNMP/Info/CiscoConfig.pm
 | 
			
		||||
lib/SNMP/Info/CiscoPortSecurity.pm
 | 
			
		||||
lib/SNMP/Info/CiscoPower.pm
 | 
			
		||||
lib/SNMP/Info/CiscoQOS.pm
 | 
			
		||||
lib/SNMP/Info/CiscoRTT.pm
 | 
			
		||||
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
 | 
			
		||||
lib/SNMP/Info/FDP.pm
 | 
			
		||||
lib/SNMP/Info/IEEE802dot11.pm
 | 
			
		||||
lib/SNMP/Info/IEEE802dot3ad.pm
 | 
			
		||||
lib/SNMP/Info/IPv6.pm
 | 
			
		||||
lib/SNMP/Info/Layer1.pm
 | 
			
		||||
lib/SNMP/Info/Layer1/Allied.pm
 | 
			
		||||
lib/SNMP/Info/Layer1/Asante.pm
 | 
			
		||||
lib/SNMP/Info/Layer1/Bayhub.pm
 | 
			
		||||
lib/SNMP/Info/Layer1/Cyclades.pm
 | 
			
		||||
lib/SNMP/Info/Layer1/S3000.pm
 | 
			
		||||
lib/SNMP/Info/Layer2.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/3Com.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Adtran.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Aerohive.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Airespace.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Aironet.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Allied.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Atmedia.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Baystack.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/C1900.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/C2900.pm
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
lib/SNMP/Info/Layer3.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Aironet.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/AlcatelLucent.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/AlteonAD.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Altiga.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Arista.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Aruba.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/BayRS.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/BlueCoatSG.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/C3550.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/C4000.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/C6500.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/CheckPoint.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/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/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
 | 
			
		||||
lib/SNMP/Info/MAU.pm
 | 
			
		||||
lib/SNMP/Info/MRO.pm
 | 
			
		||||
lib/SNMP/Info/NortelStack.pm
 | 
			
		||||
lib/SNMP/Info/PowerEthernet.pm
 | 
			
		||||
lib/SNMP/Info/RapidCity.pm
 | 
			
		||||
lib/SNMP/Info/SONMP.pm
 | 
			
		||||
LICENSE
 | 
			
		||||
MANIFEST			This list of files
 | 
			
		||||
META.json
 | 
			
		||||
META.yml
 | 
			
		||||
README
 | 
			
		||||
test.pl
 | 
			
		||||
t/00_load.t
 | 
			
		||||
xt/.perltidyrc
 | 
			
		||||
xt/00_local_distribution.t
 | 
			
		||||
xt/00_local_docininfo.t
 | 
			
		||||
xt/00_local_perlcritic.t
 | 
			
		||||
xt/00_local_pod-coverage.t
 | 
			
		||||
xt/00_local_pod.t
 | 
			
		||||
xt/00_local_prereq.t
 | 
			
		||||
xt/00_local_spelling.t
 | 
			
		||||
xt/00_local_versionsync.t
 | 
			
		||||
xt/10_remote_snmplabs.t
 | 
			
		||||
xt/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/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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										73
									
								
								MANIFEST.SKIP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								MANIFEST.SKIP
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
\.bak$
 | 
			
		||||
\.pid$
 | 
			
		||||
\.swp$
 | 
			
		||||
 | 
			
		||||
^SNMP-Info-
 | 
			
		||||
 | 
			
		||||
^MANIFEST\.
 | 
			
		||||
 | 
			
		||||
# Avoid version control files.
 | 
			
		||||
\bRCS\b
 | 
			
		||||
\bCVS\b
 | 
			
		||||
\bSCCS\b
 | 
			
		||||
,v$
 | 
			
		||||
\B\.svn\b
 | 
			
		||||
\B\.git\b
 | 
			
		||||
\B\.gitignore\b
 | 
			
		||||
\b_darcs\b
 | 
			
		||||
\B\.cvsignore$
 | 
			
		||||
 | 
			
		||||
# Avoid VMS specific MakeMaker generated files
 | 
			
		||||
\bDescrip.MMS$
 | 
			
		||||
\bDESCRIP.MMS$
 | 
			
		||||
\bdescrip.mms$
 | 
			
		||||
 | 
			
		||||
# Avoid Makemaker generated and utility files.
 | 
			
		||||
\bMANIFEST\.bak
 | 
			
		||||
\bMakefile$
 | 
			
		||||
\bblib/
 | 
			
		||||
\bMakeMaker-\d
 | 
			
		||||
\bpm_to_blib\.ts$
 | 
			
		||||
\bpm_to_blib$
 | 
			
		||||
\bblibdirs\.ts$         # 6.18 through 6.25 generated this
 | 
			
		||||
 | 
			
		||||
# Avoid Module::Build generated and utility files.
 | 
			
		||||
\bBuild$
 | 
			
		||||
\b_build/
 | 
			
		||||
\bBuild.bat$
 | 
			
		||||
\bBuild.COM$
 | 
			
		||||
\bBUILD.COM$
 | 
			
		||||
\bbuild.com$
 | 
			
		||||
 | 
			
		||||
# Avoid temp and backup files.
 | 
			
		||||
~$
 | 
			
		||||
\.old$
 | 
			
		||||
\#$
 | 
			
		||||
\b\.#
 | 
			
		||||
\.bak$
 | 
			
		||||
\.tmp$
 | 
			
		||||
\.#
 | 
			
		||||
\.rej$
 | 
			
		||||
 | 
			
		||||
# Avoid OS-specific files/dirs
 | 
			
		||||
# Mac OSX metadata
 | 
			
		||||
\B\.DS_Store
 | 
			
		||||
# Mac OSX SMB mount metadata files
 | 
			
		||||
\B\._
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
							
								
								
									
										612
									
								
								META.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										612
									
								
								META.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,612 @@
 | 
			
		||||
{
 | 
			
		||||
   "abstract" : "OO Interface to Network devices and MIBs through SNMP",
 | 
			
		||||
   "author" : [
 | 
			
		||||
      "Eric A. Miller <emiller@cpan.org>"
 | 
			
		||||
   ],
 | 
			
		||||
   "dynamic_config" : 1,
 | 
			
		||||
   "generated_by" : "Module::Build version 0.4224",
 | 
			
		||||
   "license" : [
 | 
			
		||||
      "bsd"
 | 
			
		||||
   ],
 | 
			
		||||
   "meta-spec" : {
 | 
			
		||||
      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
 | 
			
		||||
      "version" : 2
 | 
			
		||||
   },
 | 
			
		||||
   "name" : "SNMP-Info",
 | 
			
		||||
   "prereqs" : {
 | 
			
		||||
      "configure" : {
 | 
			
		||||
         "requires" : {
 | 
			
		||||
            "Module::Build" : "0.42"
 | 
			
		||||
         }
 | 
			
		||||
      },
 | 
			
		||||
      "runtime" : {
 | 
			
		||||
         "recommends" : {
 | 
			
		||||
            "Class::ISA" : "0",
 | 
			
		||||
            "File::Slurp" : "0",
 | 
			
		||||
            "Module::Info" : "0",
 | 
			
		||||
            "Module::Load" : "0",
 | 
			
		||||
            "PPI" : "0"
 | 
			
		||||
         },
 | 
			
		||||
         "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"
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   },
 | 
			
		||||
   "provides" : {
 | 
			
		||||
      "SNMP::Info" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::AMAP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/AMAP.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::AdslLine" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/AdslLine.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Aggregate" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Aggregate.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Airespace" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Airespace.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Bridge" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Bridge.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CDP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CDP.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoAgg" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoAgg.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoConfig" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoConfig.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoPortSecurity" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoPortSecurity.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoPower" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoPower.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoQOS" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoQOS.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoRTT" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoRTT.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoStack" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoStack.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoStats" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoStats.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoStpExtensions" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoStpExtensions.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoVTP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoVTP.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::DocsisCM" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/DocsisCM.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::DocsisHE" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/DocsisHE.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::EDP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/EDP.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Entity" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Entity.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::EtherLike" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/EtherLike.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::FDP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/FDP.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::IEEE802dot11" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/IEEE802dot11.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::IEEE802dot3ad" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/IEEE802dot3ad.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::IPv6" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/IPv6.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::LLDP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/LLDP.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1::Allied" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1/Allied.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1::Asante" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1/Asante.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1::Bayhub" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1/Bayhub.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1::Cyclades" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1/Cyclades.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1::S3000" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1/S3000.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::3Com" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/3Com.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Adtran" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Adtran.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Aerohive" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Aerohive.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Airespace" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Airespace.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Aironet" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Aironet.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Allied" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Allied.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Atmedia" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Atmedia.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Baystack" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Baystack.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::C1900" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/C1900.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::C2900" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/C2900.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Catalyst" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Catalyst.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Centillion" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Centillion.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Cisco" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Cisco.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::CiscoSB" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/CiscoSB.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Exinda" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Exinda.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::HP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/HP.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::HP4000" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/HP4000.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::HPVC" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/HPVC.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Kentrox" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Kentrox.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::N2270" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/N2270.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::NAP222x" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/NAP222x.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::NWSS2300" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/NWSS2300.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Netgear" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Netgear.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Nexans" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Nexans.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Orinoco" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Orinoco.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Sixnet" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Sixnet.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Trapeze" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Trapeze.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Ubiquiti" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Ubiquiti.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::ZyXEL_DSLAM" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Aironet" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Aironet.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::AlcatelLucent" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/AlcatelLucent.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::AlteonAD" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/AlteonAD.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Altiga" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Altiga.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Arista" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Arista.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Aruba" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Aruba.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::BayRS" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/BayRS.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::BlueCoatSG" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/BlueCoatSG.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::C3550" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/C3550.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::C4000" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/C4000.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::C6500" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/C6500.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::CheckPoint" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/CheckPoint.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Ciena" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Ciena.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Cisco" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Cisco.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::CiscoASA" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/CiscoASA.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::CiscoFWSM" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/CiscoFWSM.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::CiscoSwitch" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/CiscoSwitch.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Contivity" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Contivity.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Cumulus" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Cumulus.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::DLink" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/DLink.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Dell" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Dell.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::ERX" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/ERX.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Enterasys" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Enterasys.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Extreme" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Extreme.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::F5" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/F5.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Force10" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Force10.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Fortinet" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Fortinet.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Foundry" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Foundry.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Genua" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Genua.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::H3C" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/H3C.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::HP9300" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/HP9300.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Huawei" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Huawei.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::IBMGbTor" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/IBMGbTor.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Juniper" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Juniper.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Lantronix" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Lantronix.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Lenovo" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Lenovo.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Microsoft" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Microsoft.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Mikrotik" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Mikrotik.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::N1600" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/N1600.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::NetSNMP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/NetSNMP.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Netscreen" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Netscreen.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Nexus" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Nexus.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::OneAccess" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/OneAccess.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::PacketFront" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/PacketFront.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::PaloAlto" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/PaloAlto.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Passport" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Passport.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Pf" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Pf.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Pica8" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Pica8.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Redlion" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Redlion.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Scalance" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Scalance.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::SonicWALL" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/SonicWALL.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Steelhead" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Steelhead.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Sun" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Sun.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Tasman" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Tasman.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Timetra" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Timetra.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::VMware" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/VMware.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::VyOS" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/VyOS.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::APC" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/APC.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::Arbor" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/Arbor.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::CiscoIPS" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/CiscoIPS.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::Gigamon" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/Gigamon.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::Liebert" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/Liebert.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::Neoteris" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/Neoteris.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::Netscaler" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/Netscaler.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::MAU" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/MAU.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::MRO" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/MRO.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::NortelStack" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/NortelStack.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::PowerEthernet" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/PowerEthernet.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::RapidCity" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/RapidCity.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::SONMP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/SONMP.pm",
 | 
			
		||||
         "version" : "3.70"
 | 
			
		||||
      }
 | 
			
		||||
   },
 | 
			
		||||
   "release_status" : "stable",
 | 
			
		||||
   "resources" : {
 | 
			
		||||
      "bugtracker" : {
 | 
			
		||||
         "web" : "https://github.com/netdisco/snmp-info/issues"
 | 
			
		||||
      },
 | 
			
		||||
      "homepage" : "http://netdisco.org/",
 | 
			
		||||
      "license" : [
 | 
			
		||||
         "http://opensource.org/licenses/bsd-license.php"
 | 
			
		||||
      ],
 | 
			
		||||
      "repository" : {
 | 
			
		||||
         "url" : "https://github.com/netdisco/snmp-info"
 | 
			
		||||
      },
 | 
			
		||||
      "x_IRC" : "irc://irc.freenode.org/#netdisco",
 | 
			
		||||
      "x_MailingList" : "https://lists.sourceforge.net/lists/listinfo/snmp-info-users"
 | 
			
		||||
   },
 | 
			
		||||
   "version" : "3.70",
 | 
			
		||||
   "x_serialization_backend" : "JSON::PP version 2.97001"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										451
									
								
								META.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										451
									
								
								META.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,451 @@
 | 
			
		||||
---
 | 
			
		||||
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'
 | 
			
		||||
license: bsd
 | 
			
		||||
meta-spec:
 | 
			
		||||
  url: http://module-build.sourceforge.net/META-spec-v1.4.html
 | 
			
		||||
  version: '1.4'
 | 
			
		||||
name: SNMP-Info
 | 
			
		||||
provides:
 | 
			
		||||
  SNMP::Info:
 | 
			
		||||
    file: lib/SNMP/Info.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::AMAP:
 | 
			
		||||
    file: lib/SNMP/Info/AMAP.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::AdslLine:
 | 
			
		||||
    file: lib/SNMP/Info/AdslLine.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Aggregate:
 | 
			
		||||
    file: lib/SNMP/Info/Aggregate.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Airespace:
 | 
			
		||||
    file: lib/SNMP/Info/Airespace.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Bridge:
 | 
			
		||||
    file: lib/SNMP/Info/Bridge.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CDP:
 | 
			
		||||
    file: lib/SNMP/Info/CDP.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CiscoAgg:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoAgg.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CiscoConfig:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoConfig.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CiscoPortSecurity:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoPortSecurity.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CiscoPower:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoPower.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CiscoQOS:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoQOS.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CiscoRTT:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoRTT.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CiscoStack:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoStack.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CiscoStats:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoStats.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CiscoStpExtensions:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoStpExtensions.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::CiscoVTP:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoVTP.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::DocsisCM:
 | 
			
		||||
    file: lib/SNMP/Info/DocsisCM.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::DocsisHE:
 | 
			
		||||
    file: lib/SNMP/Info/DocsisHE.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::EDP:
 | 
			
		||||
    file: lib/SNMP/Info/EDP.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Entity:
 | 
			
		||||
    file: lib/SNMP/Info/Entity.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::EtherLike:
 | 
			
		||||
    file: lib/SNMP/Info/EtherLike.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::FDP:
 | 
			
		||||
    file: lib/SNMP/Info/FDP.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::IEEE802dot11:
 | 
			
		||||
    file: lib/SNMP/Info/IEEE802dot11.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::IEEE802dot3ad:
 | 
			
		||||
    file: lib/SNMP/Info/IEEE802dot3ad.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::IPv6:
 | 
			
		||||
    file: lib/SNMP/Info/IPv6.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::LLDP:
 | 
			
		||||
    file: lib/SNMP/Info/LLDP.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer1:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer1::Allied:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1/Allied.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer1::Asante:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1/Asante.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer1::Bayhub:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1/Bayhub.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer1::Cyclades:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1/Cyclades.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer1::S3000:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1/S3000.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::3Com:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/3Com.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Adtran:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Adtran.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Aerohive:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Aerohive.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Airespace:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Airespace.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Aironet:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Aironet.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Allied:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Allied.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Atmedia:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Atmedia.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Baystack:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Baystack.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::C1900:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/C1900.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::C2900:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/C2900.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Catalyst:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Catalyst.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Centillion:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Centillion.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Cisco:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Cisco.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::CiscoSB:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/CiscoSB.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Exinda:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Exinda.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::HP:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/HP.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::HP4000:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/HP4000.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::HPVC:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/HPVC.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Kentrox:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Kentrox.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::N2270:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/N2270.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::NAP222x:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/NAP222x.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::NWSS2300:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/NWSS2300.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Netgear:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Netgear.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Nexans:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Nexans.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Orinoco:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Orinoco.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Sixnet:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Sixnet.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Trapeze:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Trapeze.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::Ubiquiti:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Ubiquiti.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer2::ZyXEL_DSLAM:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Aironet:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Aironet.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::AlcatelLucent:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/AlcatelLucent.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::AlteonAD:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/AlteonAD.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Altiga:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Altiga.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Arista:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Arista.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Aruba:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Aruba.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::BayRS:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/BayRS.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::BlueCoatSG:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/BlueCoatSG.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::C3550:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/C3550.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::C4000:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/C4000.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::C6500:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/C6500.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::CheckPoint:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/CheckPoint.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Ciena:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Ciena.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Cisco:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Cisco.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::CiscoASA:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/CiscoASA.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::CiscoFWSM:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/CiscoFWSM.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::CiscoSwitch:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/CiscoSwitch.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Contivity:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Contivity.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Cumulus:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Cumulus.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::DLink:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/DLink.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Dell:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Dell.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::ERX:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/ERX.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Enterasys:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Enterasys.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Extreme:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Extreme.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::F5:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/F5.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Force10:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Force10.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Fortinet:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Fortinet.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Foundry:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Foundry.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Genua:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Genua.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::H3C:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/H3C.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::HP9300:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/HP9300.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Huawei:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Huawei.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::IBMGbTor:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/IBMGbTor.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Juniper:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Juniper.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Lantronix:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Lantronix.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Lenovo:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Lenovo.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Microsoft:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Microsoft.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Mikrotik:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Mikrotik.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::N1600:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/N1600.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::NetSNMP:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/NetSNMP.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Netscreen:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Netscreen.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Nexus:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Nexus.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::OneAccess:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/OneAccess.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::PacketFront:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/PacketFront.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::PaloAlto:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/PaloAlto.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Passport:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Passport.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Pf:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Pf.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Pica8:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Pica8.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Redlion:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Redlion.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Scalance:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Scalance.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::SonicWALL:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/SonicWALL.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Steelhead:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Steelhead.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Sun:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Sun.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Tasman:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Tasman.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::Timetra:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Timetra.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::VMware:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/VMware.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer3::VyOS:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/VyOS.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer7:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer7::APC:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/APC.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer7::Arbor:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/Arbor.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer7::CiscoIPS:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/CiscoIPS.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer7::Gigamon:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/Gigamon.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer7::Liebert:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/Liebert.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer7::Neoteris:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/Neoteris.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::Layer7::Netscaler:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/Netscaler.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::MAU:
 | 
			
		||||
    file: lib/SNMP/Info/MAU.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::MRO:
 | 
			
		||||
    file: lib/SNMP/Info/MRO.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::NortelStack:
 | 
			
		||||
    file: lib/SNMP/Info/NortelStack.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::PowerEthernet:
 | 
			
		||||
    file: lib/SNMP/Info/PowerEthernet.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::RapidCity:
 | 
			
		||||
    file: lib/SNMP/Info/RapidCity.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
  SNMP::Info::SONMP:
 | 
			
		||||
    file: lib/SNMP/Info/SONMP.pm
 | 
			
		||||
    version: '3.70'
 | 
			
		||||
recommends:
 | 
			
		||||
  Class::ISA: '0'
 | 
			
		||||
  File::Slurp: '0'
 | 
			
		||||
  Module::Info: '0'
 | 
			
		||||
  Module::Load: '0'
 | 
			
		||||
  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-license.php
 | 
			
		||||
  repository: https://github.com/netdisco/snmp-info
 | 
			
		||||
version: '3.70'
 | 
			
		||||
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
 | 
			
		||||
							
								
								
									
										18
									
								
								Makefile.PL
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								Makefile.PL
									
									
									
									
									
								
							@@ -1,18 +0,0 @@
 | 
			
		||||
# SNMP::Info -  Makefile.PL
 | 
			
		||||
use ExtUtils::MakeMaker;
 | 
			
		||||
WriteMakefile(
 | 
			
		||||
    'NAME'               => 'SNMP::Info',
 | 
			
		||||
    'VERSION_FROM'       => 'Info.pm',
 | 
			
		||||
    'PREREQ_PM'          => {'SNMP' => '4'},
 | 
			
		||||
    ($] >= 5.005 ?    
 | 
			
		||||
          (ABSTRACT_FROM => 'Info.pm', 
 | 
			
		||||
           AUTHOR        => 'Max Baker <max@warped.org>')
 | 
			
		||||
                 : () 
 | 
			
		||||
    ),
 | 
			
		||||
    'PMLIBDIRS'          => ['Info','$(BASEEXT)'],
 | 
			
		||||
             );
 | 
			
		||||
 | 
			
		||||
sub MY::postamble { "
 | 
			
		||||
.PHONY: readme
 | 
			
		||||
readme:
 | 
			
		||||
	pod2text -l Info.pm > README" }
 | 
			
		||||
							
								
								
									
										33
									
								
								contrib/DEVELOP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								contrib/DEVELOP
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
SNMP::Info Developer Guidelines
 | 
			
		||||
 | 
			
		||||
Coding Guidelines:
 | 
			
		||||
    - tab-width of 4, no tab characters
 | 
			
		||||
    - keep POD documentation up-to-date
 | 
			
		||||
    - always update ChangeLog before committing
 | 
			
		||||
    - check-in required mibs to netdisco-mibs and release new package if needed
 | 
			
		||||
 | 
			
		||||
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?
 | 
			
		||||
    -> 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 ().
 | 
			
		||||
 | 
			
		||||
    - 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".
 | 
			
		||||
       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?
 | 
			
		||||
							
								
								
									
										35
									
								
								contrib/util/docmunge
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								contrib/util/docmunge
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
#!/usr/bin/perl -i.bak
 | 
			
		||||
#
 | 
			
		||||
# [Re-]write POD to create cross-links between Required MIBs, GLOBALS
 | 
			
		||||
#     and TABLE METHODS sections.
 | 
			
		||||
# This is a horrible jumble of heuristics, but works with
 | 
			
		||||
# all of the existing files. It has only one false positive: HP.pm's
 | 
			
		||||
# mention of an SNMP::Info version number.
 | 
			
		||||
#
 | 
			
		||||
$section = undef;
 | 
			
		||||
$waiting = 0;
 | 
			
		||||
while (<>) {
 | 
			
		||||
	if (eof) {
 | 
			
		||||
		$section = undef;
 | 
			
		||||
		$waiting = 0;
 | 
			
		||||
	}
 | 
			
		||||
	if (/^=head(\d)/) {
 | 
			
		||||
		$sl = $1;
 | 
			
		||||
		if ($sl <= $level) {
 | 
			
		||||
			$section = undef;
 | 
			
		||||
		}
 | 
			
		||||
		if (/(TABLE METHODS|GLOBALS|Required MIBs)/) {
 | 
			
		||||
			$section = $1;
 | 
			
		||||
			$level = $sl;
 | 
			
		||||
			if ($section eq 'TABLE METHODS' || $section eq 'GLOBALS') {
 | 
			
		||||
				$waiting = 1;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if ($waiting && /imported/i) {
 | 
			
		||||
			$waiting = 0;
 | 
			
		||||
		}
 | 
			
		||||
	} elsif (defined($section) && !$waiting && /^[^=]/ && /SNMP::Info/) {
 | 
			
		||||
		s,(?:L<)?(SNMP::Info[a-zA-Z0-9:]*)(?:/[^>]+)?(?:>)?,L<$1/"$section">,g;
 | 
			
		||||
	}
 | 
			
		||||
	print;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										338
									
								
								contrib/util/make_dev_matrix.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										338
									
								
								contrib/util/make_dev_matrix.pl
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,338 @@
 | 
			
		||||
#!/usr/bin/perl -w
 | 
			
		||||
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
$DevMatrix = '../DeviceMatrix.txt';
 | 
			
		||||
$DevHTML   = 'DeviceMatrix.html';
 | 
			
		||||
$DevPNG    = 'DeviceMatrix.png';
 | 
			
		||||
$Attributes= {};
 | 
			
		||||
 | 
			
		||||
# Parse Data File
 | 
			
		||||
$matrix = parse_data($DevMatrix);
 | 
			
		||||
 | 
			
		||||
# Graph it for fun
 | 
			
		||||
eval "use GraphViz::Data::Structure;";
 | 
			
		||||
if ($@) {
 | 
			
		||||
    print "GraphViz::Data::Structure not installed. $@\n";
 | 
			
		||||
} else {
 | 
			
		||||
    my %graph = ();
 | 
			
		||||
    foreach my $vendor (sort sort_nocase keys %$matrix){
 | 
			
		||||
        $graph{$vendor} = {};
 | 
			
		||||
        foreach my $family  (sort sort_nocase keys %{$matrix->{$vendor}->{families}} ){
 | 
			
		||||
            my @models;
 | 
			
		||||
            foreach my $mod (keys %{$matrix->{$vendor}->{families}->{$family}->{models}}){
 | 
			
		||||
                push(@models,split(/\s*,\s*/,$mod));
 | 
			
		||||
            }
 | 
			
		||||
            if (scalar @models){
 | 
			
		||||
                $graph{$vendor}->{$family}=\@models;
 | 
			
		||||
            } else {
 | 
			
		||||
                $graph{$vendor}->{$family}=[];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    my $now = scalar localtime;
 | 
			
		||||
    my $gvds = GraphViz::Data::Structure->new(\%graph,Orientation=>'vertical',
 | 
			
		||||
        Colors=> 'Deep',
 | 
			
		||||
        graph => {label=>"SNMP::Info and Netdisco Supported Devices \n $now",'fontpath'=>'/usr/local/netdisco','fontname'=>'lucon',concentrate=>'true','overlap'=>'false',spline=>'true',bgcolor=>'wheat'},
 | 
			
		||||
        node  => {fontname=>'lucon'},
 | 
			
		||||
        );
 | 
			
		||||
    $gvds->graph()->as_png($DevPNG);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "Creating $DevHTML\n";
 | 
			
		||||
open (HTML, "> $DevHTML") or die "Can't open $DevHTML. $!\n";
 | 
			
		||||
$old_fh = select(HTML);
 | 
			
		||||
&html_head;
 | 
			
		||||
print_vendors($matrix);
 | 
			
		||||
foreach my $vendor (sort sort_nocase keys %$matrix){
 | 
			
		||||
    print "<A NAME=\"$vendor\"><SPAN CLASS=\"vendor\"><B>$vendor</B></SPAN></A>\n";
 | 
			
		||||
    print "<DL>\n";
 | 
			
		||||
 | 
			
		||||
    my $vendor_defaults = $matrix->{$vendor}->{defaults};
 | 
			
		||||
    print_notes($vendor_defaults,1);
 | 
			
		||||
 | 
			
		||||
    my $families = $matrix->{$vendor}->{families};
 | 
			
		||||
    foreach my $family (sort sort_nocase keys %$families ) {
 | 
			
		||||
        print "<DT>$family Family\n";
 | 
			
		||||
 | 
			
		||||
        my $family_defaults = $families->{$family}->{defaults};
 | 
			
		||||
        print_notes($family_defaults,2);
 | 
			
		||||
 | 
			
		||||
        my $models = $families->{$family}->{models};
 | 
			
		||||
        foreach my $model (sort sort_nocase keys %$models ){
 | 
			
		||||
            my $model_defaults = $models->{$model}->{defaults};
 | 
			
		||||
            print "<DD>$model\n";
 | 
			
		||||
            print "<DL>\n";
 | 
			
		||||
            print_notes($model_defaults,3);
 | 
			
		||||
 | 
			
		||||
            print "<DT><DD><TABLE BORDER=1>\n";
 | 
			
		||||
            print_headers();
 | 
			
		||||
            print "<TR>\n";
 | 
			
		||||
            foreach my $a (sort sort_nocase keys %$Attributes) {
 | 
			
		||||
                my $val;
 | 
			
		||||
                next if $a eq 'note';
 | 
			
		||||
                $val = ['-'];
 | 
			
		||||
                $class = 'none';
 | 
			
		||||
                if (defined $model_defaults->{$a}) {
 | 
			
		||||
                    $val = $model_defaults->{$a};
 | 
			
		||||
                    $class = 'model';
 | 
			
		||||
                } elsif (defined $family_defaults->{$a}){
 | 
			
		||||
                    $val = $family_defaults->{$a};
 | 
			
		||||
                    $class = 'family';
 | 
			
		||||
                } 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";
 | 
			
		||||
            print "</DL>\n";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    print "</DL>\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
&html_tail;
 | 
			
		||||
 | 
			
		||||
select ($old_fh);
 | 
			
		||||
close (HTML) or die "Can't write $DevHTML. $!\n";
 | 
			
		||||
 | 
			
		||||
# Data Structures
 | 
			
		||||
 | 
			
		||||
# Matrix =
 | 
			
		||||
#   ( vendor => { families  => { family => family_hash },
 | 
			
		||||
#                  defaults => { cmd    => [values]    },
 | 
			
		||||
#               }
 | 
			
		||||
#   )
 | 
			
		||||
 | 
			
		||||
# Family Hash
 | 
			
		||||
#   ( models   => { model => model_hash },
 | 
			
		||||
#     defaults => { cmd   => [values]   }
 | 
			
		||||
#   )
 | 
			
		||||
 | 
			
		||||
# Model Hash
 | 
			
		||||
#   ( defaults => { cmd => [values] } )
 | 
			
		||||
sub parse_data {
 | 
			
		||||
    my $file = shift;
 | 
			
		||||
    my %ignore = map { $_ => 1  }  @_;
 | 
			
		||||
    my $Matrix;
 | 
			
		||||
 | 
			
		||||
    my @Lines;
 | 
			
		||||
    open (DM, "< $file") or die "Can't open $file. $!\n";
 | 
			
		||||
    {
 | 
			
		||||
        @Lines = <DM>;
 | 
			
		||||
    }
 | 
			
		||||
    close (DM);
 | 
			
		||||
 | 
			
		||||
    my ($device,$family,$vendor,$class);
 | 
			
		||||
    foreach my $line (@Lines){
 | 
			
		||||
        chomp($line);
 | 
			
		||||
        # Comments
 | 
			
		||||
        $line =~ s/#.*//;
 | 
			
		||||
 | 
			
		||||
        # Blank Lines
 | 
			
		||||
        next if $line =~ /^\s*$/;
 | 
			
		||||
 | 
			
		||||
        # Trim whitespace
 | 
			
		||||
        $line =~ s/^\s+//;
 | 
			
		||||
        $line =~ s/\s+$//;
 | 
			
		||||
 | 
			
		||||
        my ($cmd,$value);
 | 
			
		||||
        if ($line =~ /^([a-z-_]+)\s*:\s*(.*)$/) {
 | 
			
		||||
            $cmd = $1;  $value = $2;
 | 
			
		||||
        } else {
 | 
			
		||||
            print "What do i do with this line : $line \n";
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (exists $ignore{$cmd}){
 | 
			
		||||
            print "Ignoring $cmd\n";
 | 
			
		||||
        }
 | 
			
		||||
        # Set Class {vendor,family,device}
 | 
			
		||||
        if ($cmd eq 'device-vendor'){
 | 
			
		||||
            $vendor = $value;
 | 
			
		||||
            $family = $model = undef;
 | 
			
		||||
            $Matrix->{$vendor} = {} unless defined $Matrix->{$vendor};
 | 
			
		||||
            $class = $Matrix->{$vendor};
 | 
			
		||||
            $class->{defaults}->{type}='vendor';
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($cmd eq 'device-family'){
 | 
			
		||||
            $family = $value;
 | 
			
		||||
            $model = undef;
 | 
			
		||||
            print "$family has no vendor.\n" unless defined $vendor;
 | 
			
		||||
            $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} = {}
 | 
			
		||||
                unless defined $Matrix->{$vendor}->{families}->{$family}->{models}->{$model};
 | 
			
		||||
            $class = $Matrix->{$vendor}->{families}->{$family}->{models}->{$model};
 | 
			
		||||
            $class->{defaults}->{type}='device';
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Store attribute
 | 
			
		||||
        push (@{$class->{defaults}->{$cmd}} , $value);
 | 
			
		||||
        $Attributes->{$cmd}++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $Matrix;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub sort_nocase {
 | 
			
		||||
    return lc($a) cmp lc($b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub print_notes {
 | 
			
		||||
    my $defaults = shift;
 | 
			
		||||
    my $level    = shift;
 | 
			
		||||
    my $notes    = $defaults->{note} || [];
 | 
			
		||||
    foreach my $note (@$notes){
 | 
			
		||||
        if ($note =~ s/^!//){
 | 
			
		||||
            $note = '<SPAN CLASS="note">' . $note . '</SPAN>';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (scalar @$notes){
 | 
			
		||||
        print "<DT>\n";
 | 
			
		||||
        my $print_note = join("\n<LI>",@$notes);
 | 
			
		||||
        print "<UL TYPE='square'><LI>$print_note</UL>\n";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub print_vendors {
 | 
			
		||||
    my $matrix=shift;
 | 
			
		||||
    print "<h1>Device Vendors</h1>\n";
 | 
			
		||||
    foreach my $vendor (sort sort_nocase keys %$matrix){
 | 
			
		||||
        print "[<A HREF=\"#$vendor\">$vendor</A>]\n";
 | 
			
		||||
    }
 | 
			
		||||
    print "<HR>\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub html_head {
 | 
			
		||||
    print <<"end_head";
 | 
			
		||||
<HTML>
 | 
			
		||||
<HEAD>
 | 
			
		||||
<TITLE>SNMP::Info - Device Compatibility Matrix</TITLE>
 | 
			
		||||
<STYLE TYPE="text/css" MEDIA="screen">
 | 
			
		||||
<!--
 | 
			
		||||
    BODY    { font-family:arial,helvetica,sans-serif; font-size:12pt; }
 | 
			
		||||
    TD      { font-family:arial,helvetica,sans-serif; font-size:10pt; }
 | 
			
		||||
    TH      { font-family:arial,helvetica,sans-serif; font-size:10pt; background:#F0F0F0; }
 | 
			
		||||
    H1      { font-family:arial,helvetica,sans-serif; font-size:14pt; }
 | 
			
		||||
    .vendor { font-size:12pt; color:#777777; }
 | 
			
		||||
    .family { font-size:12pt; color:blue; }
 | 
			
		||||
    .model  { font-size:12pt; color:red; }
 | 
			
		||||
    .note   { color:red; }
 | 
			
		||||
//-->
 | 
			
		||||
</STYLE>
 | 
			
		||||
</HEAD>
 | 
			
		||||
<BODY>
 | 
			
		||||
<h1>SNMP::Info - Device Compatibility Matrix</h1>
 | 
			
		||||
<P>
 | 
			
		||||
end_head
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub html_tail {
 | 
			
		||||
    print <<'end_tail';
 | 
			
		||||
<HR>
 | 
			
		||||
<h1>Color Key</h1>
 | 
			
		||||
[<SPAN CLASS="model">Model Attribute</SPAN>]
 | 
			
		||||
[<SPAN CLASS="family">Family Attribute</SPAN>]
 | 
			
		||||
[<SPAN CLASS="vendor">Vendor Attribute</SPAN>]
 | 
			
		||||
<h1>Attribute Key</h1>
 | 
			
		||||
A value of <B>-</B> signifies the information is not specified and can not
 | 
			
		||||
be assumed working.
 | 
			
		||||
<TABLE BORDER=1>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Arpnip</TD>
 | 
			
		||||
    <TD>Ability to collect ARP tables for MAC to IP translation.</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Class</TD>
 | 
			
		||||
    <TD>SNMP::Info Class the the device currently uses.  Devices using more generic
 | 
			
		||||
        interfaces like <tt>Layer2</tt> or <tt>Layer3</tt> may eventually get their
 | 
			
		||||
        own subclass.
 | 
			
		||||
    </TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Duplex</TD>
 | 
			
		||||
    <TD>Ability to cull duplex settings from device.<BR>
 | 
			
		||||
        <UL>
 | 
			
		||||
            <LI><tt>no</tt> - Can't recover current or admin setting.
 | 
			
		||||
            <LI><tt>link</tt> - Can get current setting only.
 | 
			
		||||
            <LI><tt>both</tt> - Can get admin and link setting.
 | 
			
		||||
            <LI><tt>write</tt> - Can get admin and link setting and perform sets.
 | 
			
		||||
        </UL>
 | 
			
		||||
    </TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Macsuck</TD>
 | 
			
		||||
    <TD>Ability to get CAM tables for MAC to switch port mapping.<BR>
 | 
			
		||||
        <UL>
 | 
			
		||||
            <LI><TT>no</TT> - Have not found an SNMP method to get data yet.
 | 
			
		||||
            <LI><TT>yes</TT> - Can get through normal SWITCH-MIB method.
 | 
			
		||||
            <LI><TT>vlan</TT> - Have to re-connect to each VLAN and then fetch with normal
 | 
			
		||||
        method.
 | 
			
		||||
        </UL>
 | 
			
		||||
    </TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Modules</TD>
 | 
			
		||||
    <TD>Ability to gather hardware module information.</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Portmac</TD>
 | 
			
		||||
    <TD>Whether the device will list the MAC address of the switch port on each
 | 
			
		||||
        switch port when doing a Macsuck.
 | 
			
		||||
    </TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Topo</TD>
 | 
			
		||||
    <TD>Ability to get Layer 2 Topology Information from device if the
 | 
			
		||||
        protocol is enabled.  SNMP::Info supports querying Link Layer
 | 
			
		||||
        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).
 | 
			
		||||
    </TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Ver</TD>
 | 
			
		||||
    <TD>SNMP Protocol Version the device has to use.</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Vlan</TD>
 | 
			
		||||
    <TD>Ability to get VLAN port assignments.<BR>
 | 
			
		||||
        <UL>
 | 
			
		||||
            <LI><TT>no</TT> - Have not found an SNMP method to get data yet.
 | 
			
		||||
            <LI><TT>yes</TT> - Can read information.
 | 
			
		||||
            <LI><TT>write</TT> - Can read and write (set).
 | 
			
		||||
        </UL>
 | 
			
		||||
    </TD>
 | 
			
		||||
</TR>
 | 
			
		||||
</TABLE>
 | 
			
		||||
</BODY>
 | 
			
		||||
</HTML>
 | 
			
		||||
end_tail
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub print_headers {
 | 
			
		||||
    print "<TR>\n";
 | 
			
		||||
    foreach my $a (sort sort_nocase keys %$Attributes) {
 | 
			
		||||
        next if $a eq 'note';
 | 
			
		||||
        print "  <TH>$a</TH>\n";
 | 
			
		||||
    }
 | 
			
		||||
    print "</TR>\n";
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										207
									
								
								contrib/util/make_snmpdata.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										207
									
								
								contrib/util/make_snmpdata.pl
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,207 @@
 | 
			
		||||
#!/usr/bin/perl
 | 
			
		||||
#
 | 
			
		||||
# make_snmpdata.pl
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Carp;
 | 
			
		||||
use Getopt::Long;
 | 
			
		||||
use Pod::Usage;
 | 
			
		||||
use SNMP;
 | 
			
		||||
 | 
			
		||||
local $| = 1;
 | 
			
		||||
 | 
			
		||||
my $mibdirs = ['/usr/local/share/snmp/mibs'];
 | 
			
		||||
my $comm    = 'public';
 | 
			
		||||
my $ver     = '2c';
 | 
			
		||||
my $dev;
 | 
			
		||||
my $ignore = 0;
 | 
			
		||||
my $help   = 0;
 | 
			
		||||
 | 
			
		||||
GetOptions(
 | 
			
		||||
    'community=s' => \$comm,
 | 
			
		||||
    'device=s'    => \$dev,
 | 
			
		||||
    'ignore'      => \$ignore,
 | 
			
		||||
    'mibdir=s'   => \$mibdirs,
 | 
			
		||||
    'version'     => \$ver,
 | 
			
		||||
    'help|?'      => sub { pod2usage(2); },
 | 
			
		||||
) or pod2usage(2);
 | 
			
		||||
 | 
			
		||||
unless ( defined $dev && $ver =~ /[1|2c]/ ) {
 | 
			
		||||
    pod2usage(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local $ENV{'SNMPCONFPATH'} = ''        if $ignore;
 | 
			
		||||
local $ENV{'MIBDIRS'}      = "$mibdirs" if $ignore;
 | 
			
		||||
 | 
			
		||||
SNMP::addMibDirs($mibdirs);
 | 
			
		||||
 | 
			
		||||
# Connect to Device
 | 
			
		||||
my $sess = SNMP::Session->new(
 | 
			
		||||
    'UseEnums'       => 1,
 | 
			
		||||
    'RetryNoSuch'    => 1,
 | 
			
		||||
    'DestHost'       => $dev,
 | 
			
		||||
    'Community'      => $comm,
 | 
			
		||||
    'Version'        => $ver,
 | 
			
		||||
    'UseSprintValue' => 1
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
my $sysdescr = $sess->get('sysDescr.0');
 | 
			
		||||
unless ( defined $sysdescr ) {
 | 
			
		||||
    die "Couldn't connect to $dev via snmp.\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SNMP::loadModules(@ARGV);
 | 
			
		||||
 | 
			
		||||
# 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');
 | 
			
		||||
foreach my $mib (@common_mibs) {
 | 
			
		||||
    $mib_hash{$mib} = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
foreach my $key ( sort( keys %SNMP::MIB ) ) {
 | 
			
		||||
    my $module = $SNMP::MIB{$key}{moduleID} || '';
 | 
			
		||||
    # IMPORTS pulls in many modules we don't want to walk
 | 
			
		||||
    # Only walk those we've specified
 | 
			
		||||
    next unless (defined $mib_hash{$module});
 | 
			
		||||
    my $access = $SNMP::MIB{$key}{'access'} || '';
 | 
			
		||||
    next unless ( $access =~ /Read|Create/x );
 | 
			
		||||
 | 
			
		||||
    my $label = SNMP::translateObj( $key, 0, 1 ) || '';
 | 
			
		||||
    snmpwalk($label);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub snmpwalk {
 | 
			
		||||
    return unless defined $sess;
 | 
			
		||||
    my $label    = shift;
 | 
			
		||||
    my $var      = SNMP::Varbind->new( [$label] );
 | 
			
		||||
    my $e        = 0;
 | 
			
		||||
    my $last_iid = '';
 | 
			
		||||
    my %seen     = ();
 | 
			
		||||
    while ( !$e ) {
 | 
			
		||||
        $sess->getnext($var);
 | 
			
		||||
        $e = $sess->{ErrorNum};
 | 
			
		||||
 | 
			
		||||
        return if $var->[0] ne $label;
 | 
			
		||||
        my $iid = $var->[1];
 | 
			
		||||
        my $val = $var->[2];
 | 
			
		||||
        return unless defined $iid;
 | 
			
		||||
 | 
			
		||||
        # Check to see if we've already seen this IID (looping)
 | 
			
		||||
        if ( defined $seen{$iid} and $seen{$iid} ) {
 | 
			
		||||
            warn "Looping on $label iid:$iid.  Skipped.\n";
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        else { $seen{$iid}++; }
 | 
			
		||||
 | 
			
		||||
        # why is it looping?
 | 
			
		||||
        return if $last_iid eq $iid;
 | 
			
		||||
        $last_iid = $iid;
 | 
			
		||||
 | 
			
		||||
        my $line = "$label.$iid = $val";
 | 
			
		||||
        print "$line\n";
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
make_snmpdata.pl - Tool to get SNMP data for the SNMP::Info testing framework
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
make_snmpdata.pl [options] MIB-MODULE-1 MIB-MODULE-2
 | 
			
		||||
 | 
			
		||||
Options:
 | 
			
		||||
 | 
			
		||||
    -community SNMP Community
 | 
			
		||||
    -device    IP Address to query
 | 
			
		||||
    -ignore    Ignore Net-SNMP configuration file
 | 
			
		||||
    -mibdir    Directory containing MIB Files
 | 
			
		||||
    -version   SNMP version to use
 | 
			
		||||
    -help      Brief help message
 | 
			
		||||
 | 
			
		||||
=head1 OPTIONS
 | 
			
		||||
 | 
			
		||||
=over 8
 | 
			
		||||
 | 
			
		||||
=item B<-community>
 | 
			
		||||
 | 
			
		||||
SNMP Community, either 1 or 2c.  Defaults to version 2c
 | 
			
		||||
 | 
			
		||||
-community 2c
 | 
			
		||||
 | 
			
		||||
=item B<-device>
 | 
			
		||||
 | 
			
		||||
IP Address to query for the SNMP data.  No default and a mandatory option.
 | 
			
		||||
 | 
			
		||||
-device 127.0.0.1
 | 
			
		||||
 | 
			
		||||
=item B<-ignore >
 | 
			
		||||
 | 
			
		||||
Ignore Net-SNMP configuration file snmp.conf.  If this used mibdirs must be
 | 
			
		||||
provided
 | 
			
		||||
 | 
			
		||||
-ignore
 | 
			
		||||
 | 
			
		||||
=item B<-mibdir>
 | 
			
		||||
 | 
			
		||||
Directory containing MIB Files.  Mutiple directories should be separated by a
 | 
			
		||||
colon ':'.  Defaults to /usr/local/share/snmp/mibs.
 | 
			
		||||
 | 
			
		||||
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
 | 
			
		||||
 | 
			
		||||
=item B<-version>
 | 
			
		||||
 | 
			
		||||
SNMP version to use.  Only version 1 and 2c are supported.  Defaults to 2c
 | 
			
		||||
 | 
			
		||||
-version 2c
 | 
			
		||||
 | 
			
		||||
=item B<-help>
 | 
			
		||||
 | 
			
		||||
Print help message and exits.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
B<make_snmpdata.pl> will gather SNMP data by walking specified MIB files and
 | 
			
		||||
output the data to a file which can be used by the SNMP::Info testing
 | 
			
		||||
framework.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										48
									
								
								contrib/util/push_ver
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										48
									
								
								contrib/util/push_ver
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
#!/usr/bin/perl -w
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
use File::Glob qw/bsd_glob/;
 | 
			
		||||
 | 
			
		||||
my @pms = glob_rec("./lib");
 | 
			
		||||
 | 
			
		||||
$new_version = shift @ARGV || die "missing new version\n";
 | 
			
		||||
 | 
			
		||||
foreach my $p (@pms) {
 | 
			
		||||
    print "$p\n";
 | 
			
		||||
 | 
			
		||||
    rename($p,"$p.orig");
 | 
			
		||||
    open (O,"<$p.orig") or die;
 | 
			
		||||
    open (P,">$p") or die "Can't open $p for write. $!\n";
 | 
			
		||||
 | 
			
		||||
    while (<O>) {
 | 
			
		||||
        s/^\s*\$VERSION\s+=\s*'[^']+'\s*;/\$VERSION = '$new_version';/;
 | 
			
		||||
        s/^SNMP::Info - Version [\d.]+$/SNMP::Info - Version $new_version/;
 | 
			
		||||
        print P;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close O;
 | 
			
		||||
    close P or die "Can't write $p. $!\n";
 | 
			
		||||
    unlink("$p.orig");
 | 
			
		||||
    #last;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub glob_rec {
 | 
			
		||||
    my $dir = shift;
 | 
			
		||||
 | 
			
		||||
    my @files = bsd_glob("$dir/*");
 | 
			
		||||
 | 
			
		||||
    my @pms;
 | 
			
		||||
 | 
			
		||||
    foreach my $f (@files) {
 | 
			
		||||
        next if $f eq '\.$';
 | 
			
		||||
 | 
			
		||||
        if (-d $f) {
 | 
			
		||||
            push @pms, glob_rec($f);
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        push @pms,$f if $f =~ /.pm$/;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return @pms;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										4
									
								
								contrib/util/run_test
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										4
									
								
								contrib/util/run_test
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
# Run this from ../
 | 
			
		||||
/usr/local/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/$1
 | 
			
		||||
							
								
								
									
										346
									
								
								contrib/util/test_class.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										346
									
								
								contrib/util/test_class.pl
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,346 @@
 | 
			
		||||
#!/usr/bin/perl
 | 
			
		||||
#
 | 
			
		||||
# test_class.pl
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2013 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Carp;
 | 
			
		||||
use Getopt::Long;
 | 
			
		||||
use Pod::Usage;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
my $EMPTY = q{};
 | 
			
		||||
 | 
			
		||||
# Default Values
 | 
			
		||||
my $class  = $EMPTY;
 | 
			
		||||
my @dump   = ();
 | 
			
		||||
my $debug  = 0;
 | 
			
		||||
my $cache  = 0;
 | 
			
		||||
my $device = '';
 | 
			
		||||
my $comm   = '';
 | 
			
		||||
my $ver    = 2;
 | 
			
		||||
my $ignore = 0;
 | 
			
		||||
my $help   = 0;
 | 
			
		||||
my $nobulk = 0;
 | 
			
		||||
my $mibdirs;
 | 
			
		||||
my %dumped;
 | 
			
		||||
 | 
			
		||||
GetOptions(
 | 
			
		||||
    'c|class=s'  => \$class,
 | 
			
		||||
    'd|dev=s'    => \$device,
 | 
			
		||||
    's|comm=s'   => \$comm,
 | 
			
		||||
    'v|ver=i'    => \$ver,
 | 
			
		||||
    'i|ignore'   => \$ignore,
 | 
			
		||||
    'p|print=s'  => \@dump,
 | 
			
		||||
    'm|mibdir=s' => \$mibdirs,
 | 
			
		||||
    'n|nobulk'   => \$nobulk,
 | 
			
		||||
    'x|debug+'   => \$debug,
 | 
			
		||||
    'k|cache'    => \$cache,
 | 
			
		||||
    'h|?|help'   => sub { pod2usage(1); },
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
unless ( $device and $comm ) {
 | 
			
		||||
    pod2usage(2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if ( $ignore && !defined $mibdirs ) {
 | 
			
		||||
    print "mibdirs must be provided if ignoring snmp.conf \n\n";
 | 
			
		||||
    pod2usage(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local $ENV{'SNMPCONFPATH'} = $EMPTY     if $ignore;
 | 
			
		||||
local $ENV{'MIBDIRS'}      = "$mibdirs" if $ignore;
 | 
			
		||||
 | 
			
		||||
if ( defined $mibdirs ) {
 | 
			
		||||
    SNMP::addMibDirs($mibdirs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$class = $class ? "SNMP::Info::$class" : 'SNMP::Info';
 | 
			
		||||
 | 
			
		||||
( my $mod = "$class.pm" )
 | 
			
		||||
    =~ s{::}{/}xg;    # SNMP::Info::Layer3 => SNMP/Info/Layer3.pm
 | 
			
		||||
if ( !eval { require $mod; 1; } ) {
 | 
			
		||||
    croak "Could not load $class. Error Message: $@\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $class_ver = $class->VERSION();
 | 
			
		||||
 | 
			
		||||
print
 | 
			
		||||
    "Class $class ($class_ver) loaded from SNMP::Info $SNMP::Info::VERSION.\n";
 | 
			
		||||
 | 
			
		||||
if ( scalar @dump ) { print 'Dumping : ', join( q{,}, @dump ), "\n" }
 | 
			
		||||
 | 
			
		||||
my %args = ();
 | 
			
		||||
if ($nobulk) {
 | 
			
		||||
    $args{BulkWalk} = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $dev = $class->new(
 | 
			
		||||
    'AutoSpecify' => 0,
 | 
			
		||||
    'AutoVerBack' => 0,
 | 
			
		||||
    'Debug'       => $debug,
 | 
			
		||||
    'Version'     => $ver,
 | 
			
		||||
    'DestHost'    => $device,
 | 
			
		||||
    'Community'   => $comm,
 | 
			
		||||
    %args
 | 
			
		||||
) or die "\n";
 | 
			
		||||
 | 
			
		||||
print "Connected to $device.\n";
 | 
			
		||||
print 'Detected Class: ', $dev->device_type(), "\n";
 | 
			
		||||
print "Using    Class: $class (-c to change)\n";
 | 
			
		||||
 | 
			
		||||
my $layers = $dev->layers();
 | 
			
		||||
my $descr  = $dev->description();
 | 
			
		||||
 | 
			
		||||
if ( !defined $layers || !defined $descr ) {
 | 
			
		||||
    die
 | 
			
		||||
	"Are you sure you got the right community string and version?\nCan't fetch layers or description.\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching base info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @base_fns = qw/vendor model os os_ver description contact location
 | 
			
		||||
    layers mac serial/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@base_fns) {
 | 
			
		||||
    test_global( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching interface info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @fns = qw/interfaces i_type i_ignore i_description i_mtu i_speed i_mac i_up
 | 
			
		||||
    i_up_admin i_name i_duplex i_duplex_admin i_stp_state
 | 
			
		||||
    i_vlan i_pvid i_lastchange/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@fns) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching VLAN info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @vlan = qw/v_index v_name/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@vlan) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching topology info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @topo = qw/c_if c_ip c_port c_id c_platform/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@topo) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching module info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @modules = qw/e_descr e_type e_parent e_name e_class e_pos e_hwver
 | 
			
		||||
    e_fwver e_swver e_model e_serial e_fru/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@modules) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@dump) {
 | 
			
		||||
    if ( !$dumped{$fn} ) { test_fn( $dev, $fn ) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if ($cache) {
 | 
			
		||||
    eval {
 | 
			
		||||
        require Data::Printer;
 | 
			
		||||
    } && eval {
 | 
			
		||||
        print "\nDumping cache...\n\n";
 | 
			
		||||
        Data::Printer::p $dev;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------
 | 
			
		||||
 | 
			
		||||
sub test_global {
 | 
			
		||||
    my $info   = shift;
 | 
			
		||||
    my $method = shift;
 | 
			
		||||
 | 
			
		||||
    my $value = $info->$method();
 | 
			
		||||
 | 
			
		||||
    if ( !defined $value ) {
 | 
			
		||||
	printf "%-20s Does not exist.\n", $method;
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
    $value =~ s/[[:cntrl:]]+/ /gx;
 | 
			
		||||
    if ( length $value > 60 ) {
 | 
			
		||||
	$value = substr $value, 0, 60;
 | 
			
		||||
	$value .= '...';
 | 
			
		||||
    }
 | 
			
		||||
    printf "%-20s %s \n", $method, $value;
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub test_fn {
 | 
			
		||||
    my $info   = shift;
 | 
			
		||||
    my $method = shift;
 | 
			
		||||
 | 
			
		||||
    my $results = $info->$method();
 | 
			
		||||
 | 
			
		||||
    # If accidentally called on a global, pass it along nicely.
 | 
			
		||||
    if ( defined $results && !ref $results ) {
 | 
			
		||||
	return test_global( $dev, $method );
 | 
			
		||||
    }
 | 
			
		||||
    if ( !defined $results && !scalar keys %{$results} ) {
 | 
			
		||||
	printf "%-20s Empty Results.\n", $method;
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf "%-20s %d rows.\n", $method, scalar keys %{$results};
 | 
			
		||||
    if ( grep {/^$method$/x} @dump ) {
 | 
			
		||||
	$dumped{$method} = 1;
 | 
			
		||||
	foreach my $iid ( keys %{$results} ) {
 | 
			
		||||
	    print "  $iid : ";
 | 
			
		||||
	    if ( ref( $results->{$iid} ) eq 'ARRAY' ) {
 | 
			
		||||
		print '[ ', join( ', ', @{ $results->{$iid} } ), ' ]';
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		print $results->{$iid};
 | 
			
		||||
	    }
 | 
			
		||||
	    print "\n";
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
test_class.pl - Test a device against an SNMP::Info class.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
test_class.pl [options]
 | 
			
		||||
 | 
			
		||||
Options:
 | 
			
		||||
 | 
			
		||||
    -c|class    SNMP::Info class to use, Layer2::Catalyst
 | 
			
		||||
    -d|dev      Device
 | 
			
		||||
    -s|comm     SNMP community
 | 
			
		||||
    -v|ver      SNMP version
 | 
			
		||||
    -p|print    Print values
 | 
			
		||||
    -i|ignore   Ignore Net-SNMP configuration file
 | 
			
		||||
    -m|mibdir   Directory containing MIB Files
 | 
			
		||||
    -n|nobulk   Disable bulkwalk
 | 
			
		||||
    -x|debug    Debugging flag
 | 
			
		||||
    -k|cache    Dump cache (requires Data::Printer to be installed)
 | 
			
		||||
    -h|?|help   Brief help message
 | 
			
		||||
 | 
			
		||||
=head1 OPTIONS
 | 
			
		||||
 | 
			
		||||
=over 8
 | 
			
		||||
 | 
			
		||||
=item B<-class>
 | 
			
		||||
 | 
			
		||||
Specific SNMP::Info class to use.  Defaults to SNMP::Info if no specific
 | 
			
		||||
class provided.
 | 
			
		||||
 | 
			
		||||
-class Layer2::Catalyst
 | 
			
		||||
 | 
			
		||||
=item B<-dev>
 | 
			
		||||
 | 
			
		||||
Device to test against.  No default and a mandatory option.
 | 
			
		||||
 | 
			
		||||
-dev 1.2.3.4
 | 
			
		||||
 | 
			
		||||
=item B<-comm>
 | 
			
		||||
 | 
			
		||||
SNMP community string.  No default and a mandatory option.
 | 
			
		||||
 | 
			
		||||
-comm public
 | 
			
		||||
 | 
			
		||||
=item B<-ver>
 | 
			
		||||
 | 
			
		||||
SNMP version. Default 2.
 | 
			
		||||
 | 
			
		||||
-ver 1
 | 
			
		||||
 | 
			
		||||
=item B<-print>
 | 
			
		||||
 | 
			
		||||
Print values of a class method rather than summarizing.  May be repeated
 | 
			
		||||
multiple times.
 | 
			
		||||
 | 
			
		||||
-print i_description -print i_type
 | 
			
		||||
 | 
			
		||||
=item B<-ignore >
 | 
			
		||||
 | 
			
		||||
Ignore Net-SNMP configuration file snmp.conf.  If this used mibdirs must be
 | 
			
		||||
provided.
 | 
			
		||||
 | 
			
		||||
-ignore
 | 
			
		||||
 | 
			
		||||
=item B<-mibdir>
 | 
			
		||||
 | 
			
		||||
Directory containing MIB Files.  Multiple directories should be separated by a
 | 
			
		||||
colon ':'.
 | 
			
		||||
 | 
			
		||||
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
 | 
			
		||||
 | 
			
		||||
=item B<-nobulk >
 | 
			
		||||
 | 
			
		||||
Disable SNMP bulkwalk. Default bulkwalk is on and utilized with version 2.
 | 
			
		||||
 | 
			
		||||
-nobulk
 | 
			
		||||
 | 
			
		||||
=item B<-debug>
 | 
			
		||||
 | 
			
		||||
Turns on SNMP::Info debug.
 | 
			
		||||
 | 
			
		||||
-debug
 | 
			
		||||
 | 
			
		||||
=item B<-cache>
 | 
			
		||||
 | 
			
		||||
Dumps the table and leaf cache at the end of running. Requires that the
 | 
			
		||||
L<Data::Printer> module be installed, otherwise does nothing.
 | 
			
		||||
 | 
			
		||||
-cache
 | 
			
		||||
 | 
			
		||||
=item B<-help>
 | 
			
		||||
 | 
			
		||||
Print help message and exits.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
B<test_class.pl> will test a device against a specfied SNMP::Info class.
 | 
			
		||||
This allows debugging and testing of live devices to include validating
 | 
			
		||||
device support with existing classes.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										454
									
								
								contrib/util/test_class_mocked.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										454
									
								
								contrib/util/test_class_mocked.pl
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,454 @@
 | 
			
		||||
#!/usr/bin/env perl
 | 
			
		||||
#
 | 
			
		||||
# test_class_mocked.pl
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Carp;
 | 
			
		||||
use FindBin;
 | 
			
		||||
use lib "$FindBin::Bin/../../lib";
 | 
			
		||||
use File::Slurp qw(slurp);
 | 
			
		||||
use Getopt::Long;
 | 
			
		||||
use Pod::Usage;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use Test::MockObject::Extends;
 | 
			
		||||
 | 
			
		||||
my $EMPTY = q{};
 | 
			
		||||
 | 
			
		||||
# Default Values
 | 
			
		||||
my $class = $EMPTY;
 | 
			
		||||
my @dump  = ();
 | 
			
		||||
my $debug = 0;
 | 
			
		||||
my $mibdirs;
 | 
			
		||||
my $ignore = 0;
 | 
			
		||||
my $help   = 0;
 | 
			
		||||
my $file;
 | 
			
		||||
my %dumped;
 | 
			
		||||
 | 
			
		||||
GetOptions(
 | 
			
		||||
    'c|class=s'  => \$class,
 | 
			
		||||
    'i|ignore'   => \$ignore,
 | 
			
		||||
    'p|print=s'  => \@dump,
 | 
			
		||||
    'x|debug+'   => \$debug,
 | 
			
		||||
    'm|mibdir=s' => \$mibdirs,
 | 
			
		||||
    'file=s'     => \$file,
 | 
			
		||||
    'h|?|help'   => sub { pod2usage(1); },
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
if ( !$file ) {
 | 
			
		||||
    pod2usage(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if ( $ignore && !defined $mibdirs ) {
 | 
			
		||||
    print "mibdirs must be provided if ignoring snmp.conf \n\n";
 | 
			
		||||
    pod2usage(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local $ENV{'SNMPCONFPATH'} = $EMPTY     if $ignore;
 | 
			
		||||
local $ENV{'MIBDIRS'}      = "$mibdirs" if $ignore;
 | 
			
		||||
 | 
			
		||||
if ( defined $mibdirs ) {
 | 
			
		||||
    SNMP::addMibDirs($mibdirs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$class = $class ? "SNMP::Info::$class" : 'SNMP::Info';
 | 
			
		||||
 | 
			
		||||
( my $mod = "$class.pm" )
 | 
			
		||||
    =~ s{::}{/}g;    # SNMP::Info::Layer3 => SNMP/Info/Layer3.pm
 | 
			
		||||
if ( !eval { require $mod; 1; } ) {
 | 
			
		||||
    croak "Could not load $class. Error Message: $@\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $class_ver = $class->VERSION();
 | 
			
		||||
 | 
			
		||||
print
 | 
			
		||||
    "Class $class ($class_ver) loaded from SNMP::Info $SNMP::Info::VERSION.\n";
 | 
			
		||||
 | 
			
		||||
if ( scalar @dump ) { print 'Dumping : ', join( q{,}, @dump ), "\n" }
 | 
			
		||||
 | 
			
		||||
my $mocked = create_mock_session();
 | 
			
		||||
 | 
			
		||||
my $dev = $class->new(
 | 
			
		||||
    'AutoSpecify' => 0,
 | 
			
		||||
    'BulkWalk'    => 0,
 | 
			
		||||
    'Debug'       => $debug,
 | 
			
		||||
    'Session'     => $mocked,
 | 
			
		||||
) or die "\n";
 | 
			
		||||
 | 
			
		||||
print 'Detected Class: ', $dev->device_type(), "\n";
 | 
			
		||||
print "Using    Class: $class (-c to change)\n";
 | 
			
		||||
 | 
			
		||||
my $layers = $dev->layers();
 | 
			
		||||
my $descr  = $dev->description();
 | 
			
		||||
 | 
			
		||||
if ( !defined $layers || !defined $descr ) {
 | 
			
		||||
    die "Are you sure you specified a file created with make_snmpdata.pl ?\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching base info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @base_fns = qw/vendor model os os_ver description contact location
 | 
			
		||||
    layers mac serial/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@base_fns) {
 | 
			
		||||
    test_global( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching interface info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @fns = qw/interfaces i_type i_ignore i_description i_mtu i_speed i_mac i_up
 | 
			
		||||
    i_up_admin i_name i_duplex i_duplex_admin i_stp_state
 | 
			
		||||
    i_vlan i_pvid i_lastchange/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@fns) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching VLAN info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @vlan = qw/v_index v_name/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@vlan) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching topology info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @topo = qw/c_if c_ip c_port c_id c_platform/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@topo) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching module info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @modules = qw/e_descr e_type e_parent e_name e_class e_pos e_hwver
 | 
			
		||||
                e_fwver e_swver e_model e_serial e_fru/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@modules) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@dump) {
 | 
			
		||||
    if ( !$dumped{$fn} ) { test_fn( $dev, $fn ) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------
 | 
			
		||||
 | 
			
		||||
sub load_snmpdata {
 | 
			
		||||
    my $data_file = shift;
 | 
			
		||||
 | 
			
		||||
    my @lines = slurp($data_file);
 | 
			
		||||
 | 
			
		||||
    my $snmp_data = {};
 | 
			
		||||
    foreach my $line (@lines) {
 | 
			
		||||
	next if !$line;
 | 
			
		||||
	next if ( $line =~ /^#/ );
 | 
			
		||||
	if ( $line =~ /^(\S+::\w+)[.]?(\S+)*\s=\s(.*)$/ ) {
 | 
			
		||||
	    my ( $leaf, $iid, $val ) = ( $1, $2, $3 );
 | 
			
		||||
	    next if !$leaf;
 | 
			
		||||
	    $iid ||= 0;
 | 
			
		||||
	    $val =~ s/\"//g;
 | 
			
		||||
	    $snmp_data->{$leaf}->{$iid} = $val;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return $snmp_data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub create_mock_session {
 | 
			
		||||
 | 
			
		||||
    my $snmp_data = load_snmpdata($file);
 | 
			
		||||
 | 
			
		||||
    my $session = SNMP::Session->new(
 | 
			
		||||
	UseEnums    => 1,
 | 
			
		||||
	RetryNoSuch => 1,
 | 
			
		||||
	Data        => $snmp_data,
 | 
			
		||||
	DestHost    => '127.0.0.1',
 | 
			
		||||
	Community   => 'public',
 | 
			
		||||
	Version     => 2,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    my $mock_session = Test::MockObject::Extends->new($session);
 | 
			
		||||
 | 
			
		||||
    mock_get($mock_session);
 | 
			
		||||
    mock_getnext($mock_session);
 | 
			
		||||
 | 
			
		||||
    return $mock_session;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mock_get {
 | 
			
		||||
    my $mock_session = shift;
 | 
			
		||||
 | 
			
		||||
    $mock_session->mock(
 | 
			
		||||
	'get',
 | 
			
		||||
	sub {
 | 
			
		||||
	    my $self = shift;
 | 
			
		||||
	    my $vars = shift;
 | 
			
		||||
	    my ( $leaf, $iid, $oid, $oid_name );
 | 
			
		||||
	    my $c_data = $self->{Data};
 | 
			
		||||
 | 
			
		||||
	    # From SNMP::Info get will only be passed either an OID or
 | 
			
		||||
	    # SNMP::Varbind with a fully qualified leaf and potentially
 | 
			
		||||
	    # a partial
 | 
			
		||||
	    if ( ref($vars) =~ /SNMP::Varbind/ ) {
 | 
			
		||||
		( $leaf, $iid ) = @{$vars};
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		$oid = $vars;
 | 
			
		||||
		$oid_name = SNMP::translateObj( $oid, 0, 1 ) || $EMPTY;
 | 
			
		||||
		( $leaf, $iid ) = $oid_name =~ /^(\S+::\w+)[.]?(\S+)*$/;
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    $iid ||= 0;
 | 
			
		||||
	    my $new_iid = $iid;
 | 
			
		||||
	    my $val     = $EMPTY;
 | 
			
		||||
	    my $data    = $c_data->{$leaf} || {};
 | 
			
		||||
	    my $count   = scalar keys %{$data} || 0;
 | 
			
		||||
	    if ( $count > 1 ) {
 | 
			
		||||
		my $found = 0;
 | 
			
		||||
		foreach my $d_iid ( sort keys %{$data} ) {
 | 
			
		||||
		    if ( $d_iid eq $iid ) {
 | 
			
		||||
			$val   = $data->{$d_iid};
 | 
			
		||||
			$found = 1;
 | 
			
		||||
			next;
 | 
			
		||||
		    }
 | 
			
		||||
		    elsif ( $found == 1 ) {
 | 
			
		||||
			$new_iid = $d_iid;
 | 
			
		||||
			last;
 | 
			
		||||
		    }
 | 
			
		||||
		}
 | 
			
		||||
		if ( $found && ( $new_iid eq $iid ) ) {
 | 
			
		||||
		    $leaf = 'unknown';
 | 
			
		||||
		}
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		$val  = $data->{$iid};
 | 
			
		||||
		$leaf = 'unknown';
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    if ( ref $vars =~ /SNMP::Varbind/ ) {
 | 
			
		||||
		$vars->[0] = $leaf;
 | 
			
		||||
		$vars->[1] = $new_iid;
 | 
			
		||||
		$vars->[2] = $val;
 | 
			
		||||
	    }
 | 
			
		||||
	    return ( wantarray() ? $vars : $val );
 | 
			
		||||
	}
 | 
			
		||||
    );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mock_getnext {
 | 
			
		||||
    my $mock_session = shift;
 | 
			
		||||
 | 
			
		||||
    $mock_session->mock(
 | 
			
		||||
	'getnext',
 | 
			
		||||
	sub {
 | 
			
		||||
	    my $self = shift;
 | 
			
		||||
	    my $vars = shift;
 | 
			
		||||
	    my ( $leaf, $iid, $oid, $oid_name );
 | 
			
		||||
	    my $c_data = $self->{Data};
 | 
			
		||||
 | 
			
		||||
	    # From SNMP::Info getnext will only be passed a SNMP::Varbind
 | 
			
		||||
	    # with a fully qualified leaf and potentially a partial
 | 
			
		||||
	    ( $leaf, $iid ) = @{$vars};
 | 
			
		||||
 | 
			
		||||
	    unless (defined $iid) {
 | 
			
		||||
		$iid = -1;
 | 
			
		||||
	    }
 | 
			
		||||
	    my $new_iid = $iid;
 | 
			
		||||
	    my $val     = $EMPTY;
 | 
			
		||||
	    my $data    = $c_data->{$leaf};
 | 
			
		||||
	    my $count   = scalar keys %{$data} || 0;
 | 
			
		||||
	    if ( $count ) {
 | 
			
		||||
		my $found = 0;
 | 
			
		||||
		foreach my $d_iid ( sort keys %{$data} ) {
 | 
			
		||||
		    if ( $d_iid gt $iid && !$found ) {
 | 
			
		||||
			$val     = $data->{$d_iid};
 | 
			
		||||
			$new_iid = $d_iid;
 | 
			
		||||
			$found   = 1;
 | 
			
		||||
			next;
 | 
			
		||||
		    }
 | 
			
		||||
		    elsif ( $found == 1 ) {
 | 
			
		||||
			last;
 | 
			
		||||
		    }
 | 
			
		||||
		}
 | 
			
		||||
		if ( $found && ( $new_iid eq $iid ) ) {
 | 
			
		||||
		    $leaf = 'unknown';
 | 
			
		||||
		}
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		$val  = $data->{$iid};
 | 
			
		||||
		$leaf = 'unknown';
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    $vars->[0] = $leaf;
 | 
			
		||||
	    $vars->[1] = $new_iid;
 | 
			
		||||
	    $vars->[2] = $val;
 | 
			
		||||
	    return ( wantarray() ? $vars : $val );
 | 
			
		||||
	}
 | 
			
		||||
    );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub test_global {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $method = shift;
 | 
			
		||||
 | 
			
		||||
    my $value = $device->$method();
 | 
			
		||||
 | 
			
		||||
    if ( !defined $value ) {
 | 
			
		||||
	printf "%-20s Does not exist.\n", $method;
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
    $value =~ s/[[:cntrl:]]+/ /g;
 | 
			
		||||
    if ( length $value > 60 ) {
 | 
			
		||||
	$value = substr $value, 0, 60;
 | 
			
		||||
	$value .= '...';
 | 
			
		||||
    }
 | 
			
		||||
    printf "%-20s %s \n", $method, $value;
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub test_fn {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $method = shift;
 | 
			
		||||
 | 
			
		||||
    my $results = $device->$method();
 | 
			
		||||
 | 
			
		||||
    # If accidentally called on a global, pass it along nicely.
 | 
			
		||||
    if ( defined $results && !ref $results ) {
 | 
			
		||||
	return test_global( $dev, $method );
 | 
			
		||||
    }
 | 
			
		||||
    if ( !defined $results && !scalar keys %{$results} ) {
 | 
			
		||||
	printf "%-20s Empty Results.\n", $method;
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf "%-20s %d rows.\n", $method, scalar keys %{$results};
 | 
			
		||||
    if ( grep {/^$method$/} @dump ) {
 | 
			
		||||
	$dumped{$method} = 1;
 | 
			
		||||
	foreach my $iid ( keys %{$results} ) {
 | 
			
		||||
	    print "  $iid : ";
 | 
			
		||||
	    if ( ref( $results->{$iid} ) eq 'ARRAY' ) {
 | 
			
		||||
		print '[ ', join( ', ', @{ $results->{$iid} } ), ' ]';
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		print $results->{$iid};
 | 
			
		||||
	    }
 | 
			
		||||
	    print "\n";
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
test_class_mocked.pl - Test a device against an SNMP::Info class using
 | 
			
		||||
output from make_snmpdata.pl stored in a text file.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
test_class_mocked.pl [options]
 | 
			
		||||
 | 
			
		||||
Options:
 | 
			
		||||
 | 
			
		||||
    -class    SNMP::Info class to use, Layer2::Catalyst
 | 
			
		||||
    -file     File containing data gathered using make_snmpdata.pl
 | 
			
		||||
    -print    Print values
 | 
			
		||||
    -debug    Debugging flag
 | 
			
		||||
    -ignore   Ignore Net-SNMP configuration file
 | 
			
		||||
    -mibdir   Directory containing MIB Files
 | 
			
		||||
    -help     Brief help message
 | 
			
		||||
 | 
			
		||||
=head1 OPTIONS
 | 
			
		||||
 | 
			
		||||
=over 8
 | 
			
		||||
 | 
			
		||||
=item B<-class>
 | 
			
		||||
 | 
			
		||||
Specific SNMP::Info class to use.  Defaults to SNMP::Info if no specific
 | 
			
		||||
class provided.
 | 
			
		||||
 | 
			
		||||
-class Layer2::Catalyst
 | 
			
		||||
 | 
			
		||||
=item B<-file>
 | 
			
		||||
 | 
			
		||||
File containing data gathered using make_snmpdata.pl.  No default and a
 | 
			
		||||
mandatory option.
 | 
			
		||||
 | 
			
		||||
-file /data/mydevice.txt
 | 
			
		||||
 | 
			
		||||
=item B<-print>
 | 
			
		||||
 | 
			
		||||
Print values of a class method rather than summarizing.  May be repeated
 | 
			
		||||
multiple times.
 | 
			
		||||
 | 
			
		||||
-print i_description -print i_type
 | 
			
		||||
 | 
			
		||||
=item B<-debug>
 | 
			
		||||
 | 
			
		||||
Turns on SNMP::Info debug.
 | 
			
		||||
 | 
			
		||||
-debug
 | 
			
		||||
 | 
			
		||||
=item B<-ignore >
 | 
			
		||||
 | 
			
		||||
Ignore Net-SNMP configuration file snmp.conf.  If this used mibdirs must be
 | 
			
		||||
provided.
 | 
			
		||||
 | 
			
		||||
-ignore
 | 
			
		||||
 | 
			
		||||
=item B<-mibdir>
 | 
			
		||||
 | 
			
		||||
Directory containing MIB Files.  Multiple directories should be separated by a
 | 
			
		||||
colon ':'.
 | 
			
		||||
 | 
			
		||||
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
 | 
			
		||||
 | 
			
		||||
=item B<-help>
 | 
			
		||||
 | 
			
		||||
Print help message and exits.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
B<test_class_mocked.pl> will test a device against an SNMP::Info class using
 | 
			
		||||
snmpwalk output from the utility B<make_snmpdata.pl> stored in a text file.
 | 
			
		||||
This allows debugging and testing without requiring network access to the
 | 
			
		||||
device being tested.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										5161
									
								
								lib/SNMP/Info.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5161
									
								
								lib/SNMP/Info.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										342
									
								
								lib/SNMP/Info/AMAP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										342
									
								
								lib/SNMP/Info/AMAP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,342 @@
 | 
			
		||||
# SNMP::Info::AMAP
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2013 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::AMAP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::AMAP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::AMAP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
  'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    # ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB::aipAMAPRemHostname
 | 
			
		||||
    'amap_rem_sysname' => 'aipAMAPRemHostname',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( 'amap_rem_sysname' => \&SNMP::Info::munge_null, );
 | 
			
		||||
 | 
			
		||||
sub hasAMAP {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $amap_ip = $amap->aipAMAPIpAddr() || {};
 | 
			
		||||
 | 
			
		||||
    return 1 if ( scalar( keys %$amap_ip ) );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Break up the aipAMAPhostsTable INDEX into MAC and IP address.
 | 
			
		||||
sub _hosts_table_index {
 | 
			
		||||
    my $idx  = shift;
 | 
			
		||||
    my @oids = split( /\./, $idx );
 | 
			
		||||
    my $mac  = join( '.', splice( @oids, 0, 6 ) );
 | 
			
		||||
 | 
			
		||||
    return ( $mac, join( '.', @oids ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Break up the aipAMAPportConnectionTable INDEX and return MAC
 | 
			
		||||
sub _conn_table_mac {
 | 
			
		||||
    my $idx       = shift;
 | 
			
		||||
    my @oids      = split( /\./, $idx );
 | 
			
		||||
    my $local_idx = shift @oids;
 | 
			
		||||
    my $mac       = join( '.', splice( @oids, 0, 6 ) );
 | 
			
		||||
 | 
			
		||||
    return ($mac);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Since we need to get IP Addresses from the aipAMAPhostsTable which has
 | 
			
		||||
# a different index (MAC, IP) than the aipAMAPportConnectionTable which holds
 | 
			
		||||
# the remote device details we create a combined index and skip any
 | 
			
		||||
# IPs which have an address of 0.0.0.0.  Would like to include only one
 | 
			
		||||
# address since they should all originate from the same device, but we don't
 | 
			
		||||
# know if they would all be reachable from the network management application.
 | 
			
		||||
#
 | 
			
		||||
# We don't implement partials since this is private index function
 | 
			
		||||
sub _amap_index {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $amap_ip    = $amap->aipAMAPIpAddr()    || {};
 | 
			
		||||
    my $amap_rport = $amap->aipAMAPLocalPort() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_index;
 | 
			
		||||
    foreach my $key ( keys %$amap_ip ) {
 | 
			
		||||
        my ( $mac, $ip ) = _hosts_table_index($key);
 | 
			
		||||
 | 
			
		||||
        next if ( $ip eq '0.0.0.0' );
 | 
			
		||||
        next unless $ip;
 | 
			
		||||
 | 
			
		||||
        foreach my $idx ( keys %$amap_rport ) {
 | 
			
		||||
            my $c_mac = _conn_table_mac($idx);
 | 
			
		||||
 | 
			
		||||
            if ( $mac eq $c_mac ) {
 | 
			
		||||
                my $index = "$idx.$ip";
 | 
			
		||||
                $amap_index{$index} = $index;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Break up _amap_index INDEX into local index, MAC, remote index, and
 | 
			
		||||
# IP address
 | 
			
		||||
sub _amap_index_parts {
 | 
			
		||||
    my $idx       = shift;
 | 
			
		||||
    my @oids      = split( /\./, $idx );
 | 
			
		||||
    my $local_idx = shift @oids;
 | 
			
		||||
    my $mac       = join( '.', splice( @oids, 0, 6 ) );
 | 
			
		||||
    my $rem_idx   = shift @oids;
 | 
			
		||||
 | 
			
		||||
    return ( $local_idx, $mac, $rem_idx, join( '.', @oids ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_if {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index  = $amap->_amap_index()         || {};
 | 
			
		||||
    my $if_idx = $amap->aipAMAPLocalIfindex() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_if;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $if_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$if_key/ ) {
 | 
			
		||||
            my $if = $if_idx->{$if_key};
 | 
			
		||||
            $amap_if{$key} = $if;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%amap_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_ip {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $amap->_amap_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_ip;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
 | 
			
		||||
        # MIB says should only be IPv4
 | 
			
		||||
        next unless ( $ip =~ /\d+(\.\d+){3}/ );
 | 
			
		||||
        $amap_ip{$key} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_port {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index      = $amap->_amap_index()      || {};
 | 
			
		||||
    my $amap_rport = $amap->aipAMAPLocalPort() || {};
 | 
			
		||||
    my $amap_rslot = $amap->aipAMAPLocalSlot() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_port;
 | 
			
		||||
    foreach my $key ( sort keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $p_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$p_key/ ) {
 | 
			
		||||
            my $port = $amap_rport->{$p_key};
 | 
			
		||||
            my $slot = $amap_rslot->{$p_key} || 0;
 | 
			
		||||
            next unless $port;
 | 
			
		||||
            $amap_port{$key} = defined $slot ? "$slot\/$port" : $port;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_id {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index     = $amap->_amap_index()      || {};
 | 
			
		||||
    my $amap_name = $amap->amap_rem_sysname() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_name;
 | 
			
		||||
    foreach my $key ( sort keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $id_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$id_key/ ) {
 | 
			
		||||
            my $name = $amap_name->{$id_key} || 0;
 | 
			
		||||
            next unless $name;
 | 
			
		||||
            $amap_name{$key} = $name;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_platform {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index              = $amap->_amap_index()          || {};
 | 
			
		||||
    my $amap_topo_platform = $amap->aipAMAPRemDeviceType() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_platform;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $pf_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$pf_key/ ) {
 | 
			
		||||
            my $platform = $amap_topo_platform->{$pf_key};
 | 
			
		||||
            next unless $platform;
 | 
			
		||||
            $amap_platform{$key} = $platform;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::AMAP - SNMP Interface to Alcatel Mapping Adjacency Protocol (AMAP)
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $amap = new SNMP::Info (
 | 
			
		||||
                             AutoSpecify => 1,
 | 
			
		||||
                             Debug       => 1,
 | 
			
		||||
                             DestHost    => 'router',
 | 
			
		||||
                             Community   => 'public',
 | 
			
		||||
                             Version     => 2
 | 
			
		||||
                           );
 | 
			
		||||
 | 
			
		||||
 my $class = $amap->class();
 | 
			
		||||
 print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
 $hasamap   = $amap->hasAMAP() ? 'yes' : 'no';
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with AMAP neighbors:
 | 
			
		||||
 my $interfaces    = $amap->interfaces();
 | 
			
		||||
 my $amap_if       = $amap->amap_if();
 | 
			
		||||
 my $amap_ip       = $amap->amap_ip();
 | 
			
		||||
 my $amap_port     = $amap->amap_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $amap_key (keys %$amap_ip){
 | 
			
		||||
    my $iid           = $amap_if->{$amap_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $amap_ip->{$amap_key};
 | 
			
		||||
    my $neighbor_port = $amap_port->{$amap_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented
 | 
			
		||||
interface to Alcatel Mapping Adjacency Protocol (AMAP) information through
 | 
			
		||||
SNMP.
 | 
			
		||||
 | 
			
		||||
AMAP is a Layer 2 protocol that allows a network device to advertise its
 | 
			
		||||
identity and capabilities on the local network providing topology information.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherits this class.  Do not use
 | 
			
		||||
directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $amap->hasAMAP()
 | 
			
		||||
 | 
			
		||||
Is AMAP is active in this device?
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_id()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the remote system.
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
=item  $amap->amap_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IPv4 addresses.  Note: AMAP returns all IP addresses associated
 | 
			
		||||
with the remote device.  It would be preferable to include only one address
 | 
			
		||||
since they should all originate from the same device, but amap_ip() can not
 | 
			
		||||
determine if all addresses are reachable from the network management
 | 
			
		||||
application therefore all addresses are returned and the calling application
 | 
			
		||||
must determine which address to use and if they are in fact from the same
 | 
			
		||||
device.
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_platform()
 | 
			
		||||
 | 
			
		||||
Returns remote platform ID
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										171
									
								
								lib/SNMP/Info/AdslLine.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								lib/SNMP/Info/AdslLine.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,171 @@
 | 
			
		||||
# SNMP::Info::AdslLine
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2009 Alexander Hartmaier
 | 
			
		||||
# 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::AdslLine;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::AdslLine::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::AdslLine::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    # ADSL-LINE-MIB::adslAtucChanTable
 | 
			
		||||
    'adsl_atuc_interleave_delay'    => 'adslAtucChanInterleaveDelay',
 | 
			
		||||
    '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',
 | 
			
		||||
    'adsl_atur_prev_tx_rate'        => 'adslAturChanPrevTxRate',
 | 
			
		||||
    'adsl_atur_crc_block_len'       => 'adslAturChanCrcBlockLength',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::AdslLine - SNMP Interface to the F<ADSL-LINE-MIB>
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Alexander Hartmaier
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $info = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $info->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
none.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ADSL-LINE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item none
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 ATUC channel table (C<adslAtucChanTable>)
 | 
			
		||||
 | 
			
		||||
This table provides one row for each ATUC channel.
 | 
			
		||||
ADSL channel interfaces are those C<ifEntries> where C<ifType>
 | 
			
		||||
is equal to adslInterleave(124) or adslFast(125).
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $info->adsl_atuc_interleave_delay()
 | 
			
		||||
 | 
			
		||||
(C<adslAtucChanInterleaveDelay>)
 | 
			
		||||
 | 
			
		||||
=item $info->adsl_atuc_curr_tx_rate()
 | 
			
		||||
 | 
			
		||||
(C<adslAtucChanCurrTxRate>)
 | 
			
		||||
 | 
			
		||||
=item $info->adsl_atuc_prev_tx_rate()
 | 
			
		||||
 | 
			
		||||
(C<adslAtucChanPrevTxRate>)
 | 
			
		||||
 | 
			
		||||
=item $info->adsl_atuc_crc_block_len()
 | 
			
		||||
 | 
			
		||||
(C<adslAtucChanCrcBlockLength>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 ATUR channel table (C<adslAturChanTable>)
 | 
			
		||||
 | 
			
		||||
This table provides one row for each ATUR channel.
 | 
			
		||||
ADSL channel interfaces are those C<ifEntries> where C<ifType>
 | 
			
		||||
is equal to adslInterleave(124) or adslFast(125).
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $info->adsl_atur_interleave_delay()
 | 
			
		||||
 | 
			
		||||
(C<adslAturChanInterleaveDelay>)
 | 
			
		||||
 | 
			
		||||
=item $info->adsl_atur_curr_tx_rate()
 | 
			
		||||
 | 
			
		||||
(C<adslAturChanCurrTxRate>)
 | 
			
		||||
 | 
			
		||||
=item $info->adsl_atur_prev_tx_rate()
 | 
			
		||||
 | 
			
		||||
(C<adslAturChanPrevTxRate>)
 | 
			
		||||
 | 
			
		||||
=item $info->adsl_atur_crc_block_len()
 | 
			
		||||
 | 
			
		||||
(C<adslAturChanCrcBlockLength>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										132
									
								
								lib/SNMP/Info/Aggregate.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								lib/SNMP/Info/Aggregate.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,132 @@
 | 
			
		||||
# SNMP::Info::Aggregate
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2014 SNMP::Info Developers
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::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/;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
# Load MIB for leafs referenced within class
 | 
			
		||||
%MIBS = ('IF-MIB' => 'ifIndex',);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = ();
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
sub agg_ports_ifstack {
 | 
			
		||||
  my $dev = shift;
 | 
			
		||||
  my $partial = shift;
 | 
			
		||||
 | 
			
		||||
  my $ifStack = $dev->ifStackStatus();
 | 
			
		||||
  # TODO: if we want to do partial, we need to use inverse status
 | 
			
		||||
  my $ifType = $dev->ifType();
 | 
			
		||||
 | 
			
		||||
  my $ret = {};
 | 
			
		||||
 | 
			
		||||
  foreach my $idx ( keys %$ifStack ) {
 | 
			
		||||
      my ( $higher, $lower ) = split /\./, $idx;
 | 
			
		||||
      next if ( $higher == 0 or $lower == 0 );
 | 
			
		||||
      if ( $ifType->{ $higher } eq 'ieee8023adLag'  or $ifType->{ $higher } eq 'propMultiplexor') {
 | 
			
		||||
          $ret->{ $lower } = $higher;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Aggregate - SNMP Interface to ifStackTable Aggregated Links
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
SNMP::Info Developers
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $info = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $info->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This class provides access to Aggregated Links configuration on devices
 | 
			
		||||
supporting C<ifStackTable>.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
L<SNMP::Info>
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<IF-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 METHODS
 | 
			
		||||
 | 
			
		||||
=over 4
 | 
			
		||||
 | 
			
		||||
=item C<agg_ports_ifstack>
 | 
			
		||||
 | 
			
		||||
Returns a HASH reference mapping from slave to master port for each member of
 | 
			
		||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
 | 
			
		||||
ifIndex of the corresponding master ports.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										1854
									
								
								lib/SNMP/Info/Airespace.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1854
									
								
								lib/SNMP/Info/Airespace.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1067
									
								
								lib/SNMP/Info/Bridge.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1067
									
								
								lib/SNMP/Info/Bridge.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										535
									
								
								lib/SNMP/Info/CDP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										535
									
								
								lib/SNMP/Info/CDP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,535 @@
 | 
			
		||||
# SNMP::Info::CDP
 | 
			
		||||
#
 | 
			
		||||
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CDP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CDP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our
 | 
			
		||||
    ($VERSION, $DEBUG, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $INIT, %CDP_CAPABILITIES);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
# Five data structures required by SNMP::Info
 | 
			
		||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
 | 
			
		||||
 | 
			
		||||
# Notice we dont inherit the default GLOBALS and FUNCS
 | 
			
		||||
# only the default MUNGE.
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    'cdp_run'      => 'cdpGlobalRun',
 | 
			
		||||
    'cdp_interval' => 'cdpGlobalMessageInterval',
 | 
			
		||||
    'cdp_holdtime' => 'cdpGlobalHoldTime',
 | 
			
		||||
    'cdp_gid'      => 'cdpGlobalDeviceId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'cdp_proto'        => 'cdpCacheAddressType',
 | 
			
		||||
    'cdp_addr'         => 'cdpCacheAddress',
 | 
			
		||||
    'cdp_ver'          => 'cdpCacheVersion',
 | 
			
		||||
    'cdp_dev_id'       => 'cdpCacheDeviceId',
 | 
			
		||||
    'cdp_dev_port'     => 'cdpCacheDevicePort',
 | 
			
		||||
    'cdp_platform'     => 'cdpCachePlatform',
 | 
			
		||||
    'cdp_capabilities' => 'cdpCacheCapabilities',
 | 
			
		||||
    'cdp_domain'       => 'cdpCacheVTPMgmtDomain',
 | 
			
		||||
    'cdp_vlan'         => 'cdpCacheNativeVLAN',
 | 
			
		||||
    'cdp_duplex'       => 'cdpCacheDuplex',
 | 
			
		||||
    'cdp_power'        => 'cdpCachePowerConsumption',
 | 
			
		||||
    'cdp_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
 | 
			
		||||
    'cdp_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
 | 
			
		||||
    'cdp_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
 | 
			
		||||
    'cdp_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'cdp_capabilities' => \&SNMP::Info::munge_bits,
 | 
			
		||||
    'cdp_platform'     => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_domain'       => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_ver'          => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_ip'           => \&SNMP::Info::munge_ip,
 | 
			
		||||
    'cdp_power'        => \&munge_power,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%CDP_CAPABILITIES = (
 | 
			
		||||
    'Router'                  => 0x001,
 | 
			
		||||
    'Trans-Bridge'            => 0x002,
 | 
			
		||||
    'Source-Route-Bridge'     => 0x004,
 | 
			
		||||
    'Switch'                  => 0x008,
 | 
			
		||||
    'Host'                    => 0x010,
 | 
			
		||||
    'IGMP'                    => 0x020,
 | 
			
		||||
    'Repeater'                => 0x040,
 | 
			
		||||
    'VoIP-Phone'              => 0x080,
 | 
			
		||||
    'Remotely-Managed-Device' => 0x100,
 | 
			
		||||
    'Supports-STP-Dispute'    => 0x200,
 | 
			
		||||
    'Two-port Mac Relay'      => 0x400,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub munge_power {
 | 
			
		||||
    my $power = shift;
 | 
			
		||||
    my $decimal = substr( $power, -3 );
 | 
			
		||||
    $power =~ s/$decimal$/\.$decimal/;
 | 
			
		||||
    return $power;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $cdp = shift;
 | 
			
		||||
 | 
			
		||||
    # 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 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;
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cdp_if {
 | 
			
		||||
    my $cdp = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp_ip = $cdp->cdp_ip();
 | 
			
		||||
    unless ( defined $cdp_ip ) {
 | 
			
		||||
        $cdp->error_throw(
 | 
			
		||||
            "SNMP::Info::CDP:cdp_if() - Device doesn't have cdp_ip() data.  Can't fake cdp_index()"
 | 
			
		||||
        );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my %cdp_if;
 | 
			
		||||
    foreach my $key ( keys %$cdp_ip ) {
 | 
			
		||||
        next unless defined $key;
 | 
			
		||||
        my $iid = $key;
 | 
			
		||||
 | 
			
		||||
        # Truncate .1 from cdp cache entry
 | 
			
		||||
        $iid =~ s/\.\d+$//;
 | 
			
		||||
        $cdp_if{$key} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%cdp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cdp_ip {
 | 
			
		||||
    my $cdp     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp_addr  = $cdp->cdp_addr($partial)  || {};
 | 
			
		||||
    my $cdp_proto = $cdp->cdp_proto($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %cdp_ip;
 | 
			
		||||
    foreach my $key ( keys %$cdp_addr ) {
 | 
			
		||||
        my $addr  = $cdp_addr->{$key};
 | 
			
		||||
        my $proto = $cdp_proto->{$key};
 | 
			
		||||
        next unless defined $addr;
 | 
			
		||||
        next if ( defined $proto and $proto ne 'ip' );
 | 
			
		||||
 | 
			
		||||
        my $ip = join( '.', unpack( 'C4', $addr ) );
 | 
			
		||||
        $cdp_ip{$key} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%cdp_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cdp_cap {
 | 
			
		||||
    my $cdp     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Some devices return a hex-string, others return a space separated
 | 
			
		||||
    # string, we need the raw data to determine return value and
 | 
			
		||||
    # take appropriate action
 | 
			
		||||
    my $cdp_caps = $cdp->cdp_capabilities_raw($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %cdp_cap;
 | 
			
		||||
    foreach my $key ( keys %$cdp_caps ) {
 | 
			
		||||
        my $cap_raw = $cdp_caps->{$key};
 | 
			
		||||
        next unless $cap_raw;
 | 
			
		||||
 | 
			
		||||
        # Simple check, smallest single string is either Host or IGMP with a
 | 
			
		||||
        # space added on the end for a length of 5, hex string is normally
 | 
			
		||||
        # 4 bytes, but since only one byte was traditionally needed process
 | 
			
		||||
        # as hex for a length of 4 or less
 | 
			
		||||
        if ( length $cap_raw < 5 ) {
 | 
			
		||||
            my $cap_hex = join( '',
 | 
			
		||||
                map { sprintf "%x", $_ } unpack( 'C*', $cap_raw ) );
 | 
			
		||||
            foreach my $capability ( keys %CDP_CAPABILITIES ) {
 | 
			
		||||
                if ( ( hex $cap_hex ) & $CDP_CAPABILITIES{$capability} ) {
 | 
			
		||||
                    push( @{ $cdp_cap{$key} }, $capability );
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            my @caps = split /\s/, $cap_raw;
 | 
			
		||||
            push( @{ $cdp_cap{$key} }, @caps );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%cdp_cap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cdp_id {
 | 
			
		||||
    my $cdp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $ch = $cdp->cdp_dev_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %cdp_id;
 | 
			
		||||
    foreach my $key ( sort keys %$ch ) {
 | 
			
		||||
        my $id = $ch->{$key};
 | 
			
		||||
        next unless $id;
 | 
			
		||||
        $id = SNMP::Info::munge_mac($id) || SNMP::Info::munge_null($id);
 | 
			
		||||
        $cdp_id{$key} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%cdp_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CDP - SNMP Interface to Cisco Discovery Protocol (CDP) using SNMP
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $cdp = new SNMP::Info (
 | 
			
		||||
                             AutoSpecify => 1,
 | 
			
		||||
                             Debug       => 1,
 | 
			
		||||
                             DestHost    => 'router',
 | 
			
		||||
                             Community   => 'public',
 | 
			
		||||
                             Version     => 2
 | 
			
		||||
                           );
 | 
			
		||||
 | 
			
		||||
 my $class = $cdp->class();
 | 
			
		||||
 print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
 $hascdp   = $cdp->hasCDP() ? 'yes' : 'no';
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with CDP neighbors:
 | 
			
		||||
 my $interfaces   = $cdp->interfaces();
 | 
			
		||||
 my $cdp_if       = $cdp->cdp_if();
 | 
			
		||||
 my $cdp_ip       = $cdp->cdp_ip();
 | 
			
		||||
 my $cdp_port     = $cdp->cdp_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $cdp_key (keys %$cdp_ip){
 | 
			
		||||
    my $iid           = $cdp_if->{$cdp_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $cdp_ip->{$cdp_key};
 | 
			
		||||
    my $neighbor_port = $cdp_port->{$cdp_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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 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.
 | 
			
		||||
Check the return value to see if that data is held by the device.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-CDP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  $cdp->hasCDP()
 | 
			
		||||
 | 
			
		||||
Is CDP is active in this device?
 | 
			
		||||
 | 
			
		||||
Accounts for SNMP version 1 devices which may have CDP but not cdp_run()
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_run()
 | 
			
		||||
 | 
			
		||||
Is CDP enabled on this device?  Note that a lot of Cisco devices that
 | 
			
		||||
implement CDP don't implement this value. @#%$!
 | 
			
		||||
 | 
			
		||||
(C<cdpGlobalRun>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_interval()
 | 
			
		||||
 | 
			
		||||
Interval in seconds at which CDP messages are generated.
 | 
			
		||||
 | 
			
		||||
(C<cdpGlobalMessageInterval>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_holdtime()
 | 
			
		||||
 | 
			
		||||
Time in seconds that CDP messages are kept.
 | 
			
		||||
 | 
			
		||||
(C<cdpGlobalHoldTime>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->cdp_gid()
 | 
			
		||||
 | 
			
		||||
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().
 | 
			
		||||
 | 
			
		||||
(C<cdpGlobalDeviceId>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 CDP CACHE ENTRIES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
the CDP Capabilities Mapping to Smartport Type table within the
 | 
			
		||||
Cisco Small Business 200 Series Smart Switch Administration Guide,
 | 
			
		||||
L<http://www.cisco.com/c/en/us/support/switches/small-business-200-series-smart-switches/products-maintenance-guides-list.html>:
 | 
			
		||||
 | 
			
		||||
(Bit) - Description
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item (0x400) - Two-Port MAC Relay.
 | 
			
		||||
 | 
			
		||||
=item (0x200) - CAST Phone Port / CVTA / Supports-STP-Dispute depending
 | 
			
		||||
                upon platform.
 | 
			
		||||
 | 
			
		||||
=item (0x100) - Remotely-Managed Device.
 | 
			
		||||
 | 
			
		||||
=item (0x80)  - VoIP Phone.
 | 
			
		||||
 | 
			
		||||
=item (0x40)  - Provides level 1 functionality.
 | 
			
		||||
 | 
			
		||||
=item (0x20)  - The bridge or switch does not forward IGMP Report packets on
 | 
			
		||||
non router ports.
 | 
			
		||||
 | 
			
		||||
=item (0x10)  - Sends and receives packets for at least one network layer
 | 
			
		||||
protocol. If the device is routing the protocol, this bit should not be set.
 | 
			
		||||
 | 
			
		||||
=item (0x08)  - Performs level 2 switching. The difference between this bit
 | 
			
		||||
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
 | 
			
		||||
device is assumed to be deployed in a physical loop-free topology.
 | 
			
		||||
 | 
			
		||||
=item (0x04)  - Performs level 2 source-route bridging. A source-route bridge
 | 
			
		||||
would set both this bit and bit 0x02.
 | 
			
		||||
 | 
			
		||||
=item (0x02)  - Performs level 2 transparent bridging.
 | 
			
		||||
 | 
			
		||||
=item (0x01)  - Performs level 3 routing for at least one network layer
 | 
			
		||||
protocol.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
Thanks to Martin Lorensen for a pointer to the original information and
 | 
			
		||||
CPAN user Alex for updates.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheCapabilities>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_domain()
 | 
			
		||||
 | 
			
		||||
Returns remote VTP Management Domain as defined in
 | 
			
		||||
C<CISCO-VTP-MIB::managementDomainName>
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheVTPMgmtDomain>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_duplex()
 | 
			
		||||
 | 
			
		||||
Returns the port duplex status from remote devices.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_id()
 | 
			
		||||
 | 
			
		||||
Returns remote device id string
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_if()
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
In order to map the cdp table entry back to the interfaces() entry, we
 | 
			
		||||
truncate the last number off of it :
 | 
			
		||||
 | 
			
		||||
  # it exists, yay.
 | 
			
		||||
  my $cdp_index     = $device->cdp_index();
 | 
			
		||||
  return $cdp_index if defined $cdp_index;
 | 
			
		||||
 | 
			
		||||
  # if not, let's fake it
 | 
			
		||||
  my $cdp_ip       = $device->cdp_ip();
 | 
			
		||||
 | 
			
		||||
  my %cdp_if
 | 
			
		||||
  foreach my $key (keys %$cdp_ip){
 | 
			
		||||
      $iid = $key;
 | 
			
		||||
      ## Truncate off .1 from cdp response
 | 
			
		||||
      $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.
 | 
			
		||||
 | 
			
		||||
Most devices don't implement this, so you probably want to use $cdp->cdp_if()
 | 
			
		||||
instead.
 | 
			
		||||
 | 
			
		||||
See cdp_if() entry.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->cdp_ip()
 | 
			
		||||
 | 
			
		||||
If $cdp->cdp_proto() is supported, returns remote IPV4 address only.  Otherwise
 | 
			
		||||
it will return all addresses.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->cdp_addr()
 | 
			
		||||
 | 
			
		||||
Returns remote address
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_platform()
 | 
			
		||||
 | 
			
		||||
Returns remote platform id
 | 
			
		||||
 | 
			
		||||
(C<cdpCachePlatform>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_port()
 | 
			
		||||
 | 
			
		||||
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<cdpCacheDevicePort>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->cdp_proto()
 | 
			
		||||
 | 
			
		||||
Returns remote address type received.  Usually IP.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheAddressType>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_ver()
 | 
			
		||||
 | 
			
		||||
Returns remote hardware version
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheVersion>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_vlan()
 | 
			
		||||
 | 
			
		||||
Returns the remote interface native VLAN.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheNativeVLAN>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_power()
 | 
			
		||||
 | 
			
		||||
Returns the amount of power consumed by remote device in milliwatts munged
 | 
			
		||||
for decimal placement.
 | 
			
		||||
 | 
			
		||||
(C<cdpCachePowerConsumption>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->cdp_cap()
 | 
			
		||||
 | 
			
		||||
Returns hash of arrays with each array containing the system capabilities
 | 
			
		||||
supported by the remote system.  Possible elements in the array are
 | 
			
		||||
C<Router>, C<Trans-Bridge>, C<Source-Route-Bridge>, C<Switch>, C<Host>,
 | 
			
		||||
C<IGMP>, C<Repeater>, C<VoIP-Phone>, C<Remotely-Managed-Device>,
 | 
			
		||||
C<Supports-STP-Dispute>, and C<Two-port Mac Relay>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cdp->munge_power()
 | 
			
		||||
 | 
			
		||||
Inserts a decimal at the proper location.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										252
									
								
								lib/SNMP/Info/CiscoAgg.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								lib/SNMP/Info/CiscoAgg.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,252 @@
 | 
			
		||||
# SNMP::Info::CiscoAgg
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2019 SNMP::Info Developers
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CiscoAgg;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
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
 | 
			
		||||
/;
 | 
			
		||||
 | 
			
		||||
our ($DEBUG, $VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
  %SNMP::Info::IEEE802dot3ad::MIBS,
 | 
			
		||||
  'CISCO-PAGP-MIB'         => 'pagpGroupIfIndex',
 | 
			
		||||
  'CISCO-LAG-MIB'          => 'clagAggPortListPorts',
 | 
			
		||||
  'CISCO-IF-EXTENSION-MIB' => 'cieIfLastInTime',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
  %SNMP::Info::IEEE802dot3ad::FUNCS,
 | 
			
		||||
  'lag_ports'         => 'clagAggPortListPorts',
 | 
			
		||||
  'lag_members'       => 'clagAggPortListInterfaceIndexList',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%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;
 | 
			
		||||
 | 
			
		||||
  # Note that this mapping will miss any interfaces that are down during
 | 
			
		||||
  # polling. If one of the members is up, we could use
 | 
			
		||||
  # pagpAdminGroupCapability to figure things out, but if they're all
 | 
			
		||||
  # down, we're hosed. Since we could be hosed anyway, we skip the fancy
 | 
			
		||||
  # stuff.
 | 
			
		||||
  my $mapping = {};
 | 
			
		||||
  my $group = $dev->pagpGroupIfIndex;
 | 
			
		||||
  for my $slave (keys %$group) {
 | 
			
		||||
    my $master = $group->{$slave};
 | 
			
		||||
    next if($master == 0 || $slave == $master);
 | 
			
		||||
 | 
			
		||||
    $mapping->{$slave} = $master;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $mapping;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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(@_)}, %{agg_ports_cisco(@_)}};
 | 
			
		||||
  return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoAgg - SNMP Interface to Cisco Aggregated Links
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
SNMP::Info Developers
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $info = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $info->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This class provides access to Aggregated Links configuration on Cisco devices.
 | 
			
		||||
It combines Cisco PAgP, Cisco proprietary info and IEEE 802.3ad information.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
L<SNMP::Info::IEEE802dot3ad>
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-PAGP-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-LAG-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-IF-EXTENSION-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=over 4
 | 
			
		||||
 | 
			
		||||
=item C<agg_ports>
 | 
			
		||||
 | 
			
		||||
Returns a HASH reference mapping from slave to master port for each member of
 | 
			
		||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
 | 
			
		||||
ifIndex of the corresponding master ports.
 | 
			
		||||
 | 
			
		||||
=item C<agg_ports_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
 | 
			
		||||
							
								
								
									
										473
									
								
								lib/SNMP/Info/CiscoConfig.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										473
									
								
								lib/SNMP/Info/CiscoConfig.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,473 @@
 | 
			
		||||
# SNMP::Info::CiscoConfig
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 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::CiscoConfig;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoConfig::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoConfig::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
 | 
			
		||||
    'CISCO-FLASH-MIB'       => 'ciscoFlashCopyTable',
 | 
			
		||||
    'OLD-CISCO-SYS-MIB'     => 'writeMem',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
    # OLD-CISCO-SYS-MIB
 | 
			
		||||
    'old_write_mem' => 'writeMem',
 | 
			
		||||
    'old_write_net' => 'writeNet',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # CISCO-COPY-CONFIG-MIB::ccCopyTable
 | 
			
		||||
    'config_protocol'           => 'ccCopyProtocol',
 | 
			
		||||
    'config_source_type'        => 'ccCopySourceFileType',
 | 
			
		||||
    'config_dest_type'          => 'ccCopyDestFileType',
 | 
			
		||||
    'config_server_addr'        => 'ccCopyServerAddress',
 | 
			
		||||
    'config_filename'           => 'ccCopyFileName',
 | 
			
		||||
    'config_username'           => 'ccCopyUserName',
 | 
			
		||||
    'config_password'           => 'ccCopyUserPassword',
 | 
			
		||||
    'config_notify_complete'    => 'ccCopyNotificationOnCompletion',
 | 
			
		||||
    'config_copy_state'         => 'ccCopyState',
 | 
			
		||||
    'config_copy_start_time'    => 'ccCopyTimeStarted',
 | 
			
		||||
    'config_copy_complete_time' => 'ccCopyTimeCompleted',
 | 
			
		||||
    'config_fail_cause'         => 'ccCopyFailCause',
 | 
			
		||||
    'config_row_status'         => 'ccCopyEntryRowStatus',
 | 
			
		||||
 | 
			
		||||
    # CISCO-FLASH-MIB::ciscoFlashCopyTable
 | 
			
		||||
    'flash_copy_cmd'        => 'ciscoFlashCopyCommand',
 | 
			
		||||
    'flash_copy_protocol'   => 'ciscoFlashCopyProtocol',
 | 
			
		||||
    'flash_copy_address'    => 'ciscoFlashCopyServerAddress',
 | 
			
		||||
    'flash_copy_source'     => 'ciscoFlashCopySourceName',
 | 
			
		||||
    'flash_copy_dest'       => 'ciscoFlashCopyDestinationName',
 | 
			
		||||
    'flash_copy_row_status' => 'ciscoFlashCopyEntryStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
sub copy_run_tftp {
 | 
			
		||||
    my $ciscoconfig = shift;
 | 
			
		||||
    my ( $tftphost, $tftpfile ) = @_;
 | 
			
		||||
 | 
			
		||||
    srand( time() ^ ( $$ + ( $$ << 15 ) ) );
 | 
			
		||||
    my $rand = int( rand( 1 << 24 ) );
 | 
			
		||||
 | 
			
		||||
    print "Saving running config to $tftphost as $tftpfile\n"
 | 
			
		||||
        if $ciscoconfig->debug();
 | 
			
		||||
 | 
			
		||||
    #Try new method first fall back to old method
 | 
			
		||||
    if ( $ciscoconfig->set_config_protocol( 1, $rand ) ) {
 | 
			
		||||
        print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
 | 
			
		||||
 | 
			
		||||
        #Check each set, delete created row if any fail
 | 
			
		||||
        unless ( $ciscoconfig->set_config_row_status( 5, $rand ) ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Initializing config copy instruction failed");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        unless ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Setting source type failed");
 | 
			
		||||
            unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
 | 
			
		||||
                $ciscoconfig->error_throw(
 | 
			
		||||
                    "Setting source type failed and failed to delete row $rand"
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        unless ( $ciscoconfig->set_config_dest_type( 1, $rand ) ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Setting destination type failed");
 | 
			
		||||
            unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
 | 
			
		||||
                $ciscoconfig->error_throw(
 | 
			
		||||
                    "Setting dest type failed and failed to delete row $rand"
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        unless ( $ciscoconfig->set_config_server_addr( $tftphost, $rand ) ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Setting tftp server failed");
 | 
			
		||||
            unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
 | 
			
		||||
                $ciscoconfig->error_throw(
 | 
			
		||||
                    "Setting tftp server failed and failed to delete row $rand"
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        unless ( $ciscoconfig->set_config_filename( $tftpfile, $rand ) ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Setting file name failed");
 | 
			
		||||
            unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
 | 
			
		||||
                $ciscoconfig->error_throw(
 | 
			
		||||
                    "Setting file name failed and failed to delete row $rand"
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        unless ( $ciscoconfig->set_config_row_status( 1, $rand ) ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Initiating transfer failed");
 | 
			
		||||
            unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
 | 
			
		||||
                $ciscoconfig->error_throw(
 | 
			
		||||
                    "Initiating transfer failed and failed to delete row $rand"
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        my $status = 0;
 | 
			
		||||
        my $timer  = 0;
 | 
			
		||||
 | 
			
		||||
       # Hard-coded timeout of approximately 5 minutes, we can wrap this in an
 | 
			
		||||
       # option later if needed
 | 
			
		||||
        my $timeout = 300;
 | 
			
		||||
        while ( $status !~ /successful|failed/ ) {
 | 
			
		||||
            my $t = $ciscoconfig->config_copy_state($rand);
 | 
			
		||||
            $status = $t->{$rand};
 | 
			
		||||
            last if $status =~ /successful|failed/;
 | 
			
		||||
            $timer += 1;
 | 
			
		||||
            if ( $timer >= $timeout ) {
 | 
			
		||||
                $status = 'failed';
 | 
			
		||||
                last;
 | 
			
		||||
            }
 | 
			
		||||
            sleep 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
 | 
			
		||||
            print "Failed deleting row, iid $rand\n" if $ciscoconfig->debug();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( $status eq 'successful' ) {
 | 
			
		||||
            print "Save operation successful\n" if $ciscoconfig->debug();
 | 
			
		||||
            return 1;
 | 
			
		||||
        }
 | 
			
		||||
        if ( $status eq 'failed' ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Save operation failed");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    print "Using old method\n" if $ciscoconfig->debug();
 | 
			
		||||
    unless ( $ciscoconfig->set_old_write_net( $tftpfile, $tftphost ) ) {
 | 
			
		||||
        $ciscoconfig->error_throw("Save operation failed");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub copy_run_start {
 | 
			
		||||
    my $ciscoconfig = shift;
 | 
			
		||||
 | 
			
		||||
    srand( time() ^ ( $$ + ( $$ << 15 ) ) );
 | 
			
		||||
    my $rand = int( rand( 1 << 24 ) );
 | 
			
		||||
 | 
			
		||||
    print "Saving running config to memory\n" if $ciscoconfig->debug();
 | 
			
		||||
 | 
			
		||||
    if ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
 | 
			
		||||
        print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
 | 
			
		||||
 | 
			
		||||
        #Check each set, delete created row if any fail
 | 
			
		||||
        unless ( $ciscoconfig->set_config_dest_type( 3, $rand ) ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Setting dest type failed");
 | 
			
		||||
            unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
 | 
			
		||||
                $ciscoconfig->error_throw(
 | 
			
		||||
                    "Setting dest type failed and failed to delete row $rand"
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        unless ( $ciscoconfig->set_config_row_status( 1, $rand ) ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Initiating save failed");
 | 
			
		||||
            unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
 | 
			
		||||
                $ciscoconfig->error_throw(
 | 
			
		||||
                    "Initiating save failed and failed to delete row $rand");
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        my $status = 0;
 | 
			
		||||
        my $timer  = 0;
 | 
			
		||||
 | 
			
		||||
       # Hard-coded timeout of approximately 5 minutes, we can wrap this in an
 | 
			
		||||
       # option later if needed
 | 
			
		||||
        my $timeout = 300;
 | 
			
		||||
        while ( $status !~ /successful|failed/ ) {
 | 
			
		||||
            my $t = $ciscoconfig->config_copy_state($rand);
 | 
			
		||||
            $status = $t->{$rand};
 | 
			
		||||
            last if $status =~ /successful|failed/;
 | 
			
		||||
            $timer += 1;
 | 
			
		||||
            if ( $timer >= $timeout ) {
 | 
			
		||||
                $status = 'failed';
 | 
			
		||||
                last;
 | 
			
		||||
            }
 | 
			
		||||
            sleep 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
 | 
			
		||||
            print "Failed deleting row, iid $rand\n" if $ciscoconfig->debug();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ( $status eq 'successful' ) {
 | 
			
		||||
            print "Save operation successful\n" if $ciscoconfig->debug();
 | 
			
		||||
            return 1;
 | 
			
		||||
        }
 | 
			
		||||
        if ( $status eq 'failed' ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Save operation failed");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    print "Using old method\n" if $ciscoconfig->debug();
 | 
			
		||||
    unless ( $ciscoconfig->set_old_write_mem(1) ) {
 | 
			
		||||
        $ciscoconfig->error_throw("Save operation failed");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoConfig - SNMP Interface to Cisco Configuration Files
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Justin Hunter, Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
    my $ciscoconfig = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
    my $class = $ciscoconfig->class();
 | 
			
		||||
    print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoConfig is a subclass of SNMP::Info that provides an interface
 | 
			
		||||
to F<CISCO-CONFIG-COPY-MIB>, F<CISCO-FLASH-MIB>, and F<OLD-CISCO-SYS-MIB>.
 | 
			
		||||
These MIBs facilitate the writing of configuration files.
 | 
			
		||||
 | 
			
		||||
Use or create a subclass of SNMP::Info that inherits this one.
 | 
			
		||||
Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-CONFIG-COPY-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-FLASH-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<OLD-CISCO-SYS-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->old_write_mem()
 | 
			
		||||
 | 
			
		||||
(C<writeMem>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->old_write_net()
 | 
			
		||||
 | 
			
		||||
(C<writeNet>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Config Copy Request Table  (C<ccCopyTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_protocol()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyProtocol>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_source_type()
 | 
			
		||||
 | 
			
		||||
(C<ccCopySourceFileType>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_dest_type()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyDestFileType>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_server_addr()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyServerAddress>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_filename()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyFileName>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_username()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyUserName>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_password()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyUserPassword>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_notify_complete()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyNotificationOnCompletion>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_copy_state()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyState>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_copy_start_time()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyTimeStarted>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_copy_complete_time()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyTimeCompleted>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_fail_cause()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyFailCause>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->config_row_status()
 | 
			
		||||
 | 
			
		||||
(C<ccCopyEntryRowStatus>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Flash Copy Table (C<ciscoFlashCopyTable>)
 | 
			
		||||
 | 
			
		||||
Table of Flash copy operation entries.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->flash_copy_cmd()
 | 
			
		||||
 | 
			
		||||
(C<ciscoFlashCopyCommand>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->flash_copy_protocol()
 | 
			
		||||
 | 
			
		||||
(C<ciscoFlashCopyProtocol>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->flash_copy_address()
 | 
			
		||||
 | 
			
		||||
(C<ciscoFlashCopyServerAddress>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->flash_copy_source()
 | 
			
		||||
 | 
			
		||||
(C<ciscoFlashCopySourceName>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->flash_copy_dest()
 | 
			
		||||
 | 
			
		||||
(C<ciscoFlashCopyDestinationName>)
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->flash_copy_row_status()
 | 
			
		||||
 | 
			
		||||
(C<ciscoFlashCopyEntryStatus>)
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->copy_run_tftp (tftpserver, tftpfilename )
 | 
			
		||||
 | 
			
		||||
Store the running configuration on a TFTP server.  Equivalent to the CLI
 | 
			
		||||
commands "copy running-config tftp" or "write net".
 | 
			
		||||
 | 
			
		||||
This method attempts to use newer "copy running-config tftp" procedure first
 | 
			
		||||
and then the older "write net" procedure if that fails.  The newer procedure
 | 
			
		||||
is supported Cisco devices with the F<CISCO-CONFIG-COPY-MIB> available, Cisco
 | 
			
		||||
IOS software release 12.0 or on some devices as early as release 11.2P.  The
 | 
			
		||||
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')
 | 
			
		||||
    or die "Couldn't save config. ",$ciscoconfig->error(1);
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->copy_run_start()
 | 
			
		||||
 | 
			
		||||
Copy the running configuration to the start up configuration.  Equivalent to
 | 
			
		||||
the CLI command C<"copy running-config startup-config"> or C<"write mem">.
 | 
			
		||||
 | 
			
		||||
This method attempts to use newer C<"copy running-config startup-config">
 | 
			
		||||
procedure first and then the older C<"write mem"> procedure if that fails.
 | 
			
		||||
The newer procedure is supported Cisco devices with the
 | 
			
		||||
F<CISCO-CONFIG-COPY-MIB> available, Cisco IOS software release 12.0 or on
 | 
			
		||||
some devices as early as release 11.2P.  The older procedure has been
 | 
			
		||||
depreciated by Cisco and is utilized only to support devices running older
 | 
			
		||||
code revisions.
 | 
			
		||||
 | 
			
		||||
 Example:
 | 
			
		||||
 $ciscoconfig->copy_run_start()
 | 
			
		||||
    or die "Couldn't save config. ",$ciscoconfig->error(1);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										411
									
								
								lib/SNMP/Info/CiscoPortSecurity.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										411
									
								
								lib/SNMP/Info/CiscoPortSecurity.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,411 @@
 | 
			
		||||
# SNMP::Info::CiscoPortSecurity
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 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::CiscoPortSecurity;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoPortSecurity::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoPortSecurity::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PAECAPABILITIES);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',
 | 
			
		||||
    'CISCO-PAE-MIB'           => 'ciscoPaeMIB',
 | 
			
		||||
    'IEEE8021-PAE-MIB'        => 'dot1xAuthLastEapolFrameSource',
 | 
			
		||||
    'CISCO-ERR-DISABLE-MIB'   => 'ciscoErrDisableMIB',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
    # CISCO-PORT-SECURITY-MIB
 | 
			
		||||
    'cps_clear'     => 'cpsGlobalClearSecureMacAddresses',
 | 
			
		||||
    'cps_notify'    => 'cpsGlobalSNMPNotifControl',
 | 
			
		||||
    'cps_rate'      => 'cpsGlobalSNMPNotifRate',
 | 
			
		||||
    'cps_enable'    => 'cpsGlobalPortSecurityEnable',
 | 
			
		||||
    'cps_mac_count' => 'cpsGlobalTotalSecureAddress',
 | 
			
		||||
    'cps_mac_max'   => 'cpsGlobalMaxSecureAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # CISCO-PORT-SECURITY-MIB::cpsIfConfigTable
 | 
			
		||||
    'cps_i_limit_val'  => 'cpsIfInvalidSrcRateLimitValue',
 | 
			
		||||
    'cps_i_limit'      => 'cpsIfInvalidSrcRateLimitEnable',
 | 
			
		||||
    'cps_i_sticky'     => 'cpsIfStickyEnable',
 | 
			
		||||
    'cps_i_clear_type' => 'cpsIfClearSecureMacAddresses',
 | 
			
		||||
    'cps_i_shutdown'   => 'cpsIfShutdownTimeout',
 | 
			
		||||
    'cps_i_flood'      => 'cpsIfUnicastFloodingEnable',
 | 
			
		||||
    'cps_i_clear'      => 'cpsIfClearSecureAddresses',
 | 
			
		||||
    'cps_i_mac'        => 'cpsIfSecureLastMacAddress',
 | 
			
		||||
    'cps_i_count'      => 'cpsIfViolationCount',
 | 
			
		||||
    'cps_i_action'     => 'cpsIfViolationAction',
 | 
			
		||||
    'cps_i_mac_static' => 'cpsIfStaticMacAddrAgingEnable',
 | 
			
		||||
    'cps_i_mac_type'   => 'cpsIfSecureMacAddrAgingType',
 | 
			
		||||
    'cps_i_mac_age'    => 'cpsIfSecureMacAddrAgingTime',
 | 
			
		||||
    'cps_i_mac_count'  => 'cpsIfCurrentSecureMacAddrCount',
 | 
			
		||||
    'cps_i_mac_max'    => 'cpsIfMaxSecureMacAddr',
 | 
			
		||||
    'cps_i_status'     => 'cpsIfPortSecurityStatus',
 | 
			
		||||
    'cps_i_enable'     => 'cpsIfPortSecurityEnable',
 | 
			
		||||
 | 
			
		||||
    # CISCO-PORT-SECURITY-MIB::cpsIfVlanTable
 | 
			
		||||
    'cps_i_v_mac_count' => 'cpsIfVlanCurSecureMacAddrCount',
 | 
			
		||||
    'cps_i_v_mac_max'   => 'cpsIfVlanMaxSecureMacAddr',
 | 
			
		||||
 | 
			
		||||
    # CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable
 | 
			
		||||
    'cps_i_v_mac_status' => 'cpsIfVlanSecureMacAddrRowStatus',
 | 
			
		||||
    'cps_i_v_mac_age'    => 'cpsIfVlanSecureMacAddrRemainAge',
 | 
			
		||||
    'cps_i_v_mac_type'   => 'cpsIfVlanSecureMacAddrType',
 | 
			
		||||
 | 
			
		||||
    # CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable
 | 
			
		||||
    'cps_m_status' => 'cpsSecureMacAddrRowStatus',
 | 
			
		||||
    'cps_m_age'    => 'cpsSecureMacAddrRemainingAge',
 | 
			
		||||
    'cps_m_type'   => 'cpsSecureMacAddrType',
 | 
			
		||||
 | 
			
		||||
    # 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,
 | 
			
		||||
    'pae_i_last_eapol_frame_source' => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'pae_i_capabilities'            => \&munge_pae_capabilities,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%PAECAPABILITIES = (
 | 
			
		||||
    0 => 'dot1xPaePortAuthCapable',
 | 
			
		||||
    1 => 'dot1xPaePortSuppCapable',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub munge_pae_capabilities {
 | 
			
		||||
    my $bits = shift;
 | 
			
		||||
 | 
			
		||||
    return unless defined $bits;
 | 
			
		||||
    my @vals
 | 
			
		||||
        = map( $PAECAPABILITIES{$_}, sprintf( "%x", unpack( 'b*', $bits ) ) );
 | 
			
		||||
    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>, F<CISCO-PAE-MIB> and F<CISCO-ERR-DISABLE-MIB>.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoPortSecurity is a subclass of SNMP::Info that provides
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-PORT-SECURITY-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-PAE-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<IEEE8021-PAE-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-ERR-DISABLE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 F<CISCO-PORT-SECURITY-MIB> globals
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_clear()
 | 
			
		||||
 | 
			
		||||
(C<cpsGlobalClearSecureMacAddresses>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_notify()
 | 
			
		||||
 | 
			
		||||
(C<cpsGlobalSNMPNotifControl>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_rate()
 | 
			
		||||
 | 
			
		||||
(C<cpsGlobalSNMPNotifRate>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_enable()
 | 
			
		||||
 | 
			
		||||
(C<cpsGlobalPortSecurityEnable>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_mac_count()
 | 
			
		||||
 | 
			
		||||
(C<cpsGlobalTotalSecureAddress>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_mac_max()
 | 
			
		||||
 | 
			
		||||
(C<cpsGlobalMaxSecureAddress>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 C<CISCO-PORT-SECURITY-MIB> - Interface Config Table
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_limit_val()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfInvalidSrcRateLimitValue>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_limit()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfInvalidSrcRateLimitEnable>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_sticky()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfStickyEnable>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_clear_type()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfClearSecureMacAddresses>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_shutdown()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfShutdownTimeout>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_flood()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfUnicastFloodingEnable>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_clear()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfClearSecureAddresses>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_mac()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfSecureLastMacAddress>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_count()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfViolationCount>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_action()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfViolationAction>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_mac_static()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfStaticMacAddrAgingEnable>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_mac_type()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfSecureMacAddrAgingType>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_mac_age()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfSecureMacAddrAgingTime>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_mac_count()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfCurrentSecureMacAddrCount>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_mac_max()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfMaxSecureMacAddr>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_status()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfPortSecurityStatus>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_enable()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfPortSecurityEnable>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanTable>
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_v_mac_count()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfVlanCurSecureMacAddrCount>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_v_mac_max()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfVlanMaxSecureMacAddr>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable>
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_v_mac_status()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfVlanSecureMacAddrRowStatus>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_v_mac_age()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfVlanSecureMacAddrRemainAge>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_v_mac_type()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfVlanSecureMacAddrType>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 C<CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable>
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_m_status()
 | 
			
		||||
 | 
			
		||||
(C<cpsSecureMacAddrRowStatus>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_m_age()
 | 
			
		||||
 | 
			
		||||
(C<cpsSecureMacAddrRemainingAge>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_m_type()
 | 
			
		||||
 | 
			
		||||
(C<cpsSecureMacAddrType>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 C<IEEE8021-PAE-MIB::dot1xPaePortEntry>
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cps->pae_i_capabilities()
 | 
			
		||||
 | 
			
		||||
C<dot1xPaePortCapabilities>
 | 
			
		||||
 | 
			
		||||
Indicates the PAE functionality that this Port supports
 | 
			
		||||
and that may be managed through this MIB munged to return either
 | 
			
		||||
C<'dot1xPaePortAuthCapable'> or C<'dot1xPaePortSuppCapable'>.
 | 
			
		||||
 | 
			
		||||
=item $cps->pae_i_last_eapol_frame_source()
 | 
			
		||||
 | 
			
		||||
C<dot1xAuthLastEapolFrameSource>
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
=item $cps->munge_pae_capabilities()
 | 
			
		||||
 | 
			
		||||
Return either C<'dot1xPaePortAuthCapable'> or C<'dot1xPaePortSuppCapable'>
 | 
			
		||||
based upon bit value.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										196
									
								
								lib/SNMP/Info/CiscoPower.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								lib/SNMP/Info/CiscoPower.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,196 @@
 | 
			
		||||
# SNMP::Info::CiscoPower
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CiscoPower;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoPower::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoPower::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
 | 
			
		||||
          'CISCO-CDP-MIB' => 'cdpCachePowerConsumption',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'cpeth_ent_phy'     => 'cpeExtPsePortEntPhyIndex',
 | 
			
		||||
    'peth_port_power'   => 'cpeExtPsePortPwrConsumption',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
# Cisco overcame the limitation of the module.port index of the
 | 
			
		||||
# pethPsePortTable by adding another mapping table, which maps
 | 
			
		||||
# a pethPsePortTable row to an entPhysicalTable index, which can
 | 
			
		||||
# then be mapped to ifIndex.
 | 
			
		||||
sub peth_port_ifindex {
 | 
			
		||||
    my $cpeth   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $ent_phy = $cpeth->cpeth_ent_phy($partial);
 | 
			
		||||
    my $e_port  = $cpeth->e_port();
 | 
			
		||||
 | 
			
		||||
    my $peth_port_ifindex = {};
 | 
			
		||||
    foreach my $i ( keys %$ent_phy ) {
 | 
			
		||||
        if ( $e_port->{ $ent_phy->{$i} } ) {
 | 
			
		||||
            $peth_port_ifindex->{$i} = $e_port->{ $ent_phy->{$i} };
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $peth_port_ifindex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# peth_port_neg_power uses the same index as the other peth_port_* tables.
 | 
			
		||||
# However, cdpCachePowerConsumption uses <ifIndex>.<neighbor>.
 | 
			
		||||
# Therefore, we have to invert peth_port_ifindex, to get to
 | 
			
		||||
# the index that is expected and the rest of the code can re-invert it.
 | 
			
		||||
sub peth_port_neg_power {
 | 
			
		||||
    my $cpeth   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Ignoring partial, since it's not easy to implement properly.
 | 
			
		||||
    my $index = $cpeth->peth_port_ifindex();
 | 
			
		||||
    my %inverse_index;
 | 
			
		||||
    foreach my $i ( keys %$index ) {
 | 
			
		||||
	$inverse_index{ $index->{$i} } = $i;
 | 
			
		||||
    }
 | 
			
		||||
    my $neg_power = $cpeth->cdpCachePowerConsumption();
 | 
			
		||||
    my $peth_port_neg_power = {};
 | 
			
		||||
    foreach my $i ( keys %$neg_power ) {
 | 
			
		||||
	my( $ifIndex, $nbrIndex ) = split( /\./, $i );
 | 
			
		||||
	if ( defined( $inverse_index{ $ifIndex } ) ) {
 | 
			
		||||
		$peth_port_neg_power->{ $inverse_index{ $ifIndex } } = $neg_power->{ $i };
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return $peth_port_neg_power;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoPower - SNMP Interface to data stored in
 | 
			
		||||
F<CISCO-POWER-ETHERNET-EXT-MIB>.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Bill Fenner
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The Info::PowerEthernet class needs a per-device helper function to
 | 
			
		||||
properly map the C<pethPsePortTable> to C<ifIndex> values.  This class
 | 
			
		||||
provides that helper, using F<CISCO-POWER-ETHERNET-EXT-MIB>.
 | 
			
		||||
It does not define any helpers for the extra values that this MIB
 | 
			
		||||
contains.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherit this class.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
For debugging purposes you can call this class directly as you would
 | 
			
		||||
SNMP::Info
 | 
			
		||||
 | 
			
		||||
 my $poe = new SNMP::Info::CiscoPower (...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
none.
 | 
			
		||||
 | 
			
		||||
Note that it requires that the device inherits from Info::Entity.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-POWER-ETHERNET-EXT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-CDP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
none.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Power Port Table
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $poe->peth_port_ifindex()
 | 
			
		||||
 | 
			
		||||
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
 | 
			
		||||
 | 
			
		||||
=item $poe->peth_port_power()
 | 
			
		||||
 | 
			
		||||
Power supplied by PoE ports, in milliwatts
 | 
			
		||||
(C<cpeExtPsePortPwrConsumption>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 CDP Port table
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $poe->peth_port_neg_power()
 | 
			
		||||
 | 
			
		||||
Power negotiated using CDP, in milliwatts
 | 
			
		||||
(C<cdpCachePowerConsumption>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										216
									
								
								lib/SNMP/Info/CiscoQOS.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								lib/SNMP/Info/CiscoQOS.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,216 @@
 | 
			
		||||
# SNMP::Info::CiscoQOS
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2005 Alexander Hartmaier
 | 
			
		||||
# 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::CiscoQOS;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoQOS::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoQOS::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # CISCO-CLASS-BASED-QOS-MIB::cbQosServicePolicyTable
 | 
			
		||||
    'qos_i_index'       => 'cbQosIfIndex',
 | 
			
		||||
    'qos_i_type'        => 'cbQosIfType',
 | 
			
		||||
    'qos_pol_direction' => 'cbQosPolicyDirection',
 | 
			
		||||
 | 
			
		||||
    # CISCO-CLASS-BASED-QOS-MIB::cbQosObjectsTable
 | 
			
		||||
    'qos_obj_conf_index' => 'cbQosConfigIndex',
 | 
			
		||||
    'qos_obj_type'       => 'cbQosObjectsType',
 | 
			
		||||
    'qos_obj_parent'     => 'cbQosParentObjectsIndex',
 | 
			
		||||
 | 
			
		||||
    # CISCO-CLASS-BASED-QOS-MIB::cbQosCMCfgTable
 | 
			
		||||
    'qos_cm_name' => 'cbQosCMName',
 | 
			
		||||
    'qos_cm_desc' => 'cbQosCMDesc',
 | 
			
		||||
    'qos_cm_info' => 'cbQosCMInfo',
 | 
			
		||||
 | 
			
		||||
    # CISCO-CLASS-BASED-QOS-MIB::cbQosCMStatsTable
 | 
			
		||||
    'qos_octet_pre'  => 'cbQosCMPrePolicyByte',
 | 
			
		||||
    'qos_octet_post' => 'cbQosCMPostPolicyByte',
 | 
			
		||||
 | 
			
		||||
    # CISCO-CLASS-BASED-QOS-MIB::cbQosQueueingCfgTable
 | 
			
		||||
    'qos_queueingcfg_bw'       => 'cbQosQueueingCfgBandwidth',
 | 
			
		||||
    'qos_queueingcfg_bw_units' => 'cbQosQueueingCfgBandwidthUnits',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoQOS - SNMP Interface to Cisco's Quality of Service MIBs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Alexander Hartmaier
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
none.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-CLASS-BASED-QOS-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item none
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Service Policy Table (C<cbQosServicePolicyTable>)
 | 
			
		||||
 | 
			
		||||
This table describes the interfaces/media types and the policy map that are
 | 
			
		||||
attached to it.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_i_index()
 | 
			
		||||
 | 
			
		||||
(C<cbQosIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_i_type()
 | 
			
		||||
 | 
			
		||||
(C<cbQosIfType>)
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_pol_direction()
 | 
			
		||||
 | 
			
		||||
(C<cbQosPolicyDirection>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Class Map Objects Table (C<cbQosObjectsTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_obj_index()
 | 
			
		||||
 | 
			
		||||
(C<cbQosConfigIndex>)
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_obj_type()
 | 
			
		||||
 | 
			
		||||
(C<cbQosObjectsType>)
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_obj_parent()
 | 
			
		||||
 | 
			
		||||
(C<cbQosParentObjectsIndex>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Class Map Configuration Table (C<cbQosCMCfgTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_cm_name()
 | 
			
		||||
 | 
			
		||||
(C<cbQosCMName>)
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_cm_desc()
 | 
			
		||||
 | 
			
		||||
(C<cbQosCMDesc>)
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_cm_info()
 | 
			
		||||
 | 
			
		||||
(C<cbQosCMInfo>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Class Map Stats Table (C<cbQosCMStatsTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_octet_pre()
 | 
			
		||||
 | 
			
		||||
(C<cbQosCMPrePolicyByte>)
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_octet_post()
 | 
			
		||||
 | 
			
		||||
(C<cbQosCMPostPolicyByte>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Queueing Configuration Table (C<cbQosQueueingCfgTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_queueingcfg_bw()
 | 
			
		||||
 | 
			
		||||
(C<cbQosQueueingCfgBandwidth>)
 | 
			
		||||
 | 
			
		||||
=item $qos->qos_queueingcfg_bw_units()
 | 
			
		||||
 | 
			
		||||
(C<cbQosQueueingCfgBandwidthUnits>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										136
									
								
								lib/SNMP/Info/CiscoRTT.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								lib/SNMP/Info/CiscoRTT.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
			
		||||
# SNMP::Info::CiscoRTT
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2005 Alexander Hartmaier
 | 
			
		||||
# 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::CiscoRTT;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoRTT::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoRTT::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # CISCO-RTTMON-MIB
 | 
			
		||||
    'rtt_desc' => 'rttMonCtrlAdminOwner',
 | 
			
		||||
    'rtt_last' => 'rttMonLatestRttOperCompletionTime',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoRTT - SNMP Interface to Cisco's Round Trip Time MIBs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Alexander Hartmaier
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
none.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-RTTMON-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
None
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Overall Control Group Table
 | 
			
		||||
 | 
			
		||||
This table is from C<CISCO-RTTMON-MIB::rttMonCtrlAdminTable>
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $rtt->rtt_desc()
 | 
			
		||||
 | 
			
		||||
(C<rttMonCtrlAdminOwner>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overall Control Group Table
 | 
			
		||||
 | 
			
		||||
This table is from C<CISCO-RTTMON-MIB::rttMonCtrl>
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $rtt->rtt_last()
 | 
			
		||||
 | 
			
		||||
(C<rttMonLatestRttOperCompletionTime>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										635
									
								
								lib/SNMP/Info/CiscoStack.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										635
									
								
								lib/SNMP/Info/CiscoStack.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,635 @@
 | 
			
		||||
# SNMP::Info::CiscoStack
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CiscoStack;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoStack::ISA       = qw/Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoStack::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PORTSTAT);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    'sysip'      => 'sysIpAddr',
 | 
			
		||||
    'netmask'    => 'sysNetMask',
 | 
			
		||||
    'broadcast'  => 'sysBroadcast',
 | 
			
		||||
    'serial1'    => 'chassisSerialNumber',
 | 
			
		||||
    'serial2'    => 'chassisSerialNumberString',
 | 
			
		||||
    'model1'     => 'chassisModel',
 | 
			
		||||
    'ps1_type'   => 'chassisPs1Type',
 | 
			
		||||
    'ps1_status' => 'chassisPs1Status',
 | 
			
		||||
    'ps2_type'   => 'chassisPs2Type',
 | 
			
		||||
    'ps2_status' => 'chassisPs2Status',
 | 
			
		||||
    'slots'      => 'chassisNumSlots',
 | 
			
		||||
    'fan'        => 'chassisFanStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # CISCO-STACK-MIB::moduleEntry
 | 
			
		||||
    #   These are blades in a catalyst device
 | 
			
		||||
    'm_type'         => 'moduleType',
 | 
			
		||||
    'm_model'        => 'moduleModel',
 | 
			
		||||
    'm_serial'       => 'moduleSerialNumber',
 | 
			
		||||
    'm_serial_string' => 'moduleSerialNumberString',
 | 
			
		||||
    'm_status'       => 'moduleStatus',
 | 
			
		||||
    'm_name'         => 'moduleName',
 | 
			
		||||
    'm_ports'        => 'moduleNumPorts',
 | 
			
		||||
    'm_ports_status' => 'modulePortStatus',
 | 
			
		||||
    'm_hwver'        => 'moduleHwVersion',
 | 
			
		||||
    'm_fwver'        => 'moduleFwVersion',
 | 
			
		||||
    'm_swver'        => 'moduleSwVersion',
 | 
			
		||||
 | 
			
		||||
    # Router Blades :
 | 
			
		||||
    'm_ip'   => 'moduleIPAddress',
 | 
			
		||||
    'm_sub1' => 'moduleSubType',
 | 
			
		||||
    'm_sub2' => 'moduleSubType2',
 | 
			
		||||
 | 
			
		||||
    # CISCO-STACK-MIB::portEntry
 | 
			
		||||
    'p_name'                  => 'portName',
 | 
			
		||||
    'p_type'                  => 'portType',
 | 
			
		||||
    'p_status'                => 'portOperStatus',
 | 
			
		||||
    'p_status2'               => 'portAdditionalStatus',
 | 
			
		||||
    'p_speed'                 => 'portAdminSpeed',
 | 
			
		||||
    'p_duplex'                => 'portDuplex',
 | 
			
		||||
    'p_port'                  => 'portIfIndex',
 | 
			
		||||
    'p_rx_flow_control'       => 'portOperRxFlowControl',
 | 
			
		||||
    'p_tx_flow_control'       => 'portOperTxFlowControl',
 | 
			
		||||
    'p_rx_flow_control_admin' => 'portAdminRxFlowControl',
 | 
			
		||||
    'p_tx_flow_control_admin' => 'portAdminTxFlowControl',
 | 
			
		||||
    'p_oidx'                  => 'portCrossIndex',
 | 
			
		||||
 | 
			
		||||
    # CISCO-STACK-MIB::PortCpbEntry
 | 
			
		||||
    'p_speed_admin'  => 'portCpbSpeed',
 | 
			
		||||
    'p_duplex_admin' => 'portCpbDuplex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'm_ports_status' => \&munge_port_status,
 | 
			
		||||
    'p_duplex_admin' => \&SNMP::Info::munge_bits,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%PORTSTAT = (
 | 
			
		||||
    1 => 'other',
 | 
			
		||||
    2 => 'ok',
 | 
			
		||||
    3 => 'minorFault',
 | 
			
		||||
    4 => 'majorFault',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Changes binary byte describing each port into ascii, and returns
 | 
			
		||||
# an ascii list separated by spaces.
 | 
			
		||||
sub munge_port_status {
 | 
			
		||||
    my $status = shift;
 | 
			
		||||
    my @vals = map( $PORTSTAT{$_}, unpack( 'C*', $status ) );
 | 
			
		||||
    return join( ' ', @vals );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $serial1 = $stack->serial1();
 | 
			
		||||
    my $serial2 = $stack->serial2();
 | 
			
		||||
 | 
			
		||||
    return $serial1 if defined $serial1;
 | 
			
		||||
    return $serial2 if defined $serial2;
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Rules for older CatOS devices using CiscoStack
 | 
			
		||||
#
 | 
			
		||||
# You can configure Ethernet and Fast Ethernet interfaces to either full
 | 
			
		||||
# duplex or half duplex.
 | 
			
		||||
#
 | 
			
		||||
# You cannot configure the duplex mode on Gigabit Ethernet ports (they are
 | 
			
		||||
# always in full-duplex mode).
 | 
			
		||||
#
 | 
			
		||||
# If you set the port speed to auto, duplex mode is automatically set to auto.
 | 
			
		||||
#
 | 
			
		||||
# For operational duplex if portCpbDuplex is all zeros the port is a gigabit
 | 
			
		||||
# port and duplex is always full.  If the port is not operational and auto
 | 
			
		||||
# return value will be undef since we don't know the operational status.
 | 
			
		||||
#
 | 
			
		||||
# Newer devices use ETHERLIKE-MIB to report operational duplex, this will be
 | 
			
		||||
# checked in the device class.
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_port       = $stack->p_port()         || {};
 | 
			
		||||
    my $p_duplex     = $stack->p_duplex()       || {};
 | 
			
		||||
    my $p_duplex_cap = $stack->p_duplex_admin() || {};
 | 
			
		||||
 | 
			
		||||
    my $i_duplex = {};
 | 
			
		||||
    foreach my $port ( keys %$p_duplex ) {
 | 
			
		||||
        my $iid = $p_port->{$port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        next if ( defined $partial and $iid !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        # Test for gigabit
 | 
			
		||||
        if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) {
 | 
			
		||||
            $i_duplex->{$iid} = 'full';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Auto is not a valid operational state
 | 
			
		||||
        elsif ( $p_duplex->{$port} eq 'auto' ) {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $i_duplex->{$iid} = $p_duplex->{$port};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# For administrative duplex if portCpbDuplex is all zeros the port is a gigabit
 | 
			
		||||
# port and duplex is always full.  If portAdminSpeed is set to auto then the
 | 
			
		||||
# duplex will be auto, otherwise use portDuplex.
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_port       = $stack->p_port()         || {};
 | 
			
		||||
    my $p_duplex     = $stack->p_duplex()       || {};
 | 
			
		||||
    my $p_duplex_cap = $stack->p_duplex_admin() || {};
 | 
			
		||||
    my $p_speed      = $stack->p_speed()        || {};
 | 
			
		||||
 | 
			
		||||
    my $i_duplex_admin = {};
 | 
			
		||||
    foreach my $port ( keys %$p_duplex ) {
 | 
			
		||||
        my $iid = $p_port->{$port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        next if ( defined $partial and $iid !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        # Test for gigabit
 | 
			
		||||
        if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) {
 | 
			
		||||
            $i_duplex_admin->{$iid} = 'full';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Check admin speed for auto
 | 
			
		||||
        elsif ( $p_speed->{$port} =~ /auto/ ) {
 | 
			
		||||
            $i_duplex_admin->{$iid} = 'auto';
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $i_duplex_admin->{$iid} = $p_duplex->{$port};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed_admin {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my %i_speed_admin;
 | 
			
		||||
    my $p_port  = $stack->p_port()  || {};
 | 
			
		||||
    my $p_speed = $stack->p_speed() || {};
 | 
			
		||||
 | 
			
		||||
    my %speeds = (
 | 
			
		||||
        'autoDetect'      => 'auto',
 | 
			
		||||
        'autoDetect10100' => 'auto',
 | 
			
		||||
        's10000000'       => '10 Mbps',
 | 
			
		||||
        's100000000'      => '100 Mbps',
 | 
			
		||||
        's1000000000'     => '1.0 Gbps',
 | 
			
		||||
        's10G'            => '10 Gbps',
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    %i_speed_admin
 | 
			
		||||
        = map { $p_port->{$_} => $speeds{ $p_speed->{$_} } } keys %$p_port;
 | 
			
		||||
 | 
			
		||||
    return \%i_speed_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_speed_admin {
 | 
			
		||||
 | 
			
		||||
    # map speeds to those the switch will understand
 | 
			
		||||
    my %speeds = qw/auto 1 10 10000000 100 100000000 1000 1000000000/;
 | 
			
		||||
 | 
			
		||||
    my $stack = shift;
 | 
			
		||||
    my ( $speed, $iid ) = @_;
 | 
			
		||||
    my $p_port = $stack->p_port() || {};
 | 
			
		||||
    my %reverse_p_port = reverse %$p_port;
 | 
			
		||||
 | 
			
		||||
    $speed = lc($speed);
 | 
			
		||||
 | 
			
		||||
    return 0 unless defined $speeds{$speed};
 | 
			
		||||
 | 
			
		||||
    $iid = $reverse_p_port{$iid};
 | 
			
		||||
 | 
			
		||||
    return $stack->set_p_speed( $speeds{$speed}, $iid );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_duplex_admin {
 | 
			
		||||
 | 
			
		||||
    # map a textual duplex to an integer one the switch understands
 | 
			
		||||
    my %duplexes = qw/half 1 full 2 auto 4/;
 | 
			
		||||
 | 
			
		||||
    my $stack = shift;
 | 
			
		||||
    my ( $duplex, $iid ) = @_;
 | 
			
		||||
    if ( $duplex eq 'auto' ) {
 | 
			
		||||
        $stack->error_throw(
 | 
			
		||||
            "Software doesn't support setting auto duplex with
 | 
			
		||||
                            set_i_duplex_admin() you must use
 | 
			
		||||
                            set_i_speed_admin() and set both speed and duplex
 | 
			
		||||
                            to auto"
 | 
			
		||||
        );
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $p_port = $stack->p_port() || {};
 | 
			
		||||
    my %reverse_p_port = reverse %$p_port;
 | 
			
		||||
 | 
			
		||||
    $duplex = lc($duplex);
 | 
			
		||||
 | 
			
		||||
    return 0 unless defined $duplexes{$duplex};
 | 
			
		||||
 | 
			
		||||
    $iid = $reverse_p_port{$iid};
 | 
			
		||||
 | 
			
		||||
    return $stack->set_p_duplex( $duplexes{$duplex}, $iid );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoStack - SNMP Interface to data from F<CISCO-STACK-MIB>
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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 = $ciscostack->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoStack is a subclass of SNMP::Info that provides
 | 
			
		||||
an interface to the C<CISCO-STACK-MIB>.  This MIB is used across
 | 
			
		||||
the Catalyst family under CatOS and IOS.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
none.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-STACK-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $stack->broadcast()
 | 
			
		||||
 | 
			
		||||
(C<sysBroadcast>)
 | 
			
		||||
 | 
			
		||||
=item $stack->fan()
 | 
			
		||||
 | 
			
		||||
(C<chassisFanStatus>)
 | 
			
		||||
 | 
			
		||||
=item $stack->model()
 | 
			
		||||
 | 
			
		||||
(C<chassisModel>)
 | 
			
		||||
 | 
			
		||||
=item $stack->netmask()
 | 
			
		||||
 | 
			
		||||
(C<sysNetMask>)
 | 
			
		||||
 | 
			
		||||
=item $stack->ps1_type()
 | 
			
		||||
 | 
			
		||||
(C<chassisPs1Type>)
 | 
			
		||||
 | 
			
		||||
=item $stack->ps2_type()
 | 
			
		||||
 | 
			
		||||
(C<chassisPs2Type>)
 | 
			
		||||
 | 
			
		||||
=item $stack->ps1_status()
 | 
			
		||||
 | 
			
		||||
(C<chassisPs1Status>)
 | 
			
		||||
 | 
			
		||||
=item $stack->ps2_status()
 | 
			
		||||
 | 
			
		||||
(C<chassisPs2Status>)
 | 
			
		||||
 | 
			
		||||
=item $stack->serial()
 | 
			
		||||
 | 
			
		||||
(C<chassisSerialNumberString>) or (C<chassisSerialNumber>)
 | 
			
		||||
 | 
			
		||||
=item $stack->slots()
 | 
			
		||||
 | 
			
		||||
(C<chassisNumSlots>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Interface Tables
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $stack->i_physical()
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
Overrides with C<ifType> if p_type() isn't available.
 | 
			
		||||
 | 
			
		||||
=item $stack->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to current link duplex setting.
 | 
			
		||||
 | 
			
		||||
First checks for fixed gigabit ports which are always full duplex.  Next, if
 | 
			
		||||
the port is not operational and reported port duplex (C<portDuplex>) is auto
 | 
			
		||||
then the operational duplex can not be determined.  Otherwise it uses the
 | 
			
		||||
reported port duplex (C<portDuplex>).
 | 
			
		||||
 | 
			
		||||
=item $stack->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to administrative duplex setting.
 | 
			
		||||
 | 
			
		||||
First checks for fixed gigabit ports which are always full duplex. Next checks
 | 
			
		||||
the port administrative speed (C<portAdminSpeed>) which if set to
 | 
			
		||||
autonegotiate then the duplex will also autonegotiate, otherwise it uses the
 | 
			
		||||
reported port duplex (C<portDuplex>).
 | 
			
		||||
 | 
			
		||||
=item $stack->i_speed_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to administrative speed setting.
 | 
			
		||||
 | 
			
		||||
C<portAdminSpeed>
 | 
			
		||||
 | 
			
		||||
=item $stack->set_i_speed_admin(speed, ifIndex)
 | 
			
		||||
 | 
			
		||||
    Sets port speed, must be supplied with speed and port C<ifIndex>
 | 
			
		||||
 | 
			
		||||
    Speed choices are 'auto', '10', '100', '1000'
 | 
			
		||||
 | 
			
		||||
    Crosses $stack->p_port() with $stack->p_duplex() to
 | 
			
		||||
    utilize port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
    Example:
 | 
			
		||||
    my %if_map = reverse %{$stack->interfaces()};
 | 
			
		||||
    $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)
 | 
			
		||||
 | 
			
		||||
    Sets port duplex, must be supplied with duplex and port C<ifIndex>
 | 
			
		||||
 | 
			
		||||
    Speed choices are 'auto', 'half', 'full'
 | 
			
		||||
 | 
			
		||||
    Crosses $stack->p_port() with $stack->p_duplex() to
 | 
			
		||||
    utilize port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
    Example:
 | 
			
		||||
    my %if_map = reverse %{$stack->interfaces()};
 | 
			
		||||
    $stack->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
 | 
			
		||||
        or die "Couldn't change port duplex. ",$stack->error(1);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Module table
 | 
			
		||||
 | 
			
		||||
This table holds configuration information for each of the blades installed in
 | 
			
		||||
the Catalyst device.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $stack->m_type()
 | 
			
		||||
 | 
			
		||||
(C<moduleType>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_model()
 | 
			
		||||
 | 
			
		||||
(C<moduleModel>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_serial()
 | 
			
		||||
 | 
			
		||||
(C<moduleSerialNumber>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_status()
 | 
			
		||||
 | 
			
		||||
(C<moduleStatus>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_name()
 | 
			
		||||
 | 
			
		||||
(C<moduleName>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_ports()
 | 
			
		||||
 | 
			
		||||
(C<moduleNumPorts>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_ports_status()
 | 
			
		||||
 | 
			
		||||
Returns a list of space separated status strings for the ports.
 | 
			
		||||
 | 
			
		||||
To see the status of port 4 :
 | 
			
		||||
 | 
			
		||||
    @ports_status = split(' ', $stack->m_ports_status() );
 | 
			
		||||
    $port4 = $ports_status[3];
 | 
			
		||||
 | 
			
		||||
(C<modulePortStatus>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_ports_hwver()
 | 
			
		||||
 | 
			
		||||
(C<moduleHwVersion>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_ports_fwver()
 | 
			
		||||
 | 
			
		||||
(C<moduleFwVersion>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_ports_swver()
 | 
			
		||||
 | 
			
		||||
(C<moduleSwVersion>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_ports_ip()
 | 
			
		||||
 | 
			
		||||
(C<moduleIPAddress>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_ports_sub1()
 | 
			
		||||
 | 
			
		||||
(C<moduleSubType>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_ports_sub2()
 | 
			
		||||
 | 
			
		||||
(C<moduleSubType2>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Modules - Router Blades
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $stack->m_ip()
 | 
			
		||||
 | 
			
		||||
(C<moduleIPAddress>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_sub1()
 | 
			
		||||
 | 
			
		||||
(C<moduleSubType>)
 | 
			
		||||
 | 
			
		||||
=item $stack->m_sub2()
 | 
			
		||||
 | 
			
		||||
(C<moduleSubType2>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Port Entry Table (C<CISCO-STACK-MIB::portTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $stack->p_name()
 | 
			
		||||
 | 
			
		||||
(C<portName>)
 | 
			
		||||
 | 
			
		||||
=item $stack->p_type()
 | 
			
		||||
 | 
			
		||||
(C<portType>)
 | 
			
		||||
 | 
			
		||||
=item $stack->p_status()
 | 
			
		||||
 | 
			
		||||
(C<portOperStatus>)
 | 
			
		||||
 | 
			
		||||
=item $stack->p_status2()
 | 
			
		||||
 | 
			
		||||
(C<portAdditionalStatus>)
 | 
			
		||||
 | 
			
		||||
=item $stack->p_speed()
 | 
			
		||||
 | 
			
		||||
(C<portAdminSpeed>)
 | 
			
		||||
 | 
			
		||||
=item $stack->p_duplex()
 | 
			
		||||
 | 
			
		||||
(C<portDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $stack->p_port()
 | 
			
		||||
 | 
			
		||||
(C<portIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $stack->p_rx_flow_control()
 | 
			
		||||
 | 
			
		||||
Can be either C<on> C<off> or C<disagree>
 | 
			
		||||
 | 
			
		||||
"Indicates the receive flow control operational status of the port. If the
 | 
			
		||||
port could not agree with the far end on a link protocol, its operational
 | 
			
		||||
status will be disagree(3)."
 | 
			
		||||
 | 
			
		||||
C<portOperRxFlowControl>
 | 
			
		||||
 | 
			
		||||
=item $stack->p_tx_flow_control()
 | 
			
		||||
 | 
			
		||||
Can be either C<on> C<off> or C<disagree>
 | 
			
		||||
 | 
			
		||||
"Indicates the transmit flow control operational status of the port. If the
 | 
			
		||||
port could not agree with the far end on a link protocol, its operational
 | 
			
		||||
status will be disagree(3)."
 | 
			
		||||
 | 
			
		||||
C<portOperTxFlowControl>
 | 
			
		||||
 | 
			
		||||
=item $stack->p_rx_flow_control_admin()
 | 
			
		||||
 | 
			
		||||
Can be either C<on> C<off> or C<desired>
 | 
			
		||||
 | 
			
		||||
"Indicates the receive flow control administrative status set on the port. If
 | 
			
		||||
the status is set to on(1), the port will require the far end to send flow
 | 
			
		||||
control. If the status is set to off(2), the port will not allow far end to
 | 
			
		||||
send flow control.  If the status is set to desired(3), the port will allow
 | 
			
		||||
the far end to send the flow control."
 | 
			
		||||
 | 
			
		||||
C<portAdminRxFlowControl>
 | 
			
		||||
 | 
			
		||||
=item $stack->p_tx_flow_control_admin()
 | 
			
		||||
 | 
			
		||||
Can be either C<on> C<off> or C<desired>
 | 
			
		||||
 | 
			
		||||
"Indicates the transmit flow control administrative status set on the port.
 | 
			
		||||
If the status is set to on(1), the port will send flow control to the far end.  If
 | 
			
		||||
the status is set to off(2), the port will not send flow control to the far
 | 
			
		||||
end. If the status is set to desired(3), the port will send flow control to
 | 
			
		||||
the far end if the far end supports it."
 | 
			
		||||
 | 
			
		||||
C<portAdminTxFlowControl>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Port Capability Table (C<CISCO-STACK-MIB::portCpbTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $stack->p_speed_admin()
 | 
			
		||||
 | 
			
		||||
(C<portCpbSpeed>)
 | 
			
		||||
 | 
			
		||||
=item $stack->p_duplex_admin()
 | 
			
		||||
 | 
			
		||||
(C<portCpbDuplex>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $stack->munge_port_status()
 | 
			
		||||
 | 
			
		||||
Munges binary byte describing each port into ascii, and returns an ascii
 | 
			
		||||
list separated by spaces.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										559
									
								
								lib/SNMP/Info/CiscoStats.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										559
									
								
								lib/SNMP/Info/CiscoStats.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,559 @@
 | 
			
		||||
# SNMP::Info::CiscoStats
 | 
			
		||||
#
 | 
			
		||||
# Changes since Version 0.7 Copyright (c) 2008-2009 Max Baker and SNMP::Info Developers
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CiscoStats;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoStats::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoStats::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'SNMPv2-MIB'            => 'sysDescr',
 | 
			
		||||
    'CISCO-PROCESS-MIB'     => 'cpmCPUTotal5sec',
 | 
			
		||||
    'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed',
 | 
			
		||||
    'OLD-CISCO-SYSTEM-MIB'  => 'writeMem',
 | 
			
		||||
    'CISCO-PRODUCTS-MIB'    => 'ciscoIGS',
 | 
			
		||||
    'ENTITY-MIB'            => 'entPhysicalSoftwareRev',
 | 
			
		||||
    'CISCO-IMAGE-MIB'       => 'ciscoImageString',
 | 
			
		||||
 | 
			
		||||
    # some older catalysts live here
 | 
			
		||||
    'CISCO-STACK-MIB'                 => 'wsc1900sysID',
 | 
			
		||||
    'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevChassis',
 | 
			
		||||
    'CISCO-FLASH-MIB'                 => 'ciscoFlashDeviceSize',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    'description' => 'sysDescr',
 | 
			
		||||
    'ent_physical_software_rev' => 'entPhysicalSoftwareRev.1',
 | 
			
		||||
 | 
			
		||||
    # We will use the numeric OID's so that we don't require people
 | 
			
		||||
    # to install v1 MIBs, which can conflict.
 | 
			
		||||
    # OLD-CISCO-CPU-MIB:avgBusyPer
 | 
			
		||||
    'ios_cpu'      => '1.3.6.1.4.1.9.2.1.56.0',
 | 
			
		||||
    'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
 | 
			
		||||
    'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
 | 
			
		||||
 | 
			
		||||
    # CISCO-PROCESS-MIB
 | 
			
		||||
    'cat_cpu'      => 'cpmCPUTotal5sec.9',
 | 
			
		||||
    'cat_cpu_1min' => 'cpmCPUTotal1min.9',
 | 
			
		||||
    'cat_cpu_5min' => 'cpmCPUTotal5min.9',
 | 
			
		||||
 | 
			
		||||
    # OLD-CISCO-SYSTEM-MIB
 | 
			
		||||
    'write_mem' => 'writeMem',
 | 
			
		||||
    'rom_id'    => 'romId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolTable
 | 
			
		||||
    'cisco_mem_free' => 'ciscoMemoryPoolFree',
 | 
			
		||||
    'cisco_mem_used' => 'ciscoMemoryPoolUsed',
 | 
			
		||||
 | 
			
		||||
    # CISCO-FLASH-MIB::ciscoFlashDeviceTable
 | 
			
		||||
    'cisco_flash_size' => 'ciscoFlashDeviceSize',
 | 
			
		||||
 | 
			
		||||
    # CISCO-IMAGE-MIB
 | 
			
		||||
    'ci_images' => 'ciscoImageString',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $l2 = shift;
 | 
			
		||||
    my $descr = $l2->description() || '';
 | 
			
		||||
 | 
			
		||||
    # 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/ );
 | 
			
		||||
    return 'catalyst' if ( $descr =~ /catalyst/i );
 | 
			
		||||
    return 'css'      if ( $descr =~ /Content Switch SW/ );
 | 
			
		||||
    return 'css-sca'  if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
 | 
			
		||||
    return 'pix'      if ( $descr =~ /Cisco PIX Security Appliance/ );
 | 
			
		||||
    return 'asa'      if ( $descr =~ /Cisco Adaptive Security Appliance/ );
 | 
			
		||||
    return 'san-os'   if ( $descr =~ /Cisco SAN-OS/ );
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ /Application Control Engine Service Module/ ) {
 | 
			
		||||
        # Only the admin context implements the entity MIB
 | 
			
		||||
        return 'ace-admin' if defined $l2->ent_physical_software_rev();
 | 
			
		||||
        return 'ace-context';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Pre-version 3 FWSMs
 | 
			
		||||
    return 'fwsm'     if ( $descr =~ /Cisco Secure FWSM Firewall/ );
 | 
			
		||||
 | 
			
		||||
    # Version 3+ FWSMs (currently untested against version 4)
 | 
			
		||||
    if ( $descr =~ /Firewall Services Module/ ) {
 | 
			
		||||
 | 
			
		||||
        my $model = $l2->model();
 | 
			
		||||
 | 
			
		||||
        if ( defined $model && $model eq "WsSvcFwm1sc" ) {
 | 
			
		||||
            # Only the admin context implements the entity MIB
 | 
			
		||||
            return 'fwsm-admin' if defined $l2->ent_physical_software_rev();
 | 
			
		||||
            return 'fwsm-context';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Non context mode FWSM
 | 
			
		||||
        return 'fwsm';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $l2    = shift;
 | 
			
		||||
    my $os    = $l2->os();
 | 
			
		||||
    my $descr = $l2->description();
 | 
			
		||||
 | 
			
		||||
    # Older Catalysts
 | 
			
		||||
    if (    defined $os
 | 
			
		||||
        and $os eq 'catalyst'
 | 
			
		||||
        and defined $descr
 | 
			
		||||
        and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/ )
 | 
			
		||||
    {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( defined $os
 | 
			
		||||
        and $os eq 'css'
 | 
			
		||||
        and defined $descr
 | 
			
		||||
        and $descr =~ m/Content Switch SW Version ([0-9\.\(\)]+) with SNMPv1\/v2c Agent/ )
 | 
			
		||||
    {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( defined $os
 | 
			
		||||
        and $os eq 'css-sca'
 | 
			
		||||
        and defined $descr
 | 
			
		||||
        and $descr =~ m/Cisco Systems Inc CSS-SCA-2FE-K9, ([0-9\.\(\)]+) Release / )
 | 
			
		||||
    {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( defined $os
 | 
			
		||||
        and $os eq 'pix'
 | 
			
		||||
        and defined $descr
 | 
			
		||||
        and $descr =~ m/Cisco PIX Security Appliance Version ([0-9\.\(\)]+)/ )
 | 
			
		||||
    {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( defined $os
 | 
			
		||||
        and $os eq 'asa'
 | 
			
		||||
        and defined $descr
 | 
			
		||||
        and $descr =~ m/Cisco Adaptive Security Appliance Version ([0-9\.\(\)]+)/ )
 | 
			
		||||
    {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( defined $os
 | 
			
		||||
        and $os =~ /^ace/ )
 | 
			
		||||
    {
 | 
			
		||||
        return $l2->ent_physical_software_rev();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( defined $os
 | 
			
		||||
        and $os =~ /^fwsm/
 | 
			
		||||
        and defined $descr
 | 
			
		||||
        and $descr =~ m/Version (\d+\.\d+(\(\d+\)){0,1})/ )
 | 
			
		||||
    {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( defined $os
 | 
			
		||||
        and $os eq 'ios-xr'
 | 
			
		||||
        and defined $descr
 | 
			
		||||
        and $descr =~ m/Version (\d+[\.\d]+)/ )
 | 
			
		||||
    {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Newer Catalysts and IOS devices
 | 
			
		||||
    if ( defined $descr
 | 
			
		||||
        and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ )
 | 
			
		||||
    {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Generic fallback: try to determine running image from CISCO-IMAGE-MIB
 | 
			
		||||
    my $image_info = $l2->ciscoImageString() || {};
 | 
			
		||||
    foreach my $row (keys %$image_info) {
 | 
			
		||||
        my $info_string = $image_info->{$row};
 | 
			
		||||
        if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
 | 
			
		||||
            return $1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_bin {
 | 
			
		||||
    my $self   = shift;
 | 
			
		||||
    my $rom_id = $self->rom_id();
 | 
			
		||||
    if ($rom_id =~ m/Version ([^,]+),/)  {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cpu {
 | 
			
		||||
    my $self    = shift;
 | 
			
		||||
    my $ios_cpu = $self->ios_cpu();
 | 
			
		||||
    return $ios_cpu if defined $ios_cpu;
 | 
			
		||||
    my $cat_cpu = $self->cat_cpu();
 | 
			
		||||
    return $cat_cpu;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cpu_1min {
 | 
			
		||||
    my $self         = shift;
 | 
			
		||||
    my $ios_cpu_1min = $self->ios_cpu_1min();
 | 
			
		||||
    return $ios_cpu_1min if defined $ios_cpu_1min;
 | 
			
		||||
    my $cat_cpu_1min = $self->cat_cpu_1min();
 | 
			
		||||
    return $cat_cpu_1min;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cpu_5min {
 | 
			
		||||
    my $self         = shift;
 | 
			
		||||
    my $ios_cpu_5min = $self->ios_cpu_5min();
 | 
			
		||||
    return $ios_cpu_5min if defined $ios_cpu_5min;
 | 
			
		||||
    my $cat_cpu_5min = $self->cat_cpu_5min();
 | 
			
		||||
    return $cat_cpu_5min;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mem_free {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $mem_free;
 | 
			
		||||
 | 
			
		||||
    my $cisco_mem_free = $self->cisco_mem_free() || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $mem_free_val ( values %$cisco_mem_free ) {
 | 
			
		||||
        $mem_free += $mem_free_val;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $mem_free;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mem_used {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $mem_used;
 | 
			
		||||
 | 
			
		||||
    my $cisco_mem_used = $self->cisco_mem_used() || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $mem_used_val ( values %$cisco_mem_used ) {
 | 
			
		||||
        $mem_used += $mem_used_val;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $mem_used;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mem_total {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $mem_total;
 | 
			
		||||
 | 
			
		||||
    my $cisco_mem_free = $self->cisco_mem_free() || {};
 | 
			
		||||
    my $cisco_mem_used = $self->cisco_mem_used() || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $mem_entry ( keys %$cisco_mem_free ) {
 | 
			
		||||
        my $mem_free = $cisco_mem_free->{$mem_entry} || 0;
 | 
			
		||||
        my $mem_used = $cisco_mem_used->{$mem_entry} || 0;
 | 
			
		||||
        $mem_total += ( $mem_free + $mem_used );
 | 
			
		||||
    }
 | 
			
		||||
    return $mem_total;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub flashmem_total {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
 | 
			
		||||
    my $flashmem_total;
 | 
			
		||||
 | 
			
		||||
    my $flash_sizes = $self->cisco_flash_size;
 | 
			
		||||
 | 
			
		||||
    foreach my $flash_index ( keys %$flash_sizes ) {
 | 
			
		||||
        $flashmem_total += $flash_sizes->{$flash_index};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $flashmem_total;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco
 | 
			
		||||
Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller, Max Baker, Sam Stickland
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $ciscostats = new SNMP::Info(
 | 
			
		||||
                    AutoSpecify => 1,
 | 
			
		||||
                    Debug       => 1,
 | 
			
		||||
                    # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                    DestHost    => 'myswitch',
 | 
			
		||||
                    Community   => 'public',
 | 
			
		||||
                    Version     => 2
 | 
			
		||||
                    )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $ciscostats->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory,
 | 
			
		||||
os and version information about Cisco Devices.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-PRODUCTS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-PROCESS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-MEMORY-POOL-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<SNMPv2-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<OLD-CISCO-SYSTEM-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-STACK-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-FLASH-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<ENTITY-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-IMAGE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cpu()
 | 
			
		||||
 | 
			
		||||
Returns ios_cpu() or cat_cpu(), whichever is available.
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cpu_1min()
 | 
			
		||||
 | 
			
		||||
Returns ios_cpu_1min() or cat_cpu1min(), whichever is available.
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cpu_5min()
 | 
			
		||||
 | 
			
		||||
Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->mem_total()
 | 
			
		||||
 | 
			
		||||
Returns mem_free() + mem_used()
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->vendor()
 | 
			
		||||
 | 
			
		||||
 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os()
 | 
			
		||||
 | 
			
		||||
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
 | 
			
		||||
from description()
 | 
			
		||||
 | 
			
		||||
Available values:
 | 
			
		||||
 | 
			
		||||
 'ios'          for Cisco IOS
 | 
			
		||||
 'ios-xe'       for Cisco IOS XE
 | 
			
		||||
 'ios-xr'       for Cisco IOS XR
 | 
			
		||||
 'pix'          for Cisco PIX
 | 
			
		||||
 'asa'          for Cisco ASA
 | 
			
		||||
 'fwsm'         for Single-mode FWSM
 | 
			
		||||
 'fwsm-admin'   for Admin context of multi-context FWSM
 | 
			
		||||
 'fwsm-context' for Standard context of multi-context FWSM
 | 
			
		||||
 'ace-admin'    for Admin context of ACE module
 | 
			
		||||
 'ace-context'  for Standard context of ACE module (NB: No OS version
 | 
			
		||||
                     detection is available, but will be the same as it's
 | 
			
		||||
                     'ace admin')
 | 
			
		||||
 'css'          for Cisco Content Switch
 | 
			
		||||
 'css-sca'      for Cisco Content Switch Secure Content Acceleration
 | 
			
		||||
 'san-os'       for Cisco SAN-OS
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os_ver()
 | 
			
		||||
 | 
			
		||||
Tries to parse device operating system version from description(), falls back
 | 
			
		||||
to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os_bin()
 | 
			
		||||
 | 
			
		||||
Tries to parse C<ROMMON> version from rom_id() string
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->ios_cpu()
 | 
			
		||||
 | 
			
		||||
Current CPU usage in percent.
 | 
			
		||||
 | 
			
		||||
C<1.3.6.1.4.1.9.2.1.56.0> =
 | 
			
		||||
C<OLD-CISCO-CPU-MIB:avgBusyPer>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->ios_cpu_1min()
 | 
			
		||||
 | 
			
		||||
Average CPU Usage in percent over the last minute.
 | 
			
		||||
 | 
			
		||||
C<1.3.6.1.4.1.9.2.1.57.0>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->ios_cpu_5min()
 | 
			
		||||
 | 
			
		||||
Average CPU Usage in percent over the last 5 minutes.
 | 
			
		||||
 | 
			
		||||
C<1.3.6.1.4.1.9.2.1.58.0>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cat_cpu()
 | 
			
		||||
 | 
			
		||||
Current CPU usage in percent.
 | 
			
		||||
 | 
			
		||||
C<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cat_cpu_1min()
 | 
			
		||||
 | 
			
		||||
Average CPU Usage in percent over the last minute.
 | 
			
		||||
 | 
			
		||||
C<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cat_cpu_5min()
 | 
			
		||||
 | 
			
		||||
Average CPU Usage in percent over the last 5 minutes.
 | 
			
		||||
 | 
			
		||||
C<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->mem_free()
 | 
			
		||||
 | 
			
		||||
Main DRAM free of the device in bytes.
 | 
			
		||||
 | 
			
		||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->mem_used()
 | 
			
		||||
 | 
			
		||||
Main DRAM used of the device in bytes.
 | 
			
		||||
 | 
			
		||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->mem_total()
 | 
			
		||||
 | 
			
		||||
Main DRAM of the device in bytes.
 | 
			
		||||
 | 
			
		||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree> +
 | 
			
		||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->flashmem_total()
 | 
			
		||||
 | 
			
		||||
Flash memory of the device in bytes.
 | 
			
		||||
 | 
			
		||||
C<CISCO-FLASH-MIB::ciscoFlashDeviceSize>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Cisco Memory Pool Table (C<ciscoMemoryPoolTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cisco_mem_free()
 | 
			
		||||
 | 
			
		||||
The number of bytes from the memory pool that are currently unused on the
 | 
			
		||||
managed device.
 | 
			
		||||
 | 
			
		||||
(C<ciscoMemoryPoolFree>)
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cisco_mem_used()
 | 
			
		||||
 | 
			
		||||
The number of bytes from the memory pool that are currently in use by
 | 
			
		||||
applications on the managed device.
 | 
			
		||||
 | 
			
		||||
(C<ciscoMemoryPoolUsed>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Cisco Flash Device Table (C<ciscoFlashDeviceTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cisco_flash_size()
 | 
			
		||||
 | 
			
		||||
Total size of the Flash device.  For a removable device, the size will be
 | 
			
		||||
zero if the device has been removed.
 | 
			
		||||
 | 
			
		||||
(C<ciscoFlashDeviceSize>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Cisco Image Table (C<ciscoImageTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ci->ci_images()
 | 
			
		||||
 | 
			
		||||
Returns the table of image strings.
 | 
			
		||||
 | 
			
		||||
C<ciscoImageString>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										414
									
								
								lib/SNMP/Info/CiscoStpExtensions.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										414
									
								
								lib/SNMP/Info/CiscoStpExtensions.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,414 @@
 | 
			
		||||
# SNMP::Info::CiscoStpExtensions
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c)2009 Carlos Vicente
 | 
			
		||||
# 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 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
 | 
			
		||||
# 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::CiscoStpExtensions;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, $DEBUG, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PORTSTAT, $INIT);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
            'CISCO-STP-EXTENSIONS-MIB' => 'stpxSpanningTreeType',
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
            'stpx_mst_config_digest' => 'stpxSMSTConfigDigest',
 | 
			
		||||
            'stpx_mst_region_name'   => 'stpxMSTRegionName',
 | 
			
		||||
            'stpx_mst_region_rev'    => 'stpxSMSTRegionRevision',
 | 
			
		||||
            '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',
 | 
			
		||||
            'stpx_smst_vlans_mapped_1k2k' => 'stpxSMSTInstanceVlansMapped1k2k',
 | 
			
		||||
            'stpx_smst_vlans_mapped_3k4k' => 'stpxSMSTInstanceVlansMapped3k4k',
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (
 | 
			
		||||
            %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
           'stpx_mst_config_digest'      => \&SNMP::Info::CiscoStpExtensions::oct2str,
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Report version of STP via standard method
 | 
			
		||||
sub stp_ver {
 | 
			
		||||
     my $self = shift;
 | 
			
		||||
     my $stp_ver = $self->SUPER::stp_ver();
 | 
			
		||||
     if ( !defined($stp_ver) || $stp_ver eq 'unknown' ){
 | 
			
		||||
         if ( defined $self->stpx_stp_type() ){
 | 
			
		||||
             $stp_ver = $self->stpx_stp_type();
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
     return $stp_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mst_config_digest {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    return $self->stpx_mst_config_digest;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mst_region_name {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    return $self->stpx_mst_region_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mst_region_rev {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    return $self->stpx_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;
 | 
			
		||||
    foreach my $iid ( keys %$vlan_membership ){
 | 
			
		||||
        if ( my $vm = $vlan_membership->{$iid} ){
 | 
			
		||||
            foreach my $vid ( @$vm ){
 | 
			
		||||
                push @vlans, $vid;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    my %res;
 | 
			
		||||
    foreach my $vlan ( @vlans ){
 | 
			
		||||
        if ( $vlan < 2048 ){
 | 
			
		||||
            foreach my $inst ( keys %$m1k2k ){
 | 
			
		||||
                my $list = $m1k2k->{$inst};
 | 
			
		||||
                my $vlanlist = [split(//, unpack("B*", $list))];
 | 
			
		||||
                if ( @$vlanlist[$vlan] ){
 | 
			
		||||
                    $res{$vlan} = $inst;
 | 
			
		||||
                    last;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }else{
 | 
			
		||||
            foreach my $inst ( keys %$m3k4k ){
 | 
			
		||||
                my $list = $m3k4k->{$inst};
 | 
			
		||||
                my $vlanlist = [split(//, unpack("B*", $list))];
 | 
			
		||||
                if ( @$vlanlist[$vlan-2048] ){
 | 
			
		||||
                    $res{$vlan} = $inst;
 | 
			
		||||
                    last;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_rootguard_enabled {
 | 
			
		||||
    my $self    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rg_enabled = $self->stpx_rootguard_enabled();
 | 
			
		||||
    my $bp_index   = $self->bp_index($partial);
 | 
			
		||||
 | 
			
		||||
    my %res;
 | 
			
		||||
    foreach my $index ( keys %$rg_enabled ){
 | 
			
		||||
        my $enabled = $rg_enabled->{$index};
 | 
			
		||||
        my $iid     = $bp_index->{$index};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        next unless defined $enabled;
 | 
			
		||||
        $res{$iid} = $enabled;
 | 
			
		||||
    }
 | 
			
		||||
    return \%res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_loopguard_enabled {
 | 
			
		||||
    my $self    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lg_enabled = $self->stpx_loopguard_enabled();
 | 
			
		||||
    my $bp_index   = $self->bp_index($partial);
 | 
			
		||||
 | 
			
		||||
    my %res;
 | 
			
		||||
    foreach my $index ( keys %$lg_enabled ){
 | 
			
		||||
        my $enabled = $lg_enabled->{$index};
 | 
			
		||||
        my $iid     = $bp_index->{$index};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        next unless defined $enabled;
 | 
			
		||||
        $res{$iid} = $enabled;
 | 
			
		||||
    }
 | 
			
		||||
    return \%res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_bpduguard_enabled {
 | 
			
		||||
    my $self    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    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};
 | 
			
		||||
        my $iid  = $bp_index->{$index};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        next unless defined $mode;
 | 
			
		||||
        if ( $mode eq 'default' ){
 | 
			
		||||
            $res{$iid} =  $bpdugm_default;
 | 
			
		||||
        }else{
 | 
			
		||||
            $res{$iid} = $mode;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_bpdufilter_enabled {
 | 
			
		||||
    my $self    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    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};
 | 
			
		||||
        my $iid  = $bp_index->{$index};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        next unless defined $mode;
 | 
			
		||||
        if ( $mode eq 'default' ){
 | 
			
		||||
            $res{$iid} =  $bpdufm_default;
 | 
			
		||||
        }else{
 | 
			
		||||
            $res{$iid} = $mode;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    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) = @_;
 | 
			
		||||
    return sprintf('%s', unpack('H*', $v));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoStpExtensions - SNMP Interface to C<CISCO-STP-EXTENSIONS-MIB>
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
 my $stpx = new SNMP::Info::CiscoStpExtensions(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-STP-EXTENSIONS-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $stpx->stp_ver()
 | 
			
		||||
 | 
			
		||||
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>
 | 
			
		||||
 | 
			
		||||
(C<stpxSpanningTreeType>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $stpx->mst_config_digest()
 | 
			
		||||
 | 
			
		||||
Returns the Multiple Spanning Tree (MST) configuration digest
 | 
			
		||||
 | 
			
		||||
(C<stpxSMSTConfigDigest>)
 | 
			
		||||
 | 
			
		||||
=item $stpx->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
 | 
			
		||||
 | 
			
		||||
(C<stpxSMSTRegionRevision>)
 | 
			
		||||
 | 
			
		||||
=item $stpx->mst_vlan2instance()
 | 
			
		||||
 | 
			
		||||
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()
 | 
			
		||||
 | 
			
		||||
Returns 1 or 0 depending on whether C<RootGuard> is enabled on a given port.
 | 
			
		||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
 | 
			
		||||
 | 
			
		||||
(C<stpxRootGuardConfigEnabled>)
 | 
			
		||||
 | 
			
		||||
=item $stpx->i_loopguard_enabled()
 | 
			
		||||
 | 
			
		||||
Returns 1 or 0 depending on whether C<LoopGuard> is enabled on a given port.
 | 
			
		||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
 | 
			
		||||
 | 
			
		||||
(C<stpxLoopGuardConfigEnabled>)
 | 
			
		||||
 | 
			
		||||
=item $stpx->i_bpduguard_enabled()
 | 
			
		||||
 | 
			
		||||
Returns 1 or 0 depending on whether C<BpduGuard> is enabled on a given port.
 | 
			
		||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
 | 
			
		||||
 | 
			
		||||
(C<stpxFastStartPortBpduGuardMode>)
 | 
			
		||||
 | 
			
		||||
=item $stpx->i_bpdufilter_enabled()
 | 
			
		||||
 | 
			
		||||
Returns 1 or 0 depending on whether C<BpduFilter> is enabled on a given port.
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item oct2str()
 | 
			
		||||
 | 
			
		||||
Unpacks H* into a string
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										938
									
								
								lib/SNMP/Info/CiscoVTP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										938
									
								
								lib/SNMP/Info/CiscoVTP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,938 @@
 | 
			
		||||
# SNMP::Info::CiscoVTP
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CiscoVTP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoVTP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoVTP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'CISCO-VTP-MIB'                       => 'vtpVlanName',
 | 
			
		||||
    'CISCO-VLAN-MEMBERSHIP-MIB'           => 'vmMembershipEntry',
 | 
			
		||||
    'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    'vtp_version'          => 'vtpVersion',
 | 
			
		||||
    'vtp_maxstore'         => 'vtpMaxVlanStorage',
 | 
			
		||||
    'vtp_notify'           => 'vtpNotificationsEnabled',
 | 
			
		||||
    'vtp_notify_create'    => 'vtpVlanCreatedNotifEnabled',
 | 
			
		||||
    'vtp_notify_delete'    => 'vtpVlanDeletedNotifEnabled',
 | 
			
		||||
    'vtp_trunk_set_serial' => 'vlanTrunkPortSetSerialNo',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # CISCO-VTP-MIB::managementDomainTable
 | 
			
		||||
    'vtp_d_name'      => 'managementDomainName',
 | 
			
		||||
    'vtp_d_mode'      => 'managementDomainLocalMode',
 | 
			
		||||
    'vtp_d_rev'       => 'managementDomainConfigRevNumber',
 | 
			
		||||
    'vtp_d_updater'   => 'managementDomainLastUpdater',
 | 
			
		||||
    'vtp_d_last'      => 'managementDomainLastChange',
 | 
			
		||||
    'vtp_d_status'    => 'managementDomainRowStatus',
 | 
			
		||||
    'vtp_d_tftp'      => 'managementDomainTftpServer',
 | 
			
		||||
    'vtp_d_tftp_path' => 'managementDomainTftpPathname',
 | 
			
		||||
    'vtp_d_pruning'   => 'managementDomainPruningState',
 | 
			
		||||
    'vtp_d_ver'       => 'managementDomainVersionInUse',
 | 
			
		||||
 | 
			
		||||
    # CISCO-VTP-MIB::vtpVlanTable
 | 
			
		||||
    'v_state'    => 'vtpVlanState',
 | 
			
		||||
    'v_type'     => 'vtpVlanType',
 | 
			
		||||
    'v_name'     => 'vtpVlanName',
 | 
			
		||||
    'v_mtu'      => 'vtpVlanMtu',
 | 
			
		||||
    'v_said'     => 'vtpVlanDot10Said',
 | 
			
		||||
    'v_ring'     => 'vtpVlanRingNumber',
 | 
			
		||||
    'v_bridge'   => 'vtpVlanBridgeNumber',
 | 
			
		||||
    'v_stp'      => 'vtpVlanStpType',
 | 
			
		||||
    'v_parent'   => 'vtpVlanParentVlan',
 | 
			
		||||
    'v_trans1'   => 'vtpVlanTranslationalVlan1',
 | 
			
		||||
    'v_trans2'   => 'vtpVlanTranslationalVlan2',
 | 
			
		||||
    'v_btype'    => 'vtpVlanBridgeType',
 | 
			
		||||
    'v_hop_are'  => 'vtpVlanAreHopCount',
 | 
			
		||||
    'v_hop_ste'  => 'vtpVlanSteHopCount',
 | 
			
		||||
    'v_crf'      => 'vtpVlanIsCRFBackup',
 | 
			
		||||
    'v_type_ext' => 'vtpVlanTypeExt',
 | 
			
		||||
    'v_if'       => 'vtpVlanIfIndex',
 | 
			
		||||
 | 
			
		||||
    # CISCO-VLAN-MEMBERSHIP-MIB::vmMembershipTable
 | 
			
		||||
    'i_vlan_type' => 'vmVlanType',
 | 
			
		||||
    'i_vlan2'     => 'vmVlan',
 | 
			
		||||
    'i_vlan_stat' => 'vmPortStatus',
 | 
			
		||||
    'i_vlan_1'    => 'vmVlans',
 | 
			
		||||
    'i_vlan_2'    => 'vmVlans2k',
 | 
			
		||||
    'i_vlan_3'    => 'vmVlans3k',
 | 
			
		||||
    'i_vlan_4'    => 'vmVlans4k',
 | 
			
		||||
 | 
			
		||||
    # CISCO-VLAN-MEMBERSHIP-MIB::vmVoiceVlanTable
 | 
			
		||||
    'i_voice_vlan' => 'vmVoiceVlanId',
 | 
			
		||||
 | 
			
		||||
    # CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB
 | 
			
		||||
    'v_cvi_if' => 'cviRoutedVlanIfIndex',
 | 
			
		||||
 | 
			
		||||
    # CISCO-VTP-MIB::vlanTrunkPortTable
 | 
			
		||||
    'vtp_trunk_mgmt_dom' => 'vlanTrunkPortManagementDomain',
 | 
			
		||||
    'vtp_trunk_encaps_t' => 'vlanTrunkPortEncapsulationType',
 | 
			
		||||
    'vtp_trunk_vlans'    => 'vlanTrunkPortVlansEnabled',
 | 
			
		||||
    'vtp_trunk_vlans_2k' => 'vlanTrunkPortVlansEnabled2k',
 | 
			
		||||
    'vtp_trunk_vlans_3k' => 'vlanTrunkPortVlansEnabled3k',
 | 
			
		||||
    'vtp_trunk_vlans_4k' => 'vlanTrunkPortVlansEnabled4k',
 | 
			
		||||
    'vtp_trunk_native'   => 'vlanTrunkPortNativeVlan',
 | 
			
		||||
    'i_pvid'             => 'vlanTrunkPortNativeVlan',
 | 
			
		||||
    'vtp_trunk_rstat'    => 'vlanTrunkPortRowStatus',
 | 
			
		||||
    'vtp_trunk_dyn'      => 'vlanTrunkPortDynamicState',
 | 
			
		||||
    'vtp_trunk_dyn_stat' => 'vlanTrunkPortDynamicStatus',
 | 
			
		||||
    'vtp_trunk_vtp'      => 'vlanTrunkPortVtpEnabled',
 | 
			
		||||
    'vtp_trunk_encaps'   => 'vlanTrunkPortEncapsulationOperType',
 | 
			
		||||
 | 
			
		||||
    # TODO Add these tables if someone wants them..
 | 
			
		||||
    # vtpEditControlTable
 | 
			
		||||
    # vtpVlanEditTable
 | 
			
		||||
    # vtpStatsTable
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
sub v_index {
 | 
			
		||||
    my $vtp     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $v_name = $vtp->v_name($partial);
 | 
			
		||||
    my %v_index;
 | 
			
		||||
    foreach my $idx ( keys %$v_name ) {
 | 
			
		||||
        my ( $mgmtdomain, $vlan ) = split( /\./, $idx );
 | 
			
		||||
        $v_index{$idx} = $vlan;
 | 
			
		||||
    }
 | 
			
		||||
    return \%v_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $vtp     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_vlan      = $vtp->vtp_trunk_native($partial)   || {};
 | 
			
		||||
    my $i_vlan         = $vtp->i_vlan2($partial)            || {};
 | 
			
		||||
    my $trunk_dyn      = $vtp->vtp_trunk_dyn($partial)      || {};
 | 
			
		||||
    my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_vlans;
 | 
			
		||||
 | 
			
		||||
    # Get access ports
 | 
			
		||||
    foreach my $port ( keys %$i_vlan ) {
 | 
			
		||||
        my $vlan = $i_vlan->{$port};
 | 
			
		||||
        next unless defined $vlan;
 | 
			
		||||
 | 
			
		||||
        $i_vlans{$port} = $vlan;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Get trunk ports
 | 
			
		||||
    foreach my $port ( keys %$port_vlan ) {
 | 
			
		||||
        my $vlan = $port_vlan->{$port};
 | 
			
		||||
        next unless defined $vlan;
 | 
			
		||||
 | 
			
		||||
        # ports up and trunking should have a trunking status
 | 
			
		||||
        my $stat = $trunk_dyn_stat->{$port};
 | 
			
		||||
 | 
			
		||||
        # vtp_trunk_dyn_stat is not useful for down ports
 | 
			
		||||
        # so we use vtp_trunk_dyn to see if trunking is set
 | 
			
		||||
        my $dyn = $trunk_dyn->{$port};
 | 
			
		||||
 | 
			
		||||
        if (($stat and $stat =~ /^trunking/ )
 | 
			
		||||
            or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))))
 | 
			
		||||
        {
 | 
			
		||||
            $i_vlans{$port} = $vlan;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Check in CISCO-VLAN-IFTABLE-RELATION-MIB
 | 
			
		||||
    # Used for traditional Cisco Routers and Aironet
 | 
			
		||||
 | 
			
		||||
    my $v_cvi_if = $vtp->v_cvi_if();
 | 
			
		||||
    if ( defined $v_cvi_if ) {
 | 
			
		||||
 | 
			
		||||
        # Translate vlan.physical_interface -> iid
 | 
			
		||||
        #       to iid -> vlan
 | 
			
		||||
        foreach my $i ( keys %$v_cvi_if ) {
 | 
			
		||||
            my ( $vlan, $phys ) = split( /\./, $i );
 | 
			
		||||
            my $iid = $v_cvi_if->{$i};
 | 
			
		||||
 | 
			
		||||
            $i_vlans{$iid} = $vlan;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_vlans;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_untagged {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $ifindex ) = @_;
 | 
			
		||||
 | 
			
		||||
    # cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
 | 
			
		||||
    # so we use vtp_trunk_dyn as a hint to use i_pvid
 | 
			
		||||
 | 
			
		||||
    my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
 | 
			
		||||
    if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
 | 
			
		||||
        return $vtp->i_pvid(@_);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return $vtp->i_vlan(@_);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $vtp     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $ports_vlans    = $vtp->vtp_trunk_vlans($partial)    || {};
 | 
			
		||||
    my $ports_vlans_2k = $vtp->vtp_trunk_vlans_2k($partial) || {};
 | 
			
		||||
    my $ports_vlans_3k = $vtp->vtp_trunk_vlans_3k($partial) || {};
 | 
			
		||||
    my $ports_vlans_4k = $vtp->vtp_trunk_vlans_4k($partial) || {};
 | 
			
		||||
    my $vtp_vlans      = $vtp->v_state();
 | 
			
		||||
    my $i_vlan         = $vtp->i_vlan2($partial)            || {};
 | 
			
		||||
    my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
 | 
			
		||||
    my $trunk_dyn      = $vtp->vtp_trunk_dyn($partial)      || {};
 | 
			
		||||
    my $i_voice_vlan   = $vtp->i_voice_vlan($partial)       || {};
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
 | 
			
		||||
    # Get access ports
 | 
			
		||||
    foreach my $port ( keys %$i_vlan ) {
 | 
			
		||||
        my $vlan = $i_vlan->{$port};
 | 
			
		||||
        next unless defined $vlan;
 | 
			
		||||
        my $dyn = $trunk_dyn->{$port};
 | 
			
		||||
        unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
 | 
			
		||||
            push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Get voice VLANs
 | 
			
		||||
    foreach my $port ( keys %$i_voice_vlan ) {
 | 
			
		||||
        my $vlan = $i_voice_vlan->{$port};
 | 
			
		||||
        next unless defined $vlan;
 | 
			
		||||
        next unless ($vlan =~ m/[[:digit:]]+/ and $vlan < 4095);
 | 
			
		||||
        my $dyn = $trunk_dyn->{$port};
 | 
			
		||||
        unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
 | 
			
		||||
            push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Get trunk ports
 | 
			
		||||
    my %oper_vlans;
 | 
			
		||||
    foreach my $iid ( keys %$vtp_vlans ) {
 | 
			
		||||
        my $vlan    = 0;
 | 
			
		||||
        my $vtp_dom = 0;
 | 
			
		||||
        my $state   = $vtp_vlans->{$iid};
 | 
			
		||||
        next unless defined $state;
 | 
			
		||||
        next if $state !~ /operational/;
 | 
			
		||||
        if ( $iid =~ /(\d+)\.(\d+)/ ) {
 | 
			
		||||
            $vtp_dom = $1;
 | 
			
		||||
            $vlan    = $2;
 | 
			
		||||
        }
 | 
			
		||||
        $oper_vlans{$vlan}++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $port ( keys %$ports_vlans ) {
 | 
			
		||||
        my $stat = $trunk_dyn_stat->{$port};
 | 
			
		||||
        my $dyn = $trunk_dyn->{$port};
 | 
			
		||||
        if (($stat and $stat =~ /^trunking/ )
 | 
			
		||||
            or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate')))) {
 | 
			
		||||
            my $k     = 0;
 | 
			
		||||
            my $list1 = $ports_vlans->{$port} || '0';
 | 
			
		||||
            my $list2 = $ports_vlans_2k->{$port} || '0';
 | 
			
		||||
            my $list3 = $ports_vlans_3k->{$port} || '0';
 | 
			
		||||
            my $list4 = $ports_vlans_4k->{$port} || '0';
 | 
			
		||||
            foreach my $list ( "$list1", "$list2", "$list3", "$list4" ) {
 | 
			
		||||
                my $offset = 1024 * $k++;
 | 
			
		||||
                next unless $list;
 | 
			
		||||
                my $vlanlist = [ split( //, unpack( "B*", $list ) ) ];
 | 
			
		||||
                foreach my $vlan ( keys %oper_vlans ) {
 | 
			
		||||
                    next if (($vlan < $offset) or ($vlan - $offset > 1024));
 | 
			
		||||
                    push( @{ $i_vlan_membership->{$port} }, $vlan )
 | 
			
		||||
                        if ( @$vlanlist[ $vlan - $offset ] );
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership_untagged {
 | 
			
		||||
    my $vtp  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $vlans = $vtp->i_vlan($partial);
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    foreach my $port (keys %$vlans) {
 | 
			
		||||
        my $vlan = $vlans->{$port};
 | 
			
		||||
        push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_pvid {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $vlan_id, $ifindex ) = @_;
 | 
			
		||||
 | 
			
		||||
    return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
 | 
			
		||||
 | 
			
		||||
    my $native_vlan = $vtp->vtp_trunk_native($ifindex);
 | 
			
		||||
    if ( defined $native_vlan ) {
 | 
			
		||||
 | 
			
		||||
        print
 | 
			
		||||
            "Changing native VLAN from $native_vlan->{$ifindex} to $vlan_id on IfIndex: $ifindex\n"
 | 
			
		||||
            if $vtp->debug();
 | 
			
		||||
 | 
			
		||||
        my $rv = $vtp->set_vtp_trunk_native( $vlan_id, $ifindex );
 | 
			
		||||
        unless ($rv) {
 | 
			
		||||
            $vtp->error_throw(
 | 
			
		||||
                "Unable to change native VLAN to $vlan_id on IfIndex: $ifindex"
 | 
			
		||||
            );
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        return $rv;
 | 
			
		||||
    }
 | 
			
		||||
    $vtp->error_throw("Can't find ifIndex: $ifindex - Is it a trunk port?");
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_vlan {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $vlan_id, $ifindex ) = @_;
 | 
			
		||||
 | 
			
		||||
    return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
 | 
			
		||||
 | 
			
		||||
    my $i_vlan = $vtp->i_vlan2($ifindex);
 | 
			
		||||
    if ( defined $i_vlan ) {
 | 
			
		||||
 | 
			
		||||
        print
 | 
			
		||||
            "Changing VLAN from $i_vlan->{$ifindex} to $vlan_id on IfIndex: $ifindex\n"
 | 
			
		||||
            if $vtp->debug();
 | 
			
		||||
 | 
			
		||||
        my $rv = $vtp->set_i_vlan2( $vlan_id, $ifindex );
 | 
			
		||||
        unless ($rv) {
 | 
			
		||||
            $vtp->error_throw(
 | 
			
		||||
                "Unable to change VLAN to $vlan_id on IfIndex: $ifindex");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        return $rv;
 | 
			
		||||
    }
 | 
			
		||||
    $vtp->error_throw("Can't find ifIndex: $ifindex - Is it an access port?");
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_untagged {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $vlan_id, $ifindex ) = @_;
 | 
			
		||||
 | 
			
		||||
    # cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
 | 
			
		||||
    # so we use vtp_trunk_dyn as a hint to use i_pvid
 | 
			
		||||
 | 
			
		||||
    my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
 | 
			
		||||
    if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
 | 
			
		||||
        return $vtp->set_i_pvid(@_);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return $vtp->set_i_vlan(@_);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_add_i_vlan_tagged {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $vlan_id, $ifindex ) = @_;
 | 
			
		||||
 | 
			
		||||
    return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
 | 
			
		||||
 | 
			
		||||
    print "Adding VLAN: $vlan_id to ifIndex: $ifindex\n" if $vtp->debug();
 | 
			
		||||
 | 
			
		||||
    my $trunk_serial  = $vtp->load_vtp_trunk_set_serial();
 | 
			
		||||
    my $trunk_members = $vtp->vtp_trunk_vlans($ifindex);
 | 
			
		||||
 | 
			
		||||
    unless ( defined $trunk_members ) {
 | 
			
		||||
        $vtp->error_throw(
 | 
			
		||||
            "Can't find ifIndex: $ifindex - Is it a trunk port?");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my @member_list = split( //, unpack( "B*", $trunk_members->{$ifindex} ) );
 | 
			
		||||
 | 
			
		||||
    print "Original vlan list for ifIndex: $ifindex: @member_list \n"
 | 
			
		||||
        if $vtp->debug();
 | 
			
		||||
    $member_list[$vlan_id] = '1';
 | 
			
		||||
    print "Modified vlan list for ifIndex: $ifindex: @member_list \n"
 | 
			
		||||
        if $vtp->debug();
 | 
			
		||||
    my $new_list = pack( "B*", join( '', @member_list ) );
 | 
			
		||||
 | 
			
		||||
    #Add VLAN to member list
 | 
			
		||||
    my $list_rv = $vtp->set_vtp_trunk_vlans( $new_list, $ifindex );
 | 
			
		||||
    unless ($list_rv) {
 | 
			
		||||
        $vtp->error_throw(
 | 
			
		||||
            "Unable to add VLAN: $vlan_id to ifIndex: $ifindex member list");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   #Make sure no other SNMP manager was making modifications at the same time.
 | 
			
		||||
    my $serial_rv = $vtp->set_vtp_trunk_set_serial($trunk_serial);
 | 
			
		||||
    unless ($serial_rv) {
 | 
			
		||||
        $vtp->error_throw(
 | 
			
		||||
            "Unable to increment trunk set serial number - check configuration!"
 | 
			
		||||
        );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_remove_i_vlan_tagged {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $vlan_id, $ifindex ) = @_;
 | 
			
		||||
 | 
			
		||||
    return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
 | 
			
		||||
 | 
			
		||||
    print "Removing VLAN: $vlan_id from ifIndex: $ifindex\n" if $vtp->debug();
 | 
			
		||||
 | 
			
		||||
    my $trunk_serial  = $vtp->load_vtp_trunk_set_serial();
 | 
			
		||||
    my $trunk_members = $vtp->vtp_trunk_vlans($ifindex);
 | 
			
		||||
 | 
			
		||||
    unless ( defined $trunk_members ) {
 | 
			
		||||
        $vtp->error_throw(
 | 
			
		||||
            "Can't find ifIndex: $ifindex - Is it a trunk port?");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my @member_list = split( //, unpack( "B*", $trunk_members->{$ifindex} ) );
 | 
			
		||||
 | 
			
		||||
    print "Original vlan list for ifIndex: $ifindex: @member_list \n"
 | 
			
		||||
        if $vtp->debug();
 | 
			
		||||
    $member_list[$vlan_id] = '0';
 | 
			
		||||
    print "Modified vlan list for ifIndex: $ifindex: @member_list \n"
 | 
			
		||||
        if $vtp->debug();
 | 
			
		||||
    my $new_list = pack( "B*", join( '', @member_list ) );
 | 
			
		||||
 | 
			
		||||
    #Remove VLAN to member list
 | 
			
		||||
    my $list_rv = $vtp->set_vtp_trunk_vlans( $new_list, $ifindex );
 | 
			
		||||
    unless ($list_rv) {
 | 
			
		||||
        $vtp->error_throw(
 | 
			
		||||
            "Error: Unable to remove VLAN: $vlan_id from ifIndex: $ifindex member list"
 | 
			
		||||
        );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #Make sure no other manager was making modifications at the same time.
 | 
			
		||||
    my $serial_rv = $vtp->set_vtp_trunk_set_serial($trunk_serial);
 | 
			
		||||
    unless ($serial_rv) {
 | 
			
		||||
        $vtp->error_throw(
 | 
			
		||||
            "Error: Unable to increment trunk set serial number - check configuration!"
 | 
			
		||||
        );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# These are internal methods and are not documented.  Do not use directly.
 | 
			
		||||
#
 | 
			
		||||
sub _validate_vlan_param {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $vlan_id, $ifindex ) = @_;
 | 
			
		||||
 | 
			
		||||
    # VID and ifIndex should both be numeric
 | 
			
		||||
    unless (defined $vlan_id
 | 
			
		||||
        and defined $ifindex
 | 
			
		||||
        and $vlan_id =~ /^\d+$/
 | 
			
		||||
        and $ifindex =~ /^\d+$/ )
 | 
			
		||||
    {
 | 
			
		||||
        $vtp->error_throw("Invalid parameter");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Check that ifIndex exists on device
 | 
			
		||||
    my $index = $vtp->interfaces($ifindex);
 | 
			
		||||
 | 
			
		||||
    unless ( exists $index->{$ifindex} ) {
 | 
			
		||||
        $vtp->error_throw("ifIndex $ifindex does not exist");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #Check that VLAN exists on device
 | 
			
		||||
    my $vtp_vlans   = $vtp->v_state();
 | 
			
		||||
    my $vlan_exists = 0;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$vtp_vlans ) {
 | 
			
		||||
        my $vlan    = 0;
 | 
			
		||||
        my $vtp_dom = 0;
 | 
			
		||||
        my $state   = $vtp_vlans->{$iid};
 | 
			
		||||
        next unless defined $state;
 | 
			
		||||
        next if $state !~ /operational/;
 | 
			
		||||
        if ( $iid =~ /(\d+)\.(\d+)/ ) {
 | 
			
		||||
            $vtp_dom = $1;
 | 
			
		||||
            $vlan    = $2;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $vlan_exists = 1 if ( $vlan_id eq $vlan );
 | 
			
		||||
    }
 | 
			
		||||
    unless ($vlan_exists) {
 | 
			
		||||
        $vtp->error_throw(
 | 
			
		||||
            "VLAN $vlan_id does not exist or is not operational");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoVTP - SNMP Interface to Cisco's VLAN Management MIBs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-VTP-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-VLAN-MEMBERSHIP-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_version()
 | 
			
		||||
 | 
			
		||||
(C<vtpVersion>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_maxstore()
 | 
			
		||||
 | 
			
		||||
(C<vtpMaxVlanStorage>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_notify()
 | 
			
		||||
 | 
			
		||||
(C<vtpNotificationsEnabled>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_notify_create()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanCreatedNotifEnabled>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_notify_delete()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanDeletedNotifEnabled>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_set_serial()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortSetSerialNo>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
Your device will only implement a subset of these methods.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and assigned VLAN ID for access ports
 | 
			
		||||
and the default VLAN ID for trunk ports.
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_untagged()
 | 
			
		||||
 | 
			
		||||
An alias for C<i_vlan>.
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
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}}));
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan_membership_untagged()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.  These are the VLANs which are members of the untagged egress list for
 | 
			
		||||
the port.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 VLAN Table (C<CISCO-VTP-MIB::vtpVlanTable>)
 | 
			
		||||
 | 
			
		||||
See L<ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-communityIndexing.html>
 | 
			
		||||
for a good treaty of how to connect to the VLANs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_index()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanIndex>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_state()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanState>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_type()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanType>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_name()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanName>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_mtu()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanMtu>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_said()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanDot10Said>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_ring()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanRingNumber>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_bridge()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanBridgeNumber>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_stp()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanStpType>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_parent()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanParentVlan>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_trans1()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanTranslationalVlan1>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_trans2()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanTranslationalVlan2>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_btype()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanBridgeType>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_hop_are()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanAreHopCount>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_hop_ste()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanSteHopCount>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_crf()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanIsCRFBackup>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_type_ext()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanTypeExt>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->v_if()
 | 
			
		||||
 | 
			
		||||
(C<vtpVlanIfIndex>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 VLAN Membership Table (C<CISCO-VLAN-MEMBERSHIP-MIB::vmMembershipTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan_type()
 | 
			
		||||
 | 
			
		||||
Static, Dynamic, or multiVlan.
 | 
			
		||||
 | 
			
		||||
(C<vmVlanType>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan2()
 | 
			
		||||
 | 
			
		||||
The VLAN that an access port is assigned to.
 | 
			
		||||
 | 
			
		||||
(C<vmVlan>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan_stat()
 | 
			
		||||
 | 
			
		||||
Inactive, active, shutdown.
 | 
			
		||||
 | 
			
		||||
(C<vmPortStatus>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan_1()
 | 
			
		||||
 | 
			
		||||
Each bit represents a VLAN.  This is 0 through 1023
 | 
			
		||||
 | 
			
		||||
(C<vmVlans>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan_2()
 | 
			
		||||
 | 
			
		||||
Each bit represents a VLAN.  This is 1024 through 2047
 | 
			
		||||
 | 
			
		||||
(C<vmVlans2k>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan_3()
 | 
			
		||||
 | 
			
		||||
Each bit represents a VLAN.  This is 2048 through 3071
 | 
			
		||||
 | 
			
		||||
(C<vmVlans3k>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan_4()
 | 
			
		||||
 | 
			
		||||
Each bit represents a VLAN.  This is 3072 through 4095
 | 
			
		||||
 | 
			
		||||
(C<vmVlans4k>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 VLAN Membership Voice VLAN Table
 | 
			
		||||
(C<CISCO-VLAN-MEMBERSHIP-MIB::vmVoiceVlanTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_voice_vlan()
 | 
			
		||||
 | 
			
		||||
(C<vmVoiceVlanId>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Management Domain Table (C<CISCO-VTP-MIB::managementDomainTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_d_name()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainName>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_d_mode()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainLocalMode>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_d_rev()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainConfigRevNumber>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_d_updater()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainLastUpdater>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_d_last()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainLastChange>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_d_status()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainRowStatus>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_d_tftp()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainTftpServer>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_d_tftp_path()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainTftpPathname>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_d_pruning()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainPruningState>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_d_ver()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainVersionInUse>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 VLAN Trunk Port Table (C<CISCO-VTP-MIB::vlanTrunkPortTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_mgmt_dom()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortManagementDomain>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_encaps_t()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortEncapsulationType>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_vlans()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortVlansEnabled>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_vlans_2k()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortVlansEnabled2k>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_vlans_3k()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortVlansEnabled3k>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_vlans_4k()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortVlansEnabled4k>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_native()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortNativeVlan>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_pvid()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortNativeVlan>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_rstat()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortRowStatus>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_dyn()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortDynamicState>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_dyn_stat()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortDynamicStatus>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_vtp()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortVtpEnabled>)
 | 
			
		||||
 | 
			
		||||
=item $vtp->vtp_trunk_encaps()
 | 
			
		||||
 | 
			
		||||
(C<vlanTrunkPortEncapsulationOperType>)
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $vtp->set_i_vlan ( vlan, ifIndex )
 | 
			
		||||
 | 
			
		||||
Changes an access (untagged) port VLAN, must be supplied with the numeric
 | 
			
		||||
VLAN ID and port C<ifIndex>.  This method should only be used on end station
 | 
			
		||||
(non-trunk) ports.
 | 
			
		||||
 | 
			
		||||
  Example:
 | 
			
		||||
  my %if_map = reverse %{$vtp->interfaces()};
 | 
			
		||||
  $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 )
 | 
			
		||||
 | 
			
		||||
Sets port default VLAN, must be supplied with the numeric VLAN ID and
 | 
			
		||||
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'})
 | 
			
		||||
    or die "Couldn't change port default VLAN. ",$vtp->error(1);
 | 
			
		||||
 | 
			
		||||
=item $vtp->set_i_untagged ( vlan, ifIndex )
 | 
			
		||||
 | 
			
		||||
This method attempts to work out whether the port referenced by ifIndex is
 | 
			
		||||
trunking, and if so will return the value of C<set_i_pvid>. Otherwise, the
 | 
			
		||||
value of C<set_i_vlan> is returned.
 | 
			
		||||
 | 
			
		||||
=item $vtp->set_add_i_vlan_tagged ( vlan, ifIndex )
 | 
			
		||||
 | 
			
		||||
Adds the VLAN to the enabled VLANs list of the port, must be supplied with the
 | 
			
		||||
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'})
 | 
			
		||||
    or die "Couldn't add port to egress list. ",$vtp->error(1);
 | 
			
		||||
 | 
			
		||||
=item $vtp->set_remove_i_vlan_tagged ( vlan, ifIndex )
 | 
			
		||||
 | 
			
		||||
Removes the VLAN from the enabled VLANs list of the port, must be supplied
 | 
			
		||||
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'})
 | 
			
		||||
    or die "Couldn't add port to egress list. ",$vtp->error(1);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										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.70-135';
 | 
			
		||||
 
 | 
			
		||||
%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.70-135';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
							
								
								
									
										296
									
								
								lib/SNMP/Info/EDP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								lib/SNMP/Info/EDP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,296 @@
 | 
			
		||||
# SNMP::Info::EDP
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::EDP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::EDP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::EDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'EXTREME-EDP-MIB'   => 'extremeEdpPortIfIndex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    # EXTREME-EDP-MIB::extremeEdpTable
 | 
			
		||||
    'edp_rem_sysname'  => 'extremeEdpNeighborName',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'edp_rem_sysname'   => \&SNMP::Info::munge_null,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub hasEDP {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
 | 
			
		||||
 | 
			
		||||
    return 1 if ( scalar( keys %$edp_ip ) );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Since we need to get IP Addresses from the extremeEdpNeighborTable which has
 | 
			
		||||
# a different index (adds VLAN name) than the extremeEdpTable which holds
 | 
			
		||||
# the remote device details use the index from extremeEdpNeighborTable but skip
 | 
			
		||||
# indexes which have an address of 0.0.0.0.  Would like to include only one
 | 
			
		||||
# address since they should all originate from the same device, but we don't
 | 
			
		||||
# know if they would all be reachable from the network management application.
 | 
			
		||||
#
 | 
			
		||||
# We don't 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};
 | 
			
		||||
        next if ($ip eq '0.0.0.0');
 | 
			
		||||
        next unless $ip;
 | 
			
		||||
        $edp_index{$key} = $key;
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_if {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $edp->_edp_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_if;
 | 
			
		||||
    foreach my $key (keys %$index) {
 | 
			
		||||
        my $iid = $key;
 | 
			
		||||
        # ifIndex is first part of the iid
 | 
			
		||||
        $iid = $1 if $iid =~ /^(\d+)\./;
 | 
			
		||||
        $edp_if{$key} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return \%edp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_ip {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index  = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_ip;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my $ip = $edp_ip->{$key};
 | 
			
		||||
        # MIB says should only be IPv4
 | 
			
		||||
        next unless ($ip =~ /\d+(\.\d+){3}/);
 | 
			
		||||
        $edp_ip{$key} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_port {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index    = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_rport = $edp->extremeEdpNeighborPort() || {};
 | 
			
		||||
    my $edp_rslot = $edp->extremeEdpNeighborSlot() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_port;
 | 
			
		||||
    foreach my $key ( sort keys %$edp_rport ) {
 | 
			
		||||
        my $port = $edp_rport->{$key};
 | 
			
		||||
        my $slot = $edp_rslot->{$key} || 0;
 | 
			
		||||
        next unless $port;
 | 
			
		||||
        my $slotport = defined $slot ?  "$slot\/$port" : $port;
 | 
			
		||||
 | 
			
		||||
        foreach my $iid ( sort keys %$index ) {
 | 
			
		||||
            $edp_port{$iid} = $slotport if ($iid =~ /^$key/);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_id {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index    = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_name = $edp->edp_rem_sysname() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_name;
 | 
			
		||||
    foreach my $key ( sort keys %$edp_name ) {
 | 
			
		||||
        my $name = $edp_name->{$key} || 0;
 | 
			
		||||
        next unless $name;
 | 
			
		||||
 | 
			
		||||
        foreach my $iid ( sort keys %$index ) {
 | 
			
		||||
            $edp_name{$iid} = $name if ($iid =~ /^$key/);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_ver {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index   = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_ver = $edp->extremeEdpNeighborSoftwareVersion() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_ver;
 | 
			
		||||
    foreach my $key ( sort keys %$edp_ver ) {
 | 
			
		||||
        my $ver = $edp_ver->{$key} || 0;
 | 
			
		||||
        next unless $ver;
 | 
			
		||||
 | 
			
		||||
        foreach my $iid ( sort keys %$index ) {
 | 
			
		||||
            $edp_ver{$iid} = $ver if ($iid =~ /^$key/);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::EDP - SNMP Interface to the Extreme Discovery Protocol (EDP)
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $edp = new SNMP::Info (
 | 
			
		||||
                             AutoSpecify => 1,
 | 
			
		||||
                             Debug       => 1,
 | 
			
		||||
                             DestHost    => 'router',
 | 
			
		||||
                             Community   => 'public',
 | 
			
		||||
                             Version     => 2
 | 
			
		||||
                           );
 | 
			
		||||
 | 
			
		||||
 my $class = $edp->class();
 | 
			
		||||
 print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
 $hasedp   = $edp->hasEDP() ? 'yes' : 'no';
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 | 
			
		||||
 foreach my $edp_key (keys %$edp_ip){
 | 
			
		||||
    my $iid           = $edp_if->{$edp_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $edp_ip->{$edp_key};
 | 
			
		||||
    my $neighbor_port = $edp_port->{$edp_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented
 | 
			
		||||
interface to EDP information through SNMP.
 | 
			
		||||
 | 
			
		||||
EDP is a Layer 2 protocol that allows a network device to advertise its
 | 
			
		||||
identity and capabilities on the local network providing topology information.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherits this class.  Do not use
 | 
			
		||||
directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<EXTREME-EDP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $edp->hasEDP()
 | 
			
		||||
 | 
			
		||||
Is EDP active on this device?
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_id()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the chassis component associated
 | 
			
		||||
with the remote system.
 | 
			
		||||
 | 
			
		||||
(C<extremeEdpNeighborName>)
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
=item  $edp->edp_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IPv4 address.
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_ver()
 | 
			
		||||
 | 
			
		||||
Returns the operating system version of the remote system.
 | 
			
		||||
 | 
			
		||||
Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<extremeEdpNeighborSoftwareVersion>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										348
									
								
								lib/SNMP/Info/Entity.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										348
									
								
								lib/SNMP/Info/Entity.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,348 @@
 | 
			
		||||
# SNMP::Info::Entity
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Entity;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Entity::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Entity::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'e_alias'  => 'entPhysicalAlias',
 | 
			
		||||
    'e_class'  => 'entPhysicalClass',
 | 
			
		||||
    'e_descr'  => 'entPhysicalDescr',
 | 
			
		||||
    'e_fwver'  => 'entPhysicalFirmwareRev',
 | 
			
		||||
    'e_fru'    => 'entPhysicalIsFRU',
 | 
			
		||||
    'e_hwver'  => 'entPhysicalHardwareRev',
 | 
			
		||||
    'e_id'     => 'entPhysicalAssetID',
 | 
			
		||||
    'e_map'    => 'entAliasMappingIdentifier',
 | 
			
		||||
    'e_model'  => 'entPhysicalModelName',
 | 
			
		||||
    'e_name'   => 'entPhysicalName',
 | 
			
		||||
    'e_parent' => 'entPhysicalContainedIn',
 | 
			
		||||
    'e_pos'    => 'entPhysicalParentRelPos',
 | 
			
		||||
    'e_serial' => 'entPhysicalSerialNum',
 | 
			
		||||
    'e_swver'  => 'entPhysicalSoftwareRev',
 | 
			
		||||
    'e_type'   => 'entPhysicalVendorType',
 | 
			
		||||
    'e_vendor' => 'entPhysicalMfgName',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( 'e_type' => \&SNMP::Info::munge_e_type, );
 | 
			
		||||
 | 
			
		||||
# entPhysicalIndex is not-accessible.  Create to facilitate emulation methods
 | 
			
		||||
# in other classes
 | 
			
		||||
 | 
			
		||||
sub e_index {
 | 
			
		||||
    my $entity  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Force use of MIB leaf to avoid inheritance issues in pseudo classes
 | 
			
		||||
    my $e_descr = $entity->entPhysicalDescr($partial);
 | 
			
		||||
 | 
			
		||||
    return unless ($e_descr);
 | 
			
		||||
 | 
			
		||||
    my %e_index;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$e_descr ) {
 | 
			
		||||
        $e_index{$iid} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%e_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_port {
 | 
			
		||||
    my $entity  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_map = $entity->e_map($partial);
 | 
			
		||||
 | 
			
		||||
    my %e_port;
 | 
			
		||||
 | 
			
		||||
    foreach my $e_id ( keys %$e_map ) {
 | 
			
		||||
        my $id = $e_id;
 | 
			
		||||
        $id =~ s/\.0$//;
 | 
			
		||||
 | 
			
		||||
        my $iid = $e_map->{$e_id};
 | 
			
		||||
        $iid =~ s/.*\.//;
 | 
			
		||||
 | 
			
		||||
        $e_port{$id} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Entity - SNMP Interface to data stored in F<ENTITY-MIB>. RFC 2737
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
F<ENTITY-MIB> is used by Layer 2 devices from Brocade, Cisco, HP,
 | 
			
		||||
and more.
 | 
			
		||||
 | 
			
		||||
See RFC 2737 for full details.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherit this class.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
For debugging purposes you can call this class directly as you would
 | 
			
		||||
SNMP::Info
 | 
			
		||||
 | 
			
		||||
 my $entity = new SNMP::Info::Entity (...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
none.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ENTITY-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
none.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
=item $entity->e_index()
 | 
			
		||||
 | 
			
		||||
Index
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalIndex>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_alias()
 | 
			
		||||
 | 
			
		||||
Human entered, not usually used.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalAlias>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_class()
 | 
			
		||||
 | 
			
		||||
Stack, Module, Container, Port ...
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalClass>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_descr()
 | 
			
		||||
 | 
			
		||||
Human Friendly
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalClass>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_fwver()
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalFirmwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_fru()
 | 
			
		||||
 | 
			
		||||
BOOLEAN. Is a Field Replaceable unit?
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalFRU>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_hwver()
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalHardwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_id()
 | 
			
		||||
 | 
			
		||||
This is human entered and not normally used.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalAssetID>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_map()
 | 
			
		||||
 | 
			
		||||
See MIB.
 | 
			
		||||
 | 
			
		||||
(C<entAliasMappingIdentifier>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_model()
 | 
			
		||||
 | 
			
		||||
Model Name of Entity.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalModelName>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_name()
 | 
			
		||||
 | 
			
		||||
More computer friendly name of entity.  Parse me.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalName>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_parent()
 | 
			
		||||
 | 
			
		||||
0 if root.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalContainedIn>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_port()
 | 
			
		||||
 | 
			
		||||
Maps Entity Table entries to the Interface Table (C<IfTable>) using
 | 
			
		||||
$entity->e_map()
 | 
			
		||||
 | 
			
		||||
=item $entity->e_pos()
 | 
			
		||||
 | 
			
		||||
The relative position among all entities sharing the same parent.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalParentRelPos>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_serial()
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalSerialNum>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_swver()
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalSoftwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_type()
 | 
			
		||||
 | 
			
		||||
This is an OID, which gets munged into the object name if the right
 | 
			
		||||
MIB is loaded.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalVendorType>)
 | 
			
		||||
 | 
			
		||||
=item $entity->e_vendor()
 | 
			
		||||
 | 
			
		||||
Vendor of Module.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalMfgName>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										253
									
								
								lib/SNMP/Info/EtherLike.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										253
									
								
								lib/SNMP/Info/EtherLike.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,253 @@
 | 
			
		||||
# SNMP::Info::EtherLike
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::EtherLike;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::EtherLike::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::EtherLike::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # EtherLike StatsTable
 | 
			
		||||
    'el_chipset'         => 'dot3StatsEtherChipSet',
 | 
			
		||||
    'el_coll_excess'     => 'dot3StatsExcessiveCollisions',
 | 
			
		||||
    'el_coll_late'       => 'dot3StatsLateCollisions',
 | 
			
		||||
    'el_coll_mult'       => 'dot3StatsMultipleCollisionFrames',
 | 
			
		||||
    'el_coll_single'     => 'dot3StatsSingleCollisionFrames',
 | 
			
		||||
    'el_duplex'          => 'dot3StatsDuplexStatus',
 | 
			
		||||
    'el_error_alignment' => 'dot3StatsAlignmentErrors',
 | 
			
		||||
    'el_error_fcs'       => 'dot3StatsFCSErrors',
 | 
			
		||||
    'el_error_cs'        => 'dot3StatsCarrierSenseErrors',
 | 
			
		||||
    'el_error_frame'     => 'dot3StatsFrameTooLongs',
 | 
			
		||||
    'el_error_mac_rec'   => 'dot3StatsInternalMacReceiveErrors',
 | 
			
		||||
    'el_error_mac_xmit'  => 'dot3StatsInternalMacTransmitErrors',
 | 
			
		||||
    'el_error_sqe'       => 'dot3StatsSQETestErrors',
 | 
			
		||||
    'el_error_symbol'    => 'dot3StatsSymbolErrors',
 | 
			
		||||
    'el_index'           => 'dot3StatsIndex',
 | 
			
		||||
    'el_xmit_defer'      => 'dot3StatsDeferredTransmissions',
 | 
			
		||||
 | 
			
		||||
    # Ethernet-like Collision Statistics Group
 | 
			
		||||
    'el_coll_freq'  => 'dot3CollFrequencies',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::MUNGE, 'el_duplex' => \&munge_el_duplex, );
 | 
			
		||||
 | 
			
		||||
sub munge_el_duplex {
 | 
			
		||||
    my $duplex = shift;
 | 
			
		||||
    return unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
    $duplex =~ s/Duplex$//;
 | 
			
		||||
    return $duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::EtherLike - SNMP Interface to SNMP F<ETHERLIKE-MIB> RFC 1398
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $el = new SNMP::Info (
 | 
			
		||||
                             AutoSpecify => 1,
 | 
			
		||||
                             Debug       => 1,
 | 
			
		||||
                             DestHost    => 'router',
 | 
			
		||||
                             Community   => 'public',
 | 
			
		||||
                             Version     => 2
 | 
			
		||||
                           );
 | 
			
		||||
 | 
			
		||||
 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();
 | 
			
		||||
 | 
			
		||||
 foreach my $el_port (keys %$el_duplex){
 | 
			
		||||
    my $duplex = $el_duplex->{$el_port};
 | 
			
		||||
    my $iid    = $el_index->{$el_port};
 | 
			
		||||
    my $port   = $interfaces->{$iid};
 | 
			
		||||
 | 
			
		||||
    print "PORT:$port set to duplex:$duplex\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
See RFC 1398 for more details.
 | 
			
		||||
 | 
			
		||||
Use or create a subclass of SNMP::Info that inherits this one.  Do not use
 | 
			
		||||
directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ETHERLIKE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item None
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 ETHERLIKE STATS TABLE (C<dot3StatsTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $el->el_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Indexes Stats Table to the interface index (iid).
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsIndex>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Indexes Stats Table to Duplex Status of port.
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsDuplexStatus>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_chipset()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsEtherChipSet>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_excess()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsExcessiveCollisions>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_late()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsLateCollisions>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_mult()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsMultipleCollisionFrames>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_single()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsSingleCollisionFrames>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_alignment()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsAlignmentErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_fcs()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsFCSErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_cs()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsCarrierSenseErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_frame()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsFrameTooLongs>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_mac_rec()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsInternalMacReceiveErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_mac_xmit()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsInternalMacTransmitErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_sqe()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsSQETestErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_symbol()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsSymbolErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_xmit_defer()
 | 
			
		||||
 | 
			
		||||
(C<dot3StatsDeferredTransmissions>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_count()
 | 
			
		||||
 | 
			
		||||
(C<dot3CollCount>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_freq()
 | 
			
		||||
 | 
			
		||||
(C<dot3CollFrequencies>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $el->munge_el_duplex()
 | 
			
		||||
 | 
			
		||||
Removes 'Duplex' from the end of a string.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										369
									
								
								lib/SNMP/Info/FDP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										369
									
								
								lib/SNMP/Info/FDP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,369 @@
 | 
			
		||||
# SNMP::Info::FDP
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bruce Rodger, Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::FDP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::FDP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::FDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    'fdp_run'      => 'snFdpGlobalRun',
 | 
			
		||||
    'fdp_interval' => 'snFdpGlobalMessageInterval',
 | 
			
		||||
    'fdp_holdtime' => 'snFdpGlobalHoldTime',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'fdp_proto'        => 'snFdpCacheAddressType',
 | 
			
		||||
    'fdp_ip'           => 'snFdpCacheAddress',
 | 
			
		||||
    'fdp_ver'          => 'snFdpCacheVersion',
 | 
			
		||||
    'fdp_id'           => 'snFdpCacheDeviceId',
 | 
			
		||||
    'fdp_port'         => 'snFdpCacheDevicePort',
 | 
			
		||||
    'fdp_platform'     => 'snFdpCachePlatform',
 | 
			
		||||
    'fdp_capabilities' => 'snFdpCacheCapabilities',
 | 
			
		||||
    'fdp_cache_type'   => 'snFdpCacheVendorId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'fdp_capabilities' => \&SNMP::Info::munge_bits,
 | 
			
		||||
    'fdp_ip'           => \&SNMP::Info::munge_ip,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub fdp_run {
 | 
			
		||||
    my $fdp     = shift;
 | 
			
		||||
    my $fdp_run = $fdp->orig_fdp_run();
 | 
			
		||||
 | 
			
		||||
    # if fdp_run isn't implemented on device, assume FDP is on
 | 
			
		||||
    return $fdp_run if defined $fdp_run;
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub hasFDP {
 | 
			
		||||
    my $fdp = shift;
 | 
			
		||||
 | 
			
		||||
    my $ver = $fdp->snmp_ver();
 | 
			
		||||
 | 
			
		||||
    # SNMP v1 clients dont have the globals
 | 
			
		||||
    if ( defined $ver and $ver == 1 ) {
 | 
			
		||||
        my $fdp_ip = $fdp->fdp_ip();
 | 
			
		||||
 | 
			
		||||
        # See if anything in fdp cache, if so we have fdp
 | 
			
		||||
        return 1 if ( defined $fdp_ip and scalar( keys %$fdp_ip ) );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $fdp->fdp_run();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fdp_if {
 | 
			
		||||
    my $fdp = shift;
 | 
			
		||||
 | 
			
		||||
    my $fdp_ip = $fdp->fdp_ip();
 | 
			
		||||
    unless ( defined $fdp_ip ) {
 | 
			
		||||
        $fdp->error_throw(
 | 
			
		||||
            "SNMP::Info::FDP:fdp_if() - Device doesn't have fdp_ip() data.  Can't fake fdp_index()"
 | 
			
		||||
        );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my %fdp_if;
 | 
			
		||||
    foreach my $key ( keys %$fdp_ip ) {
 | 
			
		||||
        next unless defined $key;
 | 
			
		||||
        my $iid = $key;
 | 
			
		||||
 | 
			
		||||
        # Truncate .1 from fdp cache entry
 | 
			
		||||
        $iid =~ s/\.\d+$//;
 | 
			
		||||
        $fdp_if{$key} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%fdp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::FDP - SNMP Interface to Foundry Discovery Protocol (FDP) using
 | 
			
		||||
SNMP
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Bruce Rodger, Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $fdp = new SNMP::Info (
 | 
			
		||||
                             AutoSpecify => 1,
 | 
			
		||||
                             Debug       => 1,
 | 
			
		||||
                             DestHost    => 'router',
 | 
			
		||||
                             Community   => 'public',
 | 
			
		||||
                             Version     => 2
 | 
			
		||||
                           );
 | 
			
		||||
 | 
			
		||||
 my $class = $fdp->class();
 | 
			
		||||
 print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
 $hasfdp   = $fdp->hasFDP() ? 'yes' : 'no';
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with FDP neighbors:
 | 
			
		||||
 my $interfaces   = $fdp->interfaces();
 | 
			
		||||
 my $fdp_if       = $fdp->fdp_if();
 | 
			
		||||
 my $fdp_ip       = $fdp->fdp_ip();
 | 
			
		||||
 my $fdp_port     = $fdp->fdp_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $fdp_key (keys %$fdp_ip){
 | 
			
		||||
    my $iid           = $fdp_if->{$fdp_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $fdp_ip->{$fdp_key};
 | 
			
		||||
    my $neighbor_port = $fdp_port->{$fdp_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
devices that also speak FDP, mostly switches and routers.  It has
 | 
			
		||||
similar functionality to Cisco's CDP, and the SNMP interface is
 | 
			
		||||
virtually identical.  FDP is implemented in 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.
 | 
			
		||||
Check the return value to see if that data is held by the device.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
 | 
			
		||||
 | 
			
		||||
Needs a reasonably recent MIB. Works OK with B2R07604A.mib, but doesn't
 | 
			
		||||
work with B2R07600C.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  $fdp->hasFDP()
 | 
			
		||||
 | 
			
		||||
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?
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalRun>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_interval()
 | 
			
		||||
 | 
			
		||||
Interval in seconds at which FDP messages are generated.
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalMessageInterval>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_holdtime()
 | 
			
		||||
 | 
			
		||||
Time in seconds that FDP messages are kept.
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalHoldTime>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
CDP compatibility
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_interval()
 | 
			
		||||
 | 
			
		||||
Interval in seconds at which FDP messages are generated.
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalMessageInterval>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_holdtime()
 | 
			
		||||
 | 
			
		||||
Time in seconds that FDP messages are kept.
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalHoldTime>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->fdp_id()
 | 
			
		||||
 | 
			
		||||
Returns FDP device ID.
 | 
			
		||||
 | 
			
		||||
This is the device id broadcast via FDP to other devices, and is what is
 | 
			
		||||
retrieved from remote devices with $fdp->id().
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_run()
 | 
			
		||||
 | 
			
		||||
Is FDP enabled on this device?
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
CDP compatibility
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_capabilities()
 | 
			
		||||
 | 
			
		||||
Returns Device Functional Capabilities.  Results are munged into an ascii
 | 
			
		||||
binary string, MSB.  Each digit represents a bit from the table below.
 | 
			
		||||
 | 
			
		||||
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
 | 
			
		||||
 | 
			
		||||
(Bit) - Description
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item (0x40) - Provides level 1 functionality.
 | 
			
		||||
 | 
			
		||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
 | 
			
		||||
non router ports.
 | 
			
		||||
 | 
			
		||||
=item (0x10) - Sends and receives packets for at least one network layer
 | 
			
		||||
protocol. If the device is routing the protocol, this bit should not be set.
 | 
			
		||||
 | 
			
		||||
=item (0x08) - Performs level 2 switching. The difference between this bit
 | 
			
		||||
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
 | 
			
		||||
device is assumed to be deployed in a physical loop-free topology.
 | 
			
		||||
 | 
			
		||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
 | 
			
		||||
would set both this bit and bit 0x02.
 | 
			
		||||
 | 
			
		||||
=item (0x02) - Performs level 2 transparent bridging.
 | 
			
		||||
 | 
			
		||||
=item (0x01) - Performs level 3 routing for at least one network layer
 | 
			
		||||
protocol.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
Thanks to Martin Lorensen for a pointer to this information.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheCapabilities>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_id()
 | 
			
		||||
 | 
			
		||||
Returns remote device id string
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
In order to map the fdp table entry back to the interfaces() entry, we
 | 
			
		||||
truncate the last number off of it :
 | 
			
		||||
 | 
			
		||||
  my $fdp_ip       = $device->fdp_ip();
 | 
			
		||||
 | 
			
		||||
  my %fdp_if
 | 
			
		||||
  foreach my $key (keys %$fdp_ip){
 | 
			
		||||
      $iid = $key;
 | 
			
		||||
      ## Truncate off .1 from fdp response
 | 
			
		||||
      $iid =~ s/\.\d+$//;
 | 
			
		||||
      $fdp_if{$key} = $iid;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return \%fdp_if;
 | 
			
		||||
 | 
			
		||||
=item  $fdp->fdp_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IP address
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_platform()
 | 
			
		||||
 | 
			
		||||
Returns remote platform id
 | 
			
		||||
 | 
			
		||||
(C<fdpCachePlatform>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
(C<fdpDevicePort>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->fdp_proto()
 | 
			
		||||
 | 
			
		||||
Returns remote address type received.  Usually IP.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheAddressType>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_ver()
 | 
			
		||||
 | 
			
		||||
Returns remote hardware version
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheVersion>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_cache_type()
 | 
			
		||||
 | 
			
		||||
Returns type of entry received, either FDP or CDP.
 | 
			
		||||
 | 
			
		||||
(C<snFdpCacheVendorId>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										408
									
								
								lib/SNMP/Info/IEEE802dot11.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										408
									
								
								lib/SNMP/Info/IEEE802dot11.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,408 @@
 | 
			
		||||
# SNMP::Info::IEEE802dot11
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 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::IEEE802dot11;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::IEEE802dot11::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::IEEE802dot11::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # dot11PhyOFDMTable
 | 
			
		||||
    'dot11_cur_freq' => 'dot11CurrentFrequency',
 | 
			
		||||
 | 
			
		||||
    # dot11PhyDSSSTable
 | 
			
		||||
    'dot11_cur_ch' => 'dot11CurrentChannel',
 | 
			
		||||
 | 
			
		||||
    # dot11PhyOperationTable
 | 
			
		||||
    'dot11_phy_type' => 'dot11PHYType',
 | 
			
		||||
    'dot11_reg_dom'  => 'dot11CurrentRegDomain',
 | 
			
		||||
 | 
			
		||||
    # dot11ResourceInfoTable
 | 
			
		||||
    'dot11_prod_ver'  => 'dot11manufacturerProductVersion',
 | 
			
		||||
    'dot11_prod_name' => 'dot11manufacturerProductName',
 | 
			
		||||
    'dot11_man_name'  => 'dot11manufacturerName',
 | 
			
		||||
 | 
			
		||||
    # dot11OperationTable
 | 
			
		||||
    'dot11_mac' => 'dot11MACAddress',
 | 
			
		||||
 | 
			
		||||
    # dot11StationConfigTable
 | 
			
		||||
    'dot11_bss_type' => 'dot11DesiredBSSType',
 | 
			
		||||
    'i_ssidlist'     => 'dot11DesiredSSID',
 | 
			
		||||
    'dot11_pwr_mode' => 'dot11PowerManagementMode',
 | 
			
		||||
    'dot11_sta_id'   => 'dot11StationID',
 | 
			
		||||
 | 
			
		||||
    # dot11PhyTxPowerTable
 | 
			
		||||
    'dot11_cur_tx_pwr'     => 'dot11CurrentTxPowerLevel',
 | 
			
		||||
    'dot11_tx_pwr_level_1' => 'dot11TxPowerLevel1',
 | 
			
		||||
    'dot11_tx_pwr_level_2' => 'dot11TxPowerLevel2',
 | 
			
		||||
    'dot11_tx_pwr_level_3' => 'dot11TxPowerLevel3',
 | 
			
		||||
    'dot11_tx_pwr_level_4' => 'dot11TxPowerLevel4',
 | 
			
		||||
    'dot11_tx_pwr_level_5' => 'dot11TxPowerLevel5',
 | 
			
		||||
    'dot11_tx_pwr_level_6' => 'dot11TxPowerLevel6',
 | 
			
		||||
    'dot11_tx_pwr_level_7' => 'dot11TxPowerLevel7',
 | 
			
		||||
    'dot11_tx_pwr_level_8' => 'dot11TxPowerLevel8',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'dot11_mac'    => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'dot11_sta_id' => \&SNMP::Info::munge_mac,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $dot11 = shift;
 | 
			
		||||
 | 
			
		||||
    my $names = $dot11->dot11_man_name();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$names ) {
 | 
			
		||||
        my $vendor = $names->{$iid};
 | 
			
		||||
        next unless defined $vendor;
 | 
			
		||||
        if ( $vendor =~ /^(\S+)/ ) {
 | 
			
		||||
            return lc($1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $dot11 = shift;
 | 
			
		||||
 | 
			
		||||
    my $names = $dot11->dot11_prod_name();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$names ) {
 | 
			
		||||
        my $prod = $names->{$iid};
 | 
			
		||||
        next unless defined $prod;
 | 
			
		||||
        return lc($prod);
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $dot11 = shift;
 | 
			
		||||
 | 
			
		||||
    my $versions = $dot11->dot11_prod_ver();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$versions ) {
 | 
			
		||||
        my $ver = $versions->{$iid};
 | 
			
		||||
        next unless defined $ver;
 | 
			
		||||
        if ( $ver =~ /([\d\.]+)/ ) {
 | 
			
		||||
            return $1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_80211channel {
 | 
			
		||||
    my $dot11 = shift;
 | 
			
		||||
 | 
			
		||||
    my $phy_type = $dot11->dot11_phy_type() || {};
 | 
			
		||||
    my $cur_freq = $dot11->dot11_cur_freq() || {};
 | 
			
		||||
    my $cur_ch   = $dot11->dot11_cur_ch()   || {};
 | 
			
		||||
 | 
			
		||||
    my %i_80211channel;
 | 
			
		||||
    foreach my $iid ( keys %$phy_type ) {
 | 
			
		||||
        my $type = $phy_type->{$iid};
 | 
			
		||||
        next unless defined $type;
 | 
			
		||||
        if ( $type =~ /dsss/ ) {
 | 
			
		||||
            my $ch = $cur_ch->{$iid};
 | 
			
		||||
            next unless defined $ch;
 | 
			
		||||
            $i_80211channel{$iid} = $ch;
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $type =~ /ofdm/ ) {
 | 
			
		||||
            my $ch = $cur_freq->{$iid};
 | 
			
		||||
            next unless defined $ch;
 | 
			
		||||
            $i_80211channel{$iid} = $ch;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_80211channel;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub dot11_cur_tx_pwr_mw {
 | 
			
		||||
    my $dot11               = shift;
 | 
			
		||||
    my $partial             = shift;
 | 
			
		||||
    my $cur                 = $dot11->dot11_cur_tx_pwr($partial);
 | 
			
		||||
    my $dot11_cur_tx_pwr_mw = {};
 | 
			
		||||
    foreach my $idx ( keys %$cur ) {
 | 
			
		||||
        my $pwr = $cur->{$idx};
 | 
			
		||||
        if ( $pwr >= 1 && $pwr <= 8 ) {
 | 
			
		||||
 | 
			
		||||
            # ToDo - Look at string eval
 | 
			
		||||
            my $mw
 | 
			
		||||
                = eval "\$dot11->dot11_tx_pwr_level_$pwr(\$idx)"; ## no critic
 | 
			
		||||
            $dot11_cur_tx_pwr_mw->{$idx} = $mw->{$idx};
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $dot11_cur_tx_pwr_mw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::IEEE802dot11 - SNMP Interface to data from F<IEEE802dot11-MIB>
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
    my $dot11 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
    my $class = $dot11->class();
 | 
			
		||||
    print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::IEEE802dot11 is a subclass of SNMP::Info that provides an
 | 
			
		||||
interface to F<IEEE802dot11-MIB>.  This MIB is used in standards based
 | 
			
		||||
802.11 wireless devices.
 | 
			
		||||
 | 
			
		||||
Use or create a subclass of SNMP::Info that inherits this one.
 | 
			
		||||
Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<IEEE802dot11-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dot11->vendor()
 | 
			
		||||
 | 
			
		||||
Tries to discover the vendor from dot11_man_name() - returns lower case
 | 
			
		||||
of the first word in the first instance found.
 | 
			
		||||
 | 
			
		||||
=item $dot11->model()
 | 
			
		||||
 | 
			
		||||
Tries to discover the model from dot11_prod_name() - returns lower case
 | 
			
		||||
of the first instance found.
 | 
			
		||||
 | 
			
		||||
=item $dot11->os_ver()
 | 
			
		||||
 | 
			
		||||
Tries to discover the operating system version from dot11_prod_ver() - returns
 | 
			
		||||
string of numeric and decimals in the first instance found.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dot11->i_ssidlist()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  SSID's recognized by the radio interface.
 | 
			
		||||
 | 
			
		||||
(C<dot11DesiredSSID>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->i_80211channel()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current operating frequency channel of the radio
 | 
			
		||||
interface.
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_cur_tx_pwr_mw()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current transmit power, in milliwatts, of the
 | 
			
		||||
radio interface.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Dot11 Phy OFDM Table  (C<dot11PhyOFDMTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_cur_freq()
 | 
			
		||||
 | 
			
		||||
(C<dot11CurrentFrequency>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Dot11 Phy DSSS Table  (C<dot11PhyDSSSTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_cur_ch()
 | 
			
		||||
 | 
			
		||||
(C<dot11CurrentChannel>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Dot11 Phy Operation Table  (C<dot11PhyOperationTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_phy_type()
 | 
			
		||||
 | 
			
		||||
(C<dot11PHYType>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_reg_dom()
 | 
			
		||||
 | 
			
		||||
(C<dot11CurrentRegDomain>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Dot11 Resource Information Table  (C<dot11ResourceInfoTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_prod_ver()
 | 
			
		||||
 | 
			
		||||
(C<dot11manufacturerProductVersion>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_prod_name()
 | 
			
		||||
 | 
			
		||||
(C<dot11manufacturerProductName>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_man_name()
 | 
			
		||||
 | 
			
		||||
(C<dot11manufacturerName>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Dot11 Operation Table  (C<dot11OperationTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_mac()
 | 
			
		||||
 | 
			
		||||
(C<dot11MACAddress>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Dot11 Station Configuration Table  (C<dot11StationConfigTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_bss_type()
 | 
			
		||||
 | 
			
		||||
(C<dot11DesiredBSSType>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_pwr_mode()
 | 
			
		||||
 | 
			
		||||
(C<dot11PowerManagementMode>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_sta_id()
 | 
			
		||||
 | 
			
		||||
(C<dot11StationID>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Dot11 Transmission Power Table  (C<dot11PhyTxPowerTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_cur_tx_pwr()
 | 
			
		||||
 | 
			
		||||
(C<dot11CurrentTxPowerLevel>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_tx_pwr_level_1()
 | 
			
		||||
 | 
			
		||||
(C<dot11TxPowerLevel1>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_tx_pwr_level_2()
 | 
			
		||||
 | 
			
		||||
(C<dot11TxPowerLevel2>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_tx_pwr_level_3()
 | 
			
		||||
 | 
			
		||||
(C<dot11TxPowerLevel3>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_tx_pwr_level_4()
 | 
			
		||||
 | 
			
		||||
(C<dot11TxPowerLevel4>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_tx_pwr_level_5()
 | 
			
		||||
 | 
			
		||||
(C<dot11TxPowerLevel5>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_tx_pwr_level_6()
 | 
			
		||||
 | 
			
		||||
(C<dot11TxPowerLevel6>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_tx_pwr_level_7()
 | 
			
		||||
 | 
			
		||||
(C<dot11TxPowerLevel7>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->dot11_tx_pwr_level_8()
 | 
			
		||||
 | 
			
		||||
(C<dot11TxPowerLevel8>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										153
									
								
								lib/SNMP/Info/IEEE802dot3ad.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								lib/SNMP/Info/IEEE802dot3ad.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,153 @@
 | 
			
		||||
# SNMP::Info::IEEE802dot3ad
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2018 SNMP::Info Developers
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::IEEE802dot3ad;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Aggregate;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::IEEE802dot3ad::ISA = qw/
 | 
			
		||||
  SNMP::Info::Aggregate
 | 
			
		||||
  Exporter
 | 
			
		||||
/;
 | 
			
		||||
@SNMP::Info::IEEE802dot3ad::EXPORT_OK = qw/
 | 
			
		||||
  agg_ports_lag
 | 
			
		||||
/;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
  %SNMP::Info::Aggregate::MIBS,
 | 
			
		||||
  'IEEE8023-LAG-MIB' => 'dot3adAggPortSelectedAggID',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
  'ad_lag_ports'    => 'dot3adAggPortListPorts',
 | 
			
		||||
 );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
  'ad_lag_ports' => \&SNMP::Info::munge_port_list,
 | 
			
		||||
 );
 | 
			
		||||
 | 
			
		||||
sub agg_ports_lag {
 | 
			
		||||
  my $dev = shift;
 | 
			
		||||
 | 
			
		||||
  # TODO: implement partial
 | 
			
		||||
  my $ports  = $dev->ad_lag_ports();
 | 
			
		||||
  my $index  = $dev->bp_index() || {};
 | 
			
		||||
 | 
			
		||||
  return {} unless ref {} eq ref $ports and scalar keys %$ports;
 | 
			
		||||
 | 
			
		||||
  my $ret = {};
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::IEEE802dot3ad - SNMP Interface to IEEE Aggregated Links
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
SNMP::Info Developers
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $info = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $info->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This class provides access to Aggregated Links configuration on devices
 | 
			
		||||
implementing C<IEEE8023-LAG-MIB>.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
L<SNMP::Info::Aggregate>
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<IEEE8023-LAG-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 METHODS
 | 
			
		||||
 | 
			
		||||
=over 4
 | 
			
		||||
 | 
			
		||||
=item C<agg_ports_lag>
 | 
			
		||||
 | 
			
		||||
Returns a HASH reference mapping from slave to master port for each member of
 | 
			
		||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
 | 
			
		||||
ifIndex of the corresponding master ports.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										560
									
								
								lib/SNMP/Info/IPv6.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										560
									
								
								lib/SNMP/Info/IPv6.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,560 @@
 | 
			
		||||
# SNMP::Info::IPv6
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2010 Jeroen van Ingen and Carlos Vicente
 | 
			
		||||
# 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::IPv6;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::IPv6::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::IPv6::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, $METHOD);
 | 
			
		||||
 | 
			
		||||
use constant {
 | 
			
		||||
    IPMIB   => 1,
 | 
			
		||||
    CISCO   => 2,
 | 
			
		||||
    IPV6MIB => 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'IP-MIB'            => 'ipv6InterfaceTableLastChange',
 | 
			
		||||
    'IPV6-MIB'          => 'ipv6IfTableLastChange',
 | 
			
		||||
    'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'ip_n2p_phys_addr'  => 'ipNetToPhysicalPhysAddress',    # IP-MIB
 | 
			
		||||
    'c_inet_phys_addr'  => 'cInetNetToMediaPhysAddress',    # CISCO-IETF-IP-MIB
 | 
			
		||||
    'i6_n2p_phys_addr'  => 'ipv6NetToMediaPhysAddress',     # IPV6-MIB
 | 
			
		||||
 | 
			
		||||
    'ip_n2p_phys_type'  => 'ipNetToPhysicalType',           # IP-MIB
 | 
			
		||||
    'c_inet_phys_type'  => 'cInetNetToMediaType',           # CISCO-IETF-IP-MIB
 | 
			
		||||
    'i6_n2p_phys_type'  => 'ipv6NetToMediaType',            # IPV6-MIB
 | 
			
		||||
 | 
			
		||||
    'ip_n2p_phys_state' => 'ipNetToPhysicalState',          # IP-MIB
 | 
			
		||||
    'c_inet_phys_state' => 'cInetNetToMediaState',          # CISCO-IETF-IP-MIB
 | 
			
		||||
    'i6_n2p_phys_state' => 'ipv6IfNetToMediaState',         # IPV6-MIB
 | 
			
		||||
 | 
			
		||||
    'ip_pfx_origin'     => 'ipAddressPrefixOrigin',         # IP-MIB
 | 
			
		||||
    'c_pfx_origin'      => 'cIpAddressPfxOrigin',           # CISCO-IETF-IP-MIB
 | 
			
		||||
 | 
			
		||||
    'ip_addr6_pfx'      => 'ipAddressPrefix',               # IP-MIB
 | 
			
		||||
    'c_addr6_pfx'       => 'cIpAddressPrefix',              # CISCO-IETF-IP-MIB
 | 
			
		||||
 | 
			
		||||
    # Commented out are not-accessible according to MIB
 | 
			
		||||
    #'ip_addr6_pfxlen'   => 'ipAddressPrefixLength',        # IP-MIB
 | 
			
		||||
    #'c_addr6_pfxlen'    => 'cIpAddressPfxLength',          # CISCO-IETF-IP-MIB
 | 
			
		||||
    'i6_addr_pfxlen'    => 'ipv6AddrPfxLength',             # IPV6-MIB
 | 
			
		||||
 | 
			
		||||
    'ip_addr6_index'    => 'ipAddressIfIndex',              # IP-MIB
 | 
			
		||||
    'c_addr6_index'     => 'cIpAddressIfIndex',             # CISCO-IETF-IP-MIB
 | 
			
		||||
 | 
			
		||||
    'ip_addr6_type'     => 'ipAddressType',                 # IP-MIB
 | 
			
		||||
    'c_addr6_type'      => 'cIpAddressType',                # CISCO-IETF-IP-MIB
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'ip_n2p_phys_addr'  => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'c_inet_phys_addr'  => \&munge_physaddr,
 | 
			
		||||
    'i6_n2p_phys_addr'  => \&SNMP::Info::munge_mac,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub ipv6_n2p_mac {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $phys_addr = &_test_methods( $info, {
 | 
			
		||||
        ip_n2p_phys_addr => IPMIB,
 | 
			
		||||
        c_inet_phys_addr => CISCO,
 | 
			
		||||
        i6_n2p_phys_addr => IPV6MIB,
 | 
			
		||||
    });
 | 
			
		||||
    return unless defined $phys_addr;
 | 
			
		||||
    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;
 | 
			
		||||
                # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
 | 
			
		||||
                $v6addr = join('.', $addrtype, $addrsize, $v6addr);
 | 
			
		||||
                $addrtype = 2;
 | 
			
		||||
            }
 | 
			
		||||
            if (($addrtype == 2) && (defined $phys_addr->{$row})) { # IPv6
 | 
			
		||||
                $return->{$row} = substr($phys_addr->{$row}, 0, 17);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_n2p_addr {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $net_addr = &_test_methods( $info, {
 | 
			
		||||
        ip_n2p_phys_addr => IPMIB,
 | 
			
		||||
        c_inet_phys_addr => CISCO,
 | 
			
		||||
        i6_n2p_phys_addr => IPV6MIB,
 | 
			
		||||
    });
 | 
			
		||||
    return unless defined $net_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;
 | 
			
		||||
                # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
 | 
			
		||||
                $v6addr = join('.', $addrtype, $addrsize, $v6addr);
 | 
			
		||||
                $addrtype = 2;
 | 
			
		||||
            }
 | 
			
		||||
            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,
 | 
			
		||||
                    # so what we've collected in that variable is actually the first byte of the address.
 | 
			
		||||
                    $v6_packed = pack('C', $addrsize) . $v6_packed;
 | 
			
		||||
                }
 | 
			
		||||
                if (length($v6_packed) == 17) {
 | 
			
		||||
                    # Workaround for IPV6-MIB on Windows 2012: if the address is one byte too long, the SNMP agent probably has an incorrect
 | 
			
		||||
                    # implementation where a length field precedes the actual IPv6 address.
 | 
			
		||||
                    # In that case, the first character should be chr(16), ie 0x10; strip it if that's the case.
 | 
			
		||||
                    $v6_packed =~ s/^\x10//;
 | 
			
		||||
                }
 | 
			
		||||
                if (length($v6_packed) == 16) {
 | 
			
		||||
                    $v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
 | 
			
		||||
                    $return->{$row} = $v6addr;
 | 
			
		||||
                } else {
 | 
			
		||||
                    printf("Invalid size for IPv6 address: expected 16 bytes, got %d (%s = %s)\n", length($v6_packed), $row, $net_addr->{$row});
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_n2p_if {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $phys_addr = &_test_methods( $info, {
 | 
			
		||||
        ip_n2p_phys_addr => IPMIB,
 | 
			
		||||
        c_inet_phys_addr => CISCO,
 | 
			
		||||
        i6_n2p_phys_addr => IPV6MIB,
 | 
			
		||||
    });
 | 
			
		||||
    return unless defined $phys_addr;
 | 
			
		||||
    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;
 | 
			
		||||
                # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
 | 
			
		||||
                $v6addr = join('.', $addrtype, $addrsize, $v6addr);
 | 
			
		||||
                $addrtype = 2;
 | 
			
		||||
            }
 | 
			
		||||
            if ($addrtype == 2) { # IPv6
 | 
			
		||||
                $return->{$row} = $ifindex;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_n2p_type {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $phys_type = &_test_methods( $info, {
 | 
			
		||||
        ip_n2p_phys_type => IPMIB,
 | 
			
		||||
        c_inet_phys_type => CISCO,
 | 
			
		||||
        i6_n2p_phys_type => IPV6MIB,
 | 
			
		||||
    });
 | 
			
		||||
    return unless defined $phys_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;
 | 
			
		||||
                # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
 | 
			
		||||
                $v6addr = join('.', $addrtype, $addrsize, $v6addr);
 | 
			
		||||
                $addrtype = 2;
 | 
			
		||||
            }
 | 
			
		||||
            if ($addrtype == 2) { # IPv6
 | 
			
		||||
                $return->{$row} = $phys_type->{$row};
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_n2p_state {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $phys_state = &_test_methods( $info, {
 | 
			
		||||
        ip_n2p_phys_state => IPMIB,
 | 
			
		||||
        c_inet_phys_state => CISCO,
 | 
			
		||||
        i6_n2p_phys_state => IPV6MIB,
 | 
			
		||||
    });
 | 
			
		||||
    return unless defined $phys_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;
 | 
			
		||||
                # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
 | 
			
		||||
                $v6addr = join('.', $addrtype, $addrsize, $v6addr);
 | 
			
		||||
                $addrtype = 2;
 | 
			
		||||
            }
 | 
			
		||||
            if ($addrtype == 2) { # IPv6
 | 
			
		||||
                $return->{$row} = $phys_state->{$row};
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_index {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $ipv6_index = &_test_methods( $info, {
 | 
			
		||||
	ip_addr6_index  => IPMIB,
 | 
			
		||||
	c_addr6_index   => CISCO,
 | 
			
		||||
				    });
 | 
			
		||||
    return unless defined $ipv6_index;
 | 
			
		||||
    foreach my $row (keys %$ipv6_index){
 | 
			
		||||
        if ($row =~ /^(\d+)\.([\d\.]+)$/) {
 | 
			
		||||
            my $addrtype = $1; my $v6addr = $2;
 | 
			
		||||
            if ($addrtype == 2) { # IPv6
 | 
			
		||||
		$return->{$row} = $ipv6_index->{$row};
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_type {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $ipv6_type = &_test_methods( $info, {
 | 
			
		||||
	ip_addr6_type  => IPMIB,
 | 
			
		||||
	c_addr6_type   => CISCO,
 | 
			
		||||
				    });
 | 
			
		||||
    return unless defined $ipv6_type;
 | 
			
		||||
    foreach my $row (keys %$ipv6_type){
 | 
			
		||||
        if ($row =~ /^(\d+)\.([\d\.]+)$/) {
 | 
			
		||||
            my $addrtype = $1; my $v6addr = $2;
 | 
			
		||||
            if ($addrtype == 2) { # IPv6
 | 
			
		||||
		$return->{$row} = $ipv6_type->{$row};
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_pfx_origin {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $ipv6_pfx_origin = &_test_methods( $info, {
 | 
			
		||||
	ip_pfx_origin  => IPMIB,
 | 
			
		||||
	c_pfx_origin   => CISCO,
 | 
			
		||||
				    });
 | 
			
		||||
    return unless defined $ipv6_pfx_origin;
 | 
			
		||||
    foreach my $row (keys %$ipv6_pfx_origin){
 | 
			
		||||
        if ($row =~ /^(\d+)\.(\d+)\.([\d\.]+)\.(\d+)$/) {
 | 
			
		||||
            my $ifindex = $1; my $type = $2; my $pfx = $3; my $len = $4;
 | 
			
		||||
            if ($type == 2) { # IPv6
 | 
			
		||||
		$return->{$row} = $ipv6_pfx_origin->{$row};
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_addr_prefix {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $ipv6_addr_prefix = &_test_methods( $info, {
 | 
			
		||||
	ip_addr6_pfx  => IPMIB,
 | 
			
		||||
	c_addr6_pfx   => CISCO,
 | 
			
		||||
				    });
 | 
			
		||||
    return unless defined $ipv6_addr_prefix;
 | 
			
		||||
    foreach my $row (keys %$ipv6_addr_prefix){
 | 
			
		||||
        if ($row =~ /^(\d+)\.[\d\.]+$/) {
 | 
			
		||||
            my $type = $1;
 | 
			
		||||
	    if (($type == 2) or ($type == 4)) { # IPv6
 | 
			
		||||
		# Remove interface specific part from vrf interfaces
 | 
			
		||||
		if ($row =~ /^((\d+\.){17}\d+)/) { $row = $1 }
 | 
			
		||||
		# Remove the OID part from the value
 | 
			
		||||
		my $val = $ipv6_addr_prefix->{$row};
 | 
			
		||||
		if ( $val =~ /^.+?((?:\d+\.){19}\d+)$/ ){
 | 
			
		||||
		    $val = $1;
 | 
			
		||||
		    $return->{$row} = $val;
 | 
			
		||||
		}
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_addr_prefixlength {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $ipv6_addr_prefix = &_test_methods( $info, {
 | 
			
		||||
        ip_addr6_pfx  => IPMIB,
 | 
			
		||||
        c_addr6_pfx   => CISCO,
 | 
			
		||||
    });
 | 
			
		||||
    return unless defined $ipv6_addr_prefix;
 | 
			
		||||
    foreach my $row (keys %$ipv6_addr_prefix) {
 | 
			
		||||
        if ($row =~ /^(\d+)\.[\d\.]+$/) {
 | 
			
		||||
            my $type = $1;
 | 
			
		||||
            if (($type == 2) or ($type == 4)) { # IPv6
 | 
			
		||||
                # Remove interface specific part from vrf interfaces
 | 
			
		||||
                if ($row =~ /^((\d+\.){17}\d+)/) { $row = $1 }
 | 
			
		||||
                # Remove the OID part from the value
 | 
			
		||||
                my $val = $ipv6_addr_prefix->{$row};
 | 
			
		||||
                if ( $val =~ /^.+?((?:\d+\.){19}(\d+))$/ ) {
 | 
			
		||||
                    $val = $2;
 | 
			
		||||
                    $return->{$row} = $val;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_addr {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $indexes = $info->ipv6_index();
 | 
			
		||||
    foreach my $row (keys %$indexes) {
 | 
			
		||||
        my @parts = split(/\./, $row);
 | 
			
		||||
        my $is_valid = 0;
 | 
			
		||||
        if (scalar @parts == 18) {
 | 
			
		||||
            my $addrtype = shift @parts;
 | 
			
		||||
            $is_valid = 1;
 | 
			
		||||
        } elsif (scalar @parts == 17) {
 | 
			
		||||
            $is_valid = 1;
 | 
			
		||||
        }
 | 
			
		||||
        my $addrsize = shift @parts; # First element now is addrsize, should be 16
 | 
			
		||||
        if ($is_valid && $addrsize == 16) {
 | 
			
		||||
            $return->{$row} = join(':', unpack('(H4)*', pack('C*', @parts)));
 | 
			
		||||
        } else {
 | 
			
		||||
            warn sprintf("%s: unable to decode table index to IPv6 address. Raw data is [%s].\n", &_my_sub_name, $row);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _method_used {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return = 'none of the MIBs';
 | 
			
		||||
    # FIXME ugh! a global. makes order of calls important for debug.
 | 
			
		||||
    if (defined $info::METHOD) {
 | 
			
		||||
        if ($info::METHOD eq IPMIB) {
 | 
			
		||||
            $return = 'IP-MIB';
 | 
			
		||||
        } elsif ($info::METHOD eq IPV6MIB) {
 | 
			
		||||
            $return = 'IPV6-MIB';
 | 
			
		||||
        } elsif ($info::METHOD eq CISCO) {
 | 
			
		||||
            $return = 'CISCO-IETF-IP-MIB';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _test_methods {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $test = shift;
 | 
			
		||||
    my $return = {};
 | 
			
		||||
    foreach my $method (sort {$test->{$a} <=> $test->{$b}} keys %$test) {
 | 
			
		||||
        $return = $info->$method || {};
 | 
			
		||||
        if (scalar keys %$return) {
 | 
			
		||||
            # FIXME ugh! a global. makes order of calls important for debug.
 | 
			
		||||
            $info::METHOD = $test->{$method};
 | 
			
		||||
            last;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _my_sub_name {
 | 
			
		||||
    my @callinfo = caller(1);
 | 
			
		||||
    return $callinfo[3];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_physaddr {
 | 
			
		||||
    my $addr = shift;
 | 
			
		||||
    return unless defined $addr;
 | 
			
		||||
    return unless length $addr;
 | 
			
		||||
    $addr = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $addr ) );
 | 
			
		||||
    return $addr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::IPv6 - SNMP Interface for obtaining IPv6 addresses and IPv6
 | 
			
		||||
address mappings
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Jeroen van Ingen and Carlos Vicente
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses
 | 
			
		||||
to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>,
 | 
			
		||||
F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the
 | 
			
		||||
device.
 | 
			
		||||
 | 
			
		||||
This class is inherited by Info::Layer3 to provide IPv6 node tracking across
 | 
			
		||||
device classes.
 | 
			
		||||
 | 
			
		||||
For debugging purposes you can call this class directly as you would
 | 
			
		||||
SNMP::Info
 | 
			
		||||
 | 
			
		||||
 my $info = new SNMP::Info::IPv6 (...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
none.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<IP-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<IPV6-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-IETF-IP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
none.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2  Internet Address Table
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_n2p_addr()
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_n2p_if()
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_n2p_mac()
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_n2p_state()
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_n2p_type()
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_index()
 | 
			
		||||
 | 
			
		||||
Maps an IPv6 address to an interface C<ifIndex>
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_type()
 | 
			
		||||
 | 
			
		||||
Maps an IPv6 address to its type (unicast, anycast, etc.)
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_pfx_origin()
 | 
			
		||||
 | 
			
		||||
Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.)
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_addr_prefix()
 | 
			
		||||
 | 
			
		||||
Maps IPv6 addresses with their prefixes
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_addr_prefixlength()
 | 
			
		||||
 | 
			
		||||
Maps IPv6 addresses with their prefix length
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_addr()
 | 
			
		||||
 | 
			
		||||
Maps a table instance to an IPv6 address
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2  Internet Address Translation Table
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $info->c_inet_phys_address()
 | 
			
		||||
 | 
			
		||||
Maps an address of type C<cInetNetToMediaNetAddressType> on interface C<ifIndex> to a physical address.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 MUNGES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item munge_physaddr()
 | 
			
		||||
 | 
			
		||||
Takes an octet stream (HEX-STRING) and returns a colon separated ASCII hex
 | 
			
		||||
string.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										801
									
								
								lib/SNMP/Info/LLDP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										801
									
								
								lib/SNMP/Info/LLDP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,801 @@
 | 
			
		||||
# SNMP::Info::LLDP
 | 
			
		||||
#
 | 
			
		||||
# 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::LLDP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::LLDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'LLDP-MIB'          => 'lldpLocSysCapEnabled',
 | 
			
		||||
    'LLDP-EXT-MED-MIB'  => 'lldpXMedMIB',
 | 
			
		||||
    'LLDP-EXT-DOT1-MIB' => 'lldpXdot1MIB',
 | 
			
		||||
    'LLDP-EXT-DOT3-MIB' => 'lldpXdot3MIB',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    'lldp_sysname' => 'lldpLocSysName',
 | 
			
		||||
    'lldp_sysdesc' => 'lldpLocSysDesc',
 | 
			
		||||
    'lldp_sys_cap' => 'lldpLocSysCapEnabled',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # LLDP-MIB::lldpLocManAddrTable
 | 
			
		||||
    'lldp_lman_addr' => 'lldpLocManAddrIfId',
 | 
			
		||||
 | 
			
		||||
    # LLDP-MIB::lldpRemTable
 | 
			
		||||
    'lldp_rem_id_type'  => 'lldpRemChassisIdSubtype',
 | 
			
		||||
    'lldp_rem_id'       => 'lldpRemChassisId',
 | 
			
		||||
    'lldp_rem_pid_type' => 'lldpRemPortIdSubtype',
 | 
			
		||||
    'lldp_rem_pid'      => 'lldpRemPortId',
 | 
			
		||||
    'lldp_rem_desc'     => 'lldpRemPortDesc',
 | 
			
		||||
    'lldp_rem_sysname'  => 'lldpRemSysName',
 | 
			
		||||
    'lldp_rem_sysdesc'  => 'lldpRemSysDesc',
 | 
			
		||||
    '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',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'lldp_sysdesc'       => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_sysname'       => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_rem_sysname'   => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_rem_sysdesc'   => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_rem_port_desc' => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_sys_cap'       => \&SNMP::Info::munge_bits,
 | 
			
		||||
    'lldp_rem_sys_cap'   => \&SNMP::Info::munge_bits,
 | 
			
		||||
    'lldp_rem_cap_spt'   => \&SNMP::Info::munge_bits,
 | 
			
		||||
 | 
			
		||||
    '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 {
 | 
			
		||||
    my $lldp = shift;
 | 
			
		||||
 | 
			
		||||
    # We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
 | 
			
		||||
    # so we could be running LLDP but not return any useful information
 | 
			
		||||
    my $lldp_cap = $lldp->lldp_sys_cap();
 | 
			
		||||
    return 1 if defined $lldp_cap;
 | 
			
		||||
 | 
			
		||||
    # If the device doesn't return local system capabilities, fallback
 | 
			
		||||
    # by checking if it would report neighbors
 | 
			
		||||
    my $lldp_rem = $lldp->lldp_rem_id() || {};
 | 
			
		||||
    return 1 if scalar keys %$lldp_rem;
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_if {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $addr    = $lldp->lldp_rem_pid($partial) || {};
 | 
			
		||||
    my $i_descr = $lldp->i_description()        || {};
 | 
			
		||||
    my $i_alias = $lldp->i_alias()              || {};
 | 
			
		||||
    my %r_i_descr = reverse %$i_descr;
 | 
			
		||||
    my %r_i_alias = reverse %$i_alias;
 | 
			
		||||
 | 
			
		||||
    my %lldp_if;
 | 
			
		||||
    foreach my $key ( keys %$addr ) {
 | 
			
		||||
        my @aOID = split( '\.', $key );
 | 
			
		||||
        my $port = $aOID[1];
 | 
			
		||||
        next unless $port;
 | 
			
		||||
 | 
			
		||||
        # Local LLDP port may not equate to ifIndex, see LldpPortNumber
 | 
			
		||||
        # TEXTUAL-CONVENTION in LLDP-MIB. Cross reference lldpLocPortDesc
 | 
			
		||||
        # with ifDescr and ifAlias to get ifIndex, prefer ifDescr over
 | 
			
		||||
        # ifAlias because using cross ref with description is correct
 | 
			
		||||
        # behavior according to the LLDP-MIB. Some devices (eg H3C gear)
 | 
			
		||||
        # seem to use ifAlias though.
 | 
			
		||||
        my $lldp_desc = $lldp->lldpLocPortDesc($port);
 | 
			
		||||
        my $desc      = $lldp_desc->{$port};
 | 
			
		||||
 | 
			
		||||
        # If cross reference is successful use it, otherwise stick with
 | 
			
		||||
        # lldpRemLocalPortNum
 | 
			
		||||
        if ( $desc && exists $r_i_descr{$desc} ) {
 | 
			
		||||
            $port = $r_i_descr{$desc};
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $desc && exists $r_i_alias{$desc} ) {
 | 
			
		||||
            $port = $r_i_alias{$desc};
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $lldp_if{$key} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_ip {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_ip;
 | 
			
		||||
    foreach my $key ( keys %$rman_addr ) {
 | 
			
		||||
        my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next unless $proto == 1;
 | 
			
		||||
        $lldp_ip{$index} = $addr;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_ipv6 {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_ipv6;
 | 
			
		||||
    foreach my $key ( keys %$rman_addr ) {
 | 
			
		||||
        my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next unless $proto == 2;
 | 
			
		||||
        $lldp_ipv6{$index} = $addr;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_ipv6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_mac {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_ipv6;
 | 
			
		||||
    foreach my $key ( keys %$rman_addr ) {
 | 
			
		||||
        my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next unless $proto == 6;
 | 
			
		||||
        $lldp_ipv6{$index} = $addr;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_ipv6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_addr {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_ip;
 | 
			
		||||
    foreach my $key ( keys %$rman_addr ) {
 | 
			
		||||
        my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        $lldp_ip{$index} = $addr;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_port {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $pdesc = $lldp->lldp_rem_desc($partial)     || {};
 | 
			
		||||
    my $pid   = $lldp->lldp_rem_pid($partial)      || {};
 | 
			
		||||
    my $ptype = $lldp->lldp_rem_pid_type($partial) || {};
 | 
			
		||||
    my $desc  = $lldp->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_port;
 | 
			
		||||
    foreach my $key ( sort keys %$pid ) {
 | 
			
		||||
        my $port = $pdesc->{$key};
 | 
			
		||||
        my $type = $ptype->{$key};
 | 
			
		||||
        if (    $type
 | 
			
		||||
            and ( $type eq 'interfaceName' or $type eq 'local' )
 | 
			
		||||
            and ( defined $pid->{$key} and $pid->{$key} !~ /^\d+$/ ) )
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            # If the pid claims to be an interface name,
 | 
			
		||||
            # believe it.
 | 
			
		||||
            $port = $pid->{$key};
 | 
			
		||||
        }
 | 
			
		||||
        unless ($port) {
 | 
			
		||||
            $port = $pid->{$key};
 | 
			
		||||
            next unless $port;
 | 
			
		||||
            next unless $type;
 | 
			
		||||
 | 
			
		||||
          # May need to format other types in the future, i.e. Network address
 | 
			
		||||
            if ( $type =~ /mac/ ) {
 | 
			
		||||
                $port = SNMP::Info::munge_mac($port)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Avaya/Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
 | 
			
		||||
        # figure out slot.port based upon lldpRemPortDesc
 | 
			
		||||
        if ( defined $desc->{$key}
 | 
			
		||||
            && $desc->{$key}
 | 
			
		||||
            =~ /^Ethernet\s(?:Routing\s)?Switch\s\d|^Virtual\sServices\sPlatform\s\d/
 | 
			
		||||
            && $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ )
 | 
			
		||||
        {
 | 
			
		||||
            $port = defined $1 ? "$2.$3" : "1.$3";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $lldp_port{$key} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_id {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $ch_type = $lldp->lldp_rem_id_type($partial) || {};
 | 
			
		||||
    my $ch      = $lldp->lldp_rem_id($partial)      || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_id;
 | 
			
		||||
    foreach my $key ( keys %$ch ) {
 | 
			
		||||
        my $id = $ch->{$key};
 | 
			
		||||
        next unless $id;
 | 
			
		||||
        my $type = $ch_type->{$key};
 | 
			
		||||
        next unless $type;
 | 
			
		||||
 | 
			
		||||
        # May need to format other types in the future
 | 
			
		||||
        if ( $type =~ /mac/ ) {
 | 
			
		||||
            $id = SNMP::Info::munge_mac($id)
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $type eq 'networkAddress' ) {
 | 
			
		||||
            if ( length( unpack( 'H*', $id ) ) == 10 ) {
 | 
			
		||||
 | 
			
		||||
                # IP address - first octet is IANA Address Family Number, need
 | 
			
		||||
                # walk with IPv6
 | 
			
		||||
                my @octets
 | 
			
		||||
                    = ( map { sprintf "%02x", $_ } unpack( 'C*', $id ) )
 | 
			
		||||
                    [ 1 .. 4 ];
 | 
			
		||||
                $id = join '.', map { hex($_) } @octets;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        $lldp_id{$key} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_platform {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rid  = $lldp->lldp_rem_id($partial)      || {};
 | 
			
		||||
    my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
 | 
			
		||||
    my $name = $lldp->lldp_rem_sysname($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_platform;
 | 
			
		||||
    foreach my $key ( keys %$rid ) {
 | 
			
		||||
        $lldp_platform{$key} = $desc->{$key} || $name->{$key};
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_cap {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp_caps = $lldp->lldp_rem_cap_spt($partial) || {};
 | 
			
		||||
 | 
			
		||||
    # Encoded as BITS which Perl Net-SNMP implementation doesn't seem to
 | 
			
		||||
    # be able to enumerate for us, so we have to get it from the MIB
 | 
			
		||||
    # and enumerate ourselves
 | 
			
		||||
    my $oid
 | 
			
		||||
        = SNMP::translateObj( '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'}
 | 
			
		||||
        : {}
 | 
			
		||||
    );
 | 
			
		||||
    my %r_enums = reverse %$enums;
 | 
			
		||||
 | 
			
		||||
    my %lldp_cap;
 | 
			
		||||
    foreach my $key ( keys %$lldp_caps ) {
 | 
			
		||||
        my $cap_bits = $lldp_caps->{$key};
 | 
			
		||||
        next unless $cap_bits;
 | 
			
		||||
 | 
			
		||||
        my $count = 0;
 | 
			
		||||
        foreach my $bit ( split //, $cap_bits ) {
 | 
			
		||||
            if ($bit) {
 | 
			
		||||
                push( @{ $lldp_cap{$key} }, $r_enums{$count} );
 | 
			
		||||
            }
 | 
			
		||||
            $count++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_cap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#sub root_ip {
 | 
			
		||||
#    my $lldp = shift;
 | 
			
		||||
#
 | 
			
		||||
#    my $man_addr = $lldp->lldp_lman_addr() || {};
 | 
			
		||||
#
 | 
			
		||||
#    foreach my $key (keys %$man_addr) {
 | 
			
		||||
#        my @oids   = split(/\./, $key);
 | 
			
		||||
#        my $proto  = shift(@oids);
 | 
			
		||||
#        my $length = shift(@oids);
 | 
			
		||||
#        # IPv4
 | 
			
		||||
#        if ($proto == 1) {
 | 
			
		||||
#            my $addr = join('.',@oids);
 | 
			
		||||
#            return $addr if (defined $addr and $lldp->snmp_connect_ip($addr));
 | 
			
		||||
#        }
 | 
			
		||||
#    }
 | 
			
		||||
#    return;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
# Break up the lldpRemManAddrTable INDEX into common index, protocol,
 | 
			
		||||
# and address.
 | 
			
		||||
sub _lldp_addr_index {
 | 
			
		||||
    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 ) {
 | 
			
		||||
        return ( $index, $proto, join( '.', @oids ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # IPv6
 | 
			
		||||
    elsif ( $proto == 2 ) {
 | 
			
		||||
        return ( $index, $proto,
 | 
			
		||||
            join( ':', unpack( '(H4)*', pack( 'C*', @oids ) ) ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # MAC
 | 
			
		||||
    elsif ( $proto == 6 ) {
 | 
			
		||||
        return ( $index, $proto,
 | 
			
		||||
            join( ':', map { sprintf "%02x", $_ } @oids ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # TODO - Other protocols may be used as well; implement when needed?
 | 
			
		||||
    else {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::LLDP - SNMP Interface to the Link Layer Discovery Protocol (LLDP)
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $lldp = new SNMP::Info (
 | 
			
		||||
                             AutoSpecify => 1,
 | 
			
		||||
                             Debug       => 1,
 | 
			
		||||
                             DestHost    => 'router',
 | 
			
		||||
                             Community   => 'public',
 | 
			
		||||
                             Version     => 2
 | 
			
		||||
                           );
 | 
			
		||||
 | 
			
		||||
 my $class = $lldp->class();
 | 
			
		||||
 print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
 $haslldp   = $lldp->hasLLDP() ? 'yes' : 'no';
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with LLDP neighbors:
 | 
			
		||||
 my $interfaces    = $lldp->interfaces();
 | 
			
		||||
 my $lldp_if       = $lldp->lldp_if();
 | 
			
		||||
 my $lldp_ip       = $lldp->lldp_ip();
 | 
			
		||||
 my $lldp_port     = $lldp->lldp_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $lldp_key (keys %$lldp_ip){
 | 
			
		||||
    my $iid           = $lldp_if->{$lldp_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $lldp_ip->{$lldp_key};
 | 
			
		||||
    my $neighbor_port = $lldp_port->{$lldp_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
identity and capabilities on the local network providing topology information.
 | 
			
		||||
The protocol is defined in the IEEE standard 802.1AB.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherits this class.  Do not use
 | 
			
		||||
directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<LLDP-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<LLDP-EXT-MED-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<LLDP-EXT-DOT1-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<LLDP-EXT-DOT3-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $lldp->hasLLDP()
 | 
			
		||||
 | 
			
		||||
Is LLDP is active in this device?
 | 
			
		||||
 | 
			
		||||
Note:  LLDP may be active, but nothing in C<lldpRemoteSystemsData> Tables so
 | 
			
		||||
the device would not return any useful topology information.
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_sysname()
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
(C<lldpLocSysName>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_sysdesc()
 | 
			
		||||
 | 
			
		||||
The string value used to identify the system description of the local system.
 | 
			
		||||
If the local agent supports IETF RFC 3418, C<lldpLocSysDesc> object should
 | 
			
		||||
have the same value of C<sysDesc> object.
 | 
			
		||||
 | 
			
		||||
Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpLocSysDesc>)
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
from the table below:
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Bit 'other(0)' indicates that the system has capabilities other than
 | 
			
		||||
those listed below.
 | 
			
		||||
 | 
			
		||||
=item Bit 'repeater(1)' indicates that the system has repeater capability.
 | 
			
		||||
 | 
			
		||||
=item Bit 'bridge(2)' indicates that the system has bridge capability.
 | 
			
		||||
 | 
			
		||||
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
 | 
			
		||||
point capability.
 | 
			
		||||
 | 
			
		||||
=item Bit 'router(4)' indicates that the system has router capability.
 | 
			
		||||
 | 
			
		||||
=item Bit 'telephone(5)' indicates that the system has telephone capability.
 | 
			
		||||
 | 
			
		||||
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
 | 
			
		||||
Device capability (IETF RFC 2669 & 2670).
 | 
			
		||||
 | 
			
		||||
=item Bit 'stationOnly(7)' indicates that the system has only station
 | 
			
		||||
capability and nothing else."
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
(C<lldpLocSysCapEnabled>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_id()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the chassis component associated
 | 
			
		||||
with the remote system.
 | 
			
		||||
 | 
			
		||||
(C<lldpRemChassisId>)
 | 
			
		||||
 | 
			
		||||
=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>),
 | 
			
		||||
if unable defaults to (C<lldpRemLocalPortNum>).
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IPv4 address.  Returns for all other address types, use
 | 
			
		||||
lldp_addr if you want any return address type.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_ipv6()
 | 
			
		||||
 | 
			
		||||
Returns remote IPv6 address, if known.  Returns for all other address types,
 | 
			
		||||
use lldp_addr if you don't care about return address type.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_mac()
 | 
			
		||||
 | 
			
		||||
Returns remote (management) MAC address, if known.  Returns for all other
 | 
			
		||||
address types, use lldp_addr if you don't care about return address type.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_addr()
 | 
			
		||||
 | 
			
		||||
Returns remote address.  Type may be any IANA Address Family Number.
 | 
			
		||||
Currently only returns IPv4, IPv6 or MAC addresses. If the remote device
 | 
			
		||||
returns more than one address type, this method will give only one. Which one
 | 
			
		||||
is returned is decided by chance, phase of the moon and Perl hash ordering.
 | 
			
		||||
 | 
			
		||||
Use lldp_mac, lldp_ip or lldp_ipv6 if you want a specific address type.
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_platform()
 | 
			
		||||
 | 
			
		||||
Tries to return something useful from C<lldp_rem_sysdesc()> or
 | 
			
		||||
C<lldp_rem_sysname()>.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_cap()
 | 
			
		||||
 | 
			
		||||
Returns hash of arrays with each array containing the system capabilities
 | 
			
		||||
supported by the remote system.  Possible elements in the array are
 | 
			
		||||
enumerated from C<LldpSystemCapabilitiesMap>.
 | 
			
		||||
 | 
			
		||||
=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>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_id_type()
 | 
			
		||||
 | 
			
		||||
Returns the type of encoding used to identify the chassis associated with
 | 
			
		||||
the remote system.
 | 
			
		||||
 | 
			
		||||
(C<lldpRemChassisIdSubtype>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_id()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the chassis component associated
 | 
			
		||||
with the remote system.
 | 
			
		||||
 | 
			
		||||
(C<lldpRemChassisId>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_pid_type()
 | 
			
		||||
 | 
			
		||||
Returns the type of port identifier encoding used in the associated
 | 
			
		||||
C<lldpRemPortId> object.
 | 
			
		||||
 | 
			
		||||
(C<lldpRemPortIdSubtype>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_pid()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the port component associated with
 | 
			
		||||
the remote system.
 | 
			
		||||
 | 
			
		||||
(C<lldpRemPortId>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_desc()
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
(C<lldpRemPortDesc>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_sysname()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the system name of the remote
 | 
			
		||||
system.
 | 
			
		||||
 | 
			
		||||
Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpRemSysName>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_sysdesc()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the system description of the
 | 
			
		||||
remote system.
 | 
			
		||||
 | 
			
		||||
Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpRemSysDesc>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_hw_rev()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the hardware revision of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemHardwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_fw_rev()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the firmware revision of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemHardwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_sw_rev()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the software revision of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemSoftwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_serial()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the serial number of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemSerialNum>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_vendor()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the manufacturer of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemMfgName>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_asset()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the asset number of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemAssetID>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_model()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the model of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemModelName>)
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_rem_media_cap_spt()
 | 
			
		||||
 | 
			
		||||
Returns which media capabilities are supported on the remote system. Results
 | 
			
		||||
are munged into an ascii binary string, LSB.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_rem_media_cap()
 | 
			
		||||
 | 
			
		||||
Returns which media capabilities are enabled on the remote system. Results
 | 
			
		||||
are munged into an ascii binary string, LSB.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_rem_sys_cap()
 | 
			
		||||
 | 
			
		||||
Returns which system capabilities are enabled on the remote system.  Results
 | 
			
		||||
are munged into an ascii binary string, LSB.  Each digit represents a bit
 | 
			
		||||
from the table below:
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Bit 'other(0)' indicates that the system has capabilities other than
 | 
			
		||||
those listed below.
 | 
			
		||||
 | 
			
		||||
=item Bit 'repeater(1)' indicates that the system has repeater capability.
 | 
			
		||||
 | 
			
		||||
=item Bit 'bridge(2)' indicates that the system has bridge capability.
 | 
			
		||||
 | 
			
		||||
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
 | 
			
		||||
point capability.
 | 
			
		||||
 | 
			
		||||
=item Bit 'router(4)' indicates that the system has router capability.
 | 
			
		||||
 | 
			
		||||
=item Bit 'telephone(5)' indicates that the system has telephone capability.
 | 
			
		||||
 | 
			
		||||
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
 | 
			
		||||
Device capability (IETF RFC 2669 & 2670).
 | 
			
		||||
 | 
			
		||||
=item Bit 'stationOnly(7)' indicates that the system has only station
 | 
			
		||||
capability and nothing else."
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
(C<lldpRemSysCapEnabled>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										343
									
								
								lib/SNMP/Info/Layer1.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										343
									
								
								lib/SNMP/Info/Layer1.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,343 @@
 | 
			
		||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer1::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Layer1::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::GLOBALS,
 | 
			
		||||
    'ports_managed' => 'ifNumber',
 | 
			
		||||
    'rptr_slots'    => 'rptrGroupCapacity',
 | 
			
		||||
    'slots'         => 'rptrGroupCapacity',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,
 | 
			
		||||
    'rptr_ports'    => 'rptrGroupPortCapacity',
 | 
			
		||||
    'rptr_port'     => 'rptrPortIndex',
 | 
			
		||||
    'rptr_slot'     => 'rptrPortGroupIndex',
 | 
			
		||||
    'rptr_up_admin' => 'rptrPortAdminStatus',
 | 
			
		||||
    'rptr_up'       => 'rptrPortOperStatus',
 | 
			
		||||
    'rptr_last_src' => 'rptrAddrTrackNewLastSrcAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::MUNGE,
 | 
			
		||||
    'rptr_last_src' => \&SNMP::Info::munge_mac,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
# assuming managed ports aren't in repeater ports?
 | 
			
		||||
sub ports {
 | 
			
		||||
    my $l1 = shift;
 | 
			
		||||
 | 
			
		||||
    my $ports      = $l1->ports_managed();
 | 
			
		||||
    my $rptr_ports = $l1->rptr_ports();
 | 
			
		||||
 | 
			
		||||
    foreach my $group ( keys %$rptr_ports ) {
 | 
			
		||||
        $ports += $rptr_ports->{$group};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $ports;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $l1->model() - Looks at sysObjectID which gives the oid of the system
 | 
			
		||||
#       name, contained in a proprietary MIB.
 | 
			
		||||
sub model {
 | 
			
		||||
    my $l1    = shift;
 | 
			
		||||
    my $id    = $l1->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    # HP
 | 
			
		||||
    $model =~ s/^hpswitch//i;
 | 
			
		||||
 | 
			
		||||
    # Cisco
 | 
			
		||||
    $model =~ s/sysid$//i;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $l1    = shift;
 | 
			
		||||
    my $descr = $l1->description();
 | 
			
		||||
 | 
			
		||||
    return 'hp'     if ( $descr =~ /hp/i );
 | 
			
		||||
    return 'cisco'  if ( $descr =~ /(catalyst|cisco|ios)/i );
 | 
			
		||||
    return 'allied' if ( $descr =~ /allied/i );
 | 
			
		||||
    return 'asante' if ( $descr =~ /asante/i );
 | 
			
		||||
 | 
			
		||||
    return 'unknown';
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# By Default we'll use the description field
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $l1      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l1->i_index($partial)   || {};
 | 
			
		||||
    my $rptr_port  = $l1->rptr_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $port ( keys %$rptr_port ) {
 | 
			
		||||
        $interfaces->{$port} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return $interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up_admin {
 | 
			
		||||
    my $l1      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_up_admin    = $l1->SUPER::i_up_admin($partial) || {};
 | 
			
		||||
    my $rptr_up_admin = $l1->rptr_up_admin($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $key ( keys %$rptr_up_admin ) {
 | 
			
		||||
        my $up = $rptr_up_admin->{$key};
 | 
			
		||||
        $i_up_admin->{$key} = 'up'   if $up =~ /enabled/;
 | 
			
		||||
        $i_up_admin->{$key} = 'down' if $up =~ /disabled/;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_up_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $l1      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_up    = $l1->SUPER::i_up($partial) || {};
 | 
			
		||||
    my $rptr_up = $l1->rptr_up($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $key ( keys %$rptr_up ) {
 | 
			
		||||
        my $up = $rptr_up->{$key};
 | 
			
		||||
        $i_up->{$key} = 'up' if $up =~ /operational/;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_up;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1 - SNMP Interface to network devices serving Layer1 only.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $l1 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $l1->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
 # Let's get some basic Port information
 | 
			
		||||
 my $interfaces = $l1->interfaces();
 | 
			
		||||
 my $i_up       = $l1->i_up();
 | 
			
		||||
 my $i_speed    = $l1->i_speed();
 | 
			
		||||
 | 
			
		||||
 foreach my $iid (keys %$interfaces) {
 | 
			
		||||
    my $port  = $interfaces->{$iid};
 | 
			
		||||
    my $up    = $i_up->{$iid};
 | 
			
		||||
    my $speed = $i_speed->{$iid}
 | 
			
		||||
    print "Port $port is $up. Port runs at $speed.\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
 my $l1 = new SNMP::Info::Layer1(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<SNMP-REPEATER-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
MIBs required for L<SNMP::Info/"REQUIREMENTS">
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info/"REQUIREMENTS"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l1->ports_managed()
 | 
			
		||||
 | 
			
		||||
Gets the number of ports under the interface mib
 | 
			
		||||
 | 
			
		||||
(C<ifNumber>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l1->model()
 | 
			
		||||
 | 
			
		||||
Cross references $l1->id() with product IDs.
 | 
			
		||||
 | 
			
		||||
For HP devices, removes C<'hpswitch'> from the name
 | 
			
		||||
 | 
			
		||||
For Cisco devices, removes C<'sysid'> from the name
 | 
			
		||||
 | 
			
		||||
=item $l1->vendor()
 | 
			
		||||
 | 
			
		||||
Tries to discover the vendor from $l1->model() and $l1->vendor()
 | 
			
		||||
 | 
			
		||||
=item $l1->ports()
 | 
			
		||||
 | 
			
		||||
Adds the values from rptr_ports() and ports_managed()
 | 
			
		||||
 | 
			
		||||
=item $l1->slots()
 | 
			
		||||
 | 
			
		||||
Number of 'groups' in the Repeater MIB
 | 
			
		||||
 | 
			
		||||
(C<rptrGroupCapacity>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"USAGE"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l1->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to the map between IID and physical Port.
 | 
			
		||||
 | 
			
		||||
=item $l1->i_up()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to link status.
 | 
			
		||||
 | 
			
		||||
=item $l1->i_up_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to administrative link status.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Repeater MIB
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_ports()
 | 
			
		||||
 | 
			
		||||
Number of ports in each group.
 | 
			
		||||
 | 
			
		||||
(C<rptrGroupPortCapacity>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_port()
 | 
			
		||||
 | 
			
		||||
Port number in Group
 | 
			
		||||
 | 
			
		||||
(C<rptrPortIndex>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_slot()
 | 
			
		||||
 | 
			
		||||
Group (slot) Number for given port.
 | 
			
		||||
 | 
			
		||||
(C<rptrPortGroupIndex>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_up_admin()
 | 
			
		||||
 | 
			
		||||
(C<rptrPortAdminStatus>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_up()
 | 
			
		||||
 | 
			
		||||
(C<rptrPortOperStatus>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_last_src()
 | 
			
		||||
 | 
			
		||||
(C<rptrAddrTrackNewLastSrcAddress>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"USAGE"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										246
									
								
								lib/SNMP/Info/Layer1/Allied.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										246
									
								
								lib/SNMP/Info/Layer1/Allied.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,246 @@
 | 
			
		||||
# SNMP::Info::Layer1::Allied
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::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//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer1::FUNCS,
 | 
			
		||||
    'ati_p_name' => 'portName',
 | 
			
		||||
    'ati_up'     => 'linkTestLED',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer1::MIBS,
 | 
			
		||||
    'ATI-MIB' => 'atiPortGroupIndex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer1::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'allied';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'allied';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
    my $descr  = $allied->description();
 | 
			
		||||
 | 
			
		||||
    if ( defined ($descr) && $descr =~ m/version (\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
 | 
			
		||||
    my $desc = $allied->description();
 | 
			
		||||
 | 
			
		||||
    if ( defined ($desc) && $desc =~ /(AT-\d{4}\S{1})/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $allied  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_name     = $allied->orig_i_name($partial) || {};
 | 
			
		||||
    my $ati_p_name = $allied->ati_p_name($partial)  || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $port ( keys %$ati_p_name ) {
 | 
			
		||||
        my $name = $ati_p_name->{$port};
 | 
			
		||||
        $i_name->{$port} = $name if ( defined $name and $name !~ /^\s*$/ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $allied  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
 | 
			
		||||
    my $ati_up = $allied->ati_up($partial) || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $port ( keys %$ati_up ) {
 | 
			
		||||
        my $up = $ati_up->{$port};
 | 
			
		||||
        $i_up->{$port} = 'down' if $up eq 'linktesterror';
 | 
			
		||||
        $i_up->{$port} = 'up'   if $up eq 'nolinktesterror';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_up;
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1::Allied - SNMP Interface to old Allied Hubs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a
 | 
			
		||||
Allied device through SNMP. See inherited classes' documentation for
 | 
			
		||||
inherited methods.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ATI-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $allied->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'allied' :)
 | 
			
		||||
 | 
			
		||||
=item $allied->os()
 | 
			
		||||
 | 
			
		||||
Returns 'allied'
 | 
			
		||||
 | 
			
		||||
=item $allied->os_ver()
 | 
			
		||||
 | 
			
		||||
Culls Version from description()
 | 
			
		||||
 | 
			
		||||
=item $allied->root_ip()
 | 
			
		||||
 | 
			
		||||
Returns IP Address of Managed Hub.
 | 
			
		||||
 | 
			
		||||
(C<actualIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $allied->model()
 | 
			
		||||
 | 
			
		||||
Tries to cull out C<AT-nnnnX> out of the description field.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $allied->i_name()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to human-set port name.
 | 
			
		||||
 | 
			
		||||
=item $allied->i_up()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to link status.  Changes
 | 
			
		||||
the values of ati_up() to 'up' and 'down'.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Allied MIB
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $allied->ati_p_name()
 | 
			
		||||
 | 
			
		||||
(C<portName>)
 | 
			
		||||
 | 
			
		||||
=item $allied->ati_up()
 | 
			
		||||
 | 
			
		||||
(C<linkTestLED>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										295
									
								
								lib/SNMP/Info/Layer1/Asante.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								lib/SNMP/Info/Layer1/Asante.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,295 @@
 | 
			
		||||
# SNMP::Info::Layer1::Asante
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::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//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer1::FUNCS,
 | 
			
		||||
    'asante_port'  => 'ePortIndex',
 | 
			
		||||
    'asante_group' => 'ePortGrpIndex',
 | 
			
		||||
    'i_type'       => 'ePortGrpIndex',
 | 
			
		||||
    'asante_up'    => 'ePortStateLinkStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-AH1012-MIB' => 'asante' );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $asante  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rptr_port = $asante->rptr_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %interfaces;
 | 
			
		||||
 | 
			
		||||
    foreach my $port ( keys %$rptr_port ) {
 | 
			
		||||
        $interfaces{$port} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'asante';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
    my $descr  = $asante->description();
 | 
			
		||||
 | 
			
		||||
    if ( defined ($descr) && $descr =~ /software v(\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'asante';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
 | 
			
		||||
    my $id    = $asante->id();
 | 
			
		||||
    my $model = SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $asante  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $asante_up = $asante->asante_up($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my $i_up = {};
 | 
			
		||||
    foreach my $port ( keys %$asante_up ) {
 | 
			
		||||
        my $up = $asante_up->{$port};
 | 
			
		||||
        $i_up->{$port} = 'down' if $up =~ /off/;
 | 
			
		||||
        $i_up->{$port} = 'up'   if $up =~ /on/;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_up;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed {
 | 
			
		||||
    my $asante  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_speed = $asante->orig_i_speed($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_speed;
 | 
			
		||||
 | 
			
		||||
    $i_speed{"1.2"} = $i_speed->{1};
 | 
			
		||||
 | 
			
		||||
    return \%i_speed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $asante  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_mac = $asante->orig_i_mac($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_mac;
 | 
			
		||||
 | 
			
		||||
    $i_mac{"1.2"} = $i_mac->{1};
 | 
			
		||||
 | 
			
		||||
    return \%i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_description {
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $asante  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_name = $asante->orig_i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
 | 
			
		||||
    $i_name{"1.2"} = $i_name->{1};
 | 
			
		||||
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1::Asante - SNMP Interface to old Asante 1012 Hubs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from an
 | 
			
		||||
Asante device through SNMP.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ASANTE-AH1012-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $asante->os()
 | 
			
		||||
 | 
			
		||||
Returns 'asante'
 | 
			
		||||
 | 
			
		||||
=item $asante->os_ver()
 | 
			
		||||
 | 
			
		||||
Culls software version from description()
 | 
			
		||||
 | 
			
		||||
=item $asante->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'asante'
 | 
			
		||||
 | 
			
		||||
=item $asante->model()
 | 
			
		||||
 | 
			
		||||
Cross references $asante->id() to the F<ASANTE-AH1012-MIB> and returns
 | 
			
		||||
the results.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $asante->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to the map between IID and physical Port.
 | 
			
		||||
 | 
			
		||||
=item $asante->i_description()
 | 
			
		||||
 | 
			
		||||
Description of the interface.
 | 
			
		||||
 | 
			
		||||
=item $asante->i_mac()
 | 
			
		||||
 | 
			
		||||
MAC address of the interface.  Note this is just the MAC of the port, not
 | 
			
		||||
anything connected to it.
 | 
			
		||||
 | 
			
		||||
=item $asante->i_name()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to human-set port name.
 | 
			
		||||
 | 
			
		||||
=item $asante->i_up()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to link status.  Changes
 | 
			
		||||
the values of asante_up() to 'up' and 'down'.
 | 
			
		||||
 | 
			
		||||
=item $asante->i_speed()
 | 
			
		||||
 | 
			
		||||
Speed of the link, human format.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Asante MIB
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $asante->ati_p_name()
 | 
			
		||||
 | 
			
		||||
(C<portName>)
 | 
			
		||||
 | 
			
		||||
=item $asante->ati_up()
 | 
			
		||||
 | 
			
		||||
(C<linkTestLED>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										731
									
								
								lib/SNMP/Info/Layer1/Bayhub.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										731
									
								
								lib/SNMP/Info/Layer1/Bayhub.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,731 @@
 | 
			
		||||
# SNMP::Info::Layer1::Bayhub
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Eric Miller, Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::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/;
 | 
			
		||||
@SNMP::Info::Layer1::Bayhub::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::NortelStack::MIBS,
 | 
			
		||||
    %SNMP::Info::SONMP::MIBS,
 | 
			
		||||
    'S5-ETHERNET-COMMON-MIB' => 's5EnPortTable',
 | 
			
		||||
    'S5-COMMON-STATS-MIB'    => 's5CmStat',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
 | 
			
		||||
    %SNMP::Info::SONMP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::NortelStack::FUNCS,
 | 
			
		||||
    %SNMP::Info::SONMP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # S5-ETHERNET-COMMON-MIB::s5EnPortTable
 | 
			
		||||
    'bayhub_pb_index' => 's5EnPortBrdIndx',
 | 
			
		||||
    'bayhub_pp_index' => 's5EnPortIndx',
 | 
			
		||||
    'bayhub_up_admin' => 's5EnPortPartStatus',
 | 
			
		||||
    'bayhub_up'       => 's5EnPortLinkStatus',
 | 
			
		||||
 | 
			
		||||
    # S5-ETHERNET-COMMON-MIB::s5EnPortExtTable
 | 
			
		||||
    'bayhub_p_speed' => 's5EnPortExtActiveSpeed',
 | 
			
		||||
    'bayhub_p_cap'   => 's5EnPortExtHwCapability',
 | 
			
		||||
    'bayhub_p_adv'   => 's5EnPortExtAutoNegAdv',
 | 
			
		||||
 | 
			
		||||
    # S5-COMMON-STATS-MIB::s5CmSNodeTable
 | 
			
		||||
    'bayhub_nb_index' => 's5CmSNodeBrdIndx',
 | 
			
		||||
    'bayhub_np_index' => 's5CmSNodePortIndx',
 | 
			
		||||
    'fw_mac'          => 's5CmSNodeMacAddr',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE, %SNMP::Info::NortelStack::MUNGE,
 | 
			
		||||
    %SNMP::Info::SONMP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
    return '00000011';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'bay_hub';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $bayhub = shift;
 | 
			
		||||
    my $id     = $bayhub->id();
 | 
			
		||||
    return unless defined $id;
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
    $model =~ s/^sreg-//i;
 | 
			
		||||
 | 
			
		||||
    return 'Baystack Hub' if ( $model =~ /BayStack/ );
 | 
			
		||||
    return '5000'         if ( $model =~ /5000/ );
 | 
			
		||||
    return '5005'         if ( $model =~ /5005/ );
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Hubs do not support ifMIB requirements for get MAC
 | 
			
		||||
# and port status
 | 
			
		||||
 | 
			
		||||
sub i_index {
 | 
			
		||||
    my $bayhub  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $b_index = $bayhub->bayhub_pb_index($partial) || {};
 | 
			
		||||
    my $p_index = $bayhub->bayhub_pp_index($partial) || {};
 | 
			
		||||
    my $model   = $bayhub->model()                   || 'Baystack Hub';
 | 
			
		||||
 | 
			
		||||
    my %i_index;
 | 
			
		||||
    foreach my $iid ( keys %$b_index ) {
 | 
			
		||||
        my $board = $b_index->{$iid};
 | 
			
		||||
        next unless defined $board;
 | 
			
		||||
        my $port = $p_index->{$iid} || 0;
 | 
			
		||||
 | 
			
		||||
        if ( $model eq 'Baystack Hub' ) {
 | 
			
		||||
            my $comidx = $board;
 | 
			
		||||
            if ( !( $comidx % 5 ) ) {
 | 
			
		||||
                $board = ( $board / 5 );
 | 
			
		||||
            }
 | 
			
		||||
            elsif ( $comidx =~ /[16]$/ ) {
 | 
			
		||||
                $board = int( $board / 5 );
 | 
			
		||||
                $port  = 25;
 | 
			
		||||
            }
 | 
			
		||||
            elsif ( $comidx =~ /[27]$/ ) {
 | 
			
		||||
                $board = int( $board / 5 );
 | 
			
		||||
                $port  = 26;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $index = ( $board * 256 ) + $port;
 | 
			
		||||
 | 
			
		||||
        $i_index{$iid} = $index;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Partials don't really help in this class, but implemented
 | 
			
		||||
# for consistency
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $bayhub  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $bayhub->i_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        # Index numbers are deterministic slot * 256 + port
 | 
			
		||||
        my $port = $index % 256;
 | 
			
		||||
        my $slot = int( $index / 256 );
 | 
			
		||||
 | 
			
		||||
        my $slotport = "$slot.$port";
 | 
			
		||||
 | 
			
		||||
        $if{$index} = $slotport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $bayhub  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_index = $bayhub->i_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $iid ( keys %$port_index ) {
 | 
			
		||||
        my $index = $port_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        my $duplex = 'half';
 | 
			
		||||
        $i_duplex{$index} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $bayhub  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_index = $bayhub->i_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $iid ( keys %$port_index ) {
 | 
			
		||||
        my $index = $port_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        my $duplex = 'half';
 | 
			
		||||
        $i_duplex_admin{$index} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed {
 | 
			
		||||
    my $bayhub  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_index = $bayhub->i_index()        || {};
 | 
			
		||||
    my $port_speed = $bayhub->bayhub_p_speed() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_speed;
 | 
			
		||||
    foreach my $iid ( keys %$port_index ) {
 | 
			
		||||
        my $index = $port_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
        my $speed = $port_speed->{$iid} || '10 Mbps';
 | 
			
		||||
 | 
			
		||||
        $speed = '10 Mbps'  if $speed =~ /bps10M/i;
 | 
			
		||||
        $speed = '100 Mbps' if $speed =~ /bps100M/i;
 | 
			
		||||
        $i_speed{$index} = $speed;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_speed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $bayhub  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_index = $bayhub->i_index()   || {};
 | 
			
		||||
    my $link_stat  = $bayhub->bayhub_up() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_up;
 | 
			
		||||
    foreach my $iid ( keys %$port_index ) {
 | 
			
		||||
        my $index = $port_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
        my $link_stat = $link_stat->{$iid};
 | 
			
		||||
        next unless defined $link_stat;
 | 
			
		||||
 | 
			
		||||
        $link_stat = 'up'   if $link_stat =~ /on/i;
 | 
			
		||||
        $link_stat = 'down' if $link_stat =~ /off/i;
 | 
			
		||||
 | 
			
		||||
        $i_up{$index} = $link_stat;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_up;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up_admin {
 | 
			
		||||
    my $bayhub  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index   = $bayhub->i_index()         || {};
 | 
			
		||||
    my $link_stat = $bayhub->bayhub_up_admin() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_up_admin;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
        my $link_stat = $link_stat->{$iid};
 | 
			
		||||
        next unless defined $link_stat;
 | 
			
		||||
 | 
			
		||||
        $i_up_admin{$index} = $link_stat;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_up_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_up_admin {
 | 
			
		||||
 | 
			
		||||
    # map setting to those the hub will understand
 | 
			
		||||
    my %setting = qw/up 2 down 3/;
 | 
			
		||||
 | 
			
		||||
    my $bayhub = shift;
 | 
			
		||||
    my ( $setting, $iid ) = @_;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $bayhub->i_index() || {};
 | 
			
		||||
    my %reverse_i_index = reverse %$i_index;
 | 
			
		||||
 | 
			
		||||
    $setting = lc($setting);
 | 
			
		||||
 | 
			
		||||
    return 0 unless defined $setting{$setting};
 | 
			
		||||
 | 
			
		||||
    $iid = $reverse_i_index{$iid};
 | 
			
		||||
 | 
			
		||||
    return $bayhub->set_bayhub_up_admin( $setting{$setting}, $iid );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Hubs do not support the standard Bridge MIB
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $bayhub  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $b_index = $bayhub->bayhub_nb_index() || {};
 | 
			
		||||
    my $p_index = $bayhub->bayhub_np_index() || {};
 | 
			
		||||
    my $model   = $bayhub->model()           || 'Baystack Hub';
 | 
			
		||||
 | 
			
		||||
    my %bp_index;
 | 
			
		||||
    foreach my $iid ( keys %$b_index ) {
 | 
			
		||||
        my $board = $b_index->{$iid};
 | 
			
		||||
        next unless defined $board;
 | 
			
		||||
        my $port = $p_index->{$iid} || 0;
 | 
			
		||||
 | 
			
		||||
        if ( $model eq 'Baystack Hub' ) {
 | 
			
		||||
            my $comidx = $board;
 | 
			
		||||
            if ( !( $comidx % 5 ) ) {
 | 
			
		||||
                $board = ( $board / 5 );
 | 
			
		||||
            }
 | 
			
		||||
            elsif ( $comidx =~ /[16]$/ ) {
 | 
			
		||||
                $board = int( $board / 5 );
 | 
			
		||||
                $port  = 25;
 | 
			
		||||
            }
 | 
			
		||||
            elsif ( $comidx =~ /[27]$/ ) {
 | 
			
		||||
                $board = int( $board / 5 );
 | 
			
		||||
                $port  = 26;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $index = ( $board * 256 ) + $port;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        $bp_index{$index} = $index;
 | 
			
		||||
    }
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $bayhub = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $bayhub->SUPER::fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $bayhub  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $b_index = $bayhub->bayhub_nb_index($partial) || {};
 | 
			
		||||
    my $p_index = $bayhub->bayhub_np_index($partial) || {};
 | 
			
		||||
    my $model   = $bayhub->model()                   || 'Baystack Hub';
 | 
			
		||||
 | 
			
		||||
    my %fw_port;
 | 
			
		||||
    foreach my $iid ( keys %$b_index ) {
 | 
			
		||||
        my $board = $b_index->{$iid};
 | 
			
		||||
        next unless defined $board;
 | 
			
		||||
        my $port = $p_index->{$iid} || 0;
 | 
			
		||||
 | 
			
		||||
        if ( $model eq 'Baystack Hub' ) {
 | 
			
		||||
            my $comidx = $board;
 | 
			
		||||
            if ( !( $comidx % 5 ) ) {
 | 
			
		||||
                $board = ( $board / 5 );
 | 
			
		||||
            }
 | 
			
		||||
            elsif ( $comidx =~ /[16]$/ ) {
 | 
			
		||||
                $board = int( $board / 5 );
 | 
			
		||||
                $port  = 25;
 | 
			
		||||
            }
 | 
			
		||||
            elsif ( $comidx =~ /[27]$/ ) {
 | 
			
		||||
                $board = int( $board / 5 );
 | 
			
		||||
                $port  = 26;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $index = ( $board * 256 ) + $port;
 | 
			
		||||
 | 
			
		||||
        $fw_port{$iid} = $index;
 | 
			
		||||
    }
 | 
			
		||||
    return \%fw_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub index_factor {
 | 
			
		||||
    return 256;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub slot_offset {
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Devices do not support ENTITY-MIB use proprietary methods.
 | 
			
		||||
 | 
			
		||||
sub e_index {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_index($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_class {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_class($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_descr {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_descr($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_name {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_name($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_fwver {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_fwver($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_hwver {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_hwver($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_parent {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_parent($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_pos {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_pos($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_serial {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_serial($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_swver {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_swver($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_type {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_type($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_vendor {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->ns_e_vendor($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay/Nortel/Avaya Hubs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
    #Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 | 
			
		||||
    my $bayhub = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
    my $class = $bayhub->class();
 | 
			
		||||
    print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::NortelStack
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<S5-ETHERNET-COMMON-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<S5-COMMON-STATS-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::NortelStack/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bayhub->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $bayhub->os()
 | 
			
		||||
 | 
			
		||||
Returns 'bay_hub'
 | 
			
		||||
 | 
			
		||||
=item $bayhub->model()
 | 
			
		||||
 | 
			
		||||
Cross references $bayhub->id() to the F<SYNOPTICS-MIB> and returns
 | 
			
		||||
the results.
 | 
			
		||||
 | 
			
		||||
Removes either Baystack Hub, 5000, or 5005 depending on the model.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bayhub->layers()
 | 
			
		||||
 | 
			
		||||
Returns 00000011.  Class emulates Layer 2 functionality through proprietary
 | 
			
		||||
MIBs.
 | 
			
		||||
 | 
			
		||||
=item  $bayhub->index_factor()
 | 
			
		||||
 | 
			
		||||
Required by SNMP::Info::SONMP.  Number representing the number of ports
 | 
			
		||||
reserved per slot within the device MIB.  Returns 256.
 | 
			
		||||
 | 
			
		||||
=item $bayhub->slot_offset()
 | 
			
		||||
 | 
			
		||||
Required by SNMP::Info::SONMP.  Offset if slot numbering does not
 | 
			
		||||
start at 0.  Returns 0.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::NortelStack
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bayhub->i_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.
 | 
			
		||||
 | 
			
		||||
=item $bayhub->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns half, hubs do not support full duplex.
 | 
			
		||||
 | 
			
		||||
=item $bayhub->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns half, hubs do not support full duplex.
 | 
			
		||||
 | 
			
		||||
=item $bayhub->i_speed()
 | 
			
		||||
 | 
			
		||||
Returns interface speed.
 | 
			
		||||
 | 
			
		||||
=item $bayhub->i_up()
 | 
			
		||||
 | 
			
		||||
Returns (C<s5EnPortLinkStatus>) for each port.  Translates on/off to up/down.
 | 
			
		||||
 | 
			
		||||
=item $bayhub->i_up_admin()
 | 
			
		||||
 | 
			
		||||
Returns (C<s5EnPortPartStatus>) for each port.
 | 
			
		||||
 | 
			
		||||
=item $bayhub->set_i_up_admin(state, ifIndex)
 | 
			
		||||
 | 
			
		||||
Sets port state, must be supplied with state and port C<ifIndex>
 | 
			
		||||
 | 
			
		||||
State choices are 'up' or 'down'
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
  my %if_map = reverse %{$bayhub->interfaces()};
 | 
			
		||||
  $bayhub->set_i_up_admin('down', $if_map{'1.1'})
 | 
			
		||||
      or die "Couldn't change port state. ",$bayhub->error(1);
 | 
			
		||||
 | 
			
		||||
=item $bayhub->bp_index()
 | 
			
		||||
 | 
			
		||||
Simulates bridge MIB by returning reference to a hash containing the index for
 | 
			
		||||
both the keys and values.
 | 
			
		||||
 | 
			
		||||
=item $bayhub->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs of the C<S5-COMMON-STATS-MIB::s5CmSNodeTable>
 | 
			
		||||
to the Interface index.
 | 
			
		||||
 | 
			
		||||
=item $bayhub->fw_mac()
 | 
			
		||||
 | 
			
		||||
(C<s5CmSNodeMacAddr>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Pseudo F<ENTITY-MIB> Information
 | 
			
		||||
 | 
			
		||||
These devices do not support F<ENTITY-MIB>.  These methods emulate Physical
 | 
			
		||||
Table methods using F<S5-CHASSIS-MIB>.  See
 | 
			
		||||
L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_index()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_index().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_class()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_class().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_descr()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_descr().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_name()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_name().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_fwver()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_fwver().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_hwver()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_hwver().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_parent()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_parent().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_pos()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_pos().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_serial()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_serial().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_swver()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_swver().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_type()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_type().
 | 
			
		||||
 | 
			
		||||
=item $bayhub->e_vendor()
 | 
			
		||||
 | 
			
		||||
Returns ns_e_vendor().
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::NortelStack
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										640
									
								
								lib/SNMP/Info/Layer1/Cyclades.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										640
									
								
								lib/SNMP/Info/Layer1/Cyclades.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,640 @@
 | 
			
		||||
# SNMP::Info::Layer1::Cyclades
 | 
			
		||||
#
 | 
			
		||||
# 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::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//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer1::MIBS,
 | 
			
		||||
    '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 = (
 | 
			
		||||
 | 
			
		||||
    %SNMP::Info::Layer1::GLOBALS,
 | 
			
		||||
 | 
			
		||||
    # 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'   => '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' => '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, );
 | 
			
		||||
 | 
			
		||||
# These devices don't have a FDB and we probably don't want to poll for ARP
 | 
			
		||||
# cache so turn off reported L2/L3.
 | 
			
		||||
sub layers {
 | 
			
		||||
    return '01000001';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    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 'vertiv';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $cyclades = shift;
 | 
			
		||||
 | 
			
		||||
    my $model
 | 
			
		||||
        = $cyclades->acs_model()
 | 
			
		||||
        || $cyclades->acs8k_model()
 | 
			
		||||
        || $cyclades->cy5k_model()
 | 
			
		||||
        || $cyclades->cy_model()
 | 
			
		||||
        || undef;
 | 
			
		||||
 | 
			
		||||
    return lc($model) if ( defined $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
 | 
			
		||||
#
 | 
			
		||||
# Partials don't really help in this class, but implemented
 | 
			
		||||
# for consistency
 | 
			
		||||
 | 
			
		||||
sub i_index {
 | 
			
		||||
    my $cyclades = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $orig_index = $cyclades->orig_i_index($partial) || {};
 | 
			
		||||
    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 ) {
 | 
			
		||||
        my $index = $orig_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
 | 
			
		||||
        $i_index{$iid} = $index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Use alternative labeling system for the serial port, listening socket
 | 
			
		||||
    # to avoid conflicts with ifIndex.
 | 
			
		||||
    foreach my $iid ( keys %$cy_index ) {
 | 
			
		||||
        my $index = $cy_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        $i_index{$index} = $index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $cyclades = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    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 ) {
 | 
			
		||||
        my $descr = $i_descr->{$iid};
 | 
			
		||||
        next unless defined $descr;
 | 
			
		||||
 | 
			
		||||
        $if{$iid} = $descr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$cy_p_tty ) {
 | 
			
		||||
        my $index = $cy_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
        my $name = $cy_p_tty->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
 | 
			
		||||
        $if{$index} = $name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed {
 | 
			
		||||
    my $cyclades = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_speed    = $cyclades->orig_i_speed($partial) || {};
 | 
			
		||||
    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 ) {
 | 
			
		||||
        my $speed = $i_speed->{$iid};
 | 
			
		||||
        next unless defined $speed;
 | 
			
		||||
 | 
			
		||||
        $i_speed{$iid} = $speed;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$cy_p_speed ) {
 | 
			
		||||
        my $index = $cy_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
        my $speed = $cy_p_speed->{$iid};
 | 
			
		||||
        next unless defined $speed;
 | 
			
		||||
 | 
			
		||||
        $i_speed{$index} = $speed;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_speed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $cyclades = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_up     = $cyclades->orig_i_up($partial) || {};
 | 
			
		||||
    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 ) {
 | 
			
		||||
        my $up = $i_up->{$iid};
 | 
			
		||||
        next unless defined $up;
 | 
			
		||||
 | 
			
		||||
        $i_up{$iid} = $up;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$cy_p_up ) {
 | 
			
		||||
        my $index = $cy_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
        my $up = $cy_p_up->{$iid};
 | 
			
		||||
        next unless defined $up;
 | 
			
		||||
 | 
			
		||||
        $i_up{$index} = $up;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_up;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_description {
 | 
			
		||||
    my $cyclades = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_desc    = $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_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 ) {
 | 
			
		||||
        my $desc = $i_desc->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
 | 
			
		||||
        $descr{$iid} = $desc;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$cy_p_desc ) {
 | 
			
		||||
        my $index = $cy_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
        my $desc = $cy_p_desc->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
 | 
			
		||||
        $descr{$index} = $desc;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $cyclades = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_name    = $cyclades->orig_i_name($partial) || {};
 | 
			
		||||
    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 ) {
 | 
			
		||||
        my $name = $i_name->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
 | 
			
		||||
        $i_name{$iid} = $name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$cy_p_desc ) {
 | 
			
		||||
        my $index = $cy_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
        my $name = $cy_p_desc->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
 | 
			
		||||
        $i_name{$index} = $name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1::Cyclades - SNMP Interface to Cyclades/Avocent terminal
 | 
			
		||||
servers
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
    #Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 | 
			
		||||
    my $cyclades = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
    my $class = $cyclades->class();
 | 
			
		||||
    print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a
 | 
			
		||||
Cyclades/Avocent device through SNMP.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cyclades->os_ver()
 | 
			
		||||
 | 
			
		||||
(C<acsFirmwareVersion>), (C<cyACS5Kversion>), or (C<cyACSversion>)
 | 
			
		||||
 | 
			
		||||
=item $cyclades->serial()
 | 
			
		||||
 | 
			
		||||
(C<acsSerialNumber>), (C<cyACS5KDevId>), or (C<cyACSDevId>)
 | 
			
		||||
 | 
			
		||||
=item $cyclades->root_ip()
 | 
			
		||||
 | 
			
		||||
(C<cyEthIPaddr>)
 | 
			
		||||
 | 
			
		||||
=item $cyclades->ps1_status()
 | 
			
		||||
 | 
			
		||||
(C<acsPowerSupplyStatePw1>), (C<cyACS5KPw1>), or (C<cyACSPw1>)
 | 
			
		||||
 | 
			
		||||
=item $cyclades->ps2_status()
 | 
			
		||||
 | 
			
		||||
(C<acsPowerSupplyStatePw2>), (C<cyACS5KPw2>), or (C<cyACSPw2>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cyclades->layers()
 | 
			
		||||
 | 
			
		||||
Returns 01000001.  These devices don't have a FDB and we probably don't want
 | 
			
		||||
to poll for an ARP cache so turn off reported Layer 2 and Layer 3.
 | 
			
		||||
 | 
			
		||||
=item $cyclades->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'vertiv'
 | 
			
		||||
 | 
			
		||||
=item $cyclades->os()
 | 
			
		||||
 | 
			
		||||
Returns 'avocent'
 | 
			
		||||
 | 
			
		||||
=item $cyclades->model()
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cyclades->i_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, 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<acsSerialPortTableDeviceName> or C<cyISPortTty>.
 | 
			
		||||
 | 
			
		||||
=item $cyclades->i_speed()
 | 
			
		||||
 | 
			
		||||
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<acsSerialPortTableSignalStateDCD> or C<cyISPortSigCD>.
 | 
			
		||||
 | 
			
		||||
=item $cyclades->i_description()
 | 
			
		||||
 | 
			
		||||
Returns description of each port.  Extended to include serial ports,
 | 
			
		||||
C<acsSerialPortTableName> or C<cyISPortName>.
 | 
			
		||||
 | 
			
		||||
=item $cyclades->i_name()
 | 
			
		||||
 | 
			
		||||
Returns name of each port.  Extended to include serial ports,
 | 
			
		||||
C<acsSerialPortTableName> or C<cyISPortName>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										550
									
								
								lib/SNMP/Info/Layer1/S3000.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										550
									
								
								lib/SNMP/Info/Layer1/S3000.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,550 @@
 | 
			
		||||
# SNMP::Info::Layer1::S3000
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 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::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//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    'SYNOPTICS-ETHERNET-MIB' => 's3EnetPortTable',
 | 
			
		||||
    'SYNOPTICS-COMMON-MIB'   => 's3AgentType',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
 | 
			
		||||
    # From SYNOPTICS-COMMON-MIB
 | 
			
		||||
    'os_bin'          => 's3AgentFwVer',
 | 
			
		||||
    's3000_major_ver' => 's3AgentSwMajorVer',
 | 
			
		||||
    's3000_minor_ver' => 's3AgentSwMinorVer',
 | 
			
		||||
    's3000_maint_ver' => 's3AgentSwMaintVer',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # SYNOPTICS-ETHERNET-MIB::s3EnetPortTable
 | 
			
		||||
    's3000_pb_index' => 's3EnetPortBoardIndex',
 | 
			
		||||
    's3000_pp_index' => 's3EnetPortIndex',
 | 
			
		||||
    's3000_up_admin' => 's3EnetPortPartStatus',
 | 
			
		||||
    's3000_up'       => 's3EnetPortLinkStatus',
 | 
			
		||||
 | 
			
		||||
    # SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable
 | 
			
		||||
    's3000_nb_index' => 's3EnetShowNodesSlotIndex',
 | 
			
		||||
    's3000_np_index' => 's3EnetShowNodesPortIndex',
 | 
			
		||||
    'fw_mac'         => 's3EnetShowNodesMacAddress',
 | 
			
		||||
 | 
			
		||||
    # SYNOPTICS-ETHERNET-MIB::s3EnetTopNmmTable
 | 
			
		||||
    's3000_topo_port' => 's3EnetTopNmmPort',
 | 
			
		||||
    's3000_topo_mac'  => 's3EnetTopNmmMacAddr',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE, 's3000_topo_mac' => \&SNMP::Info::munge_mac
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
    return '00000011';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'synoptics';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $s3000 = shift;
 | 
			
		||||
    my $id    = $s3000->id();
 | 
			
		||||
    return unless defined $id;
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
    $model =~ s/^s3reg-//i;
 | 
			
		||||
 | 
			
		||||
    return $1 if ( $model =~ /((\d+){3}[\dX])/ );
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $s3000     = shift;
 | 
			
		||||
    my $major_ver = $s3000->s3000_major_ver() || 0;
 | 
			
		||||
    my $minor_ver = $s3000->s3000_minor_ver() || 0;
 | 
			
		||||
    my $maint_ver = $s3000->s3000_maint_ver() || 0;
 | 
			
		||||
 | 
			
		||||
    my $ver = "$major_ver.$minor_ver.$maint_ver";
 | 
			
		||||
    return $ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mac {
 | 
			
		||||
    my $s3000     = shift;
 | 
			
		||||
    my $topo_port = $s3000->s3000_topo_port();
 | 
			
		||||
    my $topo_mac  = $s3000->s3000_topo_mac();
 | 
			
		||||
 | 
			
		||||
    foreach my $entry ( keys %$topo_port ) {
 | 
			
		||||
        my $port = $topo_port->{$entry};
 | 
			
		||||
        next unless $port == 0;
 | 
			
		||||
        my $mac = $topo_mac->{$entry};
 | 
			
		||||
        return $mac;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Topology turned off, not supported.
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Hubs do not support ifMIB requirements for get MAC
 | 
			
		||||
# and port status
 | 
			
		||||
 | 
			
		||||
sub i_index {
 | 
			
		||||
    my $s3000   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $b_index = $s3000->s3000_pb_index($partial) || {};
 | 
			
		||||
    my $p_index = $s3000->s3000_pp_index($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_index;
 | 
			
		||||
    foreach my $iid ( keys %$b_index ) {
 | 
			
		||||
        my $board = $b_index->{$iid};
 | 
			
		||||
        next unless defined $board;
 | 
			
		||||
        my $port = $p_index->{$iid} || 0;
 | 
			
		||||
 | 
			
		||||
        # We need to make up an index for multiple board instances.
 | 
			
		||||
        my $index = ( $board * 256 ) + $port;
 | 
			
		||||
 | 
			
		||||
        $i_index{$iid} = $index;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Partials don't really help in this class, but implemented
 | 
			
		||||
# for consistency
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $s3000   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $s3000->i_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        # Index numbers are deterministic slot * 256 + port - see i_index()
 | 
			
		||||
        my $port = $index % 256;
 | 
			
		||||
        my $slot = int( $index / 256 );
 | 
			
		||||
 | 
			
		||||
        my $slotport = "$slot.$port";
 | 
			
		||||
 | 
			
		||||
        $if{$index} = $slotport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $s3000   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_index = $s3000->i_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $iid ( keys %$port_index ) {
 | 
			
		||||
        my $index = $port_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        # Hubs only function half duplex
 | 
			
		||||
        my $duplex = 'half';
 | 
			
		||||
        $i_duplex{$index} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $s3000   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_index = $s3000->i_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $iid ( keys %$port_index ) {
 | 
			
		||||
        my $index = $port_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        # Hubs only function half duplex
 | 
			
		||||
        my $duplex = 'half';
 | 
			
		||||
        $i_duplex_admin{$index} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed {
 | 
			
		||||
    my $s3000   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_index = $s3000->i_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_speed;
 | 
			
		||||
    foreach my $iid ( keys %$port_index ) {
 | 
			
		||||
        my $index = $port_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        # These hubs only support 10 Mbs
 | 
			
		||||
        my $speed = '10000000';
 | 
			
		||||
        $i_speed{$index} = $speed;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_speed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $s3000   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_index = $s3000->i_index()  || {};
 | 
			
		||||
    my $link_stat  = $s3000->s3000_up() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_up;
 | 
			
		||||
    foreach my $iid ( keys %$port_index ) {
 | 
			
		||||
        my $index = $port_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
        my $link_stat = $link_stat->{$iid};
 | 
			
		||||
        next unless defined $link_stat;
 | 
			
		||||
 | 
			
		||||
        $link_stat = 'up'   if $link_stat =~ /on/i;
 | 
			
		||||
        $link_stat = 'down' if $link_stat =~ /off/i;
 | 
			
		||||
 | 
			
		||||
        $i_up{$index} = $link_stat;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_up;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up_admin {
 | 
			
		||||
    my $s3000   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index   = $s3000->i_index()        || {};
 | 
			
		||||
    my $link_stat = $s3000->s3000_up_admin() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_up_admin;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
        my $link_stat = $link_stat->{$iid};
 | 
			
		||||
        next unless defined $link_stat;
 | 
			
		||||
 | 
			
		||||
        $i_up_admin{$index} = $link_stat;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_up_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_up_admin {
 | 
			
		||||
 | 
			
		||||
    # map setting to those the hub will understand
 | 
			
		||||
    my %setting = qw/up 2 down 3/;
 | 
			
		||||
 | 
			
		||||
    my $s3000 = shift;
 | 
			
		||||
    my ( $setting, $iid ) = @_;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $s3000->i_index() || {};
 | 
			
		||||
    my %reverse_i_index = reverse %$i_index;
 | 
			
		||||
 | 
			
		||||
    $setting = lc($setting);
 | 
			
		||||
 | 
			
		||||
    return 0 unless defined $setting{$setting};
 | 
			
		||||
 | 
			
		||||
    $iid = $reverse_i_index{$iid};
 | 
			
		||||
 | 
			
		||||
    return $s3000->set_s3000_up_admin( $setting{$setting}, $iid );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Hubs do not support the standard Bridge MIB
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $s3000   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $b_index = $s3000->s3000_nb_index() || {};
 | 
			
		||||
    my $p_index = $s3000->s3000_np_index() || {};
 | 
			
		||||
    my $model   = $s3000->model();
 | 
			
		||||
 | 
			
		||||
    my %bp_index;
 | 
			
		||||
    foreach my $iid ( keys %$b_index ) {
 | 
			
		||||
        my $board = $b_index->{$iid};
 | 
			
		||||
        next unless defined $board;
 | 
			
		||||
        my $port = $p_index->{$iid} || 0;
 | 
			
		||||
 | 
			
		||||
        my $index = ( $board * 256 ) + $port;
 | 
			
		||||
        next if ( defined $partial and $index !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        $bp_index{$index} = $index;
 | 
			
		||||
    }
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $s3000 = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $s3000->SUPER::fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $s3000   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $b_index = $s3000->s3000_nb_index($partial) || {};
 | 
			
		||||
    my $p_index = $s3000->s3000_np_index($partial) || {};
 | 
			
		||||
    my $model   = $s3000->model();
 | 
			
		||||
 | 
			
		||||
    my %fw_port;
 | 
			
		||||
    foreach my $iid ( keys %$b_index ) {
 | 
			
		||||
        my $board = $b_index->{$iid};
 | 
			
		||||
        next unless defined $board;
 | 
			
		||||
        my $port = $p_index->{$iid} || 0;
 | 
			
		||||
 | 
			
		||||
        my $index = ( $board * 256 ) + $port;
 | 
			
		||||
 | 
			
		||||
        $fw_port{$iid} = $index;
 | 
			
		||||
    }
 | 
			
		||||
    return \%fw_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1::S3000 - SNMP Interface to Synoptics / Nortel Hubs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
    #Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 | 
			
		||||
    my $s3000 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
    my $class = $s3000->class();
 | 
			
		||||
    print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<SYNOPTICS-COMMON-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<SYNOPTICS-ETHERNET-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 $s3000->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
 | 
			
		||||
=item $s3000->os()
 | 
			
		||||
 | 
			
		||||
Returns 'synoptics'
 | 
			
		||||
 | 
			
		||||
=item $s3000->model()
 | 
			
		||||
 | 
			
		||||
Cross references $s3000->id() to the F<SYNOPTICS-MIB> and returns
 | 
			
		||||
the results.
 | 
			
		||||
 | 
			
		||||
Removes C<sreg-> from the model name and returns only the numeric model
 | 
			
		||||
identifier.
 | 
			
		||||
 | 
			
		||||
=item $stack->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version specified as major.minor.maint.
 | 
			
		||||
 | 
			
		||||
(C<s3AgentSwMajorVer>).(C<s3AgentSwMinorVer>).(C<s3AgentSwMaintVer>)
 | 
			
		||||
 | 
			
		||||
=item $stack->os_bin()
 | 
			
		||||
 | 
			
		||||
Returns the firmware version. (C<s3AgentFwVer>)
 | 
			
		||||
 | 
			
		||||
=item $s3000->mac()
 | 
			
		||||
 | 
			
		||||
Returns MAC of the advertised IP address of the device.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $s3000->layers()
 | 
			
		||||
 | 
			
		||||
Returns 00000011.  Class emulates Layer 2 functionality through proprietary
 | 
			
		||||
MIBs.
 | 
			
		||||
 | 
			
		||||
=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 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $s3000->i_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
 | 
			
		||||
than one module.
 | 
			
		||||
 | 
			
		||||
=item $s3000->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to physical ports.
 | 
			
		||||
 | 
			
		||||
=item $s3000->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns half, hubs do not support full duplex.
 | 
			
		||||
 | 
			
		||||
=item $s3000->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns half, hubs do not support full duplex.
 | 
			
		||||
 | 
			
		||||
=item $s3000->i_speed()
 | 
			
		||||
 | 
			
		||||
Returns 10000000.  The hubs only support 10 Mbs Ethernet.
 | 
			
		||||
 | 
			
		||||
=item $s3000->i_up()
 | 
			
		||||
 | 
			
		||||
Returns (C<s3EnetPortLinkStatus>) for each port.  Translates on/off to
 | 
			
		||||
up/down.
 | 
			
		||||
 | 
			
		||||
=item $s3000->i_up_admin()
 | 
			
		||||
 | 
			
		||||
Returns (C<s3EnetPortPartStatus>) for each port.
 | 
			
		||||
 | 
			
		||||
=item $s3000->set_i_up_admin(state, ifIndex)
 | 
			
		||||
 | 
			
		||||
Sets port state, must be supplied with state and port C<ifIndex>
 | 
			
		||||
 | 
			
		||||
State choices are 'up' or 'down'
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
  my %if_map = reverse %{$s3000->interfaces()};
 | 
			
		||||
  $s3000->set_i_up_admin('down', $if_map{'1.1'})
 | 
			
		||||
      or die "Couldn't change port state. ",$s3000->error(1);
 | 
			
		||||
 | 
			
		||||
=item $s3000->bp_index()
 | 
			
		||||
 | 
			
		||||
Simulates bridge MIB by returning reference to a hash containing the index for
 | 
			
		||||
both the keys and values.
 | 
			
		||||
 | 
			
		||||
=item $s3000->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs of the
 | 
			
		||||
C<SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable> to the Interface index.
 | 
			
		||||
 | 
			
		||||
=item $s3000->fw_mac()
 | 
			
		||||
 | 
			
		||||
(C<s3EnetShowNodesMacAddress>)
 | 
			
		||||
 | 
			
		||||
=item $s3000->s3000_topo_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Port Number
 | 
			
		||||
(interface iid)
 | 
			
		||||
 | 
			
		||||
(C<s3EnetTopNmmPort>)
 | 
			
		||||
 | 
			
		||||
=item $s3000->s3000_topo_mac()
 | 
			
		||||
 | 
			
		||||
(C<s3EnetTopNmmMacAddr>)
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote MAC address
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										330
									
								
								lib/SNMP/Info/Layer2.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										330
									
								
								lib/SNMP/Info/Layer2.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,330 @@
 | 
			
		||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
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 SNMP::Info::DocsisHE Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,         %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
    %SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::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,
 | 
			
		||||
    'serial1' =>
 | 
			
		||||
        '.1.3.6.1.4.1.9.3.6.3.0',    # OLD-CISCO-CHASSIS-MIB::chassisId.0
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,         %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
    %SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,   %SNMP::Info::DocsisHE::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
 | 
			
		||||
    # 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,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
# $l2->model() - Looks at sysObjectID which gives the oid of the system
 | 
			
		||||
#       name, contained in a proprietary MIB.
 | 
			
		||||
sub model {
 | 
			
		||||
    my $l2    = shift;
 | 
			
		||||
    my $id    = $l2->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id) || $id || '';
 | 
			
		||||
 | 
			
		||||
    # HP
 | 
			
		||||
    $model =~ s/^hpswitch//i;
 | 
			
		||||
 | 
			
		||||
    # Cisco
 | 
			
		||||
    $model =~ s/sysid$//i;
 | 
			
		||||
    $model =~ s/^(cisco|catalyst)//i;
 | 
			
		||||
    $model =~ s/^cat//i;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $l2    = shift;
 | 
			
		||||
    my $model = $l2->model();
 | 
			
		||||
    my $descr = $l2->description();
 | 
			
		||||
 | 
			
		||||
    if ( $model =~ /hp/i or $descr =~ /\bhp\b/i ) {
 | 
			
		||||
        return 'hp';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i ) {
 | 
			
		||||
        return 'cisco';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $l2 = shift;
 | 
			
		||||
 | 
			
		||||
    my $entity_serial = $l2->entity_derived_serial();
 | 
			
		||||
    if ( defined $entity_serial and $entity_serial !~ /^\s*$/ ){
 | 
			
		||||
        return $entity_serial;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $serial1  = $l2->serial1();
 | 
			
		||||
    if ( defined $serial1 and $serial1 !~ /^\s*$/ ) {
 | 
			
		||||
        return $serial1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $l2      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l2->i_index($partial)       || {};
 | 
			
		||||
    my $i_descr    = $l2->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    # Replace the Index with the ifDescr field.
 | 
			
		||||
    # Check for duplicates in ifDescr, if so uniquely identify by adding
 | 
			
		||||
    # ifIndex to repeated values
 | 
			
		||||
    my (%seen, %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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2 - SNMP Interface to network devices serving Layer2 only.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
 # Let's get some basic Port information
 | 
			
		||||
 my $interfaces = $l2->interfaces();
 | 
			
		||||
 my $i_up       = $l2->i_up();
 | 
			
		||||
 my $i_speed    = $l2->i_speed();
 | 
			
		||||
 foreach my $iid (keys %$interfaces) {
 | 
			
		||||
    my $port  = $interfaces->{$iid};
 | 
			
		||||
    my $up    = $i_up->{$iid};
 | 
			
		||||
    my $speed = $i_speed->{$iid}
 | 
			
		||||
    print "Port $port is $up. Port runs at $speed.\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
 my $l2 = new SNMP::Info::Layer2(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::DocsisHE
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::PowerEthernet
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes
 | 
			
		||||
 | 
			
		||||
MIBs required by the inherited classes listed above.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
MIBs can be found in netdisco-mibs package.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l2->model()
 | 
			
		||||
 | 
			
		||||
Cross references $l2->id() with product IDs in the
 | 
			
		||||
Cisco MIBs.
 | 
			
		||||
 | 
			
		||||
For HP devices, removes C<'hpswitch'> from the name
 | 
			
		||||
 | 
			
		||||
For Cisco devices, removes c<'sysid'> from the name
 | 
			
		||||
 | 
			
		||||
=item $l2->vendor()
 | 
			
		||||
 | 
			
		||||
Tries to discover the vendor from $l2->model() and $l2->description()
 | 
			
		||||
 | 
			
		||||
=item $l2->serial()
 | 
			
		||||
 | 
			
		||||
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/"USAGE"> 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::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 a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l2->interfaces()
 | 
			
		||||
 | 
			
		||||
Creates a map between the interface identifier (iid) and the physical port
 | 
			
		||||
name.
 | 
			
		||||
 | 
			
		||||
Defaults to C<ifDescr> but checks and overrides with C<ifName>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"USAGE"> 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::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
 | 
			
		||||
							
								
								
									
										203
									
								
								lib/SNMP/Info/Layer2/3Com.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								lib/SNMP/Info/Layer2/3Com.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,203 @@
 | 
			
		||||
# 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::CDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::3Com::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::3Com::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    'A3Com-products-MIB' => 'wlanAP7760',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return '3Com';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $dev  = shift;
 | 
			
		||||
    my $e_serial = $dev->e_serial();
 | 
			
		||||
 | 
			
		||||
    # Find entity table entry for this unit
 | 
			
		||||
    foreach my $e ( sort keys %$e_serial ) {
 | 
			
		||||
        if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_serial->{$e};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
 | 
			
		||||
    my $dev = shift;
 | 
			
		||||
    my $e_swver  = $dev->e_swver();
 | 
			
		||||
    # Find entity table entry for this unit
 | 
			
		||||
    foreach my $e ( sort keys %$e_swver ) {
 | 
			
		||||
        if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_swver->{$e};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return '3com';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $dsmodel = shift;
 | 
			
		||||
    my $descr = $dsmodel->description();
 | 
			
		||||
 | 
			
		||||
    if (defined ($descr)) {
 | 
			
		||||
      if ($descr =~ /^([\S ]+) Software.*/) {
 | 
			
		||||
        return $1;
 | 
			
		||||
      } else {
 | 
			
		||||
        return $descr;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::3Com - SNMP Interface to L2 3Com Switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Kosmach
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $router = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $router->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for 3Com L2 devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<A3Com-products-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $device->vendor()
 | 
			
		||||
 | 
			
		||||
Returns '3com'
 | 
			
		||||
 | 
			
		||||
=item $device->os()
 | 
			
		||||
 | 
			
		||||
Returns '3Com'
 | 
			
		||||
 | 
			
		||||
=item $device->os_ver()
 | 
			
		||||
 | 
			
		||||
Return os version
 | 
			
		||||
 | 
			
		||||
=item $device->model()
 | 
			
		||||
 | 
			
		||||
Returns device model extracted from description
 | 
			
		||||
 | 
			
		||||
=item $device->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										308
									
								
								lib/SNMP/Info/Layer2/Adtran.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								lib/SNMP/Info/Layer2/Adtran.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,308 @@
 | 
			
		||||
# 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::Layer2;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Adtran::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Adtran::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
# This will be filled in with the device's index into the EntPhysicalEntry
 | 
			
		||||
# table by the serial() function.
 | 
			
		||||
our $index = undef;
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
#    'ADTRAN-GENEVC-MIB'     => 'adGenEVCMIB',
 | 
			
		||||
#    'ADTRAN-GENMEF-MIB'     => 'adGenMEFMIB',
 | 
			
		||||
#    'ADTRAN-GENPORT-MIB'    => 'adGenPort',
 | 
			
		||||
    'ADTRAN-MIB'            => 'adtran',
 | 
			
		||||
    'ADTRAN-AOSUNIT'     => 'adGenAOSUnitMib',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    'serial'    => 'adProdSerialNumber',
 | 
			
		||||
    'ad_mgmtevcvid' => 'adGenEVCSysMgmtEVCSTagVID',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
           %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
           'ad_evcstag' => 'adGenEVCLookupName',
 | 
			
		||||
           'ad_menport' => 'adGenMenPortRowStatus',
 | 
			
		||||
           'ad_evcnamevid' => 'adGenEVCSTagVID',
 | 
			
		||||
           'ad_mgmtevcports' => 'adGenSysMgmtEVCInterfaceConnectionType',
 | 
			
		||||
           'ad_evcmapuniport' => 'adGenMEFMapUNIPort',
 | 
			
		||||
           'ad_evcmapevc' => 'adGenMEFMapAssociatedEVCAlias',
 | 
			
		||||
           'ad_genportcustuse' => 'adGenPortCustomerUse',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'adtran';
 | 
			
		||||
}
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'aos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
 | 
			
		||||
    my $layers = $adtran->SUPER::layers();
 | 
			
		||||
    # Some netvantas don't report L2 properly
 | 
			
		||||
    my $macs   = $adtran->fw_mac();
 | 
			
		||||
 | 
			
		||||
    if (keys %$macs) {
 | 
			
		||||
        my $l = substr $layers, 6, 1, "1";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $layers;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $ver = $adtran->adProdSwVersion() || undef;
 | 
			
		||||
    return $ver if (defined $ver);
 | 
			
		||||
    my $aos_ver = $adtran->adAOSDeviceVersion();
 | 
			
		||||
    return $aos_ver;
 | 
			
		||||
}
 | 
			
		||||
sub model {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $id = $adtran->id();
 | 
			
		||||
    my $mod = $adtran->adProdName() || undef;
 | 
			
		||||
    return $mod if (defined $mod);
 | 
			
		||||
    my $model = $adtran->adAOSDeviceProductName() || undef;
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $e_serial = $adtran->e_serial() || {};
 | 
			
		||||
    my $serial2 = $e_serial->{1} || undef;
 | 
			
		||||
    return $serial2 if ( defined $serial2 );
 | 
			
		||||
    return $adtran->orig_serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    my $i_name = $adtran->SUPER::i_alias() || undef;
 | 
			
		||||
    return $i_name if (defined $i_name);
 | 
			
		||||
    $i_name = {};
 | 
			
		||||
    my $adname = $adtran->ad_genportcustuse() || undef;
 | 
			
		||||
    if (defined $adname) {
 | 
			
		||||
        foreach my $port (keys %$adname) {
 | 
			
		||||
            my @splitout = split(/\./,$port);
 | 
			
		||||
            $i_name->{$splitout[1]} = $adname->{$port};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $i_name;
 | 
			
		||||
}
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    my $uniports = $adtran->ad_evcmapuniport() || undef;
 | 
			
		||||
    my $evcmaps = $adtran->ad_evcmapevc() || undef;
 | 
			
		||||
    my $v_names = $adtran->ad_evcnamevid() || undef;
 | 
			
		||||
    if (defined $uniports) {
 | 
			
		||||
        my $vlans = {};
 | 
			
		||||
        foreach my $oid (keys %$v_names) {
 | 
			
		||||
            my $name = pack("C*", split(/\./,$oid));
 | 
			
		||||
            $vlans->{$name} = $v_names->{$oid};
 | 
			
		||||
        }
 | 
			
		||||
        my $i_vlan = {};
 | 
			
		||||
        foreach my $evcmap (keys %$evcmaps) {
 | 
			
		||||
            $i_vlan->{$uniports->{$evcmap}} = $vlans->{$evcmaps->{$evcmap}};
 | 
			
		||||
        }
 | 
			
		||||
        return $i_vlan;
 | 
			
		||||
    }
 | 
			
		||||
    return {};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $adtran  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    my $i_vlan = $adtran->ad_menport();
 | 
			
		||||
    if (defined $i_vlan) {
 | 
			
		||||
        my $vlans = {};
 | 
			
		||||
        my $v_name = $adtran->v_name();
 | 
			
		||||
        foreach my $vid (keys %$v_name) {
 | 
			
		||||
            $vlans->{$v_name->{$vid}} = $vid;
 | 
			
		||||
        }
 | 
			
		||||
        my $if_vlans = {};
 | 
			
		||||
        foreach my $entry (keys %$i_vlan) {
 | 
			
		||||
            my @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();
 | 
			
		||||
        foreach my $port (keys %$mgmtevcports) {
 | 
			
		||||
           push @{$if_vlans->{$port}}, $mgmtevcid;
 | 
			
		||||
        }
 | 
			
		||||
        return $if_vlans;
 | 
			
		||||
    }
 | 
			
		||||
    return {};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub v_name {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    my $v_index = $adtran->ad_evcstag();
 | 
			
		||||
    return {} unless defined $v_index;
 | 
			
		||||
    $v_index->{$adtran->ad_mgmtevcvid()} = 'system-management-evc';
 | 
			
		||||
    return $v_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Adtran - SNMP Interface to Adtran Devices
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $adtran = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $adtran->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for adtran Devices running JUNOS
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
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 $adtran->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'adtran'
 | 
			
		||||
 | 
			
		||||
=item $adtran->os()
 | 
			
		||||
 | 
			
		||||
Returns 'aos'
 | 
			
		||||
 | 
			
		||||
=item $adtran->layers()
 | 
			
		||||
 | 
			
		||||
Ensures that layer two is reported, at least.
 | 
			
		||||
 | 
			
		||||
=item $adtran->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted first from C<adProdSwVersion> or
 | 
			
		||||
C<adAOSDeviceVersion>.
 | 
			
		||||
 | 
			
		||||
=item $adtran->model()
 | 
			
		||||
 | 
			
		||||
Returns the model extracted first from C<adProdName> or
 | 
			
		||||
C<adAOSDeviceProductName>.
 | 
			
		||||
 | 
			
		||||
=item $adtran->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $adtran->v_name()
 | 
			
		||||
 | 
			
		||||
VLAN names table.
 | 
			
		||||
 | 
			
		||||
=item $adtran->i_name()
 | 
			
		||||
 | 
			
		||||
Interface names table.
 | 
			
		||||
 | 
			
		||||
=item $adtran->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
 | 
			
		||||
 | 
			
		||||
=item $adtran->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.  These are the VLANs which are members of the egress list for the port.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::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.
 | 
			
		||||
 | 
			
		||||
=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.70-135';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
							
								
								
									
										397
									
								
								lib/SNMP/Info/Layer2/Airespace.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										397
									
								
								lib/SNMP/Info/Layer2/Airespace.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,397 @@
 | 
			
		||||
# SNMP::Info::Layer2::Airespace
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Eric Miller
 | 
			
		||||
#
 | 
			
		||||
# 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::Airespace;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::Airespace;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Airespace::ISA
 | 
			
		||||
    = qw/SNMP::Info::Airespace SNMP::Info::CDP SNMP::Info::Bridge Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Airespace::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,      %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS, %SNMP::Info::Airespace::MIBS,
 | 
			
		||||
    'CISCO-LWAPP-DOT11-CLIENT-MIB' => 'cldcClientCurrentTxRateSet',
 | 
			
		||||
    'CISCO-LWAPP-DOT11-MIB'        => 'cldHtDot11nChannelBandwidth',
 | 
			
		||||
    'CISCO-LWAPP-AP-MIB'           => 'cLApIfMacAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::GLOBALS,      %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS, %SNMP::Info::Airespace::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,      %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS, %SNMP::Info::Airespace::FUNCS,
 | 
			
		||||
    # CISCO-LWAPP-AP-MIB::cLApTable
 | 
			
		||||
    'ap_if_mac'        => 'cLApIfMacAddress',
 | 
			
		||||
    # CISCO-LWAPP-DOT11-CLIENT-MIB::cldcClientTable
 | 
			
		||||
    'client_txrate'    => 'cldcClientCurrentTxRateSet',
 | 
			
		||||
    'cd11_proto'       => 'cldcClientProtocol',
 | 
			
		||||
    'cd11_rateset'     => 'cldcClientDataRateSet',
 | 
			
		||||
    # CISCO-LWAPP-DOT11-MIB::cldHtMacOperationsTable
 | 
			
		||||
    'cd11n_ch_bw'      => 'cldHtDot11nChannelBandwidth',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::MUNGE,      %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE, %SNMP::Info::Airespace::MUNGE,
 | 
			
		||||
    'ap_if_mac'         => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'cd11n_ch_bw'       => \&munge_cd11n_ch_bw,
 | 
			
		||||
    'cd11_rateset'      => \&munge_cd11_rateset,
 | 
			
		||||
    'cd11_proto'        => \&munge_cd11_proto,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# 802.11n Modulation and Coding Scheme (MCS)
 | 
			
		||||
my $mcs_index = {
 | 
			
		||||
    20 => {
 | 
			
		||||
	m0  => '6.5',
 | 
			
		||||
	m1  => '13',
 | 
			
		||||
	m2  => '19.5',
 | 
			
		||||
	m3  => '26',
 | 
			
		||||
	m4  => '39',
 | 
			
		||||
	m5  => '52',
 | 
			
		||||
	m6  => '58.5',
 | 
			
		||||
	m7  => '65',
 | 
			
		||||
	m8  => '13',
 | 
			
		||||
	m9  => '26',
 | 
			
		||||
	m10 => '39',
 | 
			
		||||
	m11 => '52',
 | 
			
		||||
	m12 => '78',
 | 
			
		||||
	m13 => '104',
 | 
			
		||||
	m14 => '117',
 | 
			
		||||
	m15 => '130',
 | 
			
		||||
	m16 => '19.5',
 | 
			
		||||
	m17 => '39',
 | 
			
		||||
	m18 => '58.5',
 | 
			
		||||
	m19 => '78',
 | 
			
		||||
	m20 => '117',
 | 
			
		||||
	m21 => '156',
 | 
			
		||||
	m22 => '175.5',
 | 
			
		||||
	m23 => '195',
 | 
			
		||||
	# This is a cheat for 802.11a bonded
 | 
			
		||||
	m108 => '108',
 | 
			
		||||
    },
 | 
			
		||||
    40 => {
 | 
			
		||||
	m0  => '15',
 | 
			
		||||
	m1  => '30',
 | 
			
		||||
	m2  => '45',
 | 
			
		||||
	m3  => '60',
 | 
			
		||||
	m4  => '90',
 | 
			
		||||
	m5  => '120',
 | 
			
		||||
	m6  => '135',
 | 
			
		||||
	m7  => '157.5',
 | 
			
		||||
	m8  => '30',
 | 
			
		||||
	m9  => '60',
 | 
			
		||||
	m10 => '90',
 | 
			
		||||
	m11 => '120',
 | 
			
		||||
	m12 => '180',
 | 
			
		||||
	m13 => '240',
 | 
			
		||||
	m14 => '270',
 | 
			
		||||
	m15 => '300',
 | 
			
		||||
	m16 => '45',
 | 
			
		||||
	m17 => '90',
 | 
			
		||||
	m18 => '135',
 | 
			
		||||
	m19 => '180',
 | 
			
		||||
	m20 => '270',
 | 
			
		||||
	m21 => '360',
 | 
			
		||||
	m22 => '405',
 | 
			
		||||
	m23 => '450',
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $model     = $airespace->airespace_model();
 | 
			
		||||
    return unless defined $model;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cd11_mac {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $cd11_sigstrength = $airespace->cd11_sigstrength();
 | 
			
		||||
 | 
			
		||||
    my $ret = {};
 | 
			
		||||
    foreach my $idx ( keys %$cd11_sigstrength ) {
 | 
			
		||||
	my $mac = join( ":", map { sprintf "%02x", $_ } split /\./, $idx );
 | 
			
		||||
	$ret->{$idx} = $mac
 | 
			
		||||
    }
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cd11_txrate {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
 | 
			
		||||
    my $rates  = $airespace->client_txrate() || {};
 | 
			
		||||
    my $protos = $airespace->cd11_proto()    || {};
 | 
			
		||||
    my $bws    = $airespace->cd11n_ch_bw()   || {};
 | 
			
		||||
 | 
			
		||||
    my $cd11_txrate = {};
 | 
			
		||||
    foreach my $idx ( keys %$rates ) {
 | 
			
		||||
	my $rate = $rates->{$idx} || '0.0';
 | 
			
		||||
	
 | 
			
		||||
	if ( $rate =~ /^\d+/ ) {
 | 
			
		||||
            $cd11_txrate->{$idx} = [ $rate * 1.0 ];
 | 
			
		||||
	}
 | 
			
		||||
	elsif ( $rate =~ /^m/ ) {
 | 
			
		||||
	    my $band = $protos->{$idx};
 | 
			
		||||
	    my $bw   = $bws->{$band};
 | 
			
		||||
	    # FIXME throw some kind of error if we get an index/rate that we haven't implemented yet? Now we simply return "0.0"...
 | 
			
		||||
	    $cd11_txrate->{$idx} = [ $mcs_index->{$bw}->{$rate} || '0.0' ];
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
	    $cd11_txrate->{$idx} = [ $rate ];
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return $cd11_txrate;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11n_ch_bw {
 | 
			
		||||
    my $bw = shift;
 | 
			
		||||
 | 
			
		||||
    if ( $bw =~ /forty/ ) {
 | 
			
		||||
	return 40;
 | 
			
		||||
    }
 | 
			
		||||
    return 20;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11_proto {
 | 
			
		||||
    my $bw = shift;
 | 
			
		||||
 | 
			
		||||
    return 2 if ( $bw eq 'dot11n5' );
 | 
			
		||||
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11_rateset {
 | 
			
		||||
    my $rates = shift;
 | 
			
		||||
    return [ map { $_ * 1.0 } split /,/, $rates ];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Cisco provides the AP's Ethernet MAC via
 | 
			
		||||
# CISCO-LWAPP-AP-MIB::cLApIfMacAddress this was not available pre-Cisco
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $airespace->i_index($partial)  || {};
 | 
			
		||||
    my $ap_mac  = $airespace->ap_if_mac()        || {};
 | 
			
		||||
 | 
			
		||||
    my $i_mac = $airespace->SUPER::i_mac() || {};
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
	my $index = $i_index->{$iid};
 | 
			
		||||
	next unless defined $index;
 | 
			
		||||
 | 
			
		||||
	if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
 | 
			
		||||
	    $index =~ s/\.\d+$//;
 | 
			
		||||
	    next unless defined $index;
 | 
			
		||||
	    my $sys_mac = join( '.', map { hex($_) } split( ':', $index ) );
 | 
			
		||||
	    my $mac = $ap_mac->{$sys_mac};
 | 
			
		||||
	    $i_mac->{$iid} = $mac;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return $i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Airespace - SNMP Interface to Cisco (Airespace) Wireless
 | 
			
		||||
Controllers
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
    #Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 | 
			
		||||
    my $airespace = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
    my $class = $airespace->class();
 | 
			
		||||
    print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from
 | 
			
		||||
Cisco (Airespace) Wireless Controllers through SNMP.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Airespace
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-LWAPP-DOT11-CLIENT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-LWAPP-DOT11-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-LWAPP-AP-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $airespace->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $airespace->os()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $airespace->model()
 | 
			
		||||
 | 
			
		||||
(C<agentInventoryMachineModel>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Airespace
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Airespace/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Bridge/"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 cd11_mac()
 | 
			
		||||
 | 
			
		||||
Returns client radio interface MAC addresses.
 | 
			
		||||
 | 
			
		||||
=item cd11_txrate()
 | 
			
		||||
 | 
			
		||||
Returns client transmission speed in Mbs.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item i_mac()
 | 
			
		||||
 | 
			
		||||
Adds AP Ethernet MAC as port mac on radio ports from C<CISCO-LWAPP-AP-MIB>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Airespace
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item munge_cd11n_ch_bw()
 | 
			
		||||
 | 
			
		||||
Converts 802.11n channel bandwidth to either 20 or 40.
 | 
			
		||||
 | 
			
		||||
=item munge_cd11_proto()
 | 
			
		||||
 | 
			
		||||
Converts 802.11n 2.4Ghz to 1 and 5Ghz to 2 to correspond to the
 | 
			
		||||
(C<cldHtMacOperationsTable>) index.
 | 
			
		||||
 | 
			
		||||
=item munge_cd11_rateset()
 | 
			
		||||
 | 
			
		||||
Converts rate set to array.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										688
									
								
								lib/SNMP/Info/Layer2/Aironet.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										688
									
								
								lib/SNMP/Info/Layer2/Aironet.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,688 @@
 | 
			
		||||
# SNMP::Info::Layer2::Aironet
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Aironet;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::EtherLike;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::IEEE802dot11;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Aironet::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer2 SNMP::Info::EtherLike
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Aironet::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::EtherLike::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    'serial' => 'entPhysicalSerialNum.1',
 | 
			
		||||
    'ps1_type' => 'cpoePdCurrentPowerSource',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::FUNCS,
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::EtherLike::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    'i_80211channel'   => 'cd11IfPhyDsssCurrentChannel',
 | 
			
		||||
    'c_dot11subif'     => 'cDot11ClientSubIfIndex',
 | 
			
		||||
    'cd11_rateset'     => 'cDot11ClientDataRateSet',
 | 
			
		||||
    'cd11_txrate'      => 'cDot11ClientCurrentTxRateSet',
 | 
			
		||||
    'cd11_uptime'      => 'cDot11ClientUpTime',
 | 
			
		||||
    'cd11_sigstrength' => 'cDot11ClientSignalStrength',
 | 
			
		||||
    'cd11_sigqual'     => 'cDot11ClientSigQuality',
 | 
			
		||||
    'cd11_rxpkt'       => 'cDot11ClientPacketsReceived',
 | 
			
		||||
    'cd11_txpkt'       => 'cDot11ClientPacketsSent',
 | 
			
		||||
    'cd11_rxbyte'      => 'cDot11ClientBytesReceived',
 | 
			
		||||
    'cd11_txbyte'      => 'cDot11ClientBytesSent',
 | 
			
		||||
    'mbss_mac_addr'    => 'cdot11MbssidIfMacAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MIBS,
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::EtherLike::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    'CISCO-DOT11-IF-MIB'                  => 'cd11IfAuxSsid',
 | 
			
		||||
    'CISCO-DOT11-ASSOCIATION-MIB'         => 'cDot11ClientSubIfIndex',
 | 
			
		||||
    'CISCO-DOT11-SSID-SECURITY-MIB'       => 'cdot11SecVlanNameId',
 | 
			
		||||
    'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
 | 
			
		||||
    'CISCO-POE-PD-MIB'                    => 'cpoePdCurrentPowerSource',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MUNGE,
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
    %SNMP::Info::EtherLike::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    'cd11_txrate'   => \&munge_cd11_txrate,
 | 
			
		||||
    'cd11_rateset'  => \&munge_cd11_txrate,
 | 
			
		||||
    'mbss_mac_addr' => \&SNMP::Info::munge_mac,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Use 802.11 power level without putting IEEE802dot11 in @ISA
 | 
			
		||||
*SNMP::Info::Layer2::Aironet::dot11_cur_tx_pwr_mw
 | 
			
		||||
    = \&SNMP::Info::IEEE802dot11::dot11_cur_tx_pwr_mw;
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    # Sorry, but it's true.
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_description = $aironet->i_description($partial);
 | 
			
		||||
 | 
			
		||||
    return $i_description;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Tag on e_descr.1
 | 
			
		||||
sub description {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $descr   = $aironet->SUPER::description();
 | 
			
		||||
    my $e_descr = $aironet->e_descr();
 | 
			
		||||
 | 
			
		||||
    if (defined $e_descr->{1}) {
 | 
			
		||||
      if (defined $descr) {
 | 
			
		||||
        $descr = "$e_descr->{1}  $descr"
 | 
			
		||||
      } else {
 | 
			
		||||
        $descr = "$e_descr->{1}"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return $descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Fetch duplex from EtherLike
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $el_duplex = $aironet->el_duplex($partial);
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $d ( keys %$el_duplex ) {
 | 
			
		||||
        my $val = $el_duplex->{$d};
 | 
			
		||||
        next unless defined $val;
 | 
			
		||||
        $i_duplex{$d} = 'full' if $val =~ /full/i;
 | 
			
		||||
        $i_duplex{$d} = 'half' if $val =~ /half/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# IOS 12.3 introduces the cDot11ClientSubIfIndex in the
 | 
			
		||||
# cDot11ClientConfigInfoTable, which supplies the ifIndex
 | 
			
		||||
# of the VLAN Subinterface if one exists, or of the primary
 | 
			
		||||
# interface if there are not subinterfaces.  12.2 used the
 | 
			
		||||
# Q-BRIDGE-MIB dot1qTpFdbTable but that was removed in 12.3.
 | 
			
		||||
sub _aironet_special {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $os_ver  = $aironet->os_ver();
 | 
			
		||||
    if (   defined($os_ver)
 | 
			
		||||
        && $os_ver =~ /^(\d+)\.(\d+)(\D|$)/
 | 
			
		||||
        && ( ( $1 == 12 && $2 >= 3 ) || $1 > 12 ) )
 | 
			
		||||
    {
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# INDEX      { ifIndex, cd11IfAuxSsid, cDot11ClientAddress }
 | 
			
		||||
sub _aironet_breakout_dot11idx {
 | 
			
		||||
    my $oid = shift;
 | 
			
		||||
 | 
			
		||||
    my @parts   = split( /\./, $oid );
 | 
			
		||||
    my $ifindex = shift(@parts);
 | 
			
		||||
    my $ssidlen = shift(@parts);
 | 
			
		||||
    my $ssid    = pack( "C*", splice( @parts, 0, $ssidlen ) );
 | 
			
		||||
    my $mac     = join( ":", map { sprintf "%02x", $_ } @parts );
 | 
			
		||||
    return ( $ifindex, $ssid, $mac );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
 | 
			
		||||
    return $aironet->qb_fw_mac() unless _aironet_special($aironet);
 | 
			
		||||
    my $c_dot11subif = $aironet->c_dot11subif();
 | 
			
		||||
    my $fw_mac       = {};
 | 
			
		||||
 | 
			
		||||
    foreach my $i ( keys %$c_dot11subif ) {
 | 
			
		||||
        my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
 | 
			
		||||
        $fw_mac->{$i} = $mac;
 | 
			
		||||
    }
 | 
			
		||||
    return $fw_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
 | 
			
		||||
    return $aironet->qb_fw_port() unless _aironet_special($aironet);
 | 
			
		||||
    my $c_dot11subif = $aironet->c_dot11subif();
 | 
			
		||||
    my $fw_port      = {};
 | 
			
		||||
 | 
			
		||||
    foreach my $i ( keys %$c_dot11subif ) {
 | 
			
		||||
        my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
 | 
			
		||||
        $fw_port->{$i} = $c_dot11subif->{$i} || $ifindex;
 | 
			
		||||
    }
 | 
			
		||||
    return $fw_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
 | 
			
		||||
    return $aironet->orig_bp_index() unless _aironet_special($aironet);
 | 
			
		||||
    my $c_dot11subif = $aironet->c_dot11subif();
 | 
			
		||||
    my $bp_index     = {};
 | 
			
		||||
 | 
			
		||||
    foreach my $i ( keys %$c_dot11subif ) {
 | 
			
		||||
        my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
 | 
			
		||||
        my ($i) = $c_dot11subif->{$i} || $ifindex;
 | 
			
		||||
        $bp_index->{$i} = $i;
 | 
			
		||||
    }
 | 
			
		||||
    return $bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
###
 | 
			
		||||
#
 | 
			
		||||
# VLAN support
 | 
			
		||||
#
 | 
			
		||||
sub v_name {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
 | 
			
		||||
    my $v_name      = {};
 | 
			
		||||
    my $vlan_nameid = $aironet->cdot11SecVlanNameId();
 | 
			
		||||
    foreach my $i ( keys %$vlan_nameid ) {
 | 
			
		||||
        my @parts = split( /\./, $i );
 | 
			
		||||
        my $namelen = shift(@parts);
 | 
			
		||||
 | 
			
		||||
        my $name = pack( "C*", @parts );
 | 
			
		||||
        $v_name->{$i} = $name;
 | 
			
		||||
    }
 | 
			
		||||
    return $v_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub v_index {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
 | 
			
		||||
    return $aironet->cdot11SecVlanNameId();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_vlan = {};
 | 
			
		||||
    my $idxmap = $aironet->cviRoutedVlanIfIndex();
 | 
			
		||||
    foreach my $i ( keys %$idxmap ) {
 | 
			
		||||
        my @parts = split( /\./, $i );
 | 
			
		||||
        $i_vlan->{ $idxmap->{$i} } = $parts[0];
 | 
			
		||||
    }
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# The MIB reports in units of half a megabit, e.g.,
 | 
			
		||||
# 5.5Mbps is reported as 11.
 | 
			
		||||
sub munge_cd11_txrate {
 | 
			
		||||
    my $txrates = shift;
 | 
			
		||||
    my @units   = unpack( "C*", $txrates );
 | 
			
		||||
    my @rates   = map {
 | 
			
		||||
        my $unit = $_;
 | 
			
		||||
        $unit *= 0.5;
 | 
			
		||||
    } @units;
 | 
			
		||||
 | 
			
		||||
    return \@rates;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# cd11 INDEX
 | 
			
		||||
sub cd11_port {
 | 
			
		||||
    my $aironet          = shift;
 | 
			
		||||
    my $cd11_sigstrength = $aironet->cd11_sigstrength();
 | 
			
		||||
    my $interfaces       = $aironet->interfaces();
 | 
			
		||||
    my %ret;
 | 
			
		||||
    foreach ( keys %$cd11_sigstrength ) {
 | 
			
		||||
        my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
 | 
			
		||||
        $ret{$_} = $interfaces->{$ifindex};
 | 
			
		||||
    }
 | 
			
		||||
    return \%ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cd11_ssid {
 | 
			
		||||
    my $aironet          = shift;
 | 
			
		||||
    my $cd11_sigstrength = $aironet->cd11_sigstrength();
 | 
			
		||||
    my %ret;
 | 
			
		||||
    foreach ( keys %$cd11_sigstrength ) {
 | 
			
		||||
        my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
 | 
			
		||||
        $ret{$_} = $ssid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cd11_mac {
 | 
			
		||||
    my $aironet          = shift;
 | 
			
		||||
    my $cd11_sigstrength = $aironet->cd11_sigstrength();
 | 
			
		||||
    my %ret;
 | 
			
		||||
    foreach ( keys %$cd11_sigstrength ) {
 | 
			
		||||
        my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
 | 
			
		||||
        $ret{$_} = $mac;
 | 
			
		||||
    }
 | 
			
		||||
    return \%ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Map VLAN N on interface I to its actual ifIndex.
 | 
			
		||||
sub _vlan_map_n_stack {
 | 
			
		||||
    my $aironet  = shift;
 | 
			
		||||
    my $vlan_idx = $aironet->cviRoutedVlanIfIndex();
 | 
			
		||||
 | 
			
		||||
    my $vlan_map = {};
 | 
			
		||||
    foreach my $idx ( keys %$vlan_idx ) {
 | 
			
		||||
        my ( $vlan, $num ) = split( /\./, $idx );
 | 
			
		||||
        $vlan_map->{$vlan}->{$num} = $vlan_idx->{$idx};
 | 
			
		||||
    }
 | 
			
		||||
    return $vlan_map;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# When using MBSS, the ifTable reports the
 | 
			
		||||
# base MAC address, but the actual association is
 | 
			
		||||
# with a different MAC address for MBSS.
 | 
			
		||||
# This convoluted path seems to be necessary
 | 
			
		||||
# to get the right overrides.
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
 | 
			
		||||
    # no partial is possible due to the levels
 | 
			
		||||
    # of indirection.
 | 
			
		||||
 | 
			
		||||
    # Start with the ifPhysAddress, and override
 | 
			
		||||
    my $mbss_mac = $aironet->orig_i_mac();
 | 
			
		||||
 | 
			
		||||
    my $mbss_mac_addr = $aironet->mbss_mac_addr();
 | 
			
		||||
    my $ssid_vlan     = $aironet->cdot11SecAuxSsidVlan();
 | 
			
		||||
    my $vlan_map      = $aironet->cviRoutedVlanIfIndex();
 | 
			
		||||
    my $ifstack       = $aironet->ifStackStatus();
 | 
			
		||||
 | 
			
		||||
    my $vlan_list = {};
 | 
			
		||||
    foreach my $idx ( keys %$vlan_map ) {
 | 
			
		||||
        my ( $vlan, $num ) = split( /\./, $idx );
 | 
			
		||||
        push( @{ $vlan_list->{$vlan} }, $vlan_map->{$idx} );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $stack = {};
 | 
			
		||||
    foreach my $idx ( keys %$ifstack ) {
 | 
			
		||||
        my ( $upper, $lower ) = split( /\./, $idx );
 | 
			
		||||
        $stack->{$upper}->{$lower} = $ifstack->{$idx};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # mbss_mac_addr index is (radio, ssid).
 | 
			
		||||
    # ssid_vlan maps ssid->vlan.
 | 
			
		||||
    # vlan_map maps vlan->[list of interfaces]
 | 
			
		||||
    # ifstack allows us to pick the right interface
 | 
			
		||||
    foreach my $idx ( keys %$mbss_mac_addr ) {
 | 
			
		||||
        my ( $interface, @ssid ) = split( /\./, $idx );
 | 
			
		||||
        my $vlan = $ssid_vlan->{ join( ".", scalar(@ssid), @ssid ) };
 | 
			
		||||
        next unless defined($vlan);
 | 
			
		||||
        foreach my $vlanif ( @{ $vlan_list->{$vlan} } ) {
 | 
			
		||||
            if ( defined( $stack->{$vlanif}->{$interface} ) ) {
 | 
			
		||||
                $mbss_mac->{$vlanif} = $mbss_mac_addr->{$idx};
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $mbss_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ssidlist {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
 | 
			
		||||
    # no partial is possible due to the levels
 | 
			
		||||
    # of indirection.
 | 
			
		||||
    my $ssid_row  = $aironet->cdot11SecInterfSsidRowStatus();
 | 
			
		||||
    my $ssid_vlan = $aironet->cdot11SecAuxSsidVlan();
 | 
			
		||||
    if ( !defined($ssid_row) || !defined($ssid_vlan) ) {
 | 
			
		||||
        return $aironet->cd11IfAuxSsid();
 | 
			
		||||
    }
 | 
			
		||||
    my $ssidlist     = {};
 | 
			
		||||
    my $if_ssidcount = {};
 | 
			
		||||
    my $vlan_map     = $aironet->_vlan_map_n_stack();
 | 
			
		||||
    foreach my $idx ( keys %$ssid_row ) {
 | 
			
		||||
        next unless $ssid_row->{$idx} eq 'active';
 | 
			
		||||
 | 
			
		||||
        # ssid_row index is radio.ssid
 | 
			
		||||
        my ( $interface, $ssid ) = split( /\./, $idx, 2 );
 | 
			
		||||
        my ( $len, @ssidt ) = split( /\./, $ssid );
 | 
			
		||||
        my $mappedintf = $vlan_map->{ $ssid_vlan->{$ssid} }->{$interface};
 | 
			
		||||
        next unless $mappedintf;
 | 
			
		||||
        if ( !$if_ssidcount->{$mappedintf} ) {
 | 
			
		||||
            $if_ssidcount->{$mappedintf} = 1;
 | 
			
		||||
        }
 | 
			
		||||
        my $ssidlist_idx
 | 
			
		||||
            = sprintf( "%s.%d", $mappedintf, $if_ssidcount->{$mappedintf} );
 | 
			
		||||
        $ssidlist->{$ssidlist_idx} = pack( "C*", @ssidt );
 | 
			
		||||
        $if_ssidcount->{$mappedintf}++;
 | 
			
		||||
    }
 | 
			
		||||
    return $ssidlist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ssidbcast {
 | 
			
		||||
    my $aironet    = shift;
 | 
			
		||||
    my $partial    = shift;
 | 
			
		||||
    my $mbss_bcast = $aironet->cdot11SecAuxSsidMbssidBroadcast();
 | 
			
		||||
    if ( !defined($mbss_bcast) ) {
 | 
			
		||||
        return $aironet->cd11IfAuxSsidBroadcastSsid($partial);
 | 
			
		||||
    }
 | 
			
		||||
    my $map = {};
 | 
			
		||||
    foreach my $key ( keys %$mbss_bcast ) {
 | 
			
		||||
        my (@idx) = split( /\./, $key );
 | 
			
		||||
        my $len = shift(@idx);
 | 
			
		||||
        $map->{ pack( "C*", @idx ) } = $mbss_bcast->{$key};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # This needs to return the same indexes as i_ssidlist.
 | 
			
		||||
    # mbss_bcast maps ssid -> broadcasting
 | 
			
		||||
    #  so we just replace the i_ssidlist values with the mbss_bcast ones.
 | 
			
		||||
    my $i_ssidlist  = $aironet->i_ssidlist();
 | 
			
		||||
    my $i_ssidbcast = {};
 | 
			
		||||
    foreach my $key ( keys %$i_ssidlist ) {
 | 
			
		||||
        $i_ssidbcast->{$key} = $map->{ $i_ssidlist->{$key} };
 | 
			
		||||
    }
 | 
			
		||||
    return $i_ssidbcast;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ssidmac {
 | 
			
		||||
    my $aironet    = shift;
 | 
			
		||||
    my $partial    = shift;
 | 
			
		||||
    my $mbss_mac_addr = $aironet->mbss_mac_addr();
 | 
			
		||||
 | 
			
		||||
    # Same logic as i_ssidbcast to return same indexes as i_ssidlist
 | 
			
		||||
    my $map = {};
 | 
			
		||||
    foreach my $key ( keys %$mbss_mac_addr ) {
 | 
			
		||||
        my ( $interface, @idx ) = split( /\./, $key );
 | 
			
		||||
        $map->{ pack( "C*", @idx ) } = $mbss_mac_addr->{$key};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $i_ssidlist  = $aironet->i_ssidlist();
 | 
			
		||||
    my $i_ssidmac = {};
 | 
			
		||||
    foreach my $key ( keys %$i_ssidlist ) {
 | 
			
		||||
        $i_ssidmac->{$key} = $map->{ $i_ssidlist->{$key} };
 | 
			
		||||
    }
 | 
			
		||||
    return $i_ssidmac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
###
 | 
			
		||||
# PoE status.  The ps1_type is the PoE injector type, which is just
 | 
			
		||||
# a scalar; the status is a little more complex.
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $idx = $aironet->cpoePdCurrentPowerLevel();
 | 
			
		||||
    my $mw = $aironet->cpoePdSupportedPower( $idx );
 | 
			
		||||
    my $descr = $aironet->cpoePdSupportedPowerMode( $idx );
 | 
			
		||||
 | 
			
		||||
    return sprintf( "%.2fW (%s)", $mw->{$idx} * 0.001, $descr->{$idx} );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running
 | 
			
		||||
IOS.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides interface to SNMP Data available on newer Aironet devices running
 | 
			
		||||
Cisco IOS.
 | 
			
		||||
 | 
			
		||||
Note there are two classes for Aironet devices :
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3::Aironet
 | 
			
		||||
 | 
			
		||||
This class is for devices running Aironet software (older)
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2::Aironet
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
my $aironet = new SNMP::Info::Layer2::Aironet(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aironet->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $aironet->description()
 | 
			
		||||
 | 
			
		||||
System description. Adds info from method e_descr() from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"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 $aironet->cd11_port()
 | 
			
		||||
 | 
			
		||||
Returns radio interfaces.
 | 
			
		||||
 | 
			
		||||
=item $aironet->cd11_mac()
 | 
			
		||||
 | 
			
		||||
Returns client radio interface MAC addresses.
 | 
			
		||||
 | 
			
		||||
=item $aironet->cd11_ssid()
 | 
			
		||||
 | 
			
		||||
Returns radio interface ssid.
 | 
			
		||||
 | 
			
		||||
=item $aironet->dot11_cur_tx_pwr_mw()
 | 
			
		||||
 | 
			
		||||
Current transmit power, in milliwatts, of the radio interface.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aironet->interfaces()
 | 
			
		||||
 | 
			
		||||
Uses the i_description() field.
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_mac()
 | 
			
		||||
 | 
			
		||||
MAC address of the interface. Note this is just the MAC of the port, not
 | 
			
		||||
anything connected to it.
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_duplex()
 | 
			
		||||
 | 
			
		||||
Crosses information from SNMP::Info::EtherLike to get duplex info for
 | 
			
		||||
interfaces.
 | 
			
		||||
 | 
			
		||||
=item $aironet->bp_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of bridge port table entries map back to interface
 | 
			
		||||
identifier (iid)
 | 
			
		||||
 | 
			
		||||
=item $aironet->fw_mac()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table MAC Addresses
 | 
			
		||||
 | 
			
		||||
=item $aironet->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries port interface
 | 
			
		||||
identifier (iid)
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
 | 
			
		||||
 | 
			
		||||
=item $aironet->v_index()
 | 
			
		||||
 | 
			
		||||
Returns VLAN IDs
 | 
			
		||||
 | 
			
		||||
=item $aironet->v_name()
 | 
			
		||||
 | 
			
		||||
Returns VLAN names
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_ssidlist()
 | 
			
		||||
 | 
			
		||||
Returns a list of SSIDs associated with interfaces.  This function
 | 
			
		||||
is C<MBSSID> aware, so when using C<MBSSID> can map SSIDs to the sub-interface
 | 
			
		||||
to which they belong.
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_ssidbcast()
 | 
			
		||||
 | 
			
		||||
With the same keys as i_ssidlist, returns whether the given SSID is
 | 
			
		||||
being broadcast.
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_ssidmac()
 | 
			
		||||
 | 
			
		||||
With the same keys as i_ssidlist, returns the Basic service set
 | 
			
		||||
identification (BSSID), MAC address, the AP is using for the SSID.
 | 
			
		||||
 | 
			
		||||
=item $aironet ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns the PoE injector status based on C<cpoePdSupportedPower> and
 | 
			
		||||
C<cpoePdSupportedPowerMode>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aironet->munge_cd11_txrate()
 | 
			
		||||
 | 
			
		||||
Converts units of half a megabit to human readable string.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										240
									
								
								lib/SNMP/Info/Layer2/Allied.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										240
									
								
								lib/SNMP/Info/Layer2/Allied.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,240 @@
 | 
			
		||||
# SNMP::Info::Layer2::Allied
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Allied;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Allied::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Allied::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    'ip_adresses' => 'atNetAddress',
 | 
			
		||||
    'ip_mac'      => 'atPhysAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    'AtiSwitch-MIB'    => 'atiswitchProductType',
 | 
			
		||||
    'AtiStackInfo-MIB' => 'atiswitchEnhancedStacking',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'allied';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'allied';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
    my $descr  = $allied->description();
 | 
			
		||||
 | 
			
		||||
    if ( defined ($descr) && $descr =~ m/version (\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
    my $desc = $allied->description();
 | 
			
		||||
 | 
			
		||||
    if ( defined ($desc) &&  $desc =~ /(AT-80\d{2}\S*)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub root_ip {
 | 
			
		||||
    my $allied  = shift;
 | 
			
		||||
    my $ip_hash = $allied->ip_addresses();
 | 
			
		||||
    my $found_ip;
 | 
			
		||||
 | 
			
		||||
    foreach my $ip ( values %{$ip_hash} ) {
 | 
			
		||||
        $found_ip = SNMP::Info::munge_ip($ip) if ( defined $ip );
 | 
			
		||||
        last;    # this is only one IP address
 | 
			
		||||
    }
 | 
			
		||||
    return $found_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mac {
 | 
			
		||||
    my $allied   = shift;
 | 
			
		||||
    my $mac_hash = $allied->ip_mac();
 | 
			
		||||
    my $found_mac;
 | 
			
		||||
 | 
			
		||||
    foreach my $mac ( values %{$mac_hash} ) {
 | 
			
		||||
        $found_mac = SNMP::Info::munge_mac($mac);
 | 
			
		||||
        last;    # this is only one MAC address
 | 
			
		||||
    }
 | 
			
		||||
    return $found_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $allied  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
 | 
			
		||||
 | 
			
		||||
    foreach my $port ( keys %$i_up ) {
 | 
			
		||||
        my $up = $i_up->{$port};
 | 
			
		||||
        $i_up->{$port} = 'down' if $up eq 'linktesterror';
 | 
			
		||||
        $i_up->{$port} = 'up'   if $up eq 'nolinktesterror';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_up;
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesis switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker, Dmitry Sergienko <dmitry@trifle.net>
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a
 | 
			
		||||
Allied device through SNMP. See inherited classes' documentation for
 | 
			
		||||
inherited methods.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<AtiSwitch-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<AtiStackInfo-MIB>
 | 
			
		||||
 | 
			
		||||
Download for your device from ftp://ftp.allied-telesyn.com/pub/switches/mibs/
 | 
			
		||||
 | 
			
		||||
=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 $allied->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'allied'
 | 
			
		||||
 | 
			
		||||
=item $allied->os()
 | 
			
		||||
 | 
			
		||||
Returns 'allied'
 | 
			
		||||
 | 
			
		||||
=item $allied->os_ver()
 | 
			
		||||
 | 
			
		||||
Culls Version from description()
 | 
			
		||||
 | 
			
		||||
=item $allied->root_ip()
 | 
			
		||||
 | 
			
		||||
Returns IP Address of Managed Device.
 | 
			
		||||
 | 
			
		||||
(C<actualIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $allied->model()
 | 
			
		||||
 | 
			
		||||
Tries to cull out C<AT-nnnnX> out of the description field.
 | 
			
		||||
 | 
			
		||||
=item $allied->mac()
 | 
			
		||||
 | 
			
		||||
Returns device MAC.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $allied->i_up()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to link status.  Changes
 | 
			
		||||
the values of ati_up() to 'up' and 'down'.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										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.70-135';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
							
								
								
									
										693
									
								
								lib/SNMP/Info/Layer2/Baystack.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										693
									
								
								lib/SNMP/Info/Layer2/Baystack.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,693 @@
 | 
			
		||||
# SNMP::Info::Layer2::Baystack
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
# 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::Baystack;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::SONMP;
 | 
			
		||||
use SNMP::Info::NortelStack;
 | 
			
		||||
use SNMP::Info::RapidCity;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Baystack::ISA
 | 
			
		||||
    = qw/SNMP::Info::SONMP SNMP::Info::NortelStack
 | 
			
		||||
    SNMP::Info::RapidCity
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Baystack::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%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::RapidCity::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
 | 
			
		||||
    %SNMP::Info::SONMP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS,
 | 
			
		||||
    %SNMP::Info::SONMP::FUNCS,
 | 
			
		||||
    'peth_port_power' => 'bspePethPsePortExtMeasuredPower',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# 450's report full duplex as speed = 20mbps?!
 | 
			
		||||
$SNMP::Info::SPEED_MAP{20_000_000}    = '10 Mbps';
 | 
			
		||||
$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::RapidCity::MUNGE, %SNMP::Info::NortelStack::MUNGE,
 | 
			
		||||
    %SNMP::Info::SONMP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $descr    = $baystack->description() || "";
 | 
			
		||||
    my $model    = $baystack->model() || "";
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ /Business Ethernet Switch.*SW:v/i ) {
 | 
			
		||||
        return 'bes';
 | 
			
		||||
    }
 | 
			
		||||
    if (   ( ( $model =~ /(420|425|BPS)/ ) and ( $descr =~ m/SW:v[1-2]/i ) )
 | 
			
		||||
        or ( ( $model =~ /(410|450|380)/ ) ) )
 | 
			
		||||
    {
 | 
			
		||||
        return 'baystack';
 | 
			
		||||
    }
 | 
			
		||||
    if ( $model =~ /VSP/ ) {
 | 
			
		||||
        return 'vsp';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'boss';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_bin {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $descr    = $baystack->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # 303 / 304
 | 
			
		||||
    if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # 450
 | 
			
		||||
    if ( $descr =~ m/FW:V(\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/FW:(\d+\.\d+\.\d+\.\d+)/i ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $id       = $baystack->id();
 | 
			
		||||
    return unless defined $id;
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    my $descr = $baystack->description();
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
    $model =~ s/^(E(R)?S|BayStack|Ethernet(Routing)?Switch)-?//;
 | 
			
		||||
    $model =~ s/-ethSwitchNMM//;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index      = $baystack->i_index($partial) || {};
 | 
			
		||||
    my $index_factor = $baystack->index_factor();
 | 
			
		||||
    my $slot_offset  = $baystack->slot_offset();
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
 | 
			
		||||
        # Ignore cascade ports
 | 
			
		||||
        next if $index > $index_factor * 8;
 | 
			
		||||
 | 
			
		||||
        my $port = ( $index % $index_factor );
 | 
			
		||||
        my $slot = ( int( $index / $index_factor ) ) + $slot_offset;
 | 
			
		||||
 | 
			
		||||
        my $slotport = "$slot.$port";
 | 
			
		||||
        $if{$iid} = $slotport;
 | 
			
		||||
    }
 | 
			
		||||
    return \%if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_mac = $baystack->orig_i_mac($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_mac;
 | 
			
		||||
 | 
			
		||||
    # Baystack 303's with a hw rev < 2.11.4.5 report the mac as all zeros
 | 
			
		||||
    foreach my $iid ( keys %$i_mac ) {
 | 
			
		||||
        my $mac = $i_mac->{$iid};
 | 
			
		||||
        next unless defined $mac;
 | 
			
		||||
        next if $mac eq '00:00:00:00:00:00';
 | 
			
		||||
        $i_mac{$iid} = $mac;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $baystack->i_index($partial)     || {};
 | 
			
		||||
    my $i_alias = $baystack->i_alias($partial)     || {};
 | 
			
		||||
    my $i_name2 = $baystack->orig_i_name($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
    foreach my $iid ( keys %$i_name2 ) {
 | 
			
		||||
        my $name  = $i_name2->{$iid};
 | 
			
		||||
        my $alias = $i_alias->{$iid};
 | 
			
		||||
        $i_name{$iid}
 | 
			
		||||
            = ( defined $alias and $alias !~ /^\s*$/ )
 | 
			
		||||
            ? $alias
 | 
			
		||||
            : $name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub index_factor {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $model    = $baystack->model() || "";
 | 
			
		||||
    my $os       = $baystack->os();
 | 
			
		||||
    my $os_ver   = $baystack->os_ver();
 | 
			
		||||
    my $op_mode  = $baystack->ns_op_mode();
 | 
			
		||||
 | 
			
		||||
    $op_mode = 'pure' unless defined $op_mode;
 | 
			
		||||
    if ( $os_ver =~ m/^(\d+)\./ ) {
 | 
			
		||||
        $os_ver = $1;
 | 
			
		||||
    } else {
 | 
			
		||||
        $os_ver = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $index_factor = 32;
 | 
			
		||||
    $index_factor = 64
 | 
			
		||||
        if ( ( $model =~ /(470)/ )
 | 
			
		||||
        or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) );
 | 
			
		||||
    $index_factor = 128
 | 
			
		||||
        if ( ( $model =~ /(5[56]\d\d)|VSP|4950|59100/ )
 | 
			
		||||
        and ( $os_ver >= 6 ) );
 | 
			
		||||
 | 
			
		||||
    return $index_factor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Newer devices support ENTITY-MIB, use if available otherwise use proprietary
 | 
			
		||||
# methods.
 | 
			
		||||
 | 
			
		||||
sub e_index {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_index($partial) || $stack->ns_e_index($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_class {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_class($partial) || $stack->ns_e_class($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_descr {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_descr($partial) || $stack->ns_e_descr($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_name {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_name($partial) || $stack->ns_e_name($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_fwver {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_fwver($partial) || $stack->ns_e_fwver($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_hwver {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_hwver($partial) || $stack->ns_e_hwver($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_parent {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_parent($partial) || $stack->ns_e_parent($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_pos {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_pos($partial) || $stack->ns_e_pos($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_serial {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_serial($partial) || $stack->ns_e_serial($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_swver {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_swver($partial) || $stack->ns_e_swver($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_type {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_type($partial) || $stack->ns_e_type($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_vendor {
 | 
			
		||||
    my $stack   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $stack->SUPER::e_vendor($partial) || $stack->ns_e_vendor($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# fix for stack of switches without POE on module 1
 | 
			
		||||
# https://sourceforge.net/tracker/?func=detail&aid=3317739&group_id=70362&atid=527529
 | 
			
		||||
sub peth_port_ifindex {
 | 
			
		||||
    my $stack = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my %peth_port_ifindex = ();
 | 
			
		||||
    my $poe_port_st = $stack->peth_port_status($partial);
 | 
			
		||||
    my $if_index = $stack->interfaces($partial);
 | 
			
		||||
 | 
			
		||||
    foreach my $i (keys %$if_index) {
 | 
			
		||||
        next unless defined $poe_port_st->{$if_index->{$i}};
 | 
			
		||||
        $peth_port_ifindex{$if_index->{$i}} = $i;
 | 
			
		||||
    }
 | 
			
		||||
    return \%peth_port_ifindex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Currently only ERS 4800 v5.8+ support the rcBridgeSpbmMacTable
 | 
			
		||||
# which holds the FDB for a SPBM edge deployment.
 | 
			
		||||
#
 | 
			
		||||
# Q-BRIDGE still holds some entries when the rcBridgeSpbmMacTable is in use
 | 
			
		||||
# so we merge hash entries.
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $rapidcity = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $rapidcity->SUPER::fw_mac() || {};
 | 
			
		||||
    my $spbm = $rapidcity->rc_spbm_fw_mac() || {};
 | 
			
		||||
    my $fw_mac = { %$qb, %$spbm };
 | 
			
		||||
 | 
			
		||||
    return $fw_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $rapidcity = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $rapidcity->SUPER::fw_port() || {};
 | 
			
		||||
    my $spbm = $rapidcity->rc_spbm_fw_port() || {};
 | 
			
		||||
    my $fw_port = { %$qb, %$spbm };
 | 
			
		||||
 | 
			
		||||
    return $fw_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_status {
 | 
			
		||||
    my $rapidcity = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $rapidcity->SUPER::fw_status() || {};
 | 
			
		||||
    my $spbm = $rapidcity->rc_spbm_fw_status() || {};
 | 
			
		||||
    my $fw_status = { %$qb, %$spbm };
 | 
			
		||||
 | 
			
		||||
    return $fw_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub qb_fw_vlan {
 | 
			
		||||
    my $rapidcity = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $rapidcity->SUPER::qb_fw_vlan() || {};
 | 
			
		||||
    my $spbm = $rapidcity->rc_spbm_fw_vlan() || {};
 | 
			
		||||
    my $qb_fw_vlan = { %$qb, %$spbm };
 | 
			
		||||
 | 
			
		||||
    return $qb_fw_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Baystack uses S5-AGENT-MIB (loaded in NortelStack) versus RAPID-CITY
 | 
			
		||||
sub stp_ver {
 | 
			
		||||
    my $rapidcity = shift;
 | 
			
		||||
 | 
			
		||||
    return $rapidcity->s5AgSysSpanningTreeOperMode()
 | 
			
		||||
      || $rapidcity->SUPER::stp_ver();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Baystack - SNMP Interface to Avaya Ethernet Switch
 | 
			
		||||
(Baystack) and VSP 7000 series switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $baystack = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
  or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $baystack->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from an
 | 
			
		||||
Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series
 | 
			
		||||
through SNMP.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::NortelStack
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::RapidCity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<BAY-STACK-PETH-EXT-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
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::Layer3/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $baystack->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $baystack->model()
 | 
			
		||||
 | 
			
		||||
Cross references $baystack->id() to the F<SYNOPTICS-MIB> and returns
 | 
			
		||||
the results.  303s and 304s have the same ID, so we have a hack
 | 
			
		||||
to return depending on which it is.
 | 
			
		||||
 | 
			
		||||
Returns BPS for Business Policy Switch
 | 
			
		||||
 | 
			
		||||
For others extracts and returns the switch numeric designation.
 | 
			
		||||
 | 
			
		||||
=item $baystack->os()
 | 
			
		||||
 | 
			
		||||
Returns 'baystack' or 'boss' depending on software version.
 | 
			
		||||
 | 
			
		||||
=item $baystack->os_bin()
 | 
			
		||||
 | 
			
		||||
Returns the firmware version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $baystack->stp_ver()
 | 
			
		||||
 | 
			
		||||
Returns the particular STP version running on this device.
 | 
			
		||||
 | 
			
		||||
Values: C<nortelStpg>, C<pvst>, C<rstp>, C<mstp>, C<ieee8021d>
 | 
			
		||||
 | 
			
		||||
(C<s5AgSysSpanningTreeOperMode>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  $baystack->index_factor()
 | 
			
		||||
 | 
			
		||||
Required by SNMP::Info::SONMP.  Number representing the number of ports
 | 
			
		||||
reserved per slot within the device MIB.
 | 
			
		||||
 | 
			
		||||
Index factor on the Baystack switches are determined by the formula: Index
 | 
			
		||||
Factor = 64 if (model = 470 or (os eq 'boss' and operating in pure mode))
 | 
			
		||||
or else Index factor = 32.
 | 
			
		||||
 | 
			
		||||
Returns either 32 or 64 based upon the formula.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::NortelStack
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::RapidCity
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::RapidCity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $baystack->interfaces()
 | 
			
		||||
 | 
			
		||||
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()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to ignore.
 | 
			
		||||
 | 
			
		||||
=item $baystack->i_mac()
 | 
			
		||||
 | 
			
		||||
Returns the C<ifPhysAddress> table entries.
 | 
			
		||||
 | 
			
		||||
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()
 | 
			
		||||
 | 
			
		||||
Crosses C<ifName> with C<ifAlias> and returns the human set port name if
 | 
			
		||||
exists.
 | 
			
		||||
 | 
			
		||||
=item $baystack->peth_port_ifindex()
 | 
			
		||||
 | 
			
		||||
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
 | 
			
		||||
 | 
			
		||||
=item $baystack->peth_port_power()
 | 
			
		||||
 | 
			
		||||
Power supplied by PoE ports, in milliwatts
 | 
			
		||||
 | 
			
		||||
(C<bspePethPsePortExtMeasuredPower>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 F<ENTITY-MIB> Information
 | 
			
		||||
 | 
			
		||||
For older devices which do not support F<ENTITY-MIB>, these methods emulate
 | 
			
		||||
Physical Table methods using F<S5-CHASSIS-MIB>.  See
 | 
			
		||||
L<SNMP::Info::NortelStack/"TABLE METHODS"> for details on ns_e_* methods.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=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()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalClass>, this will try ns_e_class().
 | 
			
		||||
 | 
			
		||||
=item $baystack->e_descr()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalDescr>, this will try ns_e_descr().
 | 
			
		||||
 | 
			
		||||
=item $baystack->e_name()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalName>, this will try ns_e_name().
 | 
			
		||||
 | 
			
		||||
=item $baystack->e_fwver()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalFirmwareRev>, this will try
 | 
			
		||||
ns_e_fwver().
 | 
			
		||||
 | 
			
		||||
=item $baystack->e_hwver()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalHardwareRev>, this will try
 | 
			
		||||
ns_e_hwver().
 | 
			
		||||
 | 
			
		||||
=item $baystack->e_parent()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalContainedIn>, this will try
 | 
			
		||||
ns_e_parent().
 | 
			
		||||
 | 
			
		||||
=item $baystack->e_pos()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalParentRelPos>, this will try
 | 
			
		||||
ns_e_pos().
 | 
			
		||||
 | 
			
		||||
=item $baystack->e_serial()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalSerialNum>, this will try
 | 
			
		||||
ns_e_serial().
 | 
			
		||||
 | 
			
		||||
=item $baystack->e_swver()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalSoftwareRev>, this will try
 | 
			
		||||
ns_e_swver().
 | 
			
		||||
 | 
			
		||||
=item $baystack->e_type()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalVendorType>, this will try
 | 
			
		||||
ns_e_type().
 | 
			
		||||
 | 
			
		||||
=item $baystack->e_vendor()
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<entPhysicalMfgName>, this will try
 | 
			
		||||
ns_e_vendor().
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Layer 2 Forwarding Database
 | 
			
		||||
 | 
			
		||||
These methods try to obtain the layer 2 forwarding database entries via the
 | 
			
		||||
normal bridge methods as well as SPBM entries via rapid city methods.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $baystack->fw_mac()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table MAC Addresses
 | 
			
		||||
 | 
			
		||||
=item $baystack->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries port interface
 | 
			
		||||
identifier (iid)
 | 
			
		||||
 | 
			
		||||
=item $baystack->qb_fw_vlan()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries VLAN ID
 | 
			
		||||
 | 
			
		||||
=item $baystack->fw_status()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries status
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::NortelStack
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::RapidCity
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::RapidCity/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										571
									
								
								lib/SNMP/Info/Layer2/C1900.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										571
									
								
								lib/SNMP/Info/Layer2/C1900.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,571 @@
 | 
			
		||||
# SNMP::Info::Layer2::C1900
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::C1900;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CiscoStpExtensions;
 | 
			
		||||
use SNMP::Info::CiscoAgg;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::CDP SNMP::Info::CiscoStats
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg SNMP::Info::Layer2
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    'c1900_flash_status' => 'upgradeFlashBankStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # ESSWITCH-MIB
 | 
			
		||||
    'c1900_p_index'        => 'swPortIndex',
 | 
			
		||||
    'c1900_p_ifindex'      => 'swPortIfIndex',
 | 
			
		||||
    'c1900_p_duplex'       => 'swPortDuplexStatus',
 | 
			
		||||
    'c1900_p_duplex_admin' => 'swPortFullDuplex',
 | 
			
		||||
    'c1900_p_name'         => 'swPortName',
 | 
			
		||||
    'c1900_p_up_admin'     => 'swPortAdminStatus',
 | 
			
		||||
    'c1900_p_type'         => 'swPortMediaCapability',
 | 
			
		||||
    'c1900_p_media'        => 'swPortConnectorType',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
 | 
			
		||||
    # Also known as the ESSWITCH-MIB
 | 
			
		||||
    'STAND-ALONE-ETHERNET-SWITCH-MIB' => 'series2000'
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,             %SNMP::Info::CiscoAgg::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE,         %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub bulkwalk_no         { return 1; }
 | 
			
		||||
sub cisco_comm_indexing { return 1; }
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'catalyst';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $c1900 = shift;
 | 
			
		||||
 | 
			
		||||
    # Check for superclass one
 | 
			
		||||
    my $os_ver = $c1900->SUPER::os_ver();
 | 
			
		||||
    return $os_ver if defined $os_ver;
 | 
			
		||||
 | 
			
		||||
    my $c1900_flash_status = $c1900->c1900_flash_status();
 | 
			
		||||
    return unless defined $c1900_flash_status;
 | 
			
		||||
 | 
			
		||||
    if ( $c1900_flash_status =~ m/V(\d+\.\d+(\.\d+)?)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_descr = $c1900->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$i_descr ) {
 | 
			
		||||
        $i_descr->{$iid} =~ s/\s*$//;
 | 
			
		||||
    }
 | 
			
		||||
    return $i_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $c1900_p_duplex = $c1900->c1900_p_duplex($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $if ( keys %$c1900_p_duplex ) {
 | 
			
		||||
        my $duplex = $c1900_p_duplex->{$if};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $i_duplex{$if} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $c1900_p_admin = $c1900->c1900_p_duplex_admin($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $if ( keys %$c1900_p_admin ) {
 | 
			
		||||
        my $duplex = $c1900_p_admin->{$if};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /disabled/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /flow control/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /enabled/i;
 | 
			
		||||
        $duplex = 'auto' if $duplex =~ /auto/i;
 | 
			
		||||
        $i_duplex_admin{$if} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_name       = $c1900->orig_i_name($partial)  || {};
 | 
			
		||||
    my $c1900_p_name = $c1900->c1900_p_name($partial) || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $port ( keys %$c1900_p_name ) {
 | 
			
		||||
        my $name = $c1900_p_name->{$port};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
        next unless $name !~ /^\s*$/;
 | 
			
		||||
        $i_name->{$port} = $name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_duplex_admin {
 | 
			
		||||
    my $c1900 = shift;
 | 
			
		||||
    my ( $duplex, $port ) = @_;
 | 
			
		||||
 | 
			
		||||
    # map a textual duplex to an integer one the switch understands
 | 
			
		||||
    my %duplexes = qw/full 1 half 2 auto 3/;
 | 
			
		||||
 | 
			
		||||
    my $iid = $c1900->c1900_p_ifindex($port);
 | 
			
		||||
 | 
			
		||||
    return 0 unless $iid->{$port};
 | 
			
		||||
 | 
			
		||||
    $duplex = lc($duplex);
 | 
			
		||||
 | 
			
		||||
    return 0 unless defined $duplexes{$duplex};
 | 
			
		||||
 | 
			
		||||
    return $c1900->set_c1900_p_duplex_admin( $duplexes{$duplex}, $iid );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Overlap allows more than one VLAN per port.  Unable to determine default
 | 
			
		||||
    my $overlap
 | 
			
		||||
        = $c1900->bridgeGroupAllowMembershipOverlap()
 | 
			
		||||
        || $c1900->vlanAllowMembershipOverlap()
 | 
			
		||||
        || 'disabled';
 | 
			
		||||
 | 
			
		||||
    if ( $overlap eq 'enabled' ) {
 | 
			
		||||
        return {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
 | 
			
		||||
        || $c1900->vlanMemberPortOfVlan() || {};
 | 
			
		||||
 | 
			
		||||
    my $i_pvid = {};
 | 
			
		||||
    foreach my $idx ( keys %$member_of ) {
 | 
			
		||||
        my @values = split( /\./, $idx );
 | 
			
		||||
        my ( $vlan, $port ) = @values;
 | 
			
		||||
        next unless $vlan;
 | 
			
		||||
        next unless $port;
 | 
			
		||||
        next if ( defined $partial and $port !~ /^$partial$/ );
 | 
			
		||||
        my $value = $member_of->{$idx};
 | 
			
		||||
        next if ( $value eq 'false' );
 | 
			
		||||
 | 
			
		||||
        $i_pvid->{$port} = $vlan;
 | 
			
		||||
    }
 | 
			
		||||
    return $i_pvid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
 | 
			
		||||
        || $c1900->vlanMemberPortOfVlan() || {};
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    foreach my $idx ( keys %$member_of ) {
 | 
			
		||||
        my @values = split( /\./, $idx );
 | 
			
		||||
        my ( $vlan, $port ) = @values;
 | 
			
		||||
        next unless $vlan;
 | 
			
		||||
        next unless $port;
 | 
			
		||||
        next if ( defined $partial and $port !~ /^$partial$/ );
 | 
			
		||||
        my $value = $member_of->{$idx};
 | 
			
		||||
        next if ( $value eq 'false' );
 | 
			
		||||
 | 
			
		||||
        push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
    }
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership_untagged { return {}; }
 | 
			
		||||
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $if_index = $c1900->i_index($partial);
 | 
			
		||||
    my $index = $c1900->orig_bp_index($partial) || {};
 | 
			
		||||
    foreach my $iid ( keys %$if_index ) {
 | 
			
		||||
        $index->{$iid} = $iid if ( !defined $index->{$iid} );
 | 
			
		||||
    }
 | 
			
		||||
    return $index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::C1900 - SNMP Interface to data from Cisco Catalyst 1900
 | 
			
		||||
Network Switches running CatOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoAgg
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)>
 | 
			
		||||
 | 
			
		||||
F<ESSWITCH-MIB> is included in the Version 1 MIBs from Cisco.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_flash_status()
 | 
			
		||||
 | 
			
		||||
Usually contains the version of the software loaded in flash.
 | 
			
		||||
Used by os_ver()
 | 
			
		||||
 | 
			
		||||
C<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
 | 
			
		||||
 | 
			
		||||
=item $c1900->os()
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
checks for the presence of $c1900->c1900_flash_status() and culls
 | 
			
		||||
the version from there.
 | 
			
		||||
 | 
			
		||||
=item $c1900->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c1900->cisco_comm_indexing()
 | 
			
		||||
 | 
			
		||||
Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=item $c1900->bulkwalk_no
 | 
			
		||||
 | 
			
		||||
Return C<1>.  Bulkwalk is turned off for this class.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=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 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c1900->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to the map between IID and physical Port.
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to current link duplex
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to admin duplex setting
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_name()
 | 
			
		||||
 | 
			
		||||
Crosses C<ifName> with $c1900->c1900_p_name() and returns the human set port
 | 
			
		||||
name if exists.
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between the interface and the VLAN / bridge group if overlap
 | 
			
		||||
is not enabled.
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = interface, value = array of VLAN /
 | 
			
		||||
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}}));
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_vlan_membership_untagged()
 | 
			
		||||
 | 
			
		||||
Unsupported, returns nothing.
 | 
			
		||||
 | 
			
		||||
=item $c1900->bp_index()
 | 
			
		||||
 | 
			
		||||
Returns a bp_index that contains the original bp_index entries and extra
 | 
			
		||||
entries for those interfaces listed in if_index, as some C1900 devices do not
 | 
			
		||||
return complete bp_indexes.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 F<STAND-ALONE-ETHERNET-SWITCH-MIB> Switch Port Table Entries:
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_index()
 | 
			
		||||
 | 
			
		||||
Maps the Switch Port Table to the IID
 | 
			
		||||
 | 
			
		||||
C<swPortIfIndex>
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_duplex()
 | 
			
		||||
 | 
			
		||||
Gives Port Duplex Info
 | 
			
		||||
 | 
			
		||||
(C<swPortDuplexStatus>)
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Gives admin setting for Duplex Info
 | 
			
		||||
 | 
			
		||||
(C<swPortFullDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_name()
 | 
			
		||||
 | 
			
		||||
Gives human set name for port
 | 
			
		||||
 | 
			
		||||
(C<swPortName>)
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_up_admin()
 | 
			
		||||
 | 
			
		||||
Gives Admin status of port enabled.
 | 
			
		||||
 | 
			
		||||
(C<swPortAdminStatus>)
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_type()
 | 
			
		||||
 | 
			
		||||
Gives Type of port, i.e. C<"general-ethernet">
 | 
			
		||||
 | 
			
		||||
(C<swPortMediaCapability>)
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_media()
 | 
			
		||||
 | 
			
		||||
Gives the media of the port , i.e. "C<fiber-sc>"
 | 
			
		||||
 | 
			
		||||
(C<swPortConnectorType>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c1900->set_i_duplex_admin(duplex, ifIndex)
 | 
			
		||||
 | 
			
		||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>.  Speed
 | 
			
		||||
choices are 'auto', 'half', 'full'.
 | 
			
		||||
 | 
			
		||||
  Example:
 | 
			
		||||
  my %if_map = reverse %{$c1900->interfaces()};
 | 
			
		||||
  $c1900->set_i_duplex_admin('auto', $if_map{'1'})
 | 
			
		||||
    or die "Couldn't change port duplex. ",$c1900->error(1);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										404
									
								
								lib/SNMP/Info/Layer2/C2900.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										404
									
								
								lib/SNMP/Info/Layer2/C2900.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,404 @@
 | 
			
		||||
# SNMP::Info::Layer2::C2900
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::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//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::FUNCS,
 | 
			
		||||
    'i_name' => 'ifAlias',
 | 
			
		||||
 | 
			
		||||
    # C2900PortEntry
 | 
			
		||||
    'c2900_p_index'        => 'c2900PortIfIndex',
 | 
			
		||||
    'c2900_p_duplex'       => 'c2900PortDuplexStatus',
 | 
			
		||||
    'c2900_p_duplex_admin' => 'c2900PortDuplexState',
 | 
			
		||||
    'c2900_p_speed_admin'  => 'c2900PortAdminSpeed',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::MIBS,
 | 
			
		||||
    'CISCO-C2900-MIB' => 'ciscoC2900MIB',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cisco_comm_indexing {
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $c2900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces     = $c2900->interfaces($partial);
 | 
			
		||||
    my $c2900_p_index  = $c2900->c2900_p_index() || {};
 | 
			
		||||
    my $c2900_p_duplex = $c2900->c2900_p_duplex();
 | 
			
		||||
 | 
			
		||||
    my %reverse_2900 = reverse %$c2900_p_index;
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
        my $port_2900 = $reverse_2900{$if};
 | 
			
		||||
        next unless defined $port_2900;
 | 
			
		||||
        my $duplex = $c2900_p_duplex->{$port_2900};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $i_duplex{$if} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $c2900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces    = $c2900->interfaces($partial);
 | 
			
		||||
    my $c2900_p_index = $c2900->c2900_p_index() || {};
 | 
			
		||||
    my $c2900_p_admin = $c2900->c2900_p_duplex_admin();
 | 
			
		||||
 | 
			
		||||
    my %reverse_2900 = reverse %$c2900_p_index;
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
        my $port_2900 = $reverse_2900{$if};
 | 
			
		||||
        next unless defined $port_2900;
 | 
			
		||||
        my $duplex = $c2900_p_admin->{$port_2900};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $duplex = 'auto' if $duplex =~ /auto/i;
 | 
			
		||||
        $i_duplex_admin{$if} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed_admin {
 | 
			
		||||
    my $c2900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    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 %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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_speed_admin {
 | 
			
		||||
    my $c2900 = shift;
 | 
			
		||||
    my ( $speed, $iid ) = @_;
 | 
			
		||||
 | 
			
		||||
    # map speeds to those the switch will understand
 | 
			
		||||
    my %speeds = qw/auto 1 10 10000000 100 100000000/;
 | 
			
		||||
 | 
			
		||||
    my $c2900_p_index = $c2900->c2900_p_index() || {};
 | 
			
		||||
    my %reverse_2900 = reverse %$c2900_p_index;
 | 
			
		||||
 | 
			
		||||
    $speed = lc($speed);
 | 
			
		||||
 | 
			
		||||
    return unless defined $speeds{$speed};
 | 
			
		||||
 | 
			
		||||
    # account for weirdness of c2900 mib
 | 
			
		||||
    $iid = $reverse_2900{$iid};
 | 
			
		||||
 | 
			
		||||
    return $c2900->set_c2900_p_speed_admin( $speeds{$speed}, $iid );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_duplex_admin {
 | 
			
		||||
    my $c2900 = shift;
 | 
			
		||||
    my ( $duplex, $iid ) = @_;
 | 
			
		||||
 | 
			
		||||
    # map a textual duplex to an integer one the switch understands
 | 
			
		||||
    my %duplexes = qw/full 1 half 2 auto 3/;
 | 
			
		||||
 | 
			
		||||
    my $c2900_p_index = $c2900->c2900_p_index() || {};
 | 
			
		||||
    my %reverse_2900 = reverse %$c2900_p_index;
 | 
			
		||||
 | 
			
		||||
    $duplex = lc($duplex);
 | 
			
		||||
 | 
			
		||||
    return unless defined $duplexes{$duplex};
 | 
			
		||||
 | 
			
		||||
    # account for weirdness of c2900 mib
 | 
			
		||||
    $iid = $reverse_2900{$iid};
 | 
			
		||||
 | 
			
		||||
    return $c2900->set_c2900_p_duplex_admin( $duplexes{$duplex}, $iid );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use i_description for port key, cuz i_name can be manually entered.
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $c2900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $c2900->i_index($partial)       || {};
 | 
			
		||||
    my $i_descr    = $c2900->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $port = $i_descr->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $port =~ s/\./\//g if ( $port =~ /\d+\.\d+$/ );
 | 
			
		||||
        $port =~ s/[^\d\/,()\w]+//gi;
 | 
			
		||||
 | 
			
		||||
        $if{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches
 | 
			
		||||
running IOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $c2900 = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $c2900->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a
 | 
			
		||||
C2900 device through SNMP.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-C2900-MIB>
 | 
			
		||||
 | 
			
		||||
Part of the v2 MIBs from Cisco.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c2900->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $c2900->cisco_comm_indexing()
 | 
			
		||||
 | 
			
		||||
Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c2900->interfaces()
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
    (Ethernet0.1 -> Ethernet0/1)
 | 
			
		||||
 | 
			
		||||
Also, any weird characters are removed, as I saw a few pop up.
 | 
			
		||||
 | 
			
		||||
=item $c2900->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to current link duplex
 | 
			
		||||
 | 
			
		||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex()
 | 
			
		||||
 | 
			
		||||
=item $c2900->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to admin duplex setting
 | 
			
		||||
 | 
			
		||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin()
 | 
			
		||||
 | 
			
		||||
=item $c2900->i_speed_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to admin speed setting.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 F<C2900-MIB> Port Entry Table
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_index()
 | 
			
		||||
 | 
			
		||||
Maps the Switch Port Table to the IID
 | 
			
		||||
 | 
			
		||||
(C<c2900PortIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_duplex()
 | 
			
		||||
 | 
			
		||||
Gives Port Duplex Info
 | 
			
		||||
 | 
			
		||||
(C<c2900PortDuplexStatus>)
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Gives admin setting for Duplex Info
 | 
			
		||||
 | 
			
		||||
(C<c2900PortDuplexState>)
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_speed_admin()
 | 
			
		||||
 | 
			
		||||
Gives Admin speed of port
 | 
			
		||||
 | 
			
		||||
(C<c2900PortAdminSpeed>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c2900->set_i_speed_admin(speed, ifIndex)
 | 
			
		||||
 | 
			
		||||
Sets port speed, must be supplied with speed and port C<ifIndex>
 | 
			
		||||
 | 
			
		||||
Speed choices are 'auto', '10', '100'
 | 
			
		||||
 | 
			
		||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_speed_admin() to utilize
 | 
			
		||||
port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
    Example:
 | 
			
		||||
    my %if_map = reverse %{$c2900->interfaces()};
 | 
			
		||||
    $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)
 | 
			
		||||
 | 
			
		||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>
 | 
			
		||||
 | 
			
		||||
Speed choices are 'auto', 'half', 'full'
 | 
			
		||||
 | 
			
		||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin() to utilize
 | 
			
		||||
port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
    Example:
 | 
			
		||||
    my %if_map = reverse %{$c2900->interfaces()};
 | 
			
		||||
    $c2900->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
 | 
			
		||||
        or die "Couldn't change port duplex. ",$c2900->error(1);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										133
									
								
								lib/SNMP/Info/Layer2/Carelink.pm
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										133
									
								
								lib/SNMP/Info/Layer2/Carelink.pm
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,133 @@
 | 
			
		||||
# SNMP::Info::Layer2::Carelink - SNMP Interface to Carelink Devices
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2020 by 135.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Carelink;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Carelink::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Carelink::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
# 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,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    'serial_oid'    => 'mib-2.47.1.1.1.1.11.1',
 | 
			
		||||
    'os_ver_oid' => 'mib-2.47.1.1.1.1.9.1',
 | 
			
		||||
    'hw_oid'     => 'mib-2.47.1.1.1.1.2.1',
 | 
			
		||||
    'fw_mac_oid'    => 'mib-2.47.1.1.1.1.11.1',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'carelink';
 | 
			
		||||
}
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'caos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $carelink = shift;
 | 
			
		||||
    my $ver = $carelink->os_ver_oid() || undef;
 | 
			
		||||
    return $ver if (defined $ver);
 | 
			
		||||
    return 'Unknown';
 | 
			
		||||
}
 | 
			
		||||
sub model {
 | 
			
		||||
    my $carelink = shift;
 | 
			
		||||
    my $id = $carelink->id();
 | 
			
		||||
    my $mod = $carelink->hw_oid() || undef;
 | 
			
		||||
    return $mod if (defined $mod);
 | 
			
		||||
    return 'Unknown';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Carelink - SNMP Interface to Carelink Devices
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $carelink = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $carelink->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for carelink Devices running IOS-like software
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
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 $carelink->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'adtran'
 | 
			
		||||
 | 
			
		||||
=item $carelink->os()
 | 
			
		||||
 | 
			
		||||
Returns 'caos'
 | 
			
		||||
 | 
			
		||||
=item $carelink->layers()
 | 
			
		||||
 | 
			
		||||
Ensures that layer two is reported, at least.
 | 
			
		||||
 | 
			
		||||
=item $carelink->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version.
 | 
			
		||||
 | 
			
		||||
=item $carelink->model()
 | 
			
		||||
 | 
			
		||||
Returns the model extracted.
 | 
			
		||||
 | 
			
		||||
=item $carelink->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										312
									
								
								lib/SNMP/Info/Layer2/Catalyst.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										312
									
								
								lib/SNMP/Info/Layer2/Catalyst.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,312 @@
 | 
			
		||||
# SNMP::Info::Layer2::Catalyst
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond
 | 
			
		||||
# 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::Catalyst;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoStack;
 | 
			
		||||
use SNMP::Info::Layer2::Cisco;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Catalyst::ISA
 | 
			
		||||
    = qw/SNMP::Info::CiscoStack SNMP::Info::Layer2::Cisco Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# 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 %i_physical;
 | 
			
		||||
    foreach my $port ( keys %$p_port ) {
 | 
			
		||||
        my $iid = $p_port->{$port};
 | 
			
		||||
        $i_physical{$iid} = 1;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_physical;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'catalyst';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $cat    = shift;
 | 
			
		||||
    my $os_ver = $cat->SUPER::os_ver();
 | 
			
		||||
    return $os_ver if defined $os_ver;
 | 
			
		||||
 | 
			
		||||
    my $m_swver = $cat->m_swver();
 | 
			
		||||
    return unless defined $m_swver;
 | 
			
		||||
 | 
			
		||||
    # assume .1 entry is the chassis and the sw version we want.
 | 
			
		||||
    return $m_swver->{1} if defined $m_swver->{1};
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Workaround for incomplete bp_index
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $cat     = shift;
 | 
			
		||||
    my $p_index = $cat->p_port() || {};
 | 
			
		||||
    my $b_index = $cat->p_oidx() || {};
 | 
			
		||||
 | 
			
		||||
    my %bp_index;
 | 
			
		||||
    foreach my $iid ( keys %$p_index ) {
 | 
			
		||||
        my $ifidx = $p_index->{$iid};
 | 
			
		||||
        next unless defined $ifidx;
 | 
			
		||||
        my $bpidx = $b_index->{$iid} || 0;
 | 
			
		||||
 | 
			
		||||
        $bp_index{$bpidx} = $ifidx;
 | 
			
		||||
    }
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cisco_comm_indexing {
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $cat     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index   = $cat->i_index($partial);
 | 
			
		||||
    my $portnames = $cat->p_port() || {};
 | 
			
		||||
    my %portmap   = reverse %$portnames;
 | 
			
		||||
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        my $if   = $i_index->{$iid};
 | 
			
		||||
        $if =~ s/\./\// if $if;
 | 
			
		||||
        my $port = $portmap{$iid};
 | 
			
		||||
        $port =~ s/\./\// if $port;
 | 
			
		||||
        $interfaces{$iid} = $port || $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $cat     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_port = $cat->p_port() || {};
 | 
			
		||||
    my $p_name = $cat->p_name() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
    foreach my $port ( keys %$p_name ) {
 | 
			
		||||
        my $iid = $p_port->{$port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        next if ( defined $partial and $iid !~ /^$partial$/ );
 | 
			
		||||
        $i_name{$iid} = $p_name->{$port};
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Catalyst - SNMP Interface to Cisco Catalyst devices
 | 
			
		||||
running Catalyst OS.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info subclass to provide information for Cisco Catalyst series switches
 | 
			
		||||
running CatOS.
 | 
			
		||||
 | 
			
		||||
This class includes the Catalyst 2920, 4000, 5000, 6000 (hybrid mode)
 | 
			
		||||
families.
 | 
			
		||||
 | 
			
		||||
This subclass is not for all devices that have the name Catalyst.  Note that
 | 
			
		||||
some Catalyst switches run IOS, like the 2900 and 3550 families.  Cisco
 | 
			
		||||
Catalyst 1900 switches use their own MIB and have a separate subclass.  Use
 | 
			
		||||
the method above to have SNMP::Info determine the appropriate subclass before
 | 
			
		||||
using this class directly.
 | 
			
		||||
 | 
			
		||||
See SNMP::Info::device_type() for specifics.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
 my $cat = new SNMP::Info::Layer2::Catalyst(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
These MIBs are found in the standard v2 MIBs from Cisco.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cat->os()
 | 
			
		||||
 | 
			
		||||
Returns 'catalyst'
 | 
			
		||||
 | 
			
		||||
=item $cat->os_ver()
 | 
			
		||||
 | 
			
		||||
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()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $cat->cisco_comm_indexing()
 | 
			
		||||
 | 
			
		||||
Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cat->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns the map between SNMP Interface Identifier (iid) and physical port
 | 
			
		||||
name.
 | 
			
		||||
 | 
			
		||||
=item $cat->i_name()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to human set name.
 | 
			
		||||
 | 
			
		||||
C<portName>
 | 
			
		||||
 | 
			
		||||
=item $cat->i_physical()
 | 
			
		||||
 | 
			
		||||
Returns a map to IID for ports that are physical ports, not vlans, etc.
 | 
			
		||||
 | 
			
		||||
=item $cat->bp_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of bridge port table entries map back to interface
 | 
			
		||||
identifier (iid)
 | 
			
		||||
 | 
			
		||||
Crosses (C<portCrossIndex>) to (C<portIfIndex>) since some devices seem to
 | 
			
		||||
have problems with F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										524
									
								
								lib/SNMP/Info/Layer2/Centillion.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										524
									
								
								lib/SNMP/Info/Layer2/Centillion.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,524 @@
 | 
			
		||||
# SNMP::Info::Layer2::Centillion
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 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::Centillion;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::NortelStack;
 | 
			
		||||
use SNMP::Info::SONMP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Centillion::ISA
 | 
			
		||||
    = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Centillion::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
    %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
    %SNMP::Info::NortelStack::MIBS,
 | 
			
		||||
    %SNMP::Info::SONMP::MIBS,
 | 
			
		||||
    'CENTILLION-DOT3-EXTENSIONS-MIB' => 'cnDot3ExtnTable',
 | 
			
		||||
    'S5-COMMON-STATS-MIB'            => 's5CmStat',
 | 
			
		||||
    'CENTILLION-VLAN-MIB'            => 'cnVlanENETMgt',
 | 
			
		||||
    'CENTILLION-CONFIG-MIB'          => 'sysTFTPStart',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
    %SNMP::Info::NortelStack::GLOBALS,
 | 
			
		||||
    %SNMP::Info::SONMP::GLOBALS,
 | 
			
		||||
    'tftp_action' => 'sysTFTPStart',
 | 
			
		||||
    'tftp_host'   => 'sysTFTPIpAddress',
 | 
			
		||||
    'tftp_file'   => 'sysTFTPFileName',
 | 
			
		||||
    'tftp_type'   => 'sysTFTPFileType',
 | 
			
		||||
    'tftp_result' => 'sysTFTPResult',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,
 | 
			
		||||
    %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
    %SNMP::Info::NortelStack::FUNCS,
 | 
			
		||||
    %SNMP::Info::SONMP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # CENTILLION-DOT3-EXTENSIONS-MIB::cnDot3ExtnTable
 | 
			
		||||
    'centillion_p_index'        => 'cnDot3ExtnIfIndex',
 | 
			
		||||
    'centillion_p_duplex'       => 'cnDot3ExtnIfOperConnectionType',
 | 
			
		||||
    'centillion_p_duplex_admin' => 'cnDot3ExtnIfAdminConnectionType',
 | 
			
		||||
 | 
			
		||||
    # S5-COMMON-STATS-MIB::s5CmSNodeTable
 | 
			
		||||
    'fw_mac'  => 's5CmSNodeMacAddr',
 | 
			
		||||
    'fw_port' => 's5CmSNodeIfIndx',
 | 
			
		||||
 | 
			
		||||
    # CENTILLION-VLAN-MIB::cnVlanPortMemberTable
 | 
			
		||||
    'centillion_i_vlan_index' => 'cnVlanPortMemberIfIndex',
 | 
			
		||||
    'centillion_i_vlan'       => 'cnVlanPortMemberVID',
 | 
			
		||||
    'centillion_i_vlan_type'  => 'cnVlanPortMemberIngressType',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::MUNGE,
 | 
			
		||||
    %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
    %SNMP::Info::NortelStack::MUNGE,
 | 
			
		||||
    %SNMP::Info::SONMP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'centillion';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
    my $descr      = $centillion->i_description();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$descr ) {
 | 
			
		||||
        my $type = $descr->{$if};
 | 
			
		||||
 | 
			
		||||
        # Skip virtual interfaces
 | 
			
		||||
        $i_ignore{$if}++ if $type =~ /(VE|VID|vc|lp)/i;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
    my $i_index    = $centillion->i_index();
 | 
			
		||||
    my $i_descr    = $centillion->i_description();
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        my $descr = $i_descr->{$iid};
 | 
			
		||||
 | 
			
		||||
        # Skip ATM and virtual interfaces
 | 
			
		||||
        next if $descr =~ /(VE|VID|vc|lp)/i;
 | 
			
		||||
 | 
			
		||||
        # Index numbers are deterministic slot * 256 + port
 | 
			
		||||
        my $port     = $index % 256;
 | 
			
		||||
        my $slot     = int( $index / 256 );
 | 
			
		||||
        my $slotport = "$slot.$port";
 | 
			
		||||
 | 
			
		||||
        $slotport = "$descr" if $descr =~ /(mcp)/i;
 | 
			
		||||
 | 
			
		||||
        $if{$index} = $slotport;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_index  = $centillion->centillion_p_index();
 | 
			
		||||
    my $port_duplex = $centillion->centillion_p_duplex();
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $iid ( keys %$port_index ) {
 | 
			
		||||
        my $index = $port_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        my $duplex = $port_duplex->{$iid};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $i_duplex{$index} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
 | 
			
		||||
    my $port_index = $centillion->centillion_p_index();
 | 
			
		||||
    my $port_admin = $centillion->centillion_p_duplex_admin();
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $iid ( keys %$port_index ) {
 | 
			
		||||
        my $index = $port_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        my $duplex = $port_admin->{$iid};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $duplex = 'auto' if $duplex =~ /auto/i;
 | 
			
		||||
        $i_duplex_admin{$index} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
 | 
			
		||||
    my $cn_vlan_index = $centillion->centillion_i_vlan_index();
 | 
			
		||||
    my $cn_vlan       = $centillion->centillion_i_vlan();
 | 
			
		||||
 | 
			
		||||
    my %i_vlan;
 | 
			
		||||
    foreach my $iid ( keys %$cn_vlan_index ) {
 | 
			
		||||
        my $index = $cn_vlan_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        my $vlan = $cn_vlan->{$iid};
 | 
			
		||||
        next unless defined $vlan;
 | 
			
		||||
 | 
			
		||||
        $i_vlan{$index} = $vlan;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
    my $id         = $centillion->id();
 | 
			
		||||
    return unless defined $id;
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
    $model =~ s/^sreg-//i;
 | 
			
		||||
 | 
			
		||||
    return '5000BH' if ( $model =~ /5000BH/ );
 | 
			
		||||
    return '5005BH' if ( $model =~ /5005BH/ );
 | 
			
		||||
    return 'C100'   if ( $model =~ /Centillion100/ );
 | 
			
		||||
    return 'C50N'   if ( $model =~ /Centillion50N/ );
 | 
			
		||||
    return 'C50T'   if ( $model =~ /Centillion50T/ );
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
    my $index      = $centillion->fw_port();
 | 
			
		||||
 | 
			
		||||
    my %bp_index;
 | 
			
		||||
    foreach my $iid ( keys %$index ) {
 | 
			
		||||
        my $b_index = $index->{$iid};
 | 
			
		||||
        next unless defined $b_index;
 | 
			
		||||
 | 
			
		||||
        #Index value is the same as ifIndex
 | 
			
		||||
        $bp_index{$b_index} = $b_index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub index_factor {
 | 
			
		||||
    return 256;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub slot_offset {
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $centillion->SUPER::fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $centillion->SUPER::fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Centillion - SNMP Interface to Nortel Centillion based
 | 
			
		||||
ATM Switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a
 | 
			
		||||
Centillion device through SNMP.
 | 
			
		||||
 | 
			
		||||
Note:  This class supports version 4.X and 5.X which are VLAN based rather
 | 
			
		||||
than bridge group based.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::NortelStack
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CENTILLION-DOT3-EXTENSIONS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<S5-COMMON-STATS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CENTILLION-VLAN-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CENTILLION-CONFIG-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info/"REQUIREMENTS"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::NortelStack/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $centillion->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
 | 
			
		||||
=item $centillion->model()
 | 
			
		||||
 | 
			
		||||
Cross references $centillion->id() to the F<SYNOPTICS-MIB> and returns
 | 
			
		||||
the results.
 | 
			
		||||
 | 
			
		||||
Removes C<sreg-> from the model name
 | 
			
		||||
 | 
			
		||||
=item $centillion->os()
 | 
			
		||||
 | 
			
		||||
Returns 'centillion'
 | 
			
		||||
 | 
			
		||||
=item $centillion->tftp_action()
 | 
			
		||||
 | 
			
		||||
(C<sysTFTPStart>)
 | 
			
		||||
 | 
			
		||||
=item $centillion->tftp_host()
 | 
			
		||||
 | 
			
		||||
(C<sysTFTPIpAddress>)
 | 
			
		||||
 | 
			
		||||
=item $centillion->tftp_file()
 | 
			
		||||
 | 
			
		||||
(C<sysTFTPFileName>)
 | 
			
		||||
 | 
			
		||||
=item $centillion->tftp_type()
 | 
			
		||||
 | 
			
		||||
(C<sysTFTPFileType>)
 | 
			
		||||
 | 
			
		||||
=item $centillion->tftp_result()
 | 
			
		||||
 | 
			
		||||
(C<sysTFTPResult>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  $centillion->index_factor()
 | 
			
		||||
 | 
			
		||||
Required by SNMP::Info::SONMP.  Number representing the number of ports
 | 
			
		||||
reserved per slot within the device MIB.  Returns 256.
 | 
			
		||||
 | 
			
		||||
=item $centillion->slot_offset()
 | 
			
		||||
 | 
			
		||||
Required by SNMP::Info::SONMP.  Offset if slot numbering does not
 | 
			
		||||
start at 0.  Returns 0.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"USAGE"> 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::NortelStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::NortelStack/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::SONMP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $centillion->interfaces()
 | 
			
		||||
 | 
			
		||||
    Returns reference to the map between IID and physical Port.
 | 
			
		||||
 | 
			
		||||
    Slot and port numbers on the Passport switches are determined by the
 | 
			
		||||
    formula:
 | 
			
		||||
      port = index % 256
 | 
			
		||||
      slot = int(index / 256)
 | 
			
		||||
 | 
			
		||||
    The physical port name is returned as slot.port.
 | 
			
		||||
 | 
			
		||||
=item $centillion->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to current link duplex
 | 
			
		||||
 | 
			
		||||
=item $centillion->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to admin duplex setting
 | 
			
		||||
 | 
			
		||||
=item $centillion->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to ignore.
 | 
			
		||||
 | 
			
		||||
=item $centillion->fw_mac()
 | 
			
		||||
 | 
			
		||||
(C<s5CmSNodeMacAddr>)
 | 
			
		||||
 | 
			
		||||
=item $centillion->fw_port()
 | 
			
		||||
 | 
			
		||||
(C<s5CmSNodeIfIndx>)
 | 
			
		||||
 | 
			
		||||
=item $centillion->bp_index()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the Bridge Table.
 | 
			
		||||
 | 
			
		||||
=item $centillion->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the VLAN.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Centillion 802.3 Extension Table (C<cnDot3ExtnTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $centillion->centillion_p_index()
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
(C<cnDot3ExtnIfOperConnectionType>)
 | 
			
		||||
 | 
			
		||||
=item $centillion->rc_centillion_p_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps port admin duplexes to IIDs
 | 
			
		||||
 | 
			
		||||
(C<cnDot3ExtnIfAdminConnectionType>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Centillion VLAN Table (C<cnVlanPortMemberTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $centillion->centillion_i_vlan_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
 | 
			
		||||
 | 
			
		||||
(C<cnVlanPortMemberVID>)
 | 
			
		||||
 | 
			
		||||
=item $centillion->centillion_i_vlan_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value: VLAN Type
 | 
			
		||||
 | 
			
		||||
(C<cnVlanPortMemberIngressType>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"USAGE"> 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::NortelStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										274
									
								
								lib/SNMP/Info/Layer2/Cisco.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										274
									
								
								lib/SNMP/Info/Layer2/Cisco.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,274 @@
 | 
			
		||||
# SNMP::Info::Layer2::Cisco
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Cisco;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoRTT;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CiscoPortSecurity;
 | 
			
		||||
use SNMP::Info::CiscoStpExtensions;
 | 
			
		||||
use SNMP::Info::CiscoAgg;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoRTT
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::CiscoPortSecurity
 | 
			
		||||
    SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg
 | 
			
		||||
    SNMP::Info::Layer2
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L2 Cisco devices that are
 | 
			
		||||
not covered in other classes and the base L2 Cisco class for other device
 | 
			
		||||
specific L2 Cisco classes.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $cisco = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $cisco->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Generic Layer 2 Cisco devices and the base L2 Cisco class for
 | 
			
		||||
other device specific L2 Cisco classes.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoAgg
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cisco->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										311
									
								
								lib/SNMP/Info/Layer2/CiscoSB.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										311
									
								
								lib/SNMP/Info/Layer2/CiscoSB.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,311 @@
 | 
			
		||||
# SNMP::Info::Layer2::CiscoSB
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2013 Nic Bernstein
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::CiscoSB;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
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::EtherLike
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::EtherLike::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    'descr'  => 'sysDescr',
 | 
			
		||||
    'mac'    => 'rndBasePhysicalAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::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::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::EtherLike::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'ros';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Walk the entPhysicalSerialNum table and return the first serial found
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $ciscosb  = shift;
 | 
			
		||||
    my $e_serial = $ciscosb->e_serial();
 | 
			
		||||
 | 
			
		||||
    # Find entity table entry for this unit
 | 
			
		||||
    foreach my $e ( sort keys %$e_serial ) {
 | 
			
		||||
        if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_serial->{$e};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $ciscosb = shift;
 | 
			
		||||
    my $e_swver  = $ciscosb->e_swver();
 | 
			
		||||
 | 
			
		||||
    foreach my $e ( sort keys %$e_swver ) {
 | 
			
		||||
        if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_swver->{$e};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Grab e_model from Entity and tag on e_hwver
 | 
			
		||||
sub model {
 | 
			
		||||
    my $ciscosb = shift;
 | 
			
		||||
    my $e_model = $ciscosb->e_model();
 | 
			
		||||
    my $e_hwver = $ciscosb->e_hwver();
 | 
			
		||||
 | 
			
		||||
    foreach my $e ( sort keys %$e_model ) {
 | 
			
		||||
        if (defined $e_model->{$e} and $e_model->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_model->{$e};
 | 
			
		||||
            #my $model = "$e_model->{$e} $e_hwver->{$e}";
 | 
			
		||||
            #return $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 {
 | 
			
		||||
    my $ciscosb = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $ciscosb->i_name($partial);
 | 
			
		||||
 | 
			
		||||
    return $interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::CiscoSB - SNMP Interface to Cisco Small Business series
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Nic Bernstein (shamelessly stolen from Max Baker's Aironet code)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $ciscosb = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $ciscosb->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides interface to SNMP Data available on Cisco Small Business (nee LinkSys)
 | 
			
		||||
managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1)]
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCOSB-DEVICEPARAMS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCOSB-POE-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes
 | 
			
		||||
 | 
			
		||||
MIBs required by the inherited classes listed above.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->mac()
 | 
			
		||||
 | 
			
		||||
Returns mac from (C<rndBasePhysicalAddress>)
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns software version (C<entPhysicalSoftwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number of unit (C<entPhysicalSerialNum>)
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->model()
 | 
			
		||||
 | 
			
		||||
Returns model and hardware revision of unit
 | 
			
		||||
(C<entPhysicalModelName+entPhysicalHardwareRev>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 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::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
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->interfaces()
 | 
			
		||||
 | 
			
		||||
Uses the i_name() field.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										113
									
								
								lib/SNMP/Info/Layer2/ECI.pm
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										113
									
								
								lib/SNMP/Info/Layer2/ECI.pm
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,113 @@
 | 
			
		||||
# SNMP::Info::Layer2::ECI - SNMP Interface to ECI Devices
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2020 by 135.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::ECI;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::ECI::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::ECI::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'eci';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'eci-os';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    return 'unknown';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $obj = shift;
 | 
			
		||||
 | 
			
		||||
    return $obj->description;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::ECI - SNMP Interface to ECI Devices
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $obj = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $obj->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for ECI Devices running IOS-like software
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $obj->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'eci'
 | 
			
		||||
 | 
			
		||||
=item $obj->os()
 | 
			
		||||
 | 
			
		||||
Returns 'eci-os'
 | 
			
		||||
 | 
			
		||||
=item $obj->layers()
 | 
			
		||||
 | 
			
		||||
Ensures that layer two is reported, at least.
 | 
			
		||||
 | 
			
		||||
=item $obj->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version.
 | 
			
		||||
 | 
			
		||||
=item $obj->model
 | 
			
		||||
 | 
			
		||||
Returns the model extracted.
 | 
			
		||||
 | 
			
		||||
=item $obj->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
							
								
								
									
										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.70-135';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
							
								
								
									
										944
									
								
								lib/SNMP/Info/Layer2/HP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										944
									
								
								lib/SNMP/Info/Layer2/HP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,944 @@
 | 
			
		||||
# SNMP::Info::Layer2::HP - SNMP Interface to HP ProCurve Switches
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::HP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
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
 | 
			
		||||
    Exporter
 | 
			
		||||
/;
 | 
			
		||||
@SNMP::Info::Layer2::HP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MODEL_MAP, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%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',
 | 
			
		||||
    'HP-SWITCH-PL-MIB'       => 'hpSwitchProliant',
 | 
			
		||||
    'BLADETYPE4-NETWORK-MIB' => 'hpProLiant-GbE2c-InterconnectSwitch',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Aggregate::GLOBALS,
 | 
			
		||||
    'serial1'      => 'entPhysicalSerialNum.1',
 | 
			
		||||
    'serial2'      => 'hpHttpMgSerialNumber.0',
 | 
			
		||||
    'hp_cpu'       => 'hpSwitchCpuStat.0',
 | 
			
		||||
    'hp_mem_total' => 'hpGlobalMemTotalBytes.1',
 | 
			
		||||
    'mem_free'     => 'hpGlobalMemFreeBytes.1',
 | 
			
		||||
    'mem_used'     => 'hpGlobalMemAllocBytes.1',
 | 
			
		||||
    'os_version'   => 'hpSwitchOsVersion.0',
 | 
			
		||||
    'os_version2'  => 'hpHttpMgVersion.0',
 | 
			
		||||
    'os_bin'       => 'hpSwitchRomVersion.0',
 | 
			
		||||
    'mac'          => 'hpSwitchBaseMACAddress.0',
 | 
			
		||||
    'rstp_ver'     => 'hpicfBridgeRstpForceVersion',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::Aggregate::FUNCS,
 | 
			
		||||
    'i_type2'   => 'ifType',
 | 
			
		||||
 | 
			
		||||
    # RFC1271
 | 
			
		||||
    'l_descr' => 'logDescription',
 | 
			
		||||
 | 
			
		||||
    # CONFIG-MIB::hpSwitchPortTable
 | 
			
		||||
    'hp_duplex'       => 'hpSwitchPortEtherMode',
 | 
			
		||||
    'hp_duplex_admin' => 'hpSwitchPortFastEtherMode',
 | 
			
		||||
    'vendor_i_type'   => 'hpSwitchPortType',
 | 
			
		||||
 | 
			
		||||
    # HP-ICF-CHASSIS
 | 
			
		||||
    'hp_s_oid'    => 'hpicfSensorObjectId',
 | 
			
		||||
    'hp_s_name'   => 'hpicfSensorDescr',
 | 
			
		||||
    'hp_s_status' => 'hpicfSensorStatus',
 | 
			
		||||
 | 
			
		||||
    # HP-ICF-POE-MIB
 | 
			
		||||
    'peth_port_power'   => 'hpicfPoePethPsePortPower',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::Aggregate::MUNGE,
 | 
			
		||||
    'c_id'   => \&munge_hp_c_id,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
%MODEL_MAP = (
 | 
			
		||||
    'J8131A' => 'WAP-420-WW',
 | 
			
		||||
    'J8130A' => 'WAP-420-NA',
 | 
			
		||||
    'J9833A' => 'PS1810-8G',
 | 
			
		||||
    'J9834A' => 'PS1810-24G',
 | 
			
		||||
    'J8133A' => 'AP520WL',
 | 
			
		||||
    'J8680A' => '9408sl',
 | 
			
		||||
    'J9091A' => '8212zl',
 | 
			
		||||
    'J9475A' => '8206zl',
 | 
			
		||||
    'J9265A' => '6600ml-24XG',
 | 
			
		||||
    'J9264A' => '6600ml-24G-4XG',
 | 
			
		||||
    'J9263A' => '6600ml-24G',
 | 
			
		||||
    'J9452A' => '6600-48G-4XG',
 | 
			
		||||
    'J9451A' => '6600-48G',
 | 
			
		||||
    'J8474A' => '6410cl-6XG',
 | 
			
		||||
    'J8433A' => '6400cl-6XG',
 | 
			
		||||
    'J8992A' => '6200yl-24G',
 | 
			
		||||
    'J4902A' => '6108',
 | 
			
		||||
    'J8698A' => '5412zl',
 | 
			
		||||
    'J9851A' => '5412R-zl2',
 | 
			
		||||
    'J8719A' => '5408yl',
 | 
			
		||||
    'J8697A' => '5406zl',
 | 
			
		||||
    'J9850A' => '5406R-zl2',
 | 
			
		||||
    'J8718A' => '5404yl',
 | 
			
		||||
    'J4819A' => '5308XL',
 | 
			
		||||
    'J4850A' => '5304XL',
 | 
			
		||||
    'J8773A' => '4208vl',
 | 
			
		||||
    'J8770A' => '4204vl',
 | 
			
		||||
    'J8772A' => '4202vl-72',
 | 
			
		||||
    'J9032A' => '4202vl-68G',
 | 
			
		||||
    'J9031A' => '4202vl-68',
 | 
			
		||||
    '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',
 | 
			
		||||
    'J9576A' => '3800-48G-4SFP+',
 | 
			
		||||
    'J9584A' => '3800-24SFP-2SFP+',
 | 
			
		||||
    'J9587A' => '3800-24G-PoE+-2XG',
 | 
			
		||||
    'J9573A' => '3800-24G-PoE+-2SFP+',
 | 
			
		||||
    'J9585A' => '3800-24G-2XG',
 | 
			
		||||
    'J9575A' => '3800-24G-2SFP+',
 | 
			
		||||
    'J8693A' => '3500yl-48G-PWR',
 | 
			
		||||
    'J8692A' => '3500yl-24G-PWR',
 | 
			
		||||
    'J9473A' => '3500-48-PoE',
 | 
			
		||||
    'J9472A' => '3500-48',
 | 
			
		||||
    'J9471A' => '3500-24-PoE',
 | 
			
		||||
    'J9470A' => '3500-24',
 | 
			
		||||
    'J4906A' => '3400cl-48G',
 | 
			
		||||
    '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',
 | 
			
		||||
    'J9728A' => '2920-48G',
 | 
			
		||||
    'J9727A' => '2920-24G-PoE+',
 | 
			
		||||
    'J9727A' => '2920-24G-PoE+',
 | 
			
		||||
    'J9726A' => '2920-24G',
 | 
			
		||||
    'J9726A' => '2920-24G',
 | 
			
		||||
    'J9562A' => '2915-8G-PoE',
 | 
			
		||||
    'J9148A' => '2910al-48G-PoE+',
 | 
			
		||||
    'J9147A' => '2910al-48G',
 | 
			
		||||
    'J9146A' => '2910al-24G-PoE+',
 | 
			
		||||
    'J9145A' => '2910al-24G',
 | 
			
		||||
    'J9050A' => '2900-48G',
 | 
			
		||||
    'J9049A' => '2900-24G',
 | 
			
		||||
    'J4904A' => '2848',
 | 
			
		||||
    'J4903A' => '2824',
 | 
			
		||||
    'J9022A' => '2810-48G',
 | 
			
		||||
    'J9021A' => '2810-24G',
 | 
			
		||||
    'J8165A' => '2650-PWR',
 | 
			
		||||
    'J4899B' => '2650-CR',
 | 
			
		||||
    'J4899C' => '2650C',
 | 
			
		||||
    'J4899A' => '2650',
 | 
			
		||||
    'J8164A' => '2626-PWR',
 | 
			
		||||
    'J4900B' => '2626-CR',
 | 
			
		||||
    'J4900C' => '2626C',
 | 
			
		||||
    'J4900A' => '2626',
 | 
			
		||||
    'J9627A' => '2620-48-PoE+',
 | 
			
		||||
    'J9626A' => '2620-48',
 | 
			
		||||
    'J9624A' => '2620-24-PPoE+',
 | 
			
		||||
    'J9625A' => '2620-24-PoE+',
 | 
			
		||||
    'J9623A' => '2620-24',
 | 
			
		||||
    'J9565A' => '2615-8-PoE',
 | 
			
		||||
    'J9089A' => '2610-48-PWR',
 | 
			
		||||
    'J9088A' => '2610-48',
 | 
			
		||||
    'J9087A' => '2610-24-PWR',
 | 
			
		||||
    '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',
 | 
			
		||||
    'J9783A' => '2530-8',
 | 
			
		||||
    'J9778A' => '2530-48-PoE+',
 | 
			
		||||
    'J9853A' => '2530-48G-PoE+-2SFP+',
 | 
			
		||||
    'J9772A' => '2530-48G-PoE+',
 | 
			
		||||
    'J9855A' => '2530-48G-2SFP+',
 | 
			
		||||
    'J9775A' => '2530-48G',
 | 
			
		||||
    'J9781A' => '2530-48',
 | 
			
		||||
    'J9779A' => '2530-24-PoE+',
 | 
			
		||||
    'J9854A' => '2530-24G-PoE+-2SFP+',
 | 
			
		||||
    'J9773A' => '2530-24G-PoE+',
 | 
			
		||||
    'J9856A' => '2530-24G-2SFP+',
 | 
			
		||||
    'J9776A' => '2530-24G',
 | 
			
		||||
    'J9782A' => '2530-24',
 | 
			
		||||
    'J4813A' => '2524',
 | 
			
		||||
    'J9298A' => '2520G-8-PoE',
 | 
			
		||||
    'J9299A' => '2520G-24-PoE',
 | 
			
		||||
    'J9137A' => '2520-8-PoE',
 | 
			
		||||
    'J9138A' => '2520-24-PoE',
 | 
			
		||||
    'J4812A' => '2512',
 | 
			
		||||
    'J9280A' => '2510G-48',
 | 
			
		||||
    'J9279A' => '2510G-24',
 | 
			
		||||
    'J9020A' => '2510-48A',
 | 
			
		||||
    'J9019B' => '2510-24B',
 | 
			
		||||
    'J9019A' => '2510-24A',
 | 
			
		||||
    'J4818A' => '2324',
 | 
			
		||||
    'J4817A' => '2312',
 | 
			
		||||
    'J9449A' => '1810G-8',
 | 
			
		||||
    'J9450A' => '1810G-24',
 | 
			
		||||
    'J9802A' => '1810-8G',
 | 
			
		||||
    'J9803A' => '1810-24G',
 | 
			
		||||
    'J9029A' => '1800-8G',
 | 
			
		||||
    'J9028A' => '1800-24G',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method Overrides
 | 
			
		||||
 | 
			
		||||
sub stp_ver {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return $hp->rstp_ver() || $hp->SUPER::stp_ver();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cpu {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return $hp->hp_cpu();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mem_total {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return $hp->hp_mem_total();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'hp';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $hp         = shift;
 | 
			
		||||
    my $os_version = $hp->os_version() || $hp->os_version2();
 | 
			
		||||
    return $os_version if defined $os_version;
 | 
			
		||||
 | 
			
		||||
    # Some older ones don't have this value,so we cull it from the description
 | 
			
		||||
    my $descr = $hp->description();
 | 
			
		||||
    if ( $descr =~ m/revision ([A-Z]{1}\.\d{2}\.\d{2})/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 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;
 | 
			
		||||
 | 
			
		||||
    my $serial = $hp->serial1() || $hp->serial2() || undef;;
 | 
			
		||||
 | 
			
		||||
    return $serial;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Lookup model number, and translate the part number to the common number
 | 
			
		||||
sub model {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $id = $hp->id();
 | 
			
		||||
    return unless defined $id;
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^(hp|aruba)switch//i;
 | 
			
		||||
 | 
			
		||||
    return defined $MODEL_MAP{$model} ? $MODEL_MAP{$model} : $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $hp         = shift;
 | 
			
		||||
    my $interfaces = $hp->i_index();
 | 
			
		||||
    my $i_descr    = $hp->i_description();
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $descr = $i_descr->{$iid};
 | 
			
		||||
        next unless defined $descr;
 | 
			
		||||
        $if{$iid} = $descr if ( defined $descr and length $descr );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $i_alias = $hp->i_alias();
 | 
			
		||||
    my $e_name  = $hp->e_name();
 | 
			
		||||
    my $e_port  = $hp->e_port();
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
 | 
			
		||||
    foreach my $port ( keys %$e_name ) {
 | 
			
		||||
        my $iid = $e_port->{$port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        my $alias = $i_alias->{$iid};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        $i_name{$iid} = $e_name->{$port};
 | 
			
		||||
 | 
			
		||||
        # Check for alias
 | 
			
		||||
        $i_name{$iid} = $alias if ( defined $alias and length($alias) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    return $hp->mau_i_duplex();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Try HP MIB first
 | 
			
		||||
    my $hp_duplex = $hp->hp_duplex_admin($partial);
 | 
			
		||||
    if ( defined $hp_duplex and scalar( keys %$hp_duplex ) ) {
 | 
			
		||||
 | 
			
		||||
        my %i_duplex;
 | 
			
		||||
        foreach my $if ( keys %$hp_duplex ) {
 | 
			
		||||
            my $duplex = $hp_duplex->{$if};
 | 
			
		||||
            next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
            $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
            $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
            $duplex = 'auto' if $duplex =~ /auto/i;
 | 
			
		||||
            $i_duplex{$if} = $duplex;
 | 
			
		||||
        }
 | 
			
		||||
        return \%i_duplex;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return $hp->mau_i_duplex_admin();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'hp';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub log {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    my $log = $hp->l_descr();
 | 
			
		||||
 | 
			
		||||
    my $logstring = undef;
 | 
			
		||||
 | 
			
		||||
    foreach my $val ( values %$log ) {
 | 
			
		||||
        next if $val =~ /^Link\s+(Up|Down)/;
 | 
			
		||||
        $logstring .= "$val\n";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $logstring;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub slots {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_name = $hp->e_name();
 | 
			
		||||
 | 
			
		||||
    return unless defined $e_name;
 | 
			
		||||
 | 
			
		||||
    my $slots;
 | 
			
		||||
    foreach my $slot ( keys %$e_name ) {
 | 
			
		||||
        $slots++ if $e_name->{$slot} =~ /slot/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $slots;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fan {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return &_sensor( $hp, 'fan' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return &_sensor( $hp, 'power', '^power supply 1' )
 | 
			
		||||
        || &_sensor( $hp, 'power', '^power supply sensor' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_status {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return &_sensor( $hp, 'power', '^power supply 2' )
 | 
			
		||||
        || &_sensor( $hp, 'power', '^redundant' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _sensor {
 | 
			
		||||
    my $hp          = shift;
 | 
			
		||||
    my $search_type = shift || 'fan';
 | 
			
		||||
    my $search_name = shift || '';
 | 
			
		||||
    my $hp_s_oid    = $hp->hp_s_oid();
 | 
			
		||||
    my $result;
 | 
			
		||||
    foreach my $sensor ( keys %$hp_s_oid ) {
 | 
			
		||||
        my $sensortype = &SNMP::translateObj( $hp_s_oid->{$sensor} );
 | 
			
		||||
        if ( $sensortype =~ /$search_type/i ) {
 | 
			
		||||
            my $sensorname   = $hp->hp_s_name()->{$sensor};
 | 
			
		||||
            my $sensorstatus = $hp->hp_s_status()->{$sensor};
 | 
			
		||||
            if ( $sensorname =~ /$search_name/i ) {
 | 
			
		||||
                $result = $sensorstatus;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_hp_c_id {
 | 
			
		||||
    my ($v) = @_;
 | 
			
		||||
    if ( length(unpack('H*', $v)) == 12 ){
 | 
			
		||||
	return join(':',map { sprintf "%02x", $_ } unpack('C*', $v));
 | 
			
		||||
    }if ( length(unpack('H*', $v)) == 10 ){
 | 
			
		||||
	# IP address (first octet is sign, I guess)
 | 
			
		||||
	my @octets = (map { sprintf "%02x",$_ } unpack('C*', $v))[1..4];
 | 
			
		||||
	return join '.', map { hex($_) } @octets;
 | 
			
		||||
    }else{
 | 
			
		||||
	return $v;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# POWER-ETHERNET-MIB doesn't define a mapping of its
 | 
			
		||||
# "module"/"port" index to ifIndex.  Different vendors
 | 
			
		||||
# do this in different ways.
 | 
			
		||||
# HP switches use the ifIndex as port index, so we can
 | 
			
		||||
# ignore the module information and map the index directly
 | 
			
		||||
# onto an ifIndex.
 | 
			
		||||
sub peth_port_ifindex {
 | 
			
		||||
    my $peth    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $peth_port_status = $peth->peth_port_status($partial);
 | 
			
		||||
    my $peth_port_ifindex;
 | 
			
		||||
 | 
			
		||||
    foreach my $i ( keys %$peth_port_status ) {
 | 
			
		||||
        my ( $module, $port ) = split( /\./, $i );
 | 
			
		||||
        $peth_port_ifindex->{$i} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return $peth_port_ifindex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_vlan {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $rv;
 | 
			
		||||
 | 
			
		||||
    my $qb_i_vlan = $hp->qb_i_vlan_t();
 | 
			
		||||
    if (defined $qb_i_vlan and scalar(keys %$qb_i_vlan)){
 | 
			
		||||
        my $vlan = shift;
 | 
			
		||||
        my $iid = shift;
 | 
			
		||||
 | 
			
		||||
        my $qb_v_egress = $hp->qb_v_egress();
 | 
			
		||||
        if (defined $qb_v_egress and scalar($qb_v_egress->{$vlan})) {
 | 
			
		||||
            # store current untagged VLAN to remove it from the port list later
 | 
			
		||||
            my $old_untagged = $qb_i_vlan->{$iid};
 | 
			
		||||
 | 
			
		||||
            # set new untagged / native VLAN
 | 
			
		||||
            $rv = $hp->set_qb_i_vlan($vlan, $iid);
 | 
			
		||||
 | 
			
		||||
            # If change is successful, the old native VLAN will now be a tagged VLAN on the port. This is generally not what we want.
 | 
			
		||||
            # We'll have to remove this VLAN from the "egress list" on the port.
 | 
			
		||||
            if (defined $rv and $old_untagged != $vlan) {
 | 
			
		||||
                if (defined $old_untagged and defined $qb_v_egress and scalar($qb_v_egress->{$vlan})){
 | 
			
		||||
 | 
			
		||||
                    # First, get the egress list of the old native VLAN (arrayref structure)
 | 
			
		||||
                    my $egressports = $qb_v_egress->{$old_untagged};
 | 
			
		||||
 | 
			
		||||
                    # Since arrays are zero-based, we have to change the element at Index - 1
 | 
			
		||||
                    $egressports->[$iid-1] = "0";
 | 
			
		||||
 | 
			
		||||
                    # After changing, pack the array into a binary structure (expected by set_qb_v_egress) and set the new value on the device.
 | 
			
		||||
                    my $new_egresslist = pack("B*", join('', @$egressports));
 | 
			
		||||
 | 
			
		||||
                    $rv = $hp->set_qb_v_egress($new_egresslist, $old_untagged);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            $hp->error_throw(sprintf("Requested VLAN %s doesn't seem to exist on device...", $vlan));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_vlan_tagged {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $rv;
 | 
			
		||||
 | 
			
		||||
    my $qb_i_vlan = $hp->qb_i_vlan_t();
 | 
			
		||||
    if (defined $qb_i_vlan and scalar(keys %$qb_i_vlan)){
 | 
			
		||||
        my $vlan = shift;
 | 
			
		||||
        my $iid = shift;
 | 
			
		||||
 | 
			
		||||
        my $qb_v_egress = $hp->qb_v_egress();
 | 
			
		||||
        if (defined $qb_v_egress and scalar($qb_v_egress->{$vlan})) {
 | 
			
		||||
 | 
			
		||||
            # First, get the egress list of the VLAN we want to add to the port.
 | 
			
		||||
            my $egressports = $qb_v_egress->{$vlan};
 | 
			
		||||
 | 
			
		||||
            # Since arrays are zero-based, we have to change the element at Index - 1
 | 
			
		||||
            $egressports->[$iid-1] = "1";
 | 
			
		||||
 | 
			
		||||
            # After changing, pack the array into a binary structure (expected by set_qb_v_egress) and set the new value on the device.
 | 
			
		||||
            my $new_egresslist = pack("B*", join('', @$egressports));
 | 
			
		||||
            $rv = $hp->set_qb_v_egress($new_egresslist, $vlan);
 | 
			
		||||
            return $rv;
 | 
			
		||||
        } else {
 | 
			
		||||
            $hp->error_throw(sprintf("Requested VLAN %s doesn't seem to exist on device...", $vlan));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub agg_ports { return agg_ports_ifstack(@_) }
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::HP - SNMP Interface to HP Procurve Switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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::HP(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<RFC1271-MIB>
 | 
			
		||||
 | 
			
		||||
Included in V2 mibs from Cisco
 | 
			
		||||
 | 
			
		||||
=item F<HP-ICF-OID>
 | 
			
		||||
 | 
			
		||||
(this MIB new with SNMP::Info 0.8)
 | 
			
		||||
 | 
			
		||||
=item F<STATISTICS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<NETSWITCH-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CONFIG-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HP-ICF-BRIDGE>
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
L<http://www.hp.com/rnd/software> or
 | 
			
		||||
L<http://www.hp.com/rnd/software/MIBs.htm>
 | 
			
		||||
 | 
			
		||||
=head1 Change Log
 | 
			
		||||
 | 
			
		||||
Version 0.4 - Removed F<ENTITY-MIB> e_*() methods to separate sub-class -
 | 
			
		||||
SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp->cpu()
 | 
			
		||||
 | 
			
		||||
Returns CPU Utilization in percentage.
 | 
			
		||||
 | 
			
		||||
=item $hp->log()
 | 
			
		||||
 | 
			
		||||
Returns all the log entries from the switch's log that are not Link up or
 | 
			
		||||
down messages.
 | 
			
		||||
 | 
			
		||||
=item $hp->mem_free()
 | 
			
		||||
 | 
			
		||||
Returns bytes of free memory
 | 
			
		||||
 | 
			
		||||
=item $hp->mem_total()
 | 
			
		||||
 | 
			
		||||
Return bytes of total memory
 | 
			
		||||
 | 
			
		||||
=item $hp->mem_used()
 | 
			
		||||
 | 
			
		||||
Returns bytes of used memory
 | 
			
		||||
 | 
			
		||||
=item $hp->model()
 | 
			
		||||
 | 
			
		||||
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 = (
 | 
			
		||||
    'J8131A' => 'WAP-420-WW',
 | 
			
		||||
    'J8130A' => 'WAP-420-NA',
 | 
			
		||||
    'J8133A' => 'AP520WL',
 | 
			
		||||
    'J8680A' => '9408sl',
 | 
			
		||||
    'J9091A' => '8212zl',
 | 
			
		||||
    'J9475A' => '8206zl',
 | 
			
		||||
    'J9265A' => '6600ml-24XG',
 | 
			
		||||
    'J9264A' => '6600ml-24G-4XG',
 | 
			
		||||
    'J9263A' => '6600ml-24G',
 | 
			
		||||
    'J9452A' => '6600-48G-4XG',
 | 
			
		||||
    'J9451A' => '6600-48G',
 | 
			
		||||
    'J8474A' => '6410cl-6XG',
 | 
			
		||||
    'J8433A' => '6400cl-6XG',
 | 
			
		||||
    'J8992A' => '6200yl-24G',
 | 
			
		||||
    'J4902A' => '6108',
 | 
			
		||||
    'J8698A' => '5412zl',
 | 
			
		||||
    'J8719A' => '5408yl',
 | 
			
		||||
    'J8697A' => '5406zl',
 | 
			
		||||
    'J8718A' => '5404yl',
 | 
			
		||||
    'J4819A' => '5308XL',
 | 
			
		||||
    'J4850A' => '5304XL',
 | 
			
		||||
    'J8773A' => '4208vl',
 | 
			
		||||
    'J8770A' => '4204vl',
 | 
			
		||||
    'J8772A' => '4202vl-72',
 | 
			
		||||
    'J9032A' => '4202vl-68G',
 | 
			
		||||
    'J9031A' => '4202vl-68',
 | 
			
		||||
    'J8771A' => '4202vl-48G',
 | 
			
		||||
    'J4865A' => '4108GL',
 | 
			
		||||
    'J4887A' => '4104GL',
 | 
			
		||||
    'J9588A' => '3800-48G-PoE+-4XG',
 | 
			
		||||
    'J9574A' => '3800-48G-PoE+-4SFP+',
 | 
			
		||||
    'J9586A' => '3800-48G-4XG',
 | 
			
		||||
    'J9576A' => '3800-48G-4SFP+',
 | 
			
		||||
    'J9584A' => '3800-24SFP-2SFP+',
 | 
			
		||||
    'J9587A' => '3800-24G-PoE+-2XG',
 | 
			
		||||
    'J9573A' => '3800-24G-PoE+-2SFP+',
 | 
			
		||||
    'J9585A' => '3800-24G-2XG',
 | 
			
		||||
    'J9575A' => '3800-24G-2SFP+',
 | 
			
		||||
    'J8693A' => '3500yl-48G-PWR',
 | 
			
		||||
    'J8692A' => '3500yl-24G-PWR',
 | 
			
		||||
    'J9473A' => '3500-48-PoE',
 | 
			
		||||
    'J9472A' => '3500-48',
 | 
			
		||||
    'J9471A' => '3500-24-PoE',
 | 
			
		||||
    'J9470A' => '3500-24',
 | 
			
		||||
    'J4906A' => '3400cl-48G',
 | 
			
		||||
    'J4905A' => '3400cl-24G',
 | 
			
		||||
    'J4815A' => '3324XL',
 | 
			
		||||
    'J4851A' => '3124',
 | 
			
		||||
    'J9562A' => '2915-8G-PoE',
 | 
			
		||||
    'J9148A' => '2910al-48G-PoE+',
 | 
			
		||||
    'J9147A' => '2910al-48G',
 | 
			
		||||
    'J9146A' => '2910al-24G-PoE+',
 | 
			
		||||
    'J9145A' => '2910al-24G',
 | 
			
		||||
    'J9050A' => '2900-48G',
 | 
			
		||||
    'J9049A' => '2900-24G',
 | 
			
		||||
    'J4904A' => '2848',
 | 
			
		||||
    'J4903A' => '2824',
 | 
			
		||||
    'J9022A' => '2810-48G',
 | 
			
		||||
    'J9021A' => '2810-24G',
 | 
			
		||||
    'J8165A' => '2650-PWR',
 | 
			
		||||
    'J4899B' => '2650-CR',
 | 
			
		||||
    'J4899C' => '2650C',
 | 
			
		||||
    'J4899A' => '2650',
 | 
			
		||||
    'J8164A' => '2626-PWR',
 | 
			
		||||
    'J4900B' => '2626-CR',
 | 
			
		||||
    'J4900C' => '2626C',
 | 
			
		||||
    'J4900A' => '2626',
 | 
			
		||||
    'J9627A' => '2620-48-PoE+',
 | 
			
		||||
    'J9626A' => '2620-48',
 | 
			
		||||
    'J9624A' => '2620-24-PPoE+',
 | 
			
		||||
    'J9625A' => '2620-24-PoE+',
 | 
			
		||||
    'J9623A' => '2620-24',
 | 
			
		||||
    'J9565A' => '2615-8-PoE',
 | 
			
		||||
    'J9089A' => '2610-48-PWR',
 | 
			
		||||
    'J9088A' => '2610-48',
 | 
			
		||||
    'J9087A' => '2610-24-PWR',
 | 
			
		||||
    'J9086A' => '2610-24/12PWR',
 | 
			
		||||
    'J9085A' => '2610-24',
 | 
			
		||||
    'J8762A' => '2600-8-PWR',
 | 
			
		||||
    'J4813A' => '2524',
 | 
			
		||||
    'J9298A' => '2520G-8-PoE',
 | 
			
		||||
    'J9299A' => '2520G-24-PoE',
 | 
			
		||||
    'J9137A' => '2520-8-PoE',
 | 
			
		||||
    'J9138A' => '2520-24-PoE',
 | 
			
		||||
    'J4812A' => '2512',
 | 
			
		||||
    'J9280A' => '2510G-48',
 | 
			
		||||
    'J9279A' => '2510G-24',
 | 
			
		||||
    'J9020A' => '2510-48A',
 | 
			
		||||
    'J9019B' => '2510-24B',
 | 
			
		||||
    'J9019A' => '2510-24A',
 | 
			
		||||
    'J4818A' => '2324',
 | 
			
		||||
    'J4817A' => '2312',
 | 
			
		||||
    'J9449A' => '1810G-8',
 | 
			
		||||
    'J9450A' => '1810G-24',
 | 
			
		||||
    'J9029A' => '1800-8G',
 | 
			
		||||
    'J9028A' => '1800-24G',
 | 
			
		||||
 );
 | 
			
		||||
 | 
			
		||||
=item $hp->os()
 | 
			
		||||
 | 
			
		||||
Returns hp
 | 
			
		||||
 | 
			
		||||
=item $hp->os_bin()
 | 
			
		||||
 | 
			
		||||
C<hpSwitchRomVersion.0>
 | 
			
		||||
 | 
			
		||||
=item $hp->os_ver()
 | 
			
		||||
 | 
			
		||||
Tries to use os_version() and if that fails will try and cull the version from
 | 
			
		||||
the description field.
 | 
			
		||||
 | 
			
		||||
=item $hp->os_version()
 | 
			
		||||
 | 
			
		||||
C<hpSwitchOsVersion.0>
 | 
			
		||||
 | 
			
		||||
=item $hp->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number if available through SNMP
 | 
			
		||||
 | 
			
		||||
=item $hp->slots()
 | 
			
		||||
 | 
			
		||||
Returns number of entries in $hp->e_name that have 'slot' in them.
 | 
			
		||||
 | 
			
		||||
=item $hp->vendor()
 | 
			
		||||
 | 
			
		||||
hp
 | 
			
		||||
 | 
			
		||||
=item $hp->fan()
 | 
			
		||||
 | 
			
		||||
Returns fan status
 | 
			
		||||
 | 
			
		||||
=item $hp->ps1_status()
 | 
			
		||||
 | 
			
		||||
Power supply 1 status
 | 
			
		||||
 | 
			
		||||
=item $hp->ps2_status()
 | 
			
		||||
 | 
			
		||||
Power supply 2 status
 | 
			
		||||
 | 
			
		||||
=item $hp->peth_port_power()
 | 
			
		||||
 | 
			
		||||
Power supplied by PoE ports, in milliwatts
 | 
			
		||||
(C<hpicfPoePethPsePortPower>)
 | 
			
		||||
 | 
			
		||||
=item $hp->stp_ver()
 | 
			
		||||
 | 
			
		||||
Returns what version of STP the device is running.
 | 
			
		||||
(C<hpicfBridgeRstpForceVersion> with fallback to inherited stp_ver())
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over 4
 | 
			
		||||
 | 
			
		||||
=item $hp->interfaces()
 | 
			
		||||
 | 
			
		||||
Uses $hp->i_description()
 | 
			
		||||
 | 
			
		||||
=item $hp->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to current link duplex.
 | 
			
		||||
 | 
			
		||||
=item $hp->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to admin duplex setting.
 | 
			
		||||
 | 
			
		||||
=item $hp->vendor_i_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to HP specific port type
 | 
			
		||||
(C<hpSwitchPortType>).
 | 
			
		||||
 | 
			
		||||
=item $hp->i_name()
 | 
			
		||||
 | 
			
		||||
Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias()
 | 
			
		||||
 | 
			
		||||
=item $hp->peth_port_ifindex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of power Ethernet port table entries map back to
 | 
			
		||||
interface index (c<ifIndex>)
 | 
			
		||||
 | 
			
		||||
=item C<agg_ports>
 | 
			
		||||
 | 
			
		||||
Returns a HASH reference mapping from slave to master port for each member of
 | 
			
		||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
 | 
			
		||||
ifIndex of the corresponding master ports.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 MUNGES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item munge_hp_c_id()
 | 
			
		||||
 | 
			
		||||
Munge for c_id which handles CDP and LLDP.
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item set_i_vlan()
 | 
			
		||||
 | 
			
		||||
=item set_i_vlan_tagged()
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										739
									
								
								lib/SNMP/Info/Layer2/HP4000.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										739
									
								
								lib/SNMP/Info/Layer2/HP4000.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,739 @@
 | 
			
		||||
# SNMP::Info::Layer2::HP4000 - SNMP Interface to older HP ProCurve Switches (1600, 2400, 2424M, 4000 and 8000)
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::HP4000;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::HP4000::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer3 SNMP::Info::MAU
 | 
			
		||||
    SNMP::Info::CDP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::HP4000::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MODEL_MAP, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    'RFC1271-MIB'    => 'logDescription',
 | 
			
		||||
    'HP-ICF-OID'     => 'hpSwitch4000',
 | 
			
		||||
    'HP-VLAN'        => 'hpVlanMemberIndex',
 | 
			
		||||
    'STATISTICS-MIB' => 'hpSwitchCpuStat',
 | 
			
		||||
    'NETSWITCH-MIB'  => 'hpMsgBufFree',
 | 
			
		||||
    'CONFIG-MIB'     => 'hpSwitchConfig',
 | 
			
		||||
    'SEMI-MIB'       => 'hpHttpMgSerialNumber',
 | 
			
		||||
    'HP-ICF-CHASSIS' => 'hpicfSensorObjectId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    'serial1'      => 'hpHttpMgSerialNumber.0',
 | 
			
		||||
    'hp_cpu'       => 'hpSwitchCpuStat.0',
 | 
			
		||||
    'hp_mem_total' => 'hpGlobalMemTotalBytes.1',
 | 
			
		||||
    'mem_free'     => 'hpGlobalMemFreeBytes.1',
 | 
			
		||||
    'mem_used'     => 'hpGlobalMemAllocBytes.1',
 | 
			
		||||
    'os_version'   => 'hpSwitchOsVersion.0',
 | 
			
		||||
    'os_bin'       => 'hpSwitchRomVersion.0',
 | 
			
		||||
    'mac'          => 'hpSwitchBaseMACAddress.0',
 | 
			
		||||
    'hp_vlans'     => 'hpVlanNumber',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    'bp_index2' => 'dot1dBasePortIfIndex',
 | 
			
		||||
    'i_type2'   => 'ifType',
 | 
			
		||||
 | 
			
		||||
    # RFC1271
 | 
			
		||||
    'l_descr' => 'logDescription',
 | 
			
		||||
 | 
			
		||||
    # HP-VLAN-MIB
 | 
			
		||||
    'hp_v_index'    => 'hpVlanDot1QID',
 | 
			
		||||
    'hp_v_name'     => 'hpVlanIdentName',
 | 
			
		||||
    'hp_v_state'    => 'hpVlanIdentState',
 | 
			
		||||
    'hp_v_type'     => 'hpVlanIdentType',
 | 
			
		||||
    'hp_v_status'   => 'hpVlanIdentStatus',
 | 
			
		||||
    'hp_v_mac'      => 'hpVlanAddrPhysAddress',
 | 
			
		||||
    'hp_v_if_index' => 'hpVlanMemberIndex',
 | 
			
		||||
    'hp_v_if_tag'   => 'hpVlanMemberTagged2',
 | 
			
		||||
 | 
			
		||||
    # CONFIG-MIB::hpSwitchPortTable
 | 
			
		||||
    'hp_duplex'       => 'hpSwitchPortEtherMode',
 | 
			
		||||
    'hp_duplex_admin' => 'hpSwitchPortFastEtherMode',
 | 
			
		||||
    'vendor_i_type'   => 'hpSwitchPortType',
 | 
			
		||||
 | 
			
		||||
    # HP-ICF-CHASSIS
 | 
			
		||||
    'hp_s_oid'    => 'hpicfSensorObjectId',
 | 
			
		||||
    'hp_s_name'   => 'hpicfSensorDescr',
 | 
			
		||||
    'hp_s_status' => 'hpicfSensorStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MODEL_MAP = (
 | 
			
		||||
    'J4093A' => '2424M',
 | 
			
		||||
    'J4110A' => '8000M',
 | 
			
		||||
    'J4120A' => '1600M',
 | 
			
		||||
    'J4121A' => '4000M',
 | 
			
		||||
    'J4122A' => '2400M',
 | 
			
		||||
    'J4122B' => '2424M',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method Overrides
 | 
			
		||||
 | 
			
		||||
sub cpu {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return $hp->hp_cpu();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mem_total {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return $hp->hp_mem_total();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'hp';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $hp         = shift;
 | 
			
		||||
    my $os_version = $hp->os_version();
 | 
			
		||||
    return $os_version if defined $os_version;
 | 
			
		||||
 | 
			
		||||
    # Some older ones don't have this value,so we cull it from the description
 | 
			
		||||
    my $descr = $hp->description();
 | 
			
		||||
    if ( $descr =~ m/revision ([A-Z]{1}\.\d{2}\.\d{2})/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Lookup model number, and translate the part number to the common number
 | 
			
		||||
sub model {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $id = $hp->id();
 | 
			
		||||
    return unless defined $id;
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^hpswitch//i;
 | 
			
		||||
 | 
			
		||||
    return defined $MODEL_MAP{$model} ? $MODEL_MAP{$model} : $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $hp         = shift;
 | 
			
		||||
    my $interfaces = $hp->i_index();
 | 
			
		||||
    my $i_descr    = $hp->i_description();
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $descr = $i_descr->{$iid};
 | 
			
		||||
        next unless defined $descr;
 | 
			
		||||
        $if{$iid} = $descr if ( defined $descr and length $descr );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $i_alias = $hp->i_alias();
 | 
			
		||||
    my $e_name  = $hp->e_name();
 | 
			
		||||
    my $e_port  = $hp->e_port();
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
 | 
			
		||||
    foreach my $port ( keys %$e_name ) {
 | 
			
		||||
        my $iid = $e_port->{$port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        my $alias = $i_alias->{$iid};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        $i_name{$iid} = $e_name->{$port};
 | 
			
		||||
 | 
			
		||||
        # Check for alias
 | 
			
		||||
        $i_name{$iid} = $alias if ( defined $alias and length($alias) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    return $hp->mau_i_duplex();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Try HP MIB first
 | 
			
		||||
    my $hp_duplex = $hp->hp_duplex_admin($partial);
 | 
			
		||||
    if ( defined $hp_duplex and scalar( keys %$hp_duplex ) ) {
 | 
			
		||||
 | 
			
		||||
        my %i_duplex;
 | 
			
		||||
        foreach my $if ( keys %$hp_duplex ) {
 | 
			
		||||
            my $duplex = $hp_duplex->{$if};
 | 
			
		||||
            next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
            $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
            $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
            $duplex = 'auto' if $duplex =~ /auto/i;
 | 
			
		||||
            $i_duplex{$if} = $duplex;
 | 
			
		||||
        }
 | 
			
		||||
        return \%i_duplex;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return $hp->mau_i_duplex_admin();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'hp';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub log {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    my $log = $hp->l_descr();
 | 
			
		||||
 | 
			
		||||
    my $logstring = undef;
 | 
			
		||||
 | 
			
		||||
    foreach my $val ( values %$log ) {
 | 
			
		||||
        next if $val =~ /^Link\s+(Up|Down)/;
 | 
			
		||||
        $logstring .= "$val\n";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $logstring;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub slots {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_name = $hp->e_name();
 | 
			
		||||
 | 
			
		||||
    return unless defined $e_name;
 | 
			
		||||
 | 
			
		||||
    my $slots;
 | 
			
		||||
    foreach my $slot ( keys %$e_name ) {
 | 
			
		||||
        $slots++ if $e_name->{$slot} =~ /slot/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $slots;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fan {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return &_sensor( $hp, 'fan' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return &_sensor( $hp, 'power', '^power supply 1' )
 | 
			
		||||
        || &_sensor( $hp, 'power', '^power supply sensor' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_status {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return &_sensor( $hp, 'power', '^power supply 2' )
 | 
			
		||||
        || &_sensor( $hp, 'power', '^redundant' );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _sensor {
 | 
			
		||||
    my $hp          = shift;
 | 
			
		||||
    my $search_type = shift || 'fan';
 | 
			
		||||
    my $search_name = shift || '';
 | 
			
		||||
    my $hp_s_oid    = $hp->hp_s_oid();
 | 
			
		||||
    my $result;
 | 
			
		||||
    foreach my $sensor ( keys %$hp_s_oid ) {
 | 
			
		||||
        my $sensortype = &SNMP::translateObj( $hp_s_oid->{$sensor} );
 | 
			
		||||
        if ( $sensortype =~ /$search_type/i ) {
 | 
			
		||||
            my $sensorname   = $hp->hp_s_name()->{$sensor};
 | 
			
		||||
            my $sensorstatus = $hp->hp_s_status()->{$sensor};
 | 
			
		||||
            if ( $sensorname =~ /$search_name/i ) {
 | 
			
		||||
                $result = $sensorstatus;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Bridge MIB does not map Bridge Port to ifIndex correctly on older models, but Bridge Port equals ifIndex in these devices
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $if_index = $hp->i_index($partial);
 | 
			
		||||
    my %mod_bp_index;
 | 
			
		||||
    foreach my $iid ( keys %$if_index ) {
 | 
			
		||||
        $mod_bp_index{$iid} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%mod_bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# VLAN methods. Devices in this class use the proprietary HP-VLAN-MIB.
 | 
			
		||||
 | 
			
		||||
sub v_index {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $hp->hp_v_index($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub v_name {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $hp->hp_v_name($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    # the hpvlanmembertagged2 table has an entry in the form of
 | 
			
		||||
    #   vlan.interface = /untagged/no/tagged/auto
 | 
			
		||||
    my $i_vlan      = {};
 | 
			
		||||
    my $hp_v_index  = $hp->hp_v_index();
 | 
			
		||||
    my $hp_v_if_tag = $hp->hp_v_if_tag();
 | 
			
		||||
    foreach my $row ( keys %$hp_v_if_tag ) {
 | 
			
		||||
        my ( $index, $if ) = split( /\./, $row );
 | 
			
		||||
 | 
			
		||||
        my $tag  = $hp_v_if_tag->{$row};
 | 
			
		||||
        my $vlan = $hp_v_index->{$index};
 | 
			
		||||
 | 
			
		||||
        next unless ( defined $tag and $tag =~ /untagged/ );
 | 
			
		||||
 | 
			
		||||
        $i_vlan->{$if} = $vlan if defined $vlan;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    my $hp_v_index        = $hp->hp_v_index();
 | 
			
		||||
    my $hp_v_if_tag       = $hp->hp_v_if_tag();
 | 
			
		||||
    foreach my $row ( keys %$hp_v_if_tag ) {
 | 
			
		||||
        my ( $index, $if ) = split( /\./, $row );
 | 
			
		||||
 | 
			
		||||
        my $tag  = $hp_v_if_tag->{$row};
 | 
			
		||||
        my $vlan = $hp_v_index->{$index};
 | 
			
		||||
 | 
			
		||||
        next unless ( defined $tag );
 | 
			
		||||
        next if ( $tag eq 'no' );
 | 
			
		||||
 | 
			
		||||
        push( @{ $i_vlan_membership->{$if} }, $vlan );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership_untagged {
 | 
			
		||||
    my $hp  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $vlans = $hp->i_vlan($partial);
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    foreach my $port (keys %$vlans) {
 | 
			
		||||
        my $vlan = $vlans->{$port};
 | 
			
		||||
        push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_vlan {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $rv;
 | 
			
		||||
 | 
			
		||||
    my $hp_v_index  = $hp->hp_v_index();
 | 
			
		||||
    my $hp_v_if_tag = $hp->hp_v_if_tag();
 | 
			
		||||
    if (defined $hp_v_index and scalar(keys %$hp_v_index)){
 | 
			
		||||
        my $vlan = shift;
 | 
			
		||||
        my $iid = shift;
 | 
			
		||||
        my $old_untagged;
 | 
			
		||||
        # Hash to lookup VLAN index of the VID (dot1q tag)
 | 
			
		||||
        my %vl_trans = reverse %$hp_v_index;
 | 
			
		||||
 | 
			
		||||
        # Translate the VLAN identifier (tag) value to the index used by the HP-VLAN MIB
 | 
			
		||||
        my $vlan_index = $vl_trans{$vlan};
 | 
			
		||||
        if (defined $vlan_index) {
 | 
			
		||||
 | 
			
		||||
            # First, loop through table to determine current untagged vlan for the port we're about to change
 | 
			
		||||
            foreach my $row (keys %$hp_v_if_tag){
 | 
			
		||||
                my ($index,$if) = split(/\./,$row);
 | 
			
		||||
                if ($if == $iid and $hp_v_if_tag->{$row} =~ /untagged/) {
 | 
			
		||||
                    # Store the row information of the current untagged VLAN and temporarily set it to tagged
 | 
			
		||||
                    $old_untagged = $row;
 | 
			
		||||
                    $rv = $hp->set_hp_v_if_tag(1, $row);
 | 
			
		||||
                    last;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            # Then set our port untagged in the desired VLAN
 | 
			
		||||
            my $rv = $hp->set_hp_v_if_tag(2, "$vlan_index.$iid");
 | 
			
		||||
            if (defined $rv) {
 | 
			
		||||
                # If vlan change is successful, remove VLAN that used to be untagged from the port
 | 
			
		||||
                if (defined $old_untagged) {
 | 
			
		||||
                    $rv = $hp->set_hp_v_if_tag(3, $old_untagged);
 | 
			
		||||
                    $hp->error_throw("Error removing previous untagged vlan from port, should never happen...\n") unless defined $rv;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                # 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) {
 | 
			
		||||
                        $hp->error_throw("VLAN change failed, restored port to previous configuration.\n");
 | 
			
		||||
                    } else {
 | 
			
		||||
                        $hp->error_throw("VLAN change failed, unable to restore old configuration. Check device.\n");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            $hp->error_throw("Requested VLAN (VLAN ID: $vlan) not available on device.\n");
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        $hp->error_throw("Error retrieving VLAN information from device.\n");
 | 
			
		||||
    }
 | 
			
		||||
    return $rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_vlan_tagged {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $vlan = shift;
 | 
			
		||||
    my $iid = shift;
 | 
			
		||||
    my $rv;
 | 
			
		||||
 | 
			
		||||
    my $hp_v_index  = $hp->hp_v_index();
 | 
			
		||||
    if (defined $hp_v_index and scalar(keys %$hp_v_index)){
 | 
			
		||||
        # Hash to lookup VLAN index of the VID (dot1q tag)
 | 
			
		||||
        my %vl_trans = reverse %$hp_v_index;
 | 
			
		||||
 | 
			
		||||
        # Translate the VLAN identifier (tag) value to the index used by the HP-VLAN MIB
 | 
			
		||||
        my $vlan_index = $vl_trans{$vlan};
 | 
			
		||||
        if (defined $vlan_index) {
 | 
			
		||||
            # Set our port tagged in the desired VLAN
 | 
			
		||||
            $rv = $hp->set_hp_v_if_tag(1, "$vlan_index.$iid");
 | 
			
		||||
        } else {
 | 
			
		||||
            $hp->error_throw("Requested VLAN (VLAN ID: $vlan) not available on device.\n");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::HP4000 - SNMP Interface to older HP ProCurve Switches (1600, 2400, 2424M, 4000 and 8000)
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<RFC1271-MIB>
 | 
			
		||||
 | 
			
		||||
Included in V2 mibs from Cisco
 | 
			
		||||
 | 
			
		||||
=item F<HP-ICF-OID>
 | 
			
		||||
 | 
			
		||||
=item F<HP-VLAN>
 | 
			
		||||
 | 
			
		||||
(this MIB new with SNMP::Info 0.8)
 | 
			
		||||
 | 
			
		||||
=item F<STATISTICS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<NETSWITCH-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CONFIG-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
The last five MIBs listed are from HP and can be found at
 | 
			
		||||
L<http://www.hp.com/rnd/software> or
 | 
			
		||||
L<http://www.hp.com/rnd/software/MIBs.htm>
 | 
			
		||||
 | 
			
		||||
=head1 Change Log
 | 
			
		||||
 | 
			
		||||
Version 0.4 - Removed F<ENTITY-MIB> e_*() methods to separate sub-class -
 | 
			
		||||
SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp->cpu()
 | 
			
		||||
 | 
			
		||||
Returns CPU Utilization in percentage.
 | 
			
		||||
 | 
			
		||||
=item $hp->log()
 | 
			
		||||
 | 
			
		||||
Returns all the log entries from the switch's log that are not Link up or
 | 
			
		||||
down messages.
 | 
			
		||||
 | 
			
		||||
=item $hp->mem_free()
 | 
			
		||||
 | 
			
		||||
Returns bytes of free memory
 | 
			
		||||
 | 
			
		||||
=item $hp->mem_total()
 | 
			
		||||
 | 
			
		||||
Return bytes of total memory
 | 
			
		||||
 | 
			
		||||
=item $hp->mem_used()
 | 
			
		||||
 | 
			
		||||
Returns bytes of used memory
 | 
			
		||||
 | 
			
		||||
=item $hp->model()
 | 
			
		||||
 | 
			
		||||
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 = (
 | 
			
		||||
                'J4093A' => '2424M',
 | 
			
		||||
                'J4110A' => '8000M',
 | 
			
		||||
                'J4120A' => '1600M',
 | 
			
		||||
                'J4121A' => '4000M',
 | 
			
		||||
                'J4122A' => '2400M',
 | 
			
		||||
                'J4122B' => '2424M',
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
=item $hp->os()
 | 
			
		||||
 | 
			
		||||
Returns hp
 | 
			
		||||
 | 
			
		||||
=item $hp->os_bin()
 | 
			
		||||
 | 
			
		||||
C<hpSwitchRomVersion.0>
 | 
			
		||||
 | 
			
		||||
=item $hp->os_ver()
 | 
			
		||||
 | 
			
		||||
Tries to use os_version() and if that fails will try and cull the version from
 | 
			
		||||
the description field.
 | 
			
		||||
 | 
			
		||||
=item $hp->os_version()
 | 
			
		||||
 | 
			
		||||
C<hpSwitchOsVersion.0>
 | 
			
		||||
 | 
			
		||||
=item $hp->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number if available through SNMP
 | 
			
		||||
 | 
			
		||||
=item $hp->slots()
 | 
			
		||||
 | 
			
		||||
Returns number of entries in $hp->e_name that have 'slot' in them.
 | 
			
		||||
 | 
			
		||||
=item $hp->vendor()
 | 
			
		||||
 | 
			
		||||
hp
 | 
			
		||||
 | 
			
		||||
=item $hp->fan()
 | 
			
		||||
 | 
			
		||||
Returns fan status
 | 
			
		||||
 | 
			
		||||
=item $hp->ps1_status()
 | 
			
		||||
 | 
			
		||||
Power supply 1 status
 | 
			
		||||
 | 
			
		||||
=item $hp->ps2_status()
 | 
			
		||||
 | 
			
		||||
Power supply 2 status
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp->interfaces()
 | 
			
		||||
 | 
			
		||||
Uses $hp->i_description()
 | 
			
		||||
 | 
			
		||||
=item $hp->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to current link duplex.
 | 
			
		||||
 | 
			
		||||
=item $hp->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to admin duplex setting.
 | 
			
		||||
 | 
			
		||||
=item $hp->vendor_i_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to HP specific port type
 | 
			
		||||
(C<hpSwitchPortType>).
 | 
			
		||||
 | 
			
		||||
=item $hp->i_name()
 | 
			
		||||
 | 
			
		||||
Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias()
 | 
			
		||||
 | 
			
		||||
=item $hp->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the PVID (default VLAN) or untagged
 | 
			
		||||
port when using F<HP-VLAN>.
 | 
			
		||||
 | 
			
		||||
=item $hp->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.  These are the VLANs which are members of the egress list for the port.
 | 
			
		||||
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}}));
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $hp->i_vlan_membership_untagged()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.  These are the VLANs which are members of the untagged egress list for
 | 
			
		||||
the port.
 | 
			
		||||
 | 
			
		||||
=item $hp->v_index()
 | 
			
		||||
 | 
			
		||||
Returns VLAN IDs
 | 
			
		||||
 | 
			
		||||
=item $hp->v_name()
 | 
			
		||||
 | 
			
		||||
Returns VLAN names
 | 
			
		||||
 | 
			
		||||
=item $hp->bp_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of bridge port table entries map back to interface
 | 
			
		||||
identifier (iid)
 | 
			
		||||
 | 
			
		||||
Returns (C<ifIndex>) for both key and value for 1600, 2424, 4000, and 8000
 | 
			
		||||
models since they seem to have problems with F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=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::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item set_i_vlan()
 | 
			
		||||
 | 
			
		||||
=item set_i_vlan_tagged()
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										191
									
								
								lib/SNMP/Info/Layer2/HPVC.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								lib/SNMP/Info/Layer2/HPVC.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,191 @@
 | 
			
		||||
# SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2011 Jeroen van Ingen
 | 
			
		||||
#
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::HPVC;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::HPVC::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    'HPVC-MIB'       => 'vcDomainName',
 | 
			
		||||
    'CPQSINFO-MIB'   => 'cpqSiSysSerialNum',
 | 
			
		||||
    'HPVCMODULE-MIB' => 'vcModuleDomainName',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    'serial1'      => 'cpqSiSysSerialNum.0',
 | 
			
		||||
    'os_ver'       => 'cpqHoSWRunningVersion.1',
 | 
			
		||||
    'os_bin'       => 'cpqHoFwVerVersion.1',
 | 
			
		||||
    'productname'  => 'cpqSiProductName.0',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method Overrides
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'hpvc';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'hp';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return $hp->productname();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::HPVC - SNMP Interface to HP Virtual Connect Switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Jeroen van Ingen
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a
 | 
			
		||||
HP Virtual Connect Switch via SNMP.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<HPVC-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CPQSINFO-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HPVCMODULE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
All required MIBs can be found in the netdisco-mibs package.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'hpvc'>
 | 
			
		||||
 | 
			
		||||
=item $hp->os_bin()
 | 
			
		||||
 | 
			
		||||
C<cpqHoFwVerVersion.1>
 | 
			
		||||
 | 
			
		||||
=item $hp->os_ver()
 | 
			
		||||
 | 
			
		||||
C<cpqHoSWRunningVersion.1>
 | 
			
		||||
 | 
			
		||||
=item $hp->serial()
 | 
			
		||||
 | 
			
		||||
C<cpqSiSysSerialNum.0>
 | 
			
		||||
 | 
			
		||||
=item $hp->vendor()
 | 
			
		||||
 | 
			
		||||
hp
 | 
			
		||||
 | 
			
		||||
=item $hp->model()
 | 
			
		||||
 | 
			
		||||
C<cpqSiProductName.0>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										177
									
								
								lib/SNMP/Info/Layer2/Kentrox.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								lib/SNMP/Info/Layer2/Kentrox.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,177 @@
 | 
			
		||||
package SNMP::Info::Layer2::Kentrox;
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2011 Netdisco Project
 | 
			
		||||
# 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.
 | 
			
		||||
 | 
			
		||||
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//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
        #from DATASMART-MIB
 | 
			
		||||
        # MIB isn't yet in netdisco-mibs (not clear permission)
 | 
			
		||||
        # ... when it is, this can change to dsScWyv
 | 
			
		||||
        'ds_sysinfo' => '.1.3.6.1.4.1.181.2.2.12.15.0',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'kentrox';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $dsver = shift;
 | 
			
		||||
    my $descr = $dsver->description();
 | 
			
		||||
    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 ( defined ($serial) && $serial =~ /SERIAL\s(\S+)/){
 | 
			
		||||
        my $str = substr($1,8,10);
 | 
			
		||||
        return $str;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'kentrox';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $dsmodel = shift;
 | 
			
		||||
    my $descr = $dsmodel->description();
 | 
			
		||||
    if ( defined ($descr) && $descr =~ /^(\S+\s\S+)/){
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Kentrox - SNMP Interface to L2 Kentrox DataSMART DSU/CSU
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
phishphreek@gmail.com
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $router = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $router->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Kentrox DataSMART DSU/CSU
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $router->vendor()
 | 
			
		||||
 | 
			
		||||
=item $router->os()
 | 
			
		||||
 | 
			
		||||
=item $router->os_ver()
 | 
			
		||||
 | 
			
		||||
=item $router->model()
 | 
			
		||||
 | 
			
		||||
=item $router->serial()
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										234
									
								
								lib/SNMP/Info/Layer2/N2270.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								lib/SNMP/Info/Layer2/N2270.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,234 @@
 | 
			
		||||
# SNMP::Info::Layer2::N2270
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 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::N2270;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::SONMP;
 | 
			
		||||
use SNMP::Info::Airespace;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::N2270::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer2 SNMP::Info::SONMP SNMP::Info::Airespace Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::N2270::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD, $INIT, $DEBUG);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::SONMP::MIBS,
 | 
			
		||||
    %SNMP::Info::Airespace::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::SONMP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Airespace::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::SONMP::FUNCS,
 | 
			
		||||
    %SNMP::Info::Airespace::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
    %SNMP::Info::SONMP::MUNGE,
 | 
			
		||||
    %SNMP::Info::Airespace::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $n2270 = shift;
 | 
			
		||||
    my $id    = $n2270->id();
 | 
			
		||||
    return unless defined $id;
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
    $model =~ s/^sreg-WLANSecuritySwitch//i;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub index_factor {
 | 
			
		||||
    return 256;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub slot_offset {
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::N2270 - SNMP Interface to Nortel 2270 Series Wireless
 | 
			
		||||
Switch
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
    #Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 | 
			
		||||
    my $n2270 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
    my $class = $n2270->class();
 | 
			
		||||
    print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a
 | 
			
		||||
Nortel 2270 Series Wireless Switch through SNMP.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Airespace
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $n2270->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
 | 
			
		||||
=item $n2270->os()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
 | 
			
		||||
=item $n2270->model()
 | 
			
		||||
 | 
			
		||||
Cross references $bayhub->id() to the F<SYNOPTICS-ROOT-MIB> and returns
 | 
			
		||||
the results.
 | 
			
		||||
 | 
			
		||||
Removes C<sreg-WLANSecuritySwitch> from the model name
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  $bayhub->index_factor()
 | 
			
		||||
 | 
			
		||||
Required by SNMP::Info::SONMP.  Number representing the number of ports
 | 
			
		||||
reserved per slot within the device MIB.  Returns 256.
 | 
			
		||||
 | 
			
		||||
=item $bayhub->slot_offset()
 | 
			
		||||
 | 
			
		||||
Required by SNMP::Info::SONMP.  Offset if slot numbering does not
 | 
			
		||||
start at 0.  Returns 0.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::SONMP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Airespace
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Airespace/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item None
 | 
			
		||||
 | 
			
		||||
=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::SONMP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Airespace
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										581
									
								
								lib/SNMP/Info/Layer2/NAP222x.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										581
									
								
								lib/SNMP/Info/Layer2/NAP222x.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,581 @@
 | 
			
		||||
# SNMP::Info::Layer2::NAP222x
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 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::NAP222x;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::SONMP;
 | 
			
		||||
use SNMP::Info::IEEE802dot11;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::NAP222x::ISA
 | 
			
		||||
    = qw/SNMP::Info::SONMP SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::NAP222x::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,
 | 
			
		||||
    %SNMP::Info::SONMP::MIBS, 'NORTEL-WLAN-AP-MIB' => 'ntWlanSwHardwareVer',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::GLOBALS,
 | 
			
		||||
    %SNMP::Info::SONMP::GLOBALS,
 | 
			
		||||
    'nt_hw_ver'     => 'ntWlanSwHardwareVer',
 | 
			
		||||
    'nt_fw_ver'     => 'ntWlanSwBootRomVer',
 | 
			
		||||
    'nt_sw_ver'     => 'ntWlanSwOpCodeVer',
 | 
			
		||||
    'nt_cc'         => 'ntWlanSwCountryCode',
 | 
			
		||||
    'tftp_action'   => 'ntWlanTransferStart',
 | 
			
		||||
    'tftp_host'     => 'ntWlanFileServer',
 | 
			
		||||
    'tftp_file'     => 'ntWlanDestFile',
 | 
			
		||||
    'tftp_type'     => 'ntWlanFileType',
 | 
			
		||||
    'tftp_result'   => 'ntWlanFileTransferStatus',
 | 
			
		||||
    'tftp_xtype'    => 'ntWlanTransferType',
 | 
			
		||||
    'tftp_src_file' => 'ntWlanSrcFile',
 | 
			
		||||
    'ftp_user'      => 'ntWlanUserName',
 | 
			
		||||
    'ftp_pass'      => 'ntWlanPassword',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::FUNCS,
 | 
			
		||||
    %SNMP::Info::SONMP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # From ntWlanPortTable
 | 
			
		||||
    'nt_prt_name'  => 'ntWlanPortName',
 | 
			
		||||
    'nt_dpx_admin' => 'ntWlanPortCapabilities',
 | 
			
		||||
    'nt_auto'      => 'ntWlanPortAutonegotiation',
 | 
			
		||||
    'nt_dpx'       => 'ntWlanPortSpeedDpxStatus',
 | 
			
		||||
 | 
			
		||||
    # From ntWlanDot11PhyOperationTable
 | 
			
		||||
    'nt_i_broadcast' => 'ntWlanDot11ClosedSystem',
 | 
			
		||||
 | 
			
		||||
    # From ntWlanApVlanTable
 | 
			
		||||
    'nt_i_vlan' => 'ntWlanApVlanDefaultVid',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE,
 | 
			
		||||
    %SNMP::Info::SONMP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_bin {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $bin     = $nap222x->nt_fw_ver();
 | 
			
		||||
    return unless defined $bin;
 | 
			
		||||
 | 
			
		||||
    if ( $bin =~ m/(\d+\.\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $descr   = $nap222x->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    return 'AP-2220' if ( $descr =~ /2220/ );
 | 
			
		||||
    return 'AP-2221' if ( $descr =~ /2221/ );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mac {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $i_mac   = $nap222x->i_mac();
 | 
			
		||||
 | 
			
		||||
    # Return Interface MAC
 | 
			
		||||
    foreach my $entry ( keys %$i_mac ) {
 | 
			
		||||
        my $sn = $i_mac->{$entry};
 | 
			
		||||
        next unless $sn;
 | 
			
		||||
        return $sn;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $i_mac   = $nap222x->i_mac();
 | 
			
		||||
 | 
			
		||||
    # Return Interface MAC
 | 
			
		||||
    foreach my $entry ( keys %$i_mac ) {
 | 
			
		||||
        my $sn = $i_mac->{$entry};
 | 
			
		||||
        next unless $sn;
 | 
			
		||||
        return $sn;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces  = $nap222x->i_index($partial)       || {};
 | 
			
		||||
    my $description = $nap222x->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $desc = $description->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
        next if $desc =~ /lo/i;
 | 
			
		||||
 | 
			
		||||
        $interfaces{$iid} = $desc;
 | 
			
		||||
    }
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $mode       = $nap222x->nt_dpx($partial)      || {};
 | 
			
		||||
    my $port_name  = $nap222x->nt_prt_name($partial) || {};
 | 
			
		||||
    my $interfaces = $nap222x->interfaces($partial)  || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
        my $port = $interfaces->{$if};
 | 
			
		||||
        next unless $port =~ /dp/i;
 | 
			
		||||
        foreach my $idx ( keys %$mode ) {
 | 
			
		||||
            my $name = $port_name->{$idx} || 'unknown';
 | 
			
		||||
            next unless $name eq $port;
 | 
			
		||||
            my $duplex = $mode->{$idx};
 | 
			
		||||
 | 
			
		||||
            $duplex = 'other' unless defined $duplex;
 | 
			
		||||
            $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
            $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
 | 
			
		||||
            $i_duplex{$if} = $duplex;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $dpx_admin  = $nap222x->nt_dpx_admin($partial) || {};
 | 
			
		||||
    my $nt_auto    = $nap222x->nt_auto($partial)      || {};
 | 
			
		||||
    my $interfaces = $nap222x->interfaces($partial)   || {};
 | 
			
		||||
    my $port_name  = $nap222x->nt_prt_name($partial)  || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
        my $port = $interfaces->{$if};
 | 
			
		||||
        next unless $port =~ /dp/i;
 | 
			
		||||
        foreach my $idx ( keys %$dpx_admin ) {
 | 
			
		||||
            my $name = $port_name->{$idx} || 'unknown';
 | 
			
		||||
            next unless $name eq $port;
 | 
			
		||||
            my $duplex = $dpx_admin->{$idx};
 | 
			
		||||
            my $auto   = $nt_auto->{$idx};
 | 
			
		||||
 | 
			
		||||
            $duplex = 'other' unless defined $duplex;
 | 
			
		||||
            $duplex = 'half'
 | 
			
		||||
                if ( $duplex =~ /half/i and $auto =~ /disabled/i );
 | 
			
		||||
            $duplex = 'full'
 | 
			
		||||
                if ( $duplex =~ /full/i and $auto =~ /disabled/i );
 | 
			
		||||
            $duplex = 'auto' if $auto =~ /enabled/i;
 | 
			
		||||
 | 
			
		||||
            $i_duplex_admin{$if} = $duplex;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $nap222x->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
        my $desc = $interfaces->{$if};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
 | 
			
		||||
        my $name = 'unknown';
 | 
			
		||||
        $name = 'Ethernet Interface'   if $desc =~ /dp/i;
 | 
			
		||||
        $name = 'Wireless Interface B' if $desc =~ /ndc/i;
 | 
			
		||||
        $name = 'Wireless Interface A' if $desc =~ /ar/i;
 | 
			
		||||
 | 
			
		||||
        $i_name{$if} = $name;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# dot1dBasePortTable does not exist and dot1dTpFdbPort does not map to ifIndex
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $nap222x->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %bp_index;
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $desc = $interfaces->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
        next unless $desc =~ /(ndc|ar)/i;
 | 
			
		||||
 | 
			
		||||
        my $port = 1;
 | 
			
		||||
        $port = 2 if $desc =~ /ndc/i;
 | 
			
		||||
 | 
			
		||||
        $bp_index{$port} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Indicies don't match anywhere in these devices! Need to override to match
 | 
			
		||||
# IfIndex.
 | 
			
		||||
sub i_ssidlist {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # modify partial to match index
 | 
			
		||||
    if ( defined $partial ) {
 | 
			
		||||
        $partial = $partial - 2;
 | 
			
		||||
    }
 | 
			
		||||
    my $ssids = $nap222x->orig_i_ssidlist($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ssidlist;
 | 
			
		||||
    foreach my $iid ( keys %$ssids ) {
 | 
			
		||||
        my $port = $iid + 2;
 | 
			
		||||
        my $ssid = $ssids->{$iid};
 | 
			
		||||
        next unless defined $ssid;
 | 
			
		||||
 | 
			
		||||
        $i_ssidlist{$port} = $ssid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ssidlist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ssidbcast {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # modify partial to match index
 | 
			
		||||
    if ( defined $partial ) {
 | 
			
		||||
        $partial = $partial - 2;
 | 
			
		||||
    }
 | 
			
		||||
    my $bcast = $nap222x->nt_i_broadcast($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ssidbcast;
 | 
			
		||||
    foreach my $iid ( keys %$bcast ) {
 | 
			
		||||
        my $port = $iid + 2;
 | 
			
		||||
        my $bc   = $bcast->{$iid};
 | 
			
		||||
        next unless defined $bc;
 | 
			
		||||
 | 
			
		||||
        $i_ssidbcast{$port} = $bc;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ssidbcast;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_80211channel {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # modify partial to match index
 | 
			
		||||
    if ( defined $partial ) {
 | 
			
		||||
        $partial = $partial - 2;
 | 
			
		||||
    }
 | 
			
		||||
    my $phy_type = $nap222x->dot11_phy_type($partial) || {};
 | 
			
		||||
    my $cur_freq = $nap222x->dot11_cur_freq()         || {};
 | 
			
		||||
    my $cur_ch   = $nap222x->dot11_cur_ch()           || {};
 | 
			
		||||
 | 
			
		||||
    my %i_80211channel;
 | 
			
		||||
    foreach my $iid ( keys %$phy_type ) {
 | 
			
		||||
        my $port = $iid + 2;
 | 
			
		||||
        my $type = $phy_type->{$iid};
 | 
			
		||||
        next unless defined $type;
 | 
			
		||||
        if ( $type =~ /dsss/ ) {
 | 
			
		||||
            my $ch = $cur_ch->{1};
 | 
			
		||||
            next unless defined $ch;
 | 
			
		||||
            $i_80211channel{$port} = $ch;
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $type =~ /ofdm/ ) {
 | 
			
		||||
            my $ch = $cur_freq->{0};
 | 
			
		||||
            next unless defined $ch;
 | 
			
		||||
            $i_80211channel{$port} = $ch;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_80211channel;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $nap222x = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # modify partial to match index
 | 
			
		||||
    if ( defined $partial ) {
 | 
			
		||||
        $partial = $partial - 2;
 | 
			
		||||
    }
 | 
			
		||||
    my $vlans = $nap222x->nt_i_vlan($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_vlan;
 | 
			
		||||
    foreach my $iid ( keys %$vlans ) {
 | 
			
		||||
        my $port = $iid + 2;
 | 
			
		||||
        my $vlan = $vlans->{$iid};
 | 
			
		||||
        next unless defined $vlan;
 | 
			
		||||
 | 
			
		||||
        $i_vlan{$port} = $vlan;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::NAP222x - SNMP Interface to Nortel 2220 Series Access
 | 
			
		||||
Points
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a Nortel
 | 
			
		||||
2220 series wireless Access Points through SNMP.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<NORTEL-WLAN-AP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $nap222x->model()
 | 
			
		||||
 | 
			
		||||
Returns the model extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $nap222x->os()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
 | 
			
		||||
=item $nap222x->os_bin()
 | 
			
		||||
 | 
			
		||||
Returns the firmware version extracted from C<ntWlanSwBootRomVer>.
 | 
			
		||||
 | 
			
		||||
=item $nap222x->mac()
 | 
			
		||||
 | 
			
		||||
Returns the MAC address of the first Ethernet Interface.
 | 
			
		||||
 | 
			
		||||
=item $nap222x->serial()
 | 
			
		||||
 | 
			
		||||
Returns the MAC address of the first Ethernet Interface.
 | 
			
		||||
 | 
			
		||||
=item $nap222x->nt_hw_ver()
 | 
			
		||||
 | 
			
		||||
Returns the hardware version.
 | 
			
		||||
 | 
			
		||||
(C<ntWlanSwHardwareVer>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->nt_cc()
 | 
			
		||||
 | 
			
		||||
Returns the country code of the AP.
 | 
			
		||||
 | 
			
		||||
(C<ntWlanSwHardwareVer>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->tftp_action()
 | 
			
		||||
 | 
			
		||||
(C<ntWlanTransferStart>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->tftp_host()
 | 
			
		||||
 | 
			
		||||
(C<ntWlanFileServer>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->tftp_file()
 | 
			
		||||
 | 
			
		||||
(C<ntWlanDestFile>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->tftp_type()
 | 
			
		||||
 | 
			
		||||
(C<ntWlanFileType>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->tftp_result()
 | 
			
		||||
 | 
			
		||||
(C<ntWlanFileTransferStatus>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->tftp_xtype()
 | 
			
		||||
 | 
			
		||||
(C<ntWlanTransferType>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->tftp_src_file()
 | 
			
		||||
 | 
			
		||||
(C<ntWlanSrcFile>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->ftp_user()
 | 
			
		||||
 | 
			
		||||
(C<ntWlanUserName>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->ftp_pass()
 | 
			
		||||
 | 
			
		||||
(C<ntWlanPassword>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $nap222x->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to physical ports.
 | 
			
		||||
 | 
			
		||||
=item $nap222x->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps port operational duplexes to IIDs.
 | 
			
		||||
 | 
			
		||||
(C<ntWlanPortSpeedDpxStatus>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps port admin duplexes to IIDs.
 | 
			
		||||
 | 
			
		||||
(C<ntWlanPortCapabilities>)
 | 
			
		||||
 | 
			
		||||
=item $nap222x->i_name()
 | 
			
		||||
 | 
			
		||||
Returns a human name based upon port description.
 | 
			
		||||
 | 
			
		||||
=item $nap222x->bp_index()
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=item $nap222x->i_ssidlist()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  SSID's recognized by the radio interface.
 | 
			
		||||
 | 
			
		||||
=item $nap222x->i_ssidbcast()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Indicates whether the SSID is broadcast.
 | 
			
		||||
 | 
			
		||||
=item $nap222x->i_80211channel()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current operating frequency channel of the radio
 | 
			
		||||
interface.
 | 
			
		||||
 | 
			
		||||
=item $nap222x->i_vlan()
 | 
			
		||||
 | 
			
		||||
The default Vlan ID of the radio interfaces.
 | 
			
		||||
 | 
			
		||||
(C<ntWlanApVlanDefaultVid>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										1279
									
								
								lib/SNMP/Info/Layer2/NWSS2300.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1279
									
								
								lib/SNMP/Info/Layer2/NWSS2300.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										263
									
								
								lib/SNMP/Info/Layer2/Netgear.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										263
									
								
								lib/SNMP/Info/Layer2/Netgear.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,263 @@
 | 
			
		||||
# SNMP::Info::Layer2::Netgear
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Netgear;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Netgear::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
# 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, );
 | 
			
		||||
 | 
			
		||||
%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, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'netgear';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'netgear';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# We will attempt to use Entity-MIB if present.  In that case, we will
 | 
			
		||||
# also set the shared variable $index, which is used by other functions
 | 
			
		||||
# to index within Entity-MIB tables. This assumes, of course, that there
 | 
			
		||||
# is only one serial number (entPhysicalSerialNum) present in the table.
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $serial = undef;
 | 
			
		||||
 | 
			
		||||
    my $e_serial = $netgear->e_serial();
 | 
			
		||||
    if (defined($e_serial)) { # This unit sports the Entity-MIB
 | 
			
		||||
        # Find entity table entry for this unit
 | 
			
		||||
        foreach my $e ( keys %$e_serial ) {
 | 
			
		||||
            if (defined ($e_serial->{$e}) and $e_serial->{$e} !~ /^\s*$/) {
 | 
			
		||||
                $index = $e;
 | 
			
		||||
                last;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return $e_serial->{$index} if defined $index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Without 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/[FG]SM\d/i;;
 | 
			
		||||
    return 'none';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# If device supports Entity-MIB, index into that to divine model and
 | 
			
		||||
# hardware version, otherwise default to sysDescr.
 | 
			
		||||
sub model {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    if (defined($index)) {
 | 
			
		||||
        my $model   = $netgear->e_descr();
 | 
			
		||||
        my $e_hwver = $netgear->e_hwver();
 | 
			
		||||
 | 
			
		||||
        $model = "$model->{$index} $e_hwver->{$index}";
 | 
			
		||||
        return $model;
 | 
			
		||||
    }
 | 
			
		||||
    return $netgear->description();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# ifDescr is the same for all interfaces in a class, but the ifName is
 | 
			
		||||
# unique, so let's use that for port name.  If all else fails,
 | 
			
		||||
# concatenate ifDesc and ifIndex.
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $netgear->i_index($partial)       || {};
 | 
			
		||||
    my $i_descr    = $netgear->i_description($partial) || {};
 | 
			
		||||
    my $i_name     = $netgear->i_name($partial);
 | 
			
		||||
    my $i_isset    = ();
 | 
			
		||||
    # Replace the description with the ifName field, if set
 | 
			
		||||
    foreach my $iid ( keys %$i_name ) {
 | 
			
		||||
        my $name = $i_name->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
        if (defined $name and $name !~ /^\s*$/) {
 | 
			
		||||
            $interfaces->{$iid} = $name;
 | 
			
		||||
            $i_isset->{$iid} = 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    # Replace the Index with the ifDescr field, appended with index
 | 
			
		||||
    # number, to deal with devices with non-unique ifDescr.
 | 
			
		||||
    foreach my $iid ( keys %$i_descr ) {
 | 
			
		||||
        my $port = $i_descr->{$iid} . '-' . $iid;
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if (defined $i_isset->{$iid} and $i_isset->{$iid} == 1);
 | 
			
		||||
        $interfaces->{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 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;
 | 
			
		||||
    my $serial  = $netgear->serial(); # Make sure that index gets primed
 | 
			
		||||
    if (defined($index)) {
 | 
			
		||||
        my $os_ver  = $netgear->e_swver();
 | 
			
		||||
        return $os_ver->{$index} if defined $os_ver;
 | 
			
		||||
    }
 | 
			
		||||
    return $netgear->ng_gsmosver() if defined  $netgear->model and $netgear->model =~ m/[FG]SM\d/i;
 | 
			
		||||
    return $netgear->ng_fsosver() if defined  $netgear->model and $netgear->model =~ m/FS\d/i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
 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.
 | 
			
		||||
 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a
 | 
			
		||||
Netgear device through SNMP. See inherited classes' documentation for
 | 
			
		||||
inherited methods.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
 | 
			
		||||
classes.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netgear->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'netgear'
 | 
			
		||||
 | 
			
		||||
=item $netgear->os()
 | 
			
		||||
 | 
			
		||||
Returns 'netgear'
 | 
			
		||||
 | 
			
		||||
=item $netgear->model()
 | 
			
		||||
 | 
			
		||||
Returns concatenation of $e_model and $e_hwver if Entity MIB present,
 | 
			
		||||
otherwise returns description()
 | 
			
		||||
 | 
			
		||||
=item $netgear->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns OS Version.
 | 
			
		||||
 | 
			
		||||
=item $netgear->serial()
 | 
			
		||||
 | 
			
		||||
Returns Serial Number if available (older FS switches have no accessible
 | 
			
		||||
serial number).
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of
 | 
			
		||||
a reference to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netgear->interfaces()
 | 
			
		||||
 | 
			
		||||
Uses the i_name() field.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=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.70-135';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
							
								
								
									
										283
									
								
								lib/SNMP/Info/Layer2/Orinoco.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								lib/SNMP/Info/Layer2/Orinoco.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,283 @@
 | 
			
		||||
# SNMP::Info::Layer2::Orinoco
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 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::Orinoco;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::IEEE802dot11;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Orinoco::ISA
 | 
			
		||||
    = qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Orinoco::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS
 | 
			
		||||
    = ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'orinoco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $orinoco = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $orinoco->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/V(\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    if ( $descr =~ m/v(\d+\.\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_bin {
 | 
			
		||||
    my $orinoco = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $orinoco->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/V(\d+\.\d+)$/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    if ( $descr =~ m/v(\d+\.\d+\.\d+)$/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'proxim';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $orinoco = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $orinoco->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    return $1             if ( $descr =~ /(AP-\d+)/ );
 | 
			
		||||
    return 'WavePOINT-II' if ( $descr =~ /WavePOINT-II/ );
 | 
			
		||||
    return 'Outdoor Router' if ( $descr =~ /Wireless Router/ );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $orinoco = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $orinoco->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    $descr = $1 if $descr =~ /SN-(\S+)/;
 | 
			
		||||
    return $descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $orinoco = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $orinoco->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$descr ) {
 | 
			
		||||
        my $type = $descr->{$if};
 | 
			
		||||
 | 
			
		||||
        # Skip virtual interfaces
 | 
			
		||||
        $i_ignore{$if}++ if $type =~ /(lo|empty|PCMCIA)/i;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $orinoco = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces   = $orinoco->i_index($partial)       || {};
 | 
			
		||||
    my $descriptions = $orinoco->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $desc = $descriptions->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
        next if $desc =~ /(lo|empty|PCMCIA)/i;
 | 
			
		||||
 | 
			
		||||
        $desc = 'AMD' if $desc =~ /AMD/;
 | 
			
		||||
 | 
			
		||||
        $interfaces{$iid} = $desc;
 | 
			
		||||
    }
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Orinoco - SNMP Interface to Orinoco Series Access Points
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # 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();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from
 | 
			
		||||
Orinoco Access Point through SNMP.  Orinoco devices have been manufactured
 | 
			
		||||
by Proxim, Agere, and Lucent.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $orinoco->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'proxim'
 | 
			
		||||
 | 
			
		||||
=item $orinoco->model()
 | 
			
		||||
 | 
			
		||||
Returns the model extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $orinoco->os()
 | 
			
		||||
 | 
			
		||||
Returns 'orinoco'
 | 
			
		||||
 | 
			
		||||
=item $orinoco->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $orinoco->os_bin()
 | 
			
		||||
 | 
			
		||||
Returns the firmware version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $orinoco->serial()
 | 
			
		||||
 | 
			
		||||
Returns the serial number extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $orinoco->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to physical ports.
 | 
			
		||||
 | 
			
		||||
=item $orinoco->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to ignore.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										108
									
								
								lib/SNMP/Info/Layer2/Proscend.pm
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										108
									
								
								lib/SNMP/Info/Layer2/Proscend.pm
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,108 @@
 | 
			
		||||
# SNMP::Info::Layer2::Proscend - SNMP Interface to Proscend Devices
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2020 by 135.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Proscend;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Proscend::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Proscend::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.70-135';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'proscend';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'proscend';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $obj = shift;
 | 
			
		||||
    return $obj->SUPER::model();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Proscend - SNMP Interface to Proscend Devices
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $obj = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $obj->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Proscend Devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $obj->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'proscend'
 | 
			
		||||
 | 
			
		||||
=item $obj->os()
 | 
			
		||||
 | 
			
		||||
Returns 'proscend'
 | 
			
		||||
 | 
			
		||||
=item $obj->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version.
 | 
			
		||||
 | 
			
		||||
=item $obj->model()
 | 
			
		||||
 | 
			
		||||
Returns the model extracted.
 | 
			
		||||
 | 
			
		||||
=item $obj->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user