Compare commits
	
		
			866 Commits
		
	
	
		
			ver_0_4
			...
			ver_3_0_4_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					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 | 
@@ -1,3 +1,8 @@
 | 
			
		||||
All code from version 0.7 on
 | 
			
		||||
Copyright (c) 2003-2009 Max Baker and SNMP::Info Developers
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Original Code
 | 
			
		||||
Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										541
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										541
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -1,13 +1,535 @@
 | 
			
		||||
SNMP::Info - Perl5 OO Interface to Network Devices and SNMP MIBs
 | 
			
		||||
ChangeLog $Id$
 | 
			
		||||
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
 | 
			
		||||
 | 
			
		||||
version 3.04_001 (2013-08-16)
 | 
			
		||||
 | 
			
		||||
   [ENHANCEMENTS]
 | 
			
		||||
 | 
			
		||||
    * [#47] Add model info on HP 2530 and HP 2920 series
 | 
			
		||||
    * Add support for Cisco Small Business series
 | 
			
		||||
      Layer2/CiscoSB class
 | 
			
		||||
    * Add proper LLDP support to Netgear.pm
 | 
			
		||||
    * Change $netgear->interfaces() to use ifName rather than ifDescr
 | 
			
		||||
      as the former is unique per interface while the latter is not.  
 | 
			
		||||
      If ifName is not present, concatenate ifDescr and ifIndex
 | 
			
		||||
      to achieve a unique value.
 | 
			
		||||
    * Properly report hardware version, Serial No. and OS Version for
 | 
			
		||||
      Netgear.
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
version 3.03 (2013-07-11)
 | 
			
		||||
 | 
			
		||||
    [BUG FIXES]
 | 
			
		||||
 | 
			
		||||
    * Add missing =back to POD (A. Hartmaier)
 | 
			
		||||
 | 
			
		||||
version 3.02 (2013-07-08)
 | 
			
		||||
 | 
			
		||||
    [ENHANCEMENTS]
 | 
			
		||||
 | 
			
		||||
    * Properly pull os_ver from Netgear GS series switches.
 | 
			
		||||
    * Support Alcatel devices with layer3 features.
 | 
			
		||||
    * Identify Cisco Aironet 1140 APs as Layer2::Aironet
 | 
			
		||||
    * LAN switch support added to Layer3::Aruba class
 | 
			
		||||
    * [RT#86725] - Identify Cisco Catalyst 3850 as Layer3::C6500 (C. Causer)
 | 
			
		||||
 | 
			
		||||
version 3.01 (2013-04-13)
 | 
			
		||||
 | 
			
		||||
    [API Changes]
 | 
			
		||||
 | 
			
		||||
    * The methods c_ip(), c_if(), c_port(), c_id(), and c_platform() now
 | 
			
		||||
      represent common topology methods and will try to return a combined
 | 
			
		||||
      hash of data from all L2 topology protocols either running on the
 | 
			
		||||
      device or specified in the method call.  The topology specific methods
 | 
			
		||||
      have been been prefixed with the protocol name in lowercase so that
 | 
			
		||||
      they can be called directly, sonmp_ip(), cdp_ip(), etc.
 | 
			
		||||
    * L2::Bay and L2::Foundry have been removed from the distribution.  Both
 | 
			
		||||
      classes were depreciated and all functionality is available through
 | 
			
		||||
      L2::Baystack and L3::Foundry. 
 | 
			
		||||
 | 
			
		||||
    [NEW FEATURES]
 | 
			
		||||
 | 
			
		||||
    * [3160037] - Support _raw suffix on methods to skip munging
 | 
			
		||||
    * [3185391] - Support for F5 devices in new class L3::F5
 | 
			
		||||
    * [3323814] - Arp support for Netscreen (David Baldwin)
 | 
			
		||||
    * [3323821] - Support for Netscreen w/ WLAN (eg SSG5) (David Baldwin)
 | 
			
		||||
    * [3599277] - Q-BRIDGE Support to collect VLAN in macsuck
 | 
			
		||||
    * [3033731] - Alcatel-Lucent OmniSwich AMAP Support in new AMAP class
 | 
			
		||||
    * [3598896] - Lantronix device support (J R Binks)
 | 
			
		||||
    * [3598337] - Lantronix SLC support
 | 
			
		||||
    * Support for Cisco ASA in L3::CiscoASA (Kraus/Hartmaier/Bernstein)
 | 
			
		||||
    * Support for Avaya VSP 9000 series in L3::Passport
 | 
			
		||||
    * Support for Avaya VSP 7000 series in L2::Baystack
 | 
			
		||||
    * Support Avaya (Trapeze) Wireless Controllers in new class L2::NWSS2300
 | 
			
		||||
    * Support Juniper (Trapeze) Wireless Controllers in new class L2::Trapeze
 | 
			
		||||
    * Support for newer Radware Alteon ADC switches 4408/4416/5412/5224 and
 | 
			
		||||
      older AWS 2000/3000 series in existing L3::AlteonAD
 | 
			
		||||
    * Support for H3C & HP A-series in new class L3::H3C
 | 
			
		||||
    * Support for Citrix Netscaler appliances in new class L7::Netscaler
 | 
			
		||||
    * New configuration option IgnoreNetSNMPConf will ignore Net-SNMP
 | 
			
		||||
      configuration files on object initialization
 | 
			
		||||
    * Two new utilities added in t/util to assist in developing device
 | 
			
		||||
      support; make_snmpdata.pl gathers SNMP data (snmpwalk) in a format that
 | 
			
		||||
      can be used with test_class_mocked.pl which mocks an SNMP agent to
 | 
			
		||||
      enable testing with no network access to a device.
 | 
			
		||||
 | 
			
		||||
    [ENHANCEMENTS]
 | 
			
		||||
 | 
			
		||||
    * UNIVERSAL::can() now works with dynamic methods 
 | 
			
		||||
    * Dynamically generated methods are added to symbol table to avoid
 | 
			
		||||
      AUTOLOAD on subsequent calls
 | 
			
		||||
    * L2::Airespace now supports 802.11n client tx rates
 | 
			
		||||
    * L2::Airespace now reports AP Ethernet MAC as port MAC for radio ports
 | 
			
		||||
    * CiscoStats improvements to determine os versions, eg IOS XE ver on Sup7L-E
 | 
			
		||||
    * CiscoStats now reports 'ios-xe' if the device runs IOS XE (used to be 'ios')
 | 
			
		||||
    * Improved support of XOS based Extreme devices
 | 
			
		||||
 | 
			
		||||
    [BUG FIXES]
 | 
			
		||||
 | 
			
		||||
    * [3564920] - lldp_if gives wrong data for Enterasys
 | 
			
		||||
 | 
			
		||||
version 2.11 (2012-12-09)
 | 
			
		||||
 | 
			
		||||
    [BUG FIXES]
 | 
			
		||||
 | 
			
		||||
    * Add fall-back for sysDescr on Force10
 | 
			
		||||
 | 
			
		||||
version 2.10 (2012-12-08)
 | 
			
		||||
 | 
			
		||||
    [NEW FEATURES]
 | 
			
		||||
 | 
			
		||||
    * Support for Force10 devices (W. Bulley)
 | 
			
		||||
 | 
			
		||||
version 2.09 (2012-11-28)
 | 
			
		||||
 | 
			
		||||
    [NEW FEATURES]
 | 
			
		||||
 | 
			
		||||
    * New method i_ssidmac() to get BSSID's from AP's with initial support
 | 
			
		||||
      in L2::Aironet and Airespace classes
 | 
			
		||||
    * Support for Avaya Secure Routers in new class L3::Tasman
 | 
			
		||||
    * Add EDP and LLDP L2 Topology to L3::Extreme 
 | 
			
		||||
    * [3185393] Support for Juniper SSL VPN in new class L7::Neoteris
 | 
			
		||||
    * [3381027] Support for Cisco Nexus in new class L3::Nexus   
 | 
			
		||||
    * [1424336] Support for Extreme Discovery Protocol (EDP)
 | 
			
		||||
    
 | 
			
		||||
    [ENHANCEMENTS]
 | 
			
		||||
 | 
			
		||||
    * [3017571] Add LLDP support for NetSNMP device class (begemot) 
 | 
			
		||||
    * [3418918] Extreme devices now report OS as either extremeware or xos
 | 
			
		||||
    * [2809045] Strip preceding netscreen from model name in L3::Netscreen
 | 
			
		||||
    * [] Classify Linksys 2024 as L3::Dell (Rogier Krieger)
 | 
			
		||||
    
 | 
			
		||||
    [BUG FIXES]
 | 
			
		||||
    
 | 
			
		||||
    * Fixed logic to return cached data for table methods when available and
 | 
			
		||||
      not a partial fetch
 | 
			
		||||
    * Fix typo in PoD for Bridge.pm and CiscoConfig.pm (William Bulley)
 | 
			
		||||
    * Fix/improve IPv6 neighbor cache handling, especially for Cisco Nexus
 | 
			
		||||
 | 
			
		||||
version 2.08 (2012-07-15)
 | 
			
		||||
 | 
			
		||||
    [NEW FEATURES]
 | 
			
		||||
 | 
			
		||||
    * Basic support for APC UPS devices
 | 
			
		||||
    * [2993691] Support for SonicWALL devices in new class L3::SonicWALL (phishphreek)
 | 
			
		||||
    * [2996795] Support for Kentrox devices in new class L2::Kentrox (phishphreek)
 | 
			
		||||
    * [] Basic support for Blue Coat proxy devices in new class L3::BlueCoatSG (jeroenvi)
 | 
			
		||||
    * [] Support Cisco 6500 / Sup2T in L3::C6500 class (jeroenvi)
 | 
			
		||||
 | 
			
		||||
    [ENHANCEMENTS]
 | 
			
		||||
 | 
			
		||||
    * Pseudo ENTITY-MIB methods added to L3::Juniper for hardware information
 | 
			
		||||
    * Add method to report current transmit power of the radio interface,
 | 
			
		||||
      dot11_cur_tx_pwr_mw(), in Airespace class 
 | 
			
		||||
    * [3085411] Activate L3 properties for Netgear GSM7224v2 (phishphreek)
 | 
			
		||||
    * [3085413] SNMP OIDs for Netgear Serial and OS Ver (phishphreek)
 | 
			
		||||
    * [3286549] Dell LLDP Support (Nico Giefing)
 | 
			
		||||
    * [3469527] Netgear LLDP Support (Nic Bernstein)
 | 
			
		||||
    * [3472052] moduleSerialNumber support for Cisco Stack (Slava)
 | 
			
		||||
    * [3523320] Better VLAN support in Juniper class (Web Bulley)
 | 
			
		||||
    * [3532261] LLDP support in C6500 and related (Carlos Vicente)
 | 
			
		||||
    * [3538949] Updated switch models in L2::HP (jeroenvi)
 | 
			
		||||
 | 
			
		||||
    [BUG FIXES]
 | 
			
		||||
 | 
			
		||||
    * Get OS version for Juniper devices not reporting in sysDescr
 | 
			
		||||
    * Correct base MAC reporting for Juniper devices
 | 
			
		||||
    * Correct reporting of SSID broadcast status in Airespace class
 | 
			
		||||
    * [3541442] Change L2::Catalyst port names to what is reported in CDP
 | 
			
		||||
    * [2132349] Add an additional check to get Foundry OS version
 | 
			
		||||
    * [2929883] [3413999] LLDP interface mapping issue
 | 
			
		||||
    * [3297786] LLDP TimeMark component defaults to zero (David Baldwin)
 | 
			
		||||
    * [2988163] Detect Juniper SSG firewalls as Layer3::Netscreen (R. Kerr)
 | 
			
		||||
    * [3317739] Fix for Baystack without POE on stack member 1 (David Baldwin)
 | 
			
		||||
    * [2037444] os_ver fails on some Extreme versions (Robert Kerr)
 | 
			
		||||
    * [2980789] Fix root_ip to try OSPF RouterID first (Brian De Wolf)
 | 
			
		||||
    * [2986858] Fix the patch from this ticket (Oliver Gorwits)
 | 
			
		||||
    * [3136084] Rename Allied Telesyn to Allied Telesis (Oliver Gorwits)
 | 
			
		||||
    * [3268104] CiscoVTP.pm i_vlan_membership() array bounds (Michael Sanderson)
 | 
			
		||||
    * [3497004] Clarify POD description of default values (a2w)
 | 
			
		||||
    * [3502533] Layer2/Baystack interface indexes > 513 (Robert Nyqvist)
 | 
			
		||||
 | 
			
		||||
version 2.06 (2011-09-28)
 | 
			
		||||
 | 
			
		||||
    [NEW FEATURES]
 | 
			
		||||
 | 
			
		||||
    * Support for PacketFront devices in new class L3::PacketFront
 | 
			
		||||
    * Support for Mikrotik devices in new class L3::Mikrotik
 | 
			
		||||
    * Support for HP VirtualConnect switches in new class L2::HPVC
 | 
			
		||||
    * Support for ADSL-LINE-MIB in new class AdslLine
 | 
			
		||||
 | 
			
		||||
    [ENHANCEMENTS]
 | 
			
		||||
 | 
			
		||||
    * POD clarification on i_speed() munging by Info.pm
 | 
			
		||||
    * Added i_stack_status method that can be used for finding the parent
 | 
			
		||||
      interface for e.g. ADSL interface speed determination
 | 
			
		||||
 | 
			
		||||
    [BUG FIXES]
 | 
			
		||||
 | 
			
		||||
    * [3344843] Fix returning serial() and os_ver() for web-managable HP
 | 
			
		||||
      switches, introduced by HP/HP4000 class split, reported by J R Binks
 | 
			
		||||
    * [2809033] Put L2-only Cisco blade switches in L3::C6500
 | 
			
		||||
    * [3408506] Fix uninitialized value in IPv6 when neighbor state is 
 | 
			
		||||
      incomplete (Michael Borgelt)
 | 
			
		||||
 | 
			
		||||
version 2.05 (2011-06-23)
 | 
			
		||||
    + Fix broken function call in L2::Aironet
 | 
			
		||||
    + Promote L2::Aruba to L3::Aruba, as Aruba devices can be L3 entities and
 | 
			
		||||
      provide L3 information.
 | 
			
		||||
 | 
			
		||||
version 2.04 (2011-03-31)
 | 
			
		||||
    + Support for older HP switch models moved to new L2::HP4000 class
 | 
			
		||||
    + Fix VLAN changing in L2::HP and L2::HP4000 classes
 | 
			
		||||
    * Updated model lists in HP classes
 | 
			
		||||
    + [2980782] Added L3::CiscoFWSM for Cisco Firewall Services Modules
 | 
			
		||||
      (Brian De Wolf)
 | 
			
		||||
    + Added L3::Pf for FreeBSD PFSense Firewalls (max)
 | 
			
		||||
    * Added specific functions for neighbor mgmt addresses to CDP class
 | 
			
		||||
    * Implemented os_bin() method in CiscoStats 
 | 
			
		||||
    + [2980787] Fix for C1900 bp_index not containing interfaces.
 | 
			
		||||
      (Brian De Wolf)
 | 
			
		||||
    + [2599795] Added vendor_i_type() method to HP and HP4000 clases
 | 
			
		||||
    + [2688801] Minor modification for obscure Proxim/Orinoco device
 | 
			
		||||
      (jrbinks)
 | 
			
		||||
    + [3051443] Add PoE measured power per port to Cisco, Extrme and HP 
 | 
			
		||||
      classes (jeroenvi)
 | 
			
		||||
    * Minor tweaks to support devices without sysServices
 | 
			
		||||
    * Added Cisco CBS3xxx blade switches to L3::C6500
 | 
			
		||||
    * Fix for FWSMs not being detected properly.  Special thanks goes to
 | 
			
		||||
      Jukka Pirhonen for pointing it out. (Brian De Wolf)
 | 
			
		||||
    + Added support for IPv6 to physical address mapping
 | 
			
		||||
    * Added ME340x to L3::C3550
 | 
			
		||||
    * Added new ProCurve models to HP class
 | 
			
		||||
    * Fixed i_speed_raw not returning raw values (Alexander Hartmaier)
 | 
			
		||||
 | 
			
		||||
version 2.01 (06/12/09)
 | 
			
		||||
    + Added CiscoStpExtensions Class (Carlos Vicente)
 | 
			
		||||
    + Added Layer3::Arista (fenner)
 | 
			
		||||
    + [2020353] Added L3::Altiga for Cisco (Altiga) VPN3000 Concentrators
 | 
			
		||||
                (Jeroen van Ingen)
 | 
			
		||||
 | 
			
		||||
    * Fixed RFC1213-MIB vs IF-MIB collision in ifOperStatus
 | 
			
		||||
    * Updated test_class.pl for better debug info and relative path
 | 
			
		||||
    * Add cisco vendor detection by OID in Layer3.pm (Sam Stickland)
 | 
			
		||||
    * Fix CaSe of EtherLike-MIB in EtherLike.pm (Alexander Hartmaier)
 | 
			
		||||
    * Added Cisco FWSM to L3::Cisco
 | 
			
		||||
    * Added s222_rp to L3::C6500
 | 
			
		||||
    * Added CIGESM to L2::C2900
 | 
			
		||||
    * Added Airespace WLC to L2::Airespace
 | 
			
		||||
    * Updated POD and DeviceMatrix quite a bit
 | 
			
		||||
    * Added ENTITY-MIB to CiscoStats for better model handling above
 | 
			
		||||
    * Fix networkaddress handling in LLDP-MIB
 | 
			
		||||
    * Added CiscoConfig to L2::Aironet, L3::C3550 classes
 | 
			
		||||
    * Better SSID capabilities for L2::Aironet
 | 
			
		||||
    * Fix CDP vs LLDP in c_id() for HP Class
 | 
			
		||||
    * test_class.pl improvements
 | 
			
		||||
 | 
			
		||||
version 2.00 (08/01/08)
 | 
			
		||||
    + Support for Alcatel-Lucent OmniSwitch via L3::AlcatelLucent
 | 
			
		||||
    + Support for Alcatel-Lucent Service Router via L3::Timetra
 | 
			
		||||
    + Support for Alcatel-Lucent OmniAccess via L2::Aruba
 | 
			
		||||
 | 
			
		||||
    * Silence warnings in MAU due to uninitialized variables 
 | 
			
		||||
 | 
			
		||||
version 1.09 (07/22/08) - Beta/developer release
 | 
			
		||||
    + Added support for HP ProCurve Foundry OEM switches, such as the 9300
 | 
			
		||||
      series, in new class L3::HP9300 (contributions from Douglas McKeown and
 | 
			
		||||
      Ivan Auger)
 | 
			
		||||
    + Added support for CISCO-PAE-MIB in CiscoPortSecurity (Kesy)
 | 
			
		||||
    + Support for D-Link devices through L3::Dell
 | 
			
		||||
    + Support for Linksys SRW2048 through L3::Dell
 | 
			
		||||
    + Support for IBM BladeCenter 4-Port GB Ethernet Switch Module through
 | 
			
		||||
      L3::Dell (Alex Kramarov)
 | 
			
		||||
    + Support for newer Nortel Alteon switches and Nortel BladeCenter Switch
 | 
			
		||||
      Modules in L3::AlteonAD
 | 
			
		||||
    + Support for Cisco 1250 series through L2::Aironet
 | 
			
		||||
    + Updates to fan, power supply, and serial number methods in
 | 
			
		||||
      L2::HP (Jeroen van Ingen)
 | 
			
		||||
    + Use Cisco Client Association MIBs for Aironet client reporting
 | 
			
		||||
      via fw_mac
 | 
			
		||||
    + Support VLANs on Aironet
 | 
			
		||||
    + Get the proper radio MAC address from aironet in MBSS mode
 | 
			
		||||
    + Additional wireless statistics from Aironet
 | 
			
		||||
    + Add support to specify MIB to resolve leaf names conflicts in
 | 
			
		||||
      %GLOBALS and %FUNCS.
 | 
			
		||||
    + Added munge_port_list() and modify_port_list() methods to assist in
 | 
			
		||||
      working with PortList objects. 
 | 
			
		||||
    + Added set_multi() method to enable a SNMP set command on several new
 | 
			
		||||
      values in one request.  Required for complex set operations
 | 
			
		||||
      on some agents.
 | 
			
		||||
    + Infrastructure for SNMPv3 support:
 | 
			
		||||
        + Save the SecName passed into the constructor
 | 
			
		||||
        + Create an update() function, which replaces the underlying
 | 
			
		||||
          SNMP session using different parameters.
 | 
			
		||||
        + Return the SecName instead of community from snmp_comm() when using
 | 
			
		||||
          SNMPv3.
 | 
			
		||||
 | 
			
		||||
    * L2::HP now isa Layer3 instead of Layer2 to support arpnip
 | 
			
		||||
      (Dudley Freeman)
 | 
			
		||||
    * Silence warnings from Cisco devices which don't return values for
 | 
			
		||||
      extended VLAN range (1024-4096)
 | 
			
		||||
    * Documentation coverage, spelling, and syntax updates
 | 
			
		||||
    * set_i_pvid(), set_i_vlan(), set_add_i_vlan_tagged(),
 | 
			
		||||
      set_remove_i_vlan_tagged() removed from Bridge and HP classes due to
 | 
			
		||||
      incompatibility across devices.
 | 
			
		||||
 | 
			
		||||
version 1.07 (11/26/07) - Beta/developer release
 | 
			
		||||
 | 
			
		||||
version 1.05 (11/25/07) - CVS only. No official release
 | 
			
		||||
    + Added support for LLDP in new class LLDP (contributions from Bernhard
 | 
			
		||||
      Augenstein)
 | 
			
		||||
    + Added device specific support for LLDP in L2::HP, L2::Baystack,
 | 
			
		||||
      L3::Enterasys and L3::Foundry
 | 
			
		||||
    + Added support for Enterasys devices as new class L3::Enterasys 
 | 
			
		||||
    + Added support for Dell PowerConnect switches as new class L3::Dell
 | 
			
		||||
    + Added basic support for generic routers running Microsoft Windows OS
 | 
			
		||||
      as new class L3::Microsoft (begemot)
 | 
			
		||||
    + Added basic support for Sun routers as new class L3::Sun (begemot)
 | 
			
		||||
    + Added basic support for Juniper NetScreen devices as new class
 | 
			
		||||
      L3::Netscreen (Kent Hamilton)
 | 
			
		||||
    + Added support for Cyclades terminal servers as new class L1::Cyclades
 | 
			
		||||
    + Added support for Cisco (Airespace) wireless controllers as new class
 | 
			
		||||
      L2::Airespace
 | 
			
		||||
    + Added support for Nortel Ethernet Routing Switch 2500 series and
 | 
			
		||||
      Business Ethernet Switches (David Sieb<65>rger)
 | 
			
		||||
    + Update of L3::Foundry to support all Foundry devices including newer
 | 
			
		||||
      switches.  Depreciate L2::Foundry.
 | 
			
		||||
    + Added generic device type detection using IANA assigned enterpise
 | 
			
		||||
      number extracted from sysObjectID
 | 
			
		||||
    + Added ifDiscards and other missing entries from IF-MIB::ifEntry (Greg King)
 | 
			
		||||
    + Added CGESM devices to L2::C2900 class (Alexander Hartmaier)
 | 
			
		||||
    + Added support for dual speed 10/100 hubs and i_speed() in L1::Bayhub
 | 
			
		||||
    + Added i_ssidlist(), i_ssidbcast(), and i_80211channel() methods to
 | 
			
		||||
      L2::Aruba, Airespace, and L2::NAP222x classes
 | 
			
		||||
    + New class IEEE802dot11 class for generic standards based wireless AP
 | 
			
		||||
      support to include i_ssidlist()and i_80211channel() methods.
 | 
			
		||||
    + L2::Orinoco inherits from new IEEE802dot11 for i_ssidlist()and
 | 
			
		||||
      i_80211channel() support. 
 | 
			
		||||
    + Added new VLAN methods i_pvid(), i_vlan_membership(), set_i_pvid(),
 | 
			
		||||
      set_i_vlan(), set_add_i_vlan_tagged(), set_remove_i_vlan_tagged() to
 | 
			
		||||
      Bridge, CiscoVTP, Extreme, HP, and RapidCity classes.
 | 
			
		||||
    + Added set_i_speed_admin() method to RapidCity class,
 | 
			
		||||
    + Added set_i_duplex_admin() method to RapidCity class,
 | 
			
		||||
    + Added OSPF Neighbor Tables, SF Patch 1577918 to Layer 3 (Andrew Herrick)
 | 
			
		||||
    + Added CiscoConfig class, SF Patch 1555001 (Justin Hunter)
 | 
			
		||||
    + Enable load_ methods for %GLOBALS and MIB Leaf node names.
 | 
			
		||||
    + Enable dynamic methods in AUTOLOAD with MIB Leaf node names for loaded
 | 
			
		||||
      MIBs without definition in %FUNCS or %GLOBALS.  Single instance mib leafs
 | 
			
		||||
      will be treated as a GLOBAL and returna scalar while mib leafs which
 | 
			
		||||
      reside in a table will be treated as a FUNC and return a reference to a
 | 
			
		||||
      hash.
 | 
			
		||||
    + Enable load_ methods for %GLOBALS and MIB Leaf node names.
 | 
			
		||||
    + Add loop detect option and code for getnext table column walks.
 | 
			
		||||
    + Add Layer3::NetSNMP for Net-SNMP-based hosts, part of
 | 
			
		||||
      SF patch 1557529 (Bradley Baetz).
 | 
			
		||||
    + Add EIGRP Neighbor Tables to L3::Cisco SF Patch 1577927 (Andrew Herrick)
 | 
			
		||||
    + Additions to CiscoQOS and CiscoStats (Alexander Hartmaier)
 | 
			
		||||
    + Emulate ENTITY-MIB Physical Table methods for devices which don't
 | 
			
		||||
      have ENTITY-MIB support in Airespace, Bayhub, Baystack, BayRS,
 | 
			
		||||
      NortelStack, and Passport classes.
 | 
			
		||||
    + Enable use of MIB Leaf node names in SNMP sets.
 | 
			
		||||
    + Add POWER-ETHERNET-MIB and CISCO-POWER-ETHERNET-EXT-MIB support.
 | 
			
		||||
 | 
			
		||||
    * Fix for bug where an SNMP error in any operation would cause subsequent
 | 
			
		||||
      table get operations to fail while using the same session, originally
 | 
			
		||||
      identified by Nicolai Petri.
 | 
			
		||||
    * Enable single instance partial table fetches (Alexander Hartmaier)
 | 
			
		||||
    * Enable partial table fetches in overriden table methods (Justin Hunter)
 | 
			
		||||
    * Allow partial table fetches with load_ methods.
 | 
			
		||||
    * Fixed vlan trunk port handling bug in L2:HP (Michael Robbert)
 | 
			
		||||
    * Correct bp_port() definition in Bridge class (Reported by Nicolai Petri)
 | 
			
		||||
    * Remove port security definitions from CiscoStack and move into new class
 | 
			
		||||
      CiscoPortSecurity.  Needed to support devices such a L3::C4000 which
 | 
			
		||||
      support CISCO-PORT-SECURITY-MIB, but not CISCO-STACK-MIB.
 | 
			
		||||
      (Reported by Prakash RudraRaju)
 | 
			
		||||
    * Correct port numbering for Nortel 8110, 1100, 1150 in L3:Passport
 | 
			
		||||
      (Reported by David Pinkoski)
 | 
			
		||||
    * Documentation updates
 | 
			
		||||
    * Translate OIDs returned by Entity MIB e_type
 | 
			
		||||
    * Modify inheritance to use Cisco classes before generic classes
 | 
			
		||||
    * Create e_index method in ENTITY-MIB to facilitate emulation methods in
 | 
			
		||||
      other classes as entPhysicalIndex is not-accessible.
 | 
			
		||||
    * Only return MAC from munge_mac() if it actually is a MAC. Fix for
 | 
			
		||||
      netdisco where device would not be inserted in DB due to malformed MAC.
 | 
			
		||||
    * Enable SUPER class calls to find autoloaded methods (Bernhard Augenstein)
 | 
			
		||||
    * Clear attribute cache on sucessful SNMP set.
 | 
			
		||||
    * Improve accuracy of operational and administrative duplex reporting on
 | 
			
		||||
      devices using CiscoStack.
 | 
			
		||||
    * All i_type() methods now use standard IANAifType values.
 | 
			
		||||
    * Report bridge groups (VLANs) in L2::C1900.
 | 
			
		||||
    * Turn on bulkwalk for C6500.  Users with buggy OS versions can turn
 | 
			
		||||
      it off when creating the object.
 | 
			
		||||
    * c_ip() now attempts to return only IPV4 addresses, use c_addr() for all
 | 
			
		||||
      address types.
 | 
			
		||||
 | 
			
		||||
version 1.04 (07/08/06)
 | 
			
		||||
    +  Added C1130 and C1240 to L2::Aironet (Ralf Gross)
 | 
			
		||||
    +  Added detection for Cisco 2960, 2940, 3400 w/ MetroBase
 | 
			
		||||
    +  Added generic L2::Cisco Class
 | 
			
		||||
    *  Corrected detection for Cisco Supervisor Engine 2 and 32 (IOS).  
 | 
			
		||||
    *  Fixed warnings in CiscoStack
 | 
			
		||||
    *  Updated ProCurve HP device detection for newer firmwares
 | 
			
		||||
 | 
			
		||||
version 1.03 (04/14/06) - Beta/developer release
 | 
			
		||||
    * Use ipNetToMedia table instead of atTable for ARP
 | 
			
		||||
    * Remove CiscoStack from Layer3::C4000
 | 
			
		||||
    * Fixed bug in MAU class when polling devices without MAU-MIB support 
 | 
			
		||||
 | 
			
		||||
version 1.01 (04/08/06) - Beta/developer release
 | 
			
		||||
    + Change version numbers to X.XX format.  Odd releases are beta
 | 
			
		||||
      or developer only releases.  Even are official releases.
 | 
			
		||||
 | 
			
		||||
version 1.0 (04/07/06) - CVS only. No official release
 | 
			
		||||
    + Added Interface FlowControl status to CiscoStack (Nicolai Petri)
 | 
			
		||||
    + Added CiscoImage class (Matthew Tuttle)
 | 
			
		||||
    + Added C1200 and C350 IOS devices to L2::Aironet (Matthew Tuttle)
 | 
			
		||||
    + Added support for Foundry IronWare and gave L3::Foundry CPR
 | 
			
		||||
    + Added support for Foundry EdgeIrons as new class L2::Foundry
 | 
			
		||||
    + Added BulkWalk and BulkRepeaters options to new()
 | 
			
		||||
    + Added DebugSNMP option to new()
 | 
			
		||||
    + Added CISCO-ENTITY-VENDORTYPE-OID-MIB,CISCO-PRODUCTS-MIB,CISCO-STACK-MIB
 | 
			
		||||
      to CiscoStats.pm for model()
 | 
			
		||||
    + Check for bulkwalk_no() method
 | 
			
		||||
    + Added Entity.pm to L3 and L2 classes per N. Petri's suggestion.
 | 
			
		||||
    + Added support for Passport/Accelar 1100 and 1200 series in L3::Passport
 | 
			
		||||
    + Added support for Passport/Accelar 8100 series in L3::Passport
 | 
			
		||||
    + Added support for Passport 1600 series as new class, L3::N1600
 | 
			
		||||
    + Added support for Extreme Alpine and Summit switches as new class
 | 
			
		||||
      L3:Extreme (Mike Hunter and Eric Miller)
 | 
			
		||||
    + Added support for Aruba wireless switches (Eric Miller and Brian Chow)
 | 
			
		||||
    + Added support for Nortel 2700 series (Airespace) wireless switches
 | 
			
		||||
    + Added support for Synoptics hubs as new class L1:S3000
 | 
			
		||||
    + Added Cisco QOS and RTT classes (Alexander Hartmaier)
 | 
			
		||||
    + Added BGP Peer Table to L3 class (Carlos Vicente)
 | 
			
		||||
    + Added ipforwarding status to Info base class (Carlos Vicente)
 | 
			
		||||
    + Added STP port state to Bridge class (Alexander Barthel)
 | 
			
		||||
    + Added L3 support (arpnip) to Baystack class for routing capable switches
 | 
			
		||||
    + Added set_i_duplex_admin() and set_i_speed_admin() to C2900 class
 | 
			
		||||
      (Justin Hunter)
 | 
			
		||||
    + Added set_i_duplex_admin() and set_i_speed_admin() to CiscoStack class
 | 
			
		||||
    + CDP added to Aironet class
 | 
			
		||||
    + Added Juniper class
 | 
			
		||||
    + Added support for Catalyst 4000 and 4500, get admin. duplex
 | 
			
		||||
      and speed properly
 | 
			
		||||
    + Added i_speed_high(), which i_speed() uses if needed to support
 | 
			
		||||
      interfaces >4Gbps
 | 
			
		||||
 | 
			
		||||
    * More error checking in  _load_attr() around bulkwalk code
 | 
			
		||||
    * Minor warning fix in L3::Aironet::os_ver()
 | 
			
		||||
    * Abstracted remaining Cisco stuff from L3 to L3::Cisco
 | 
			
		||||
    * Removed all Cisco stuff from L2
 | 
			
		||||
    * Expanded Entity.pm to cover the whole ENTITY-MIB and improved docs.
 | 
			
		||||
    * changed all refs to $DEBUG to $self->debug() for reentrant code
 | 
			
		||||
    * [ 1111284 ] Parameters not being set with AutoSpecify - fixed.
 | 
			
		||||
    * Turned off BULKWALK for C1900 and C6500 classes.
 | 
			
		||||
    * Added exception handling for V2 ENDOFMIBVIEW
 | 
			
		||||
    * Fix in SONMP when topology not enabled
 | 
			
		||||
    * Fix in L3::Passport root_ip()
 | 
			
		||||
    * Fix in L3::Passport bp_index() some devices not returning complete index.
 | 
			
		||||
    * Enable set_i_up_admin() in Bayhub
 | 
			
		||||
    * Recognize new Nortel model names in Baystack and Passport classes
 | 
			
		||||
    * Orinoco class should now recognize more models
 | 
			
		||||
    * Cleanup model recognition in Baystack class, recognize more models
 | 
			
		||||
    * Modify Catalyst class to use CISCO-STACK-MIB for brige port index mapping
 | 
			
		||||
      some devices having problems returning complete index from BRIDGE-MIB
 | 
			
		||||
    * Check root ip for reachability before assignment
 | 
			
		||||
    * HP class should recognize more models
 | 
			
		||||
    * Fix in HP class for models not returning full bp_index
 | 
			
		||||
    * [ 1436103 ] L2::Aironet devices weren't getting their model
 | 
			
		||||
      translated properly
 | 
			
		||||
 | 
			
		||||
verison 0.9 (11/15/04)
 | 
			
		||||
    + ** Added full Nortel/Bay/BayStack support 
 | 
			
		||||
        by new developer Eric Miller.  
 | 
			
		||||
        L2::Bay now depricated.
 | 
			
		||||
    + Added Alteon Ace support (Eric Miller)
 | 
			
		||||
    + Added Nortel Cotivity support (Eric Miller)
 | 
			
		||||
    + Added Nortel BayRS support (Eric Miller)
 | 
			
		||||
    + Added Nortel Centillion support (Eric Miller)
 | 
			
		||||
    + Added Nortel AP 222x support (Eric Miller)
 | 
			
		||||
    + Added Orinco AP support (Eric Miller) 
 | 
			
		||||
    + Added i_lastchange() per suggestion of Nicolai Petri
 | 
			
		||||
    + Added BULKWALK patch by Bradley Baetz - This should
 | 
			
		||||
          greatly speed up requests on SNMPv2c devices.
 | 
			
		||||
    + Added MibDirs option to new() to allow specifying non-system MIB
 | 
			
		||||
      directories.
 | 
			
		||||
 | 
			
		||||
    * Added C3560s to the C3550 class. Thanks to Nicolai.
 | 
			
		||||
    * Fixed Bug where older Cisco's would append nulls to certain
 | 
			
		||||
      CDP information.  Would come up a 'DBD::Pg parser' error in Netdisco
 | 
			
		||||
    * Changed so a failed _global() call is cached so it won't retry
 | 
			
		||||
      an error over and over again if the same global is used.
 | 
			
		||||
    * Added check in _set() to see if data came from sub or FUNCS/GLOBALS
 | 
			
		||||
      Fails if came from sub.
 | 
			
		||||
 | 
			
		||||
version 0.8 (03/21/04)
 | 
			
		||||
    + Added Q-BRIDGE-MIB support to SNMP::Info::Bridge
 | 
			
		||||
    + Added Aironet AP4800 to Layer3::Aironet class
 | 
			
		||||
    + Added C3500XL devices to the Layer2::C2900 class
 | 
			
		||||
    + Added Cisco 3750 (37xxstack) to Layer3::C6500 class
 | 
			
		||||
    + Added Cisco Catalyst 4000 to Layer3::C6500 class
 | 
			
		||||
    + Added Cisco Catalyst 2970 to Layer3::C6500 Class
 | 
			
		||||
    * Made Cisco Commuinty string indexing a boolean method for clarification
 | 
			
		||||
    * Added VLAN info for HP devices using Q-BRIDGE-MIB
 | 
			
		||||
    * Fixed warning about uninitialized value in CiscoStats line 92
 | 
			
		||||
    * Added for more serial# checking for L2 and L3
 | 
			
		||||
    * Fixed warning in Layer2::Bay about non numeric port line 199
 | 
			
		||||
    Contributions from Dmitry Sergienko:
 | 
			
		||||
    + Added Cisco Aironet BR500 and AP1200 to L2::Aironet Class
 | 
			
		||||
    * Fixed the Port name alias for Catalyst 2900 devices
 | 
			
		||||
    + Added Support For ZyXEL DSLAMs and Allied Telesys Switches
 | 
			
		||||
 | 
			
		||||
version 0.7 (08/14/03)
 | 
			
		||||
    * Added Class for Catalyst 6500 Series - Layer3::C6500
 | 
			
		||||
    * Added CiscoVTP support to 3550,2900, and Catalyst classes
 | 
			
		||||
    * Extracted VLAN stuff from Layer2::Catalyst to SNMP::Info::CiscoVTP
 | 
			
		||||
    * Extracted CISCO-STACK-MIB from Layer2::Catalyst to SNMP::Info::CiscoStack
 | 
			
		||||
    * Added 2950's to the Layer2::C2900 class
 | 
			
		||||
    * Added 3548's and 350x's to the Layer3::C3550 class
 | 
			
		||||
    * Broke out 3550's into separate device types (3550-24, 3550-48)
 | 
			
		||||
    * Added T1,dual T1, and T3 , ATM over OC-12 ... to the SPEED_MAP
 | 
			
		||||
    * Fixed speed map -- OC-1 -> OC-3
 | 
			
		||||
    * Fixed Bug where Catalyst Switch running IOS would report CatOS as os()
 | 
			
		||||
 | 
			
		||||
version 0.6 (06/18/03)
 | 
			
		||||
    * Minor Bug Fix.  SNMP::Info::Layer2::Bay and SNMP::Info::Layer2::C1900
 | 
			
		||||
      didn't return 1 and failed to load on some versions of Perl.
 | 
			
		||||
 | 
			
		||||
version 0.5 (06/10/03)
 | 
			
		||||
    * Added ability to get paritial tables.  For example to get the
 | 
			
		||||
      IP routing table for 128.114.*  you can do 
 | 
			
		||||
      $ipr = $dev->ipr_dest('128.114');
 | 
			
		||||
    * Added IP Routing Table entries from RFC1213 to SNMP::Info
 | 
			
		||||
    * minor bug fixes
 | 
			
		||||
 | 
			
		||||
version 0.4 (04/29/03)
 | 
			
		||||
    * BIG CHANGE ! Internal Data structure has changed.  
 | 
			
		||||
    * Added clear_cache() method
 | 
			
		||||
    * Added NO_SUCH support for snmpget (TABLE) calls to get SNMP MIB II data 
 | 
			
		||||
      from SNMP Version 1 devices.
 | 
			
		||||
    * Methods load_all() and all() have changed their return value. Sorry but the API had to change.
 | 
			
		||||
    * New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch() to make it more OO happy.
 | 
			
		||||
    * Methods load_all() and all() have changed their return value. Sorry but
 | 
			
		||||
      the API had to change.
 | 
			
		||||
    * New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch()
 | 
			
		||||
      to make it more OO happy.
 | 
			
		||||
    * Globals are now cached
 | 
			
		||||
    * Added new argument 'AutoSpecify' to new() to auto-connect with subclass 
 | 
			
		||||
      detected in device_type()
 | 
			
		||||
@@ -20,15 +542,15 @@ version 0.4 (04/29/03)
 | 
			
		||||
 | 
			
		||||
version 0.3 (03/06/03)
 | 
			
		||||
    * Fixed HP model() warning
 | 
			
		||||
    * Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE in _global
 | 
			
		||||
      and _load_attr
 | 
			
		||||
    * Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE
 | 
			
		||||
      in _global and _load_attr
 | 
			
		||||
    * Added more debugging
 | 
			
		||||
    * Added info and munging for c_capabilities in SNMP::Info::CD
 | 
			
		||||
      Thanks to Martin Lorensen <martin@lorensen.dk>
 | 
			
		||||
      Thanks to Martin Lorensen <martin /at- lorensen.dk>
 | 
			
		||||
    * Removed requirement for SNMP in the Makefile.PL and moved it to t/prereq.t
 | 
			
		||||
      so that the Module will install via CPAN without trying to install the old
 | 
			
		||||
      4.2.0 version of SNMP on CPAN.  Will now fail in the test phase. 
 | 
			
		||||
      Thanks again to Martin Lorensen <martin@lorensen.dk>
 | 
			
		||||
      Thanks again to Martin Lorensen <martin /at- lorensen.dk>
 | 
			
		||||
    * Moved tests from test.pl to t/*
 | 
			
		||||
 | 
			
		||||
version 0.2 (02/19/03)
 | 
			
		||||
@@ -38,7 +560,8 @@ version 0.2 (02/19/03)
 | 
			
		||||
    * Added Spanning Tree Protocol (STP) methods to SNMP::Info::Bridge
 | 
			
		||||
    * Removed HP Specific MIBS in SNMP::Info::Layer2 and cleaned up model()
 | 
			
		||||
    * Added poke for Bay 450 Switches 
 | 
			
		||||
    * Mapped HP Part Numbers to model numbers J4812A => 2512 in SNMP::Info::Layer2::HP
 | 
			
		||||
    * Mapped HP Part Numbers to model numbers J4812A => 2512 in
 | 
			
		||||
      SNMP::Info::Layer2::HP
 | 
			
		||||
     
 | 
			
		||||
version 0.1 (12/30/02)
 | 
			
		||||
    * Initial Release
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								DEVELOP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								DEVELOP
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
SNMP::Info Developer Guidelines
 | 
			
		||||
 | 
			
		||||
Coding Guidelines:
 | 
			
		||||
    - tab-width of 4, no tab characters
 | 
			
		||||
    - keep POD documentation up-to-date
 | 
			
		||||
    - always update ChangeLog before committing
 | 
			
		||||
    - always update DeviceMatrix.txt before committing
 | 
			
		||||
    - check-in required mibs to netdisco-mibs and release new package if needed
 | 
			
		||||
 | 
			
		||||
Release and Testing Instructions: 
 | 
			
		||||
    - Please see misc/RELEASE in Netdisco
 | 
			
		||||
      ( http://netdisco.cvs.sourceforge.net/viewvc/netdisco/misc/RELEASE?view=markup )
 | 
			
		||||
      and follow all testing and release guidelines
 | 
			
		||||
 | 
			
		||||
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?
 | 
			
		||||
							
								
								
									
										1045
									
								
								DeviceMatrix.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1045
									
								
								DeviceMatrix.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										341
									
								
								Info/AMAP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										341
									
								
								Info/AMAP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,341 @@
 | 
			
		||||
# SNMP::Info::AMAP
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2013 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::AMAP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::LLDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS
 | 
			
		||||
    = ( 'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
 | 
			
		||||
    # EXTREME-EDP-MIB::extremeEdpTable
 | 
			
		||||
    'amap_rem_sysname' => 'aipAMAPRemHostname',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( 'amap_rem_sysname' => \&SNMP::Info::munge_null, );
 | 
			
		||||
 | 
			
		||||
sub hasAMAP {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $amap_ip = $amap->aipAMAPIpAddr() || {};
 | 
			
		||||
 | 
			
		||||
    return 1 if ( scalar( keys %$amap_ip ) );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Break up the aipAMAPhostsTable INDEX into MAC and IP address.
 | 
			
		||||
sub _hosts_table_index {
 | 
			
		||||
    my $idx  = shift;
 | 
			
		||||
    my @oids = split( /\./, $idx );
 | 
			
		||||
    my $mac  = join( '.', splice( @oids, 0, 6 ) );
 | 
			
		||||
 | 
			
		||||
    return ( $mac, join( '.', @oids ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Break up the aipAMAPportConnectionTable INDEX and return MAC
 | 
			
		||||
sub _conn_table_mac {
 | 
			
		||||
    my $idx       = shift;
 | 
			
		||||
    my @oids      = split( /\./, $idx );
 | 
			
		||||
    my $local_idx = shift @oids;
 | 
			
		||||
    my $mac       = join( '.', splice( @oids, 0, 6 ) );
 | 
			
		||||
 | 
			
		||||
    return ($mac);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Since we need to get IP Addresses from the aipAMAPhostsTable which has
 | 
			
		||||
# a different index (MAC, IP) than the aipAMAPportConnectionTable which holds
 | 
			
		||||
# the remote device details we create a combined index and skip any
 | 
			
		||||
# IPs which have an address of 0.0.0.0.  Would like to include only one
 | 
			
		||||
# address since they should all originate from the same device, but we don't
 | 
			
		||||
# know if they would all be reachable from the network management application.
 | 
			
		||||
#
 | 
			
		||||
# We don't inplement partials since this is private index function
 | 
			
		||||
sub _amap_index {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $amap_ip    = $amap->aipAMAPIpAddr()    || {};
 | 
			
		||||
    my $amap_rport = $amap->aipAMAPLocalPort() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_index;
 | 
			
		||||
    foreach my $key ( keys %$amap_ip ) {
 | 
			
		||||
        my ( $mac, $ip ) = _hosts_table_index($key);
 | 
			
		||||
 | 
			
		||||
        next if ( $ip eq '0.0.0.0' );
 | 
			
		||||
        next unless $ip;
 | 
			
		||||
 | 
			
		||||
        foreach my $idx ( keys %$amap_rport ) {
 | 
			
		||||
            my $c_mac = _conn_table_mac($idx);
 | 
			
		||||
 | 
			
		||||
            if ( $mac eq $c_mac ) {
 | 
			
		||||
                my $index = "$idx.$ip";
 | 
			
		||||
                $amap_index{$index} = $index;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Break up _amap_index INDEX into local index, MAC, remote index, and
 | 
			
		||||
# IP address
 | 
			
		||||
sub _amap_index_parts {
 | 
			
		||||
    my $idx       = shift;
 | 
			
		||||
    my @oids      = split( /\./, $idx );
 | 
			
		||||
    my $local_idx = shift @oids;
 | 
			
		||||
    my $mac       = join( '.', splice( @oids, 0, 6 ) );
 | 
			
		||||
    my $rem_idx   = shift @oids;
 | 
			
		||||
 | 
			
		||||
    return ( $local_idx, $mac, $rem_idx, join( '.', @oids ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_if {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index  = $amap->_amap_index()         || {};
 | 
			
		||||
    my $if_idx = $amap->aipAMAPLocalIfindex() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_if;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $if_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$if_key/ ) {
 | 
			
		||||
            my $if = $if_idx->{$if_key};
 | 
			
		||||
            $amap_if{$key} = $if;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%amap_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_ip {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $amap->_amap_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_ip;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
 | 
			
		||||
        # MIB says should only be IPv4
 | 
			
		||||
        next unless ( $ip =~ /\d+(\.\d+){3}/ );
 | 
			
		||||
        $amap_ip{$key} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_port {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index      = $amap->_amap_index()      || {};
 | 
			
		||||
    my $amap_rport = $amap->aipAMAPLocalPort() || {};
 | 
			
		||||
    my $amap_rslot = $amap->aipAMAPLocalSlot() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_port;
 | 
			
		||||
    foreach my $key ( sort keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $p_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$p_key/ ) {
 | 
			
		||||
            my $port = $amap_rport->{$p_key};
 | 
			
		||||
            my $slot = $amap_rslot->{$p_key} || 0;
 | 
			
		||||
            next unless $port;
 | 
			
		||||
            $amap_port{$key} = defined $slot ? "$slot\/$port" : $port;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_id {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index     = $amap->_amap_index()      || {};
 | 
			
		||||
    my $amap_name = $amap->amap_rem_sysname() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_name;
 | 
			
		||||
    foreach my $key ( sort keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $id_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$id_key/ ) {
 | 
			
		||||
            my $name = $amap_name->{$id_key} || 0;
 | 
			
		||||
            next unless $name;
 | 
			
		||||
            $amap_name{$key} = $name;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub amap_platform {
 | 
			
		||||
    my $amap = shift;
 | 
			
		||||
 | 
			
		||||
    my $index              = $amap->_amap_index()          || {};
 | 
			
		||||
    my $amap_topo_platform = $amap->aipAMAPRemDeviceType() || {};
 | 
			
		||||
 | 
			
		||||
    my %amap_platform;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
 | 
			
		||||
        my $pf_key = "$local_idx.$mac.$rem_idx";
 | 
			
		||||
 | 
			
		||||
        if ( $key =~ /^$pf_key/ ) {
 | 
			
		||||
            my $platform = $amap_topo_platform->{$pf_key};
 | 
			
		||||
            next unless $platform;
 | 
			
		||||
            $amap_platform{$key} = $platform;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%amap_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::AMAP - SNMP Interface to Alcatel Mapping Adjacency Protocol (AMAP)
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $amap = new SNMP::Info ( 
 | 
			
		||||
                             AutoSpecify => 1,
 | 
			
		||||
                             Debug       => 1,
 | 
			
		||||
                             DestHost    => 'router', 
 | 
			
		||||
                             Community   => 'public',
 | 
			
		||||
                             Version     => 2
 | 
			
		||||
                           );
 | 
			
		||||
 | 
			
		||||
 my $class = $amap->class();
 | 
			
		||||
 print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
 $hasamap   = $amap->hasAMAP() ? 'yes' : 'no';
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with LLDP neighbors:
 | 
			
		||||
 my $interfaces    = $amap->interfaces();
 | 
			
		||||
 my $amap_if       = $amap->amap_if();
 | 
			
		||||
 my $amap_ip       = $amap->amap_ip();
 | 
			
		||||
 my $amap_port     = $amap->amap_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $amap_key (keys %$amap_ip){
 | 
			
		||||
    my $iid           = $amap_if->{$amap_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $amap_ip->{$amap_key};
 | 
			
		||||
    my $neighbor_port = $amap_port->{$amap_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented 
 | 
			
		||||
interface to Alcatel Mapping Adjacency Protocol (AMAP) information through
 | 
			
		||||
SNMP.
 | 
			
		||||
 | 
			
		||||
AMAP is a Layer 2 protocol that allows a network device to advertise its
 | 
			
		||||
identity and capabilities on the local network providing topology information.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherits this class.  Do not use
 | 
			
		||||
directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBAL METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $amap->hasAMAP()
 | 
			
		||||
 | 
			
		||||
Is AMAP is active in this device?  
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_id()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the remote system.
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
=item  $amap->amap_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IPv4 addresses.  Note: AMAP returns all IP addresses associated
 | 
			
		||||
with the remote device.  It would be preferable to include only one address
 | 
			
		||||
since they should all originate from the same device, but amap_ip() can not 
 | 
			
		||||
determine if all addresses are reachable from the network management
 | 
			
		||||
application therefore all addresses are returned and the calling application
 | 
			
		||||
must determine which address to use and if they are in fact from the same
 | 
			
		||||
device.
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
=item $amap->amap_platform()
 | 
			
		||||
 | 
			
		||||
Returns remote platform ID
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										172
									
								
								Info/AdslLine.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								Info/AdslLine.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,172 @@
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::AdslLine::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::AdslLine::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
							
								
								
									
										1822
									
								
								Info/Airespace.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1822
									
								
								Info/Airespace.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										827
									
								
								Info/Bridge.pm
									
									
									
									
									
								
							
							
						
						
									
										827
									
								
								Info/Bridge.pm
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										363
									
								
								Info/CDP.pm
									
									
									
									
									
								
							
							
						
						
									
										363
									
								
								Info/CDP.pm
									
									
									
									
									
								
							@@ -1,134 +1,163 @@
 | 
			
		||||
# SNMP::Info::CDP
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use Carp;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
 | 
			
		||||
@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;
 | 
			
		||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# Five data structures required by SNMP::Info
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
%MIBS    = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
 | 
			
		||||
%MIBS_V1 = ( 'CISCO-CDP-MIB-V1SMI' => 'cdpGlobalRun' );
 | 
			
		||||
%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_id'       => 'cdpGlobalDeviceId',
 | 
			
		||||
           );
 | 
			
		||||
    'cdp_run'      => 'cdpGlobalRun',
 | 
			
		||||
    'cdp_interval' => 'cdpGlobalMessageInterval',
 | 
			
		||||
    'cdp_holdtime' => 'cdpGlobalHoldTime',
 | 
			
		||||
    'cdp_gid'       => 'cdpGlobalDeviceId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS  = (
 | 
			
		||||
            'c_index'        => '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'
 | 
			
		||||
          );
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'cdp_index'        => 'cdpCacheIfIndex',
 | 
			
		||||
    'cdp_proto'        => 'cdpCacheAddressType',
 | 
			
		||||
    'cdp_addr'         => 'cdpCacheAddress',
 | 
			
		||||
    'cdp_ver'          => 'cdpCacheVersion',
 | 
			
		||||
    'cdp_id'           => 'cdpCacheDeviceId',
 | 
			
		||||
    'cdp_port'         => 'cdpCacheDevicePort',
 | 
			
		||||
    'cdp_platform'     => 'cdpCachePlatform',
 | 
			
		||||
    'cdp_capabilities' => 'cdpCacheCapabilities',
 | 
			
		||||
    'cdp_domain'       => 'cdpCacheVTPMgmtDomain',
 | 
			
		||||
    'cdp_vlan'         => 'cdpCacheNativeVLAN',
 | 
			
		||||
    'cdp_duplex'       => 'cdpCacheDuplex',
 | 
			
		||||
    'cdp_power'        => 'cdpCachePowerConsumption',
 | 
			
		||||
    'cdp_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
 | 
			
		||||
    'cdp_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
 | 
			
		||||
    'cdp_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
 | 
			
		||||
    'cdp_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
          'c_capabilities' => \&munge_caps,
 | 
			
		||||
          'c_ip'           => \&SNMP::Info::munge_ip
 | 
			
		||||
         );
 | 
			
		||||
    'cdp_capabilities' => \&SNMP::Info::munge_caps,
 | 
			
		||||
    'cdp_platform'     => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_domain'       => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_port'         => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_id'           => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_ver'          => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_ip'           => \&SNMP::Info::munge_ip,
 | 
			
		||||
    'cdp_power'        => \&munge_power,
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub munge_caps {
 | 
			
		||||
    my $caps = shift;
 | 
			
		||||
    return undef unless defined $caps;
 | 
			
		||||
 | 
			
		||||
    my $bits = substr(unpack("B*",$caps),-7);
 | 
			
		||||
    return $bits;
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
sub munge_power {
 | 
			
		||||
    my $power = shift;
 | 
			
		||||
    my $decimal = substr( $power, -3 );
 | 
			
		||||
    $power =~ s/$decimal$/\.$decimal/;
 | 
			
		||||
    return $power;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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();
 | 
			
		||||
    if ( defined $ver and $ver == 1 ) {
 | 
			
		||||
        my $cdp_ip = $cdp->cdp_ip();
 | 
			
		||||
 | 
			
		||||
        # See if anything in cdp cache, if so we have cdp
 | 
			
		||||
        return 1 if (defined $c_ip and scalar(keys %$c_ip)) ;
 | 
			
		||||
        return undef;
 | 
			
		||||
        return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return $cdp->cdp_run();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $cdp  = shift;
 | 
			
		||||
sub cdp_if {
 | 
			
		||||
    my $cdp = shift;
 | 
			
		||||
 | 
			
		||||
    # See if by some miracle Cisco implemented the cdpCacheIfIndex entry
 | 
			
		||||
    my $c_index     = $cdp->c_index();
 | 
			
		||||
    return $c_index if defined $c_index;
 | 
			
		||||
    my $cdp_index = $cdp->cdp_index();
 | 
			
		||||
    return $cdp_index if defined $cdp_index;
 | 
			
		||||
 | 
			
		||||
    # Nope, didn't think so. Now we fake it.
 | 
			
		||||
    my $c_ip = $cdp->c_ip();
 | 
			
		||||
    unless (defined $c_ip){
 | 
			
		||||
        $cdp->{error} = "SNMP::Info::CDP::c_if() - Device doesn't have c_ip() data.  Can't fake c_index()";
 | 
			
		||||
        $DEBUG and carp($cdp->error(1));
 | 
			
		||||
        return undef;
 | 
			
		||||
    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 %c_if;
 | 
			
		||||
    foreach my $key (keys %$c_ip){
 | 
			
		||||
      next unless defined $key;
 | 
			
		||||
      my $iid = $key;
 | 
			
		||||
      # Truncate .1 from cdp cache entry
 | 
			
		||||
      $iid =~ s/\.\d+$//;
 | 
			
		||||
      $c_if{$key} = $iid;
 | 
			
		||||
    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 \%c_if;
 | 
			
		||||
    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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -136,11 +165,11 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CDP - Perl5 Interface to Cisco Discovery Protocol (CDP) using SNMP
 | 
			
		||||
SNMP::Info::CDP - SNMP Interface to Cisco Discovery Protocol (CDP) using SNMP
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -159,15 +188,15 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with CDP neighbors:
 | 
			
		||||
 my $interfaces = $cdp->interfaces();
 | 
			
		||||
 my $c_if       = $cdp->c_if();
 | 
			
		||||
 my $c_ip       = $cdp->c_ip();
 | 
			
		||||
 my $c_port     = $cdp->c_port();
 | 
			
		||||
 my $cdp_if       = $cdp->cdp_if();
 | 
			
		||||
 my $cdp_ip       = $cdp->cdp_ip();
 | 
			
		||||
 my $cdp_port     = $cdp->cdp_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $cdp_key (keys %$c_ip){
 | 
			
		||||
    my $iid           = $c_if->{$cdp_key};
 | 
			
		||||
 foreach my $cdp_key (keys %$cdp_ip){
 | 
			
		||||
    my $iid           = $cdp_if->{$cdp_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $c_ip->{$cdp_key};
 | 
			
		||||
    my $neighbor_port = $c_port->{$cdp_key};
 | 
			
		||||
    my $neighbor      = $cdp_ip->{$cdp_key};
 | 
			
		||||
    my $neighbor_port = $cdp_port->{$cdp_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
@@ -176,10 +205,12 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented 
 | 
			
		||||
interface to CDP information through SNMP.
 | 
			
		||||
 | 
			
		||||
CDP is a Layer 2 protocol that supplies topology information of devices that also speak CDP, 
 | 
			
		||||
mostly switches and routers.  CDP is implemented in Cisco and some HP devices.
 | 
			
		||||
CDP is a Layer 2 protocol that supplies topology information of devices that
 | 
			
		||||
also speak CDP, mostly switches and routers.  CDP is implemented in Cisco and
 | 
			
		||||
some HP devices.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherits this class.  Do not use directly.
 | 
			
		||||
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.
 | 
			
		||||
@@ -192,7 +223,7 @@ None.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item CISCO-CDP-MIB
 | 
			
		||||
=item F<CISCO-CDP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -212,30 +243,31 @@ 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. @#%$!
 | 
			
		||||
Is CDP enabled on this device?  Note that a lot of Cisco devices that
 | 
			
		||||
implement CDP don't implement this value. @#%$!
 | 
			
		||||
 | 
			
		||||
(B<cdpGlobalRun>)
 | 
			
		||||
(C<cdpGlobalRun>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_interval()
 | 
			
		||||
 | 
			
		||||
Interval in seconds at which CDP messages are generated.
 | 
			
		||||
 | 
			
		||||
(B<cdpGlobalMessageInterval>)
 | 
			
		||||
(C<cdpGlobalMessageInterval>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_holdtime()
 | 
			
		||||
 | 
			
		||||
Time in seconds that CDP messages are kept. 
 | 
			
		||||
 | 
			
		||||
(B<cdpGlobalHoldTime>)
 | 
			
		||||
(C<cdpGlobalHoldTime>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->cdp_id() 
 | 
			
		||||
=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().
 | 
			
		||||
This is the device id broadcast via CDP to other devices, and is what is
 | 
			
		||||
retrieved from remote devices with $cdp->id().
 | 
			
		||||
 | 
			
		||||
(B<cdpGlobalDeviceId>)
 | 
			
		||||
(C<cdpGlobalDeviceId>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -248,7 +280,7 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_capabilities()
 | 
			
		||||
=item $cdp->cdp_capabilities()
 | 
			
		||||
 | 
			
		||||
Returns Device Functional Capabilities.  Results are munged into an ascii
 | 
			
		||||
binary string, 7 digits long, MSB.  Each digit represents a bit from the
 | 
			
		||||
@@ -262,115 +294,148 @@ From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#1884
 | 
			
		||||
 | 
			
		||||
=item (0x40) - Provides level 1 functionality.
 | 
			
		||||
 | 
			
		||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on nonrouter ports.
 | 
			
		||||
=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 (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 (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 (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.
 | 
			
		||||
=item (0x01) - Performs level 3 routing for at least one network layer
 | 
			
		||||
protocol.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this information.
 | 
			
		||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this
 | 
			
		||||
information.
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheCapabilities>)
 | 
			
		||||
(C<cdpCacheCapabilities>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_domain()
 | 
			
		||||
=item $cdp->cdp_domain()
 | 
			
		||||
 | 
			
		||||
Returns remote VTP Management Domain as defined in CISCO-VTP-MIB::managementDomainName
 | 
			
		||||
Returns remote VTP Management Domain as defined in
 | 
			
		||||
C<CISCO-VTP-MIB::managementDomainName>
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheVTPMgmtDomain>)
 | 
			
		||||
(C<cdpCacheVTPMgmtDomain>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_duplex() 
 | 
			
		||||
=item $cdp->cdp_duplex() 
 | 
			
		||||
 | 
			
		||||
Returns the port duplex status from remote devices.
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheDuplex>)
 | 
			
		||||
(C<cdpCacheDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_id()
 | 
			
		||||
=item $cdp->cdp_id()
 | 
			
		||||
 | 
			
		||||
Returns remote device id string
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheDeviceId>)
 | 
			
		||||
(C<cdpCacheDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_if()
 | 
			
		||||
=item $cdp->cdp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
Note that a lot devices don't implement $cdp->c_index(),  So if it isn't around,
 | 
			
		||||
we fake it. 
 | 
			
		||||
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 :
 | 
			
		||||
In order to map the cdp table entry back to the interfaces() entry, we
 | 
			
		||||
truncate the last number off of it :
 | 
			
		||||
 | 
			
		||||
  # it exists, yay.
 | 
			
		||||
  my $c_index     = $device->c_index();
 | 
			
		||||
  return $c_index if defined $c_index;
 | 
			
		||||
  my $cdp_index     = $device->cdp_index();
 | 
			
		||||
  return $cdp_index if defined $cdp_index;
 | 
			
		||||
 | 
			
		||||
  # if not, let's fake it
 | 
			
		||||
  my $c_ip       = $device->c_ip();
 | 
			
		||||
  my $cdp_ip       = $device->cdp_ip();
 | 
			
		||||
    
 | 
			
		||||
  my %c_if
 | 
			
		||||
  foreach my $key (keys %$c_ip){
 | 
			
		||||
  my %cdp_if
 | 
			
		||||
  foreach my $key (keys %$cdp_ip){
 | 
			
		||||
      $iid = $key;
 | 
			
		||||
      ## Truncate off .1 from cdp response
 | 
			
		||||
      $iid =~ s/\.\d+$//;
 | 
			
		||||
      $c_if{$key} = $iid;
 | 
			
		||||
      $cdp_if{$key} = $iid;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  return \%c_if;
 | 
			
		||||
  return \%cdp_if;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_index()
 | 
			
		||||
=item $cdp->cdp_index()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP2 Interface table for CDP Cache Entries. 
 | 
			
		||||
 | 
			
		||||
Most devices don't implement this, so you probably want to use $cdp->c_if() instead.
 | 
			
		||||
Most devices don't implement this, so you probably want to use $cdp->cdp_if()
 | 
			
		||||
instead.
 | 
			
		||||
 | 
			
		||||
See c_if() entry.
 | 
			
		||||
See cdp_if() entry.
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheIfIndex>)
 | 
			
		||||
(C<cdpCacheIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->c_ip()
 | 
			
		||||
=item  $cdp->cdp_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IP address
 | 
			
		||||
If $cdp->cdp_proto() is supported, returns remote IPV4 address only.  Otherwise
 | 
			
		||||
it will return all addresses.
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheAddress>)
 | 
			
		||||
(C<cdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_platform() 
 | 
			
		||||
=item  $cdp->cdp_addr()
 | 
			
		||||
 | 
			
		||||
Returns remote address
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_platform() 
 | 
			
		||||
 | 
			
		||||
Returns remote platform id 
 | 
			
		||||
 | 
			
		||||
(B<cdpCachePlatform>)
 | 
			
		||||
(C<cdpCachePlatform>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_port()
 | 
			
		||||
=item $cdp->cdp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
(B<cdpDevicePort>)
 | 
			
		||||
(C<cdpDevicePort>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->c_proto()
 | 
			
		||||
=item  $cdp->cdp_proto()
 | 
			
		||||
 | 
			
		||||
Returns remote address type received.  Usually IP.
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheAddressType>)
 | 
			
		||||
(C<cdpCacheAddressType>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_ver() 
 | 
			
		||||
=item $cdp->cdp_ver() 
 | 
			
		||||
 | 
			
		||||
Returns remote hardware version
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheVersion>)
 | 
			
		||||
(C<cdpCacheVersion>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_vlan()
 | 
			
		||||
=item $cdp->cdp_vlan()
 | 
			
		||||
 | 
			
		||||
Returns the remote interface native VLAN.
 | 
			
		||||
 | 
			
		||||
(B<cdpCacheNativeVLAN>)
 | 
			
		||||
(C<cdpCacheNativeVLAN>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_power()
 | 
			
		||||
 | 
			
		||||
Returns the amount of power consumed by remote device in milliwatts munged
 | 
			
		||||
for decimal placement.
 | 
			
		||||
 | 
			
		||||
(C<cdpCachePowerConsumption>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cdp->munge_power()
 | 
			
		||||
 | 
			
		||||
Inserts a decimal at the proper location.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										473
									
								
								Info/CiscoConfig.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										473
									
								
								Info/CiscoConfig.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,473 @@
 | 
			
		||||
# SNMP::Info::CiscoConfig
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoConfig::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoConfig::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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_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.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
							
								
								
									
										115
									
								
								Info/CiscoImage.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								Info/CiscoImage.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,115 @@
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2005 Matt Tuttle
 | 
			
		||||
# 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::CiscoImage;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoImage::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoImage::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-IMAGE-MIB' => 'ciscoImageString', );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( 'ci_images' => 'ciscoImageString', );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoImage - SNMP Interface to image strings for Cisco Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Matt Tuttle (C<mtuttle@americanhebrewacademy.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $ci = new SNMP::Info(
 | 
			
		||||
                AutoSpecify => 1,
 | 
			
		||||
                Debug       => 1,
 | 
			
		||||
                # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                DestHost    => 'myswitch',
 | 
			
		||||
                Community   => 'public',
 | 
			
		||||
                Version     => 2
 | 
			
		||||
                )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $ci->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoImage is a subclass of SNMP::Info that provides access to
 | 
			
		||||
image strings embedded in an image running on Cisco Devices.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-IMAGE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ci->ci_images()
 | 
			
		||||
 | 
			
		||||
Returns the table of image strings.
 | 
			
		||||
 | 
			
		||||
C<ciscoImageString>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										388
									
								
								Info/CiscoPortSecurity.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										388
									
								
								Info/CiscoPortSecurity.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,388 @@
 | 
			
		||||
# SNMP::Info::CiscoPortSecurity
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoPortSecurity::ISA       = qw/Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoPortSecurity::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',
 | 
			
		||||
    'CISCO-PAE-MIB'           => 'ciscoPaeMIB',
 | 
			
		||||
    'IEEE8021-PAE-MIB'        => 'dot1xAuthLastEapolFrameSource',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%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',
 | 
			
		||||
    'cps_i_v'           => 'cpsIfVlanIndex',
 | 
			
		||||
 | 
			
		||||
    # CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable
 | 
			
		||||
    'cps_i_v_mac_status' => 'cpsIfVlanSecureMacAddrRowStatus',
 | 
			
		||||
    'cps_i_v_mac_age'    => 'cpsIfVlanSecureMacAddrRemainAge',
 | 
			
		||||
    'cps_i_v_mac_type'   => 'cpsIfVlanSecureMacAddrType',
 | 
			
		||||
    'cps_i_v_vlan'       => 'cpsIfVlanSecureVlanIndex',
 | 
			
		||||
    'cps_i_v_mac'        => 'cpsIfVlanSecureMacAddress',
 | 
			
		||||
 | 
			
		||||
    # CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable
 | 
			
		||||
    'cps_m_status' => 'cpsSecureMacAddrRowStatus',
 | 
			
		||||
    'cps_m_age'    => 'cpsSecureMacAddrRemainingAge',
 | 
			
		||||
    'cps_m_type'   => 'cpsSecureMacAddrType',
 | 
			
		||||
    'cps_m_mac'    => 'cpsSecureMacAddress',
 | 
			
		||||
 | 
			
		||||
    # IEEE8021-PAE-MIB::dot1xPaePortEntry
 | 
			
		||||
    'pae_i_capabilities'            => 'dot1xPaePortCapabilities',
 | 
			
		||||
    'pae_i_last_eapol_frame_source' => 'dot1xAuthLastEapolFrameSource',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'cps_i_mac'                     => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'cps_m_mac'                     => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'cps_i_v_mac'                   => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'pae_i_last_eapol_frame_source' => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'pae_i_capabilities'            => \&munge_pae_capabilities,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%PAECAPABILITIES = (
 | 
			
		||||
    0 => 'dot1xPaePortAuthCapable',
 | 
			
		||||
    1 => 'dot1xPaePortSuppCapable'
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub munge_pae_capabilities {
 | 
			
		||||
    my $bits = shift;
 | 
			
		||||
 | 
			
		||||
    return unless defined $bits;
 | 
			
		||||
    my @vals
 | 
			
		||||
        = map( $PAECAPABILITIES{$_}, sprintf( "%x", unpack( 'b*', $bits ) ) );
 | 
			
		||||
    return join( ' ', @vals );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoPortSecurity - SNMP Interface to data from
 | 
			
		||||
F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-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> and F<CISCO-PAE-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>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=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>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_v()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfVlanIndex>)
 | 
			
		||||
 | 
			
		||||
=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>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_v_vlan()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfVlanSecureVlanIndex>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_i_v_mac()
 | 
			
		||||
 | 
			
		||||
(C<cpsIfVlanSecureMacAddress>)
 | 
			
		||||
 | 
			
		||||
=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>)
 | 
			
		||||
 | 
			
		||||
=item $cps->cps_m_mac()
 | 
			
		||||
 | 
			
		||||
(C<cpsSecureMacAddress>)
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cps->munge_pae_capabilities()
 | 
			
		||||
 | 
			
		||||
Return either C<'dot1xPaePortAuthCapable'> or C<'dot1xPaePortSuppCapable'>
 | 
			
		||||
based upon bit value.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										193
									
								
								Info/CiscoPower.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								Info/CiscoPower.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,193 @@
 | 
			
		||||
# SNMP::Info::CiscoPower
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CiscoPower;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoPower::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoPower::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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>
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
							
								
								
									
										218
									
								
								Info/CiscoQOS.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								Info/CiscoQOS.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,218 @@
 | 
			
		||||
# SNMP::Info::CiscoQOS
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoQOS::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoQOS::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
							
								
								
									
										138
									
								
								Info/CiscoRTT.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								Info/CiscoRTT.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,138 @@
 | 
			
		||||
# SNMP::Info::CiscoRTT
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoRTT::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoRTT::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
None
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Overall Control Group Table
 | 
			
		||||
 | 
			
		||||
This table is from C<CISCO-RTTMAN-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
 | 
			
		||||
							
								
								
									
										637
									
								
								Info/CiscoStack.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										637
									
								
								Info/CiscoStack.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,637 @@
 | 
			
		||||
# SNMP::Info::CiscoStack
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CiscoStack;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoStack::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoStack::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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} == 1 ) {
 | 
			
		||||
            $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> and
 | 
			
		||||
F<CISCO-PORT-SECURITY-MIB>
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $ciscostats = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $ciscostats->class();
 | 
			
		||||
 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
 | 
			
		||||
@@ -1,106 +1,234 @@
 | 
			
		||||
# SNMP::Info::CiscoStats
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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;
 | 
			
		||||
$VERSION = 0.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
 | 
			
		||||
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoStats::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoStats::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$INIT    = 0;
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            'RFC1213-MIB'           => 'sysDescr',
 | 
			
		||||
            'CISCO-PROCESS-MIB'     => 'cpmCPUTotal5sec',
 | 
			
		||||
            'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed' 
 | 
			
		||||
           );
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'SNMPv2-MIB'            => 'sysDescr',
 | 
			
		||||
    'CISCO-PROCESS-MIB'     => 'cpmCPUTotal5sec',
 | 
			
		||||
    'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed',
 | 
			
		||||
    'OLD-CISCO-SYSTEM-MIB'  => 'writeMem',
 | 
			
		||||
    'CISCO-PRODUCTS-MIB'    => 'sysName',
 | 
			
		||||
    'ENTITY-MIB'            => 'entPhysicalSoftwareRev',
 | 
			
		||||
    'CISCO-IMAGE-MIB'       => 'ciscoImageString',
 | 
			
		||||
 | 
			
		||||
    # some older catalysts live here
 | 
			
		||||
    'CISCO-STACK-MIB'                 => 'wsc1900sysID',
 | 
			
		||||
    'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevChassis',
 | 
			
		||||
    'CISCO-FLASH-MIB'                 => 'ciscoFlashDeviceSize',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            'description'  => 'sysDescr',
 | 
			
		||||
            # 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',
 | 
			
		||||
            # CISCO-MEMORY-POOL-MIB
 | 
			
		||||
            'mem_free'     => 'ciscoMemoryPoolFree.1',
 | 
			
		||||
            'mem_used'     => 'ciscoMemoryPoolUsed.1',
 | 
			
		||||
           );
 | 
			
		||||
    'description' => 'sysDescr',
 | 
			
		||||
    'ent_physical_software_rev' => 'entPhysicalSoftwareRev.1',
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (
 | 
			
		||||
           );
 | 
			
		||||
    # 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',
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (
 | 
			
		||||
           );
 | 
			
		||||
    # 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',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $l2 = shift;
 | 
			
		||||
    my $descr = $l2->description();
 | 
			
		||||
    my $descr = $l2->description() || '';
 | 
			
		||||
 | 
			
		||||
    return 'catalyst' if ($descr =~ /catalyst/i);
 | 
			
		||||
    return 'ios'      if ($descr =~ /IOS/);
 | 
			
		||||
    return undef;
 | 
			
		||||
    # order here matters - there are Catalysts that run IOS and have catalyst
 | 
			
		||||
    # in their description field, as well as Catalysts that run IOS-XE.
 | 
			
		||||
    return 'ios-xe'   if ( $descr =~ /IOS-XE/ );
 | 
			
		||||
    return 'ios'      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 ($os eq 'catalyst' and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/){
 | 
			
		||||
    if (    defined $os
 | 
			
		||||
        and $os eq 'catalyst'
 | 
			
		||||
        and defined $descr
 | 
			
		||||
        and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/ )
 | 
			
		||||
    {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Newer Catalysts and IOS devices
 | 
			
		||||
    if ($descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ ){
 | 
			
		||||
    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;
 | 
			
		||||
    } 
 | 
			
		||||
    return undef;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    # 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 $self    = shift;
 | 
			
		||||
    my $ios_cpu = $self->ios_cpu();
 | 
			
		||||
    return $ios_cpu if defined $ios_cpu;
 | 
			
		||||
    my $cat_cpu = $self->cat_cpu();
 | 
			
		||||
@@ -108,7 +236,7 @@ sub cpu {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cpu_1min {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    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();
 | 
			
		||||
@@ -116,19 +244,69 @@ sub cpu_1min {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cpu_5min {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    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_free = $self->mem_free();
 | 
			
		||||
    my $mem_used = $self->mem_used();
 | 
			
		||||
    return undef unless defined $mem_free and defined $mem_used;
 | 
			
		||||
    return $mem_free + $mem_used;
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
@@ -136,23 +314,24 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco Devices
 | 
			
		||||
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco
 | 
			
		||||
Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
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
 | 
			
		||||
                        ) 
 | 
			
		||||
                    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();
 | 
			
		||||
@@ -160,24 +339,38 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory, os and
 | 
			
		||||
version information about Cisco Devices. 
 | 
			
		||||
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.
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item CISCO-PROCESS-MIB
 | 
			
		||||
=item F<CISCO-PRODUCTS-MIB>
 | 
			
		||||
 | 
			
		||||
=item CISCO-MEMORY-POOL-MIB
 | 
			
		||||
=item F<CISCO-PROCESS-MIB>
 | 
			
		||||
 | 
			
		||||
=item RFC1213-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
 | 
			
		||||
 | 
			
		||||
@@ -203,67 +396,138 @@ Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
 | 
			
		||||
 | 
			
		||||
Returns mem_free() + mem_used()
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->vendor()
 | 
			
		||||
 | 
			
		||||
 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os()
 | 
			
		||||
 | 
			
		||||
Trys to parse if device is running IOS or CatOS from description()
 | 
			
		||||
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
 | 
			
		||||
from description()
 | 
			
		||||
 | 
			
		||||
Available values:
 | 
			
		||||
 | 
			
		||||
 'ios'          for Cisco IOS
 | 
			
		||||
 'ios-xe'       for Cisco IOS XE
 | 
			
		||||
 'pix'          for Cisco PIX
 | 
			
		||||
 'asa'          for Cisco ASA
 | 
			
		||||
 'fwsm'         for Single-mode FWSM
 | 
			
		||||
 'fwsm-admin'   for Admin context of multi-context FWSM
 | 
			
		||||
 'fwsm-context' for Standard context of multi-context FWSM
 | 
			
		||||
 'ace-admin'    for Admin context of ACE module
 | 
			
		||||
 'ace-context'  for Standard context of ACE module (NB: No OS version
 | 
			
		||||
                     detection is available, but will be the same as it's
 | 
			
		||||
                     'ace admin')
 | 
			
		||||
 'css'          for Cisco Content Switch
 | 
			
		||||
 'css-sca'      for Cisco Content Switch Secure Content Acceleration
 | 
			
		||||
 'san-os'       for Cisco SAN-OS
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os_ver()
 | 
			
		||||
 | 
			
		||||
Trys to parse device operating system version from description()
 | 
			
		||||
Tries to parse device operating system version from description(), falls back
 | 
			
		||||
to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os_bin()
 | 
			
		||||
 | 
			
		||||
Tries to parse C<ROMMON> version from rom_id() string
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->ios_cpu()
 | 
			
		||||
 | 
			
		||||
Current CPU usage in percents of device.
 | 
			
		||||
Current CPU usage in percent.
 | 
			
		||||
 | 
			
		||||
B<1.3.6.1.4.1.9.2.1.56.0> = 
 | 
			
		||||
B<OLD-CISCO-CPU-MIB:avgBusyPer>
 | 
			
		||||
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 percents of device over last minute.
 | 
			
		||||
Average CPU Usage in percent over the last minute.
 | 
			
		||||
 | 
			
		||||
B<1.3.6.1.4.1.9.2.1.57.0>
 | 
			
		||||
C<1.3.6.1.4.1.9.2.1.57.0>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->ios_cpu_5min()
 | 
			
		||||
 | 
			
		||||
Average CPU Usage in percents of device over last 5 minutes.
 | 
			
		||||
Average CPU Usage in percent over the last 5 minutes.
 | 
			
		||||
 | 
			
		||||
B<1.3.6.1.4.1.9.2.1.58.0>
 | 
			
		||||
C<1.3.6.1.4.1.9.2.1.58.0>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cat_cpu()
 | 
			
		||||
 | 
			
		||||
Current CPU usage in percents of device.
 | 
			
		||||
Current CPU usage in percent.
 | 
			
		||||
 | 
			
		||||
B<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
 | 
			
		||||
C<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cat_cpu_1min()
 | 
			
		||||
 | 
			
		||||
Average CPU Usage in percents of device over last minute.
 | 
			
		||||
Average CPU Usage in percent over the last minute.
 | 
			
		||||
 | 
			
		||||
B<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
 | 
			
		||||
C<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->cat_cpu_5min()
 | 
			
		||||
 | 
			
		||||
Average CPU Usage in percents of device over last 5 minutes.
 | 
			
		||||
Average CPU Usage in percent over the last 5 minutes.
 | 
			
		||||
 | 
			
		||||
B<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
 | 
			
		||||
C<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->mem_free()
 | 
			
		||||
 | 
			
		||||
Main DRAM free in device.  In bytes.
 | 
			
		||||
Main DRAM free of the device in bytes.
 | 
			
		||||
 | 
			
		||||
B<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree.1>
 | 
			
		||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree>
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->mem_used()
 | 
			
		||||
 | 
			
		||||
Main DRAM used in device.  In bytes.
 | 
			
		||||
Main DRAM used of the device in bytes.
 | 
			
		||||
 | 
			
		||||
B<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed.1>
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
=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
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										355
									
								
								Info/CiscoStpExtensions.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										355
									
								
								Info/CiscoStpExtensions.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,355 @@
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
@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',
 | 
			
		||||
           );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (
 | 
			
		||||
            %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
            'stpx_rootguard_enabled'      => 'stpxRootGuardConfigEnabled',
 | 
			
		||||
            'stpx_loopguard_enabled'      => 'stpxLoopGuardConfigEnabled',
 | 
			
		||||
            '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 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
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
 | 
			
		||||
=head1 GLOBAL METHODS
 | 
			
		||||
 | 
			
		||||
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>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 MUNGES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item oct2str()
 | 
			
		||||
 | 
			
		||||
Unpacks H* into a string
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										860
									
								
								Info/CiscoVTP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										860
									
								
								Info/CiscoVTP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,860 @@
 | 
			
		||||
# SNMP::Info::CiscoVTP
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoVTP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoVTP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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_index'     => 'managementDomainIndex',
 | 
			
		||||
    '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_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;
 | 
			
		||||
        my $stat = $trunk_dyn_stat->{$port};
 | 
			
		||||
        if ( defined $stat and $stat =~ /^trunking/ ) {
 | 
			
		||||
            $i_vlans{$port} = $vlan;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Check in CISCO-VLAN-IFTABLE-RELATION-MIB
 | 
			
		||||
    # Is this only for Aironet???  If so, it needs
 | 
			
		||||
    # to be removed from this class
 | 
			
		||||
 | 
			
		||||
    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_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 $i_vlan_membership = {};
 | 
			
		||||
 | 
			
		||||
    # Get access ports
 | 
			
		||||
    foreach my $port ( keys %$i_vlan ) {
 | 
			
		||||
        my $vlan = $i_vlan->{$port};
 | 
			
		||||
        next unless defined $vlan;
 | 
			
		||||
        my $stat = $trunk_dyn_stat->{$port};
 | 
			
		||||
        if ( defined $stat and $stat =~ /notTrunking/ ) {
 | 
			
		||||
            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};
 | 
			
		||||
        if ( defined $stat and $stat =~ /^trunking/ ) {
 | 
			
		||||
            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 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_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
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
 | 
			
		||||
=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_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";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=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_index()
 | 
			
		||||
 | 
			
		||||
(C<managementDomainIndex>)
 | 
			
		||||
 | 
			
		||||
=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_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
 | 
			
		||||
							
								
								
									
										295
									
								
								Info/EDP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								Info/EDP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,295 @@
 | 
			
		||||
# SNMP::Info::EDP
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::EDP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::LLDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'EXTREME-EDP-MIB'   => 'extremeEdpPortIfIndex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    # EXTREME-EDP-MIB::extremeEdpTable
 | 
			
		||||
    'edp_rem_sysname'  => 'extremeEdpNeighborName',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'edp_rem_sysname'   => \&SNMP::Info::munge_null,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub hasEDP {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
 | 
			
		||||
 | 
			
		||||
    return 1 if ( scalar( keys %$edp_ip ) );
 | 
			
		||||
    
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Since we need to get IP Addresses from the extremeEdpNeighborTable which has
 | 
			
		||||
# a different index (adds VLAN name) than the extremeEdpTable which holds
 | 
			
		||||
# the remote device details use the index from extremeEdpNeighborTable but skip
 | 
			
		||||
# indexes which have an address of 0.0.0.0.  Would like to include only one
 | 
			
		||||
# address since they should all originate from the same device, but we don't
 | 
			
		||||
# know if they would all be reachable from the network management application.
 | 
			
		||||
#
 | 
			
		||||
# We don't inplement partials since this is private index function
 | 
			
		||||
sub _edp_index {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $edp_ip  = $edp->extremeEdpNeighborVlanIpAddress() || {};
 | 
			
		||||
    
 | 
			
		||||
    my %edp_index;
 | 
			
		||||
    foreach my $key ( keys %$edp_ip ) {
 | 
			
		||||
        my $ip = $edp_ip->{$key};
 | 
			
		||||
        next if ($ip eq '0.0.0.0');
 | 
			
		||||
        next unless $ip;
 | 
			
		||||
        $edp_index{$key} = $key;
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_if {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $edp->_edp_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_if;
 | 
			
		||||
    foreach my $key (keys %$index) {
 | 
			
		||||
        my $iid = $key;
 | 
			
		||||
        # ifIndex is first part of the iid
 | 
			
		||||
        $iid = $1 if $iid =~ /^(\d+)\./;
 | 
			
		||||
        $edp_if{$key} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
  return \%edp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_ip {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index  = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_ip;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my $ip = $edp_ip->{$key};
 | 
			
		||||
        # MIB says should only be IPv4
 | 
			
		||||
        next unless ($ip =~ /\d+(\.\d+){3}/);
 | 
			
		||||
        $edp_ip{$key} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_port {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index    = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_rport = $edp->extremeEdpNeighborPort() || {};
 | 
			
		||||
    my $edp_rslot = $edp->extremeEdpNeighborSlot() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_port;
 | 
			
		||||
    foreach my $key ( sort keys %$edp_rport ) {
 | 
			
		||||
        my $port = $edp_rport->{$key};
 | 
			
		||||
        my $slot = $edp_rslot->{$key} || 0;
 | 
			
		||||
        next unless $port;
 | 
			
		||||
        my $slotport = defined $slot ?  "$slot\/$port" : $port;
 | 
			
		||||
 | 
			
		||||
        foreach my $iid ( sort keys %$index ) {
 | 
			
		||||
            $edp_port{$iid} = $slotport if ($iid =~ /^$key/);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_id {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index    = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_name = $edp->edp_rem_sysname() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_name;
 | 
			
		||||
    foreach my $key ( sort keys %$edp_name ) {
 | 
			
		||||
        my $name = $edp_name->{$key} || 0;
 | 
			
		||||
        next unless $name;
 | 
			
		||||
 | 
			
		||||
        foreach my $iid ( sort keys %$index ) {
 | 
			
		||||
            $edp_name{$iid} = $name if ($iid =~ /^$key/);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_ver {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index   = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_ver = $edp->extremeEdpNeighborSoftwareVersion() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_ver;
 | 
			
		||||
    foreach my $key ( sort keys %$edp_ver ) {
 | 
			
		||||
        my $ver = $edp_ver->{$key} || 0;
 | 
			
		||||
        next unless $ver;
 | 
			
		||||
 | 
			
		||||
        foreach my $iid ( sort keys %$index ) {
 | 
			
		||||
            $edp_ver{$iid} = $ver if ($iid =~ /^$key/);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::EDP - SNMP Interface to the Extreme Discovery Protocol (EDP)
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $edp = new SNMP::Info ( 
 | 
			
		||||
                             AutoSpecify => 1,
 | 
			
		||||
                             Debug       => 1,
 | 
			
		||||
                             DestHost    => 'router', 
 | 
			
		||||
                             Community   => 'public',
 | 
			
		||||
                             Version     => 2
 | 
			
		||||
                           );
 | 
			
		||||
 | 
			
		||||
 my $class = $edp->class();
 | 
			
		||||
 print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
 $haslldp   = $edp->hasLLDP() ? 'yes' : 'no';
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with LLDP neighbors:
 | 
			
		||||
 my $interfaces    = $edp->interfaces();
 | 
			
		||||
 my $edp_if       = $edp->edp_if();
 | 
			
		||||
 my $edp_ip       = $edp->edp_ip();
 | 
			
		||||
 my $edp_port     = $edp->edp_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $edp_key (keys %$edp_ip){
 | 
			
		||||
    my $iid           = $edp_if->{$edp_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $edp_ip->{$edp_key};
 | 
			
		||||
    my $neighbor_port = $edp_port->{$edp_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented 
 | 
			
		||||
interface to EDP information through SNMP.
 | 
			
		||||
 | 
			
		||||
EDP is a Layer 2 protocol that allows a network device to advertise its
 | 
			
		||||
identity and capabilities on the local network providing topology information.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherits this class.  Do not use
 | 
			
		||||
directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<EXTREME-EDP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBAL METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $edp->hasEDP()
 | 
			
		||||
 | 
			
		||||
Is EDP is active in this device?  
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_id()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the chassis component associated
 | 
			
		||||
with the remote system.
 | 
			
		||||
 | 
			
		||||
(C<extremeEdpNeighborName>)
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
=item  $edp->edp_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IPv4 address.
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_ver()
 | 
			
		||||
 | 
			
		||||
Returns the operating system version of the remote system.
 | 
			
		||||
 | 
			
		||||
Nulls are removed before the value is returned. 
 | 
			
		||||
 | 
			
		||||
(C<extremeEdpNeighborSoftwareVersion>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										192
									
								
								Info/Entity.pm
									
									
									
									
									
								
							
							
						
						
									
										192
									
								
								Info/Entity.pm
									
									
									
									
									
								
							@@ -1,75 +1,102 @@
 | 
			
		||||
# SNMP::Info::Entity
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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;
 | 
			
		||||
$VERSION = 0.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
 | 
			
		||||
@SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Entity::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Entity::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$INIT    = 0;
 | 
			
		||||
%MIBS    = ('ENTITY-MIB' => 'entPhysicalSerialNum');
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
           );
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (
 | 
			
		||||
            'e_class'   => 'entPhysicalClass',
 | 
			
		||||
            'e_descr'   => 'entPhysicalDescr',
 | 
			
		||||
            'e_fwver'   => 'entPhysicalFirmwareRev',
 | 
			
		||||
            'e_hwver'   => 'entPhysicalHardwareRev',
 | 
			
		||||
            'e_map'     => 'entAliasMappingIdentifier',
 | 
			
		||||
            'e_model'   => 'entPhysicalModelName',
 | 
			
		||||
            'e_name'    => 'entPhysicalName',
 | 
			
		||||
            'e_parent'  => 'entPhysicalContainedIn',
 | 
			
		||||
            'e_serial'  => 'entPhysicalSerialNum',
 | 
			
		||||
            'e_swver'   => 'entPhysicalSoftwareRev',
 | 
			
		||||
            'e_type'    => 'entPhysicalVendorType',
 | 
			
		||||
           );
 | 
			
		||||
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (
 | 
			
		||||
           );
 | 
			
		||||
%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 psuedo 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 $e_map  = $entity->e_map();
 | 
			
		||||
    my $entity  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_map = $entity->e_map($partial);
 | 
			
		||||
 | 
			
		||||
    my %e_port;
 | 
			
		||||
 | 
			
		||||
    foreach my $e_id (keys %$e_map) {
 | 
			
		||||
    foreach my $e_id ( keys %$e_map ) {
 | 
			
		||||
        my $id = $e_id;
 | 
			
		||||
        $id =~ s/\.0$//;
 | 
			
		||||
 | 
			
		||||
@@ -81,15 +108,18 @@ sub e_port {
 | 
			
		||||
 | 
			
		||||
    return \%e_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Entity - Perl5 Interface to SNMP data stored in ENTITY-MIB.
 | 
			
		||||
SNMP::Info::Entity - SNMP Interface to data stored in F<ENTITY-MIB>. RFC 2737
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -97,7 +127,6 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $entity = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
@@ -109,11 +138,15 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
ENTITY-MIB is used by some Layer 2 devices like HP Switches and Aironet Access Points
 | 
			
		||||
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
 | 
			
		||||
For debugging purposes you can call this class directly as you would
 | 
			
		||||
SNMP::Info
 | 
			
		||||
 | 
			
		||||
 my $entity = new SNMP::Info::Entity (...);
 | 
			
		||||
 | 
			
		||||
@@ -125,7 +158,7 @@ none.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item ENTITY-MIB
 | 
			
		||||
=item F<ENTITY-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -144,43 +177,85 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=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 EntityTable entries to the Interface Table (IfTable) using
 | 
			
		||||
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>)
 | 
			
		||||
@@ -191,8 +266,17 @@ $entity->e_map()
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
 
 | 
			
		||||
@@ -1,79 +1,86 @@
 | 
			
		||||
# SNMP::Info::EtherLike
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
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::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::EtherLike::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# Same info in both rfc1398 and this?
 | 
			
		||||
%MIBS = ('ETHERLIKE-MIB' => 'etherMIB' );
 | 
			
		||||
%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_count'      => 'dot3CollCount',
 | 
			
		||||
          'el_coll_freq'       => 'dot3CollFrequencies'
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::MUNGE );
 | 
			
		||||
    # 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_count' => 'dot3CollCount',
 | 
			
		||||
    '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__
 | 
			
		||||
@@ -81,11 +88,11 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::EtherLike - Perl5 Interface to SNMP ETHERLIKE-MIB 
 | 
			
		||||
SNMP::Info::EtherLike - SNMP Interface to SNMP F<ETHERLIKE-MIB> RFC 1398
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -100,7 +107,8 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $class = $cdp->class();
 | 
			
		||||
 print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
 # Find the duplex setting for a port on a device that implements ETHERLIKE-MIB
 | 
			
		||||
 # 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(); 
 | 
			
		||||
@@ -110,19 +118,19 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
    my $iid    = $el_index->{$el_port};
 | 
			
		||||
    my $port   = $interfaces->{$iid};
 | 
			
		||||
 | 
			
		||||
    $duplex = 'half' if $duplex =~/half/i;
 | 
			
		||||
    $duplex = 'full' if $duplex =~/full/i;
 | 
			
		||||
    $duplex = 'auto' if $duplex =~/auto/i;
 | 
			
		||||
 | 
			
		||||
    print "PORT:$port set to duplex:$duplex\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies 
 | 
			
		||||
access to the ETHERLIKE-MIB used by some Layer 3 Devices such as Cisco routers.
 | 
			
		||||
access to the F<ETHERLIKE-MIB> used by some Layer 3 Devices such as
 | 
			
		||||
Cisco routers.
 | 
			
		||||
 | 
			
		||||
Use or create a subclass of SNMP::Info that inherits this one.  Do not use directly.
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
@@ -132,7 +140,7 @@ None.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item ETHERLIKE-MIB
 | 
			
		||||
=item F<ETHERLIKE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -153,7 +161,7 @@ These are methods that return scalar values from SNMP
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 ETHERLIKE STATS TABLE (dot3StatsTable)
 | 
			
		||||
=head2 ETHERLIKE STATS TABLE (C<dot3StatsTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
@@ -161,77 +169,87 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Indexes Stats Table to the interface index (iid).
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsIndex>)
 | 
			
		||||
(C<dot3StatsIndex>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Indexes Stats Table to Duplex Status of port.
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsDuplexStatus>)
 | 
			
		||||
(C<dot3StatsDuplexStatus>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_chipset()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsEtherChipSet>)
 | 
			
		||||
(C<dot3StatsEtherChipSet>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_excess()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsExcessiveCollisions>)
 | 
			
		||||
(C<dot3StatsExcessiveCollisions>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_late()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsLateCollisions>)
 | 
			
		||||
(C<dot3StatsLateCollisions>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_mult()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsMultipleCollisionFrames>)
 | 
			
		||||
(C<dot3StatsMultipleCollisionFrames>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_single()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsSingleCollisionFrames>)
 | 
			
		||||
(C<dot3StatsSingleCollisionFrames>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_alignment()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsAlignmentErrors>)
 | 
			
		||||
(C<dot3StatsAlignmentErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_fcs()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsFCSErrors>)
 | 
			
		||||
(C<dot3StatsFCSErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_cs()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsCarrierSenseErrors>)
 | 
			
		||||
(C<dot3StatsCarrierSenseErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_frame()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsFrameTooLongs>)
 | 
			
		||||
(C<dot3StatsFrameTooLongs>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_mac_rec()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsInternalMacReceiveErrors>)
 | 
			
		||||
(C<dot3StatsInternalMacReceiveErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_mac_xmit()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsInternalMacTransmitErrors>)
 | 
			
		||||
(C<dot3StatsInternalMacTransmitErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_sqe()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsSQETestErrors>)
 | 
			
		||||
(C<dot3StatsSQETestErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_error_symbol()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsSymbolErrors>)
 | 
			
		||||
(C<dot3StatsSymbolErrors>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_xmit_defer()
 | 
			
		||||
 | 
			
		||||
(B<dot3StatsDeferredTransmissions>)
 | 
			
		||||
(C<dot3StatsDeferredTransmissions>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_count()
 | 
			
		||||
 | 
			
		||||
(B<dot3CollCount>)
 | 
			
		||||
(C<dot3CollCount>)
 | 
			
		||||
 | 
			
		||||
=item $el->el_coll_freq()
 | 
			
		||||
 | 
			
		||||
(B<dot3CollFrequencies>)
 | 
			
		||||
(C<dot3CollFrequencies>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $el->munge_el_duplex()
 | 
			
		||||
 | 
			
		||||
Removes 'Duplex' from the end of a string.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										424
									
								
								Info/FDP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										424
									
								
								Info/FDP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,424 @@
 | 
			
		||||
# SNMP::Info::FDP
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::FDP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::FDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    'fdp_run'      => 'snFdpGlobalRun',
 | 
			
		||||
    'fdp_interval' => 'snFdpGlobalMessageInterval',
 | 
			
		||||
    'fdp_holdtime' => 'snFdpGlobalHoldTime',
 | 
			
		||||
    'fdp_id'       => 'snFdpGlobalDeviceId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'fdp_index'        => 'snFdpCacheIfIndex',
 | 
			
		||||
    'fdp_proto'        => 'snFdpCacheAddressType',
 | 
			
		||||
    'fdp_ip'           => 'snFdpCacheAddress',
 | 
			
		||||
    'fdp_ver'          => 'snFdpCacheVersion',
 | 
			
		||||
    'fdp_id'           => 'snFdpCacheDeviceId',
 | 
			
		||||
    'fdp_port'         => 'snFdpCacheDevicePort',
 | 
			
		||||
    'fdp_platform'     => 'snFdpCachePlatform',
 | 
			
		||||
    'fdp_capabilities' => 'snFdpCacheCapabilities',
 | 
			
		||||
    'fdp_domain'       => 'snFdpCacheVTPMgmtDomain',
 | 
			
		||||
    'fdp_vlan'         => 'snFdpCacheNativeVLAN',
 | 
			
		||||
    'fdp_duplex'       => 'snFdpCacheDuplex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'fdp_capabilities' => \&SNMP::Info::munge_caps,
 | 
			
		||||
    '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->{_version};
 | 
			
		||||
 | 
			
		||||
    #my $ver = $fdp->fdp_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;
 | 
			
		||||
 | 
			
		||||
    # See if by some miracle Cisco implemented the fdpCacheIfIndex entry
 | 
			
		||||
    my $fdp_index = $fdp->fdp_index();
 | 
			
		||||
    return $fdp_index if defined $fdp_index;
 | 
			
		||||
 | 
			
		||||
    # Nope, didn't think so. Now we fake it.
 | 
			
		||||
    my $fdp_ip = $fdp->fdp_ip();
 | 
			
		||||
    unless ( defined $fdp_ip ) {
 | 
			
		||||
        $fdp->error_throw(
 | 
			
		||||
            "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 GLOBAL METHODS
 | 
			
		||||
 | 
			
		||||
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>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->fdp_id() 
 | 
			
		||||
 | 
			
		||||
Returns FDP device ID.  
 | 
			
		||||
 | 
			
		||||
This is the device id broadcast via FDP to other devices, and is what is
 | 
			
		||||
retrieved from remote devices with $fdp->id().
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalDeviceId>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
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, 7 digits long, MSB.  Each digit represents a bit from the
 | 
			
		||||
table below.
 | 
			
		||||
 | 
			
		||||
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
 | 
			
		||||
 | 
			
		||||
(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 C<martin -at- lorensen.dk> for a pointer to
 | 
			
		||||
this information.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheCapabilities>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_domain()
 | 
			
		||||
 | 
			
		||||
The CDP version of this returns remote VTP Management Domain as defined
 | 
			
		||||
in C<CISCO-VTP-MIB::managementDomainName>
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheVTPMgmtDomain>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_duplex() 
 | 
			
		||||
 | 
			
		||||
Returns the port duplex status from remote devices.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_id()
 | 
			
		||||
 | 
			
		||||
Returns remote device id string
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
Note that a lot devices don't implement $fdp->fdp_index(),  So if it isn't
 | 
			
		||||
around, we fake it. 
 | 
			
		||||
 | 
			
		||||
In order to map the fdp table entry back to the interfaces() entry, we
 | 
			
		||||
truncate the last number off of it :
 | 
			
		||||
 | 
			
		||||
  # it exists, yay.
 | 
			
		||||
  my $fdp_index     = $device->fdp_index();
 | 
			
		||||
  return $fdp_index if defined $fdp_index;
 | 
			
		||||
 | 
			
		||||
  # if not, let's fake it
 | 
			
		||||
  my $fdp_ip       = $device->fdp_ip();
 | 
			
		||||
    
 | 
			
		||||
  my %fdp_if
 | 
			
		||||
  foreach my $key (keys %$fdp_ip){
 | 
			
		||||
      $iid = $key;
 | 
			
		||||
      ## Truncate off .1 from fdp response
 | 
			
		||||
      $iid =~ s/\.\d+$//;
 | 
			
		||||
      $fdp_if{$key} = $iid;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  return \%fdp_if;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_index()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP2 Interface table for FDP Cache Entries. 
 | 
			
		||||
 | 
			
		||||
Most devices don't implement this, so you probably want to use $fdp->fdp_if()
 | 
			
		||||
instead.
 | 
			
		||||
 | 
			
		||||
See fdp_if() entry.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->fdp_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IP address
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->fdp_platform() 
 | 
			
		||||
 | 
			
		||||
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_vlan()
 | 
			
		||||
 | 
			
		||||
Returns the remote interface native VLAN.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheNativeVLAN>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										407
									
								
								Info/IEEE802dot11.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										407
									
								
								Info/IEEE802dot11.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,407 @@
 | 
			
		||||
# SNMP::Info::IEEE802dot11
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::IEEE802dot11::ISA       = qw/Exporter/;
 | 
			
		||||
@SNMP::Info::IEEE802dot11::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
							
								
								
									
										485
									
								
								Info/IPv6.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										485
									
								
								Info/IPv6.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,485 @@
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::IPv6::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::IPv6::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE $METHOD/;
 | 
			
		||||
 | 
			
		||||
use constant {
 | 
			
		||||
    IPMIB   => 1,
 | 
			
		||||
    CISCO   => 2,
 | 
			
		||||
    IPV6MIB => 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%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' => 'ipv6NetToMediaState',           # 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 
 | 
			
		||||
 | 
			
		||||
    'ip_addr6_index'    => 'ipAddressIfIndex',              # IP-MIBw
 | 
			
		||||
    '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) == 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) { # IPv6
 | 
			
		||||
		# 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 _method_used {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return = 'none of the MIBs';
 | 
			
		||||
    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) {
 | 
			
		||||
            $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
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
							
								
								
									
										533
									
								
								Info/LLDP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										533
									
								
								Info/LLDP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,533 @@
 | 
			
		||||
# SNMP::Info::LLDP
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::LLDP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::LLDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'LLDP-MIB'          => 'lldpLocSysCapEnabled',
 | 
			
		||||
    '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-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,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
    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 ( exists $r_i_descr{$desc} ) {
 | 
			
		||||
            $port = $r_i_descr{$desc};
 | 
			
		||||
        } elsif ( exists $r_i_alias{$desc} ) {
 | 
			
		||||
            $port = $r_i_alias{$desc};
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        $lldp_if{$key} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    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_addr_index($key);
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next unless $proto == 1;
 | 
			
		||||
        $lldp_ip{$index} = $addr;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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_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 %lldp_port;
 | 
			
		||||
    foreach my $key ( sort keys %$pid ) {
 | 
			
		||||
        my $port = $pdesc->{$key};
 | 
			
		||||
        unless ($port) {
 | 
			
		||||
            $port = $pid->{$key};
 | 
			
		||||
            next unless $port;
 | 
			
		||||
            my $type = $ptype->{$key};
 | 
			
		||||
            next unless $type;
 | 
			
		||||
 | 
			
		||||
          # May need to format other types in the future, i.e. Network address
 | 
			
		||||
            if ( $type =~ /mac/ ) {
 | 
			
		||||
                $port = join( ':',
 | 
			
		||||
                    map { sprintf "%02x", $_ } unpack( 'C*', $port ) );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Avaya/Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
 | 
			
		||||
        # figure out slot.port based upon lldpRemPortDesc
 | 
			
		||||
        if ( $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ ) {
 | 
			
		||||
            $port = defined $1 ? "$2.$3" : "$3";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $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 = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) );
 | 
			
		||||
        }
 | 
			
		||||
        elsif ($type eq 'networkAddress') {
 | 
			
		||||
            if ( length(unpack('H*', $id)) == 10 ) {
 | 
			
		||||
                # IP address (first octet is sign, I guess)
 | 
			
		||||
                my @octets = (map { sprintf "%02x",$_ } unpack('C*', $id))[1..4];
 | 
			
		||||
                $id = join '.', map { hex($_) } @octets;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        $lldp_id{$key} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#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 $idx    = shift;
 | 
			
		||||
    my @oids   = split( /\./, $idx );
 | 
			
		||||
    my $index  = join( '.', splice( @oids, 0, 3 ) );
 | 
			
		||||
    my $proto  = shift(@oids);
 | 
			
		||||
    my $length = shift(@oids);
 | 
			
		||||
 | 
			
		||||
    # IPv4
 | 
			
		||||
    if ( $proto == 1 ) {
 | 
			
		||||
        return ( $index, $proto, join( '.', @oids ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # MAC
 | 
			
		||||
    elsif ( $proto == 6 ) {
 | 
			
		||||
        return ( $index, $proto,
 | 
			
		||||
            join( ':', map { sprintf "%02x", $_ } @oids ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # TODO - Need to handle other protocols, i.e. IPv6
 | 
			
		||||
    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-DOT1-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<LLDP-EXT-DOT3-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBAL METHODS
 | 
			
		||||
 | 
			
		||||
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_addr()
 | 
			
		||||
 | 
			
		||||
Returns remote address.  Type may be any IANA Address Family Number.
 | 
			
		||||
Currently only returns IPv4 or MAC addresses.
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
=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_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<lldpRemSysCapEnabled>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										236
									
								
								Info/Layer1.pm
									
									
									
									
									
								
							
							
						
						
									
										236
									
								
								Info/Layer1.pm
									
									
									
									
									
								
							@@ -1,79 +1,73 @@
 | 
			
		||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices 
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
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::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Layer1::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
 | 
			
		||||
 | 
			
		||||
# See SNMP::Info for the details of these data structures and 
 | 
			
		||||
#       the interworkings.
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS, 
 | 
			
		||||
          'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex'
 | 
			
		||||
        );
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::GLOBALS,
 | 
			
		||||
            'ports_managed'  => 'ifNumber',
 | 
			
		||||
            'rptr_slots'     => 'rptrGroupCapacity',
 | 
			
		||||
            'slots'          => 'rptrGroupCapacity'
 | 
			
		||||
            );
 | 
			
		||||
    %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',
 | 
			
		||||
           );
 | 
			
		||||
%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,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::MUNGE,
 | 
			
		||||
    'rptr_last_src' => \&SNMP::Info::munge_mac,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
@@ -81,23 +75,23 @@ $INIT = 0;
 | 
			
		||||
sub ports {
 | 
			
		||||
    my $l1 = shift;
 | 
			
		||||
 | 
			
		||||
    my $ports         = $l1->ports_managed();
 | 
			
		||||
    my $rptr_ports    = $l1->rptr_ports();
 | 
			
		||||
    my $ports      = $l1->ports_managed();
 | 
			
		||||
    my $rptr_ports = $l1->rptr_ports();
 | 
			
		||||
 | 
			
		||||
    foreach my $group (keys %$rptr_ports){
 | 
			
		||||
        $ports += $rptr_ports->{$group}; 
 | 
			
		||||
    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. 
 | 
			
		||||
#       name, contained in a propriatry MIB.
 | 
			
		||||
sub model {
 | 
			
		||||
    my $l1 = shift;
 | 
			
		||||
    my $id = $l1->id();
 | 
			
		||||
    my $l1    = shift;
 | 
			
		||||
    my $id    = $l1->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    # HP
 | 
			
		||||
    $model =~ s/^hpswitch//i;
 | 
			
		||||
 | 
			
		||||
@@ -108,66 +102,73 @@ sub model {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $l1 = shift;
 | 
			
		||||
    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 '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 $interfaces = $l1->i_index();
 | 
			
		||||
    my $rptr_port  = $l1->rptr_port();
 | 
			
		||||
    my $l1      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    foreach my $port (keys %$rptr_port){
 | 
			
		||||
    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 $l1      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_up_admin = $l1->i_up_admin2();
 | 
			
		||||
    my $rptr_up_admin = $l1->rptr_up_admin();
 | 
			
		||||
    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){
 | 
			
		||||
    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/; 
 | 
			
		||||
        $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();
 | 
			
		||||
    my $l1      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    foreach my $key (keys %$rptr_up){
 | 
			
		||||
    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/; 
 | 
			
		||||
        $i_up->{$key} = 'up' if $up =~ /operational/;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_up;
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1 - Perl5 Interface to network devices serving Layer1 only.
 | 
			
		||||
SNMP::Info::Layer1 - SNMP Interface to network devices serving Layer1 only.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -175,14 +176,13 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $l1 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $l1->class();
 | 
			
		||||
 my $class = $l1->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
 # Let's get some basic Port information
 | 
			
		||||
@@ -199,14 +199,15 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
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. 
 | 
			
		||||
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(...);
 | 
			
		||||
 | 
			
		||||
@@ -222,15 +223,16 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP-REPEATER-MIB
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes
 | 
			
		||||
 | 
			
		||||
MIBs required for SNMP::Info
 | 
			
		||||
=item F<SNMP-REPEATER-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
SNMP-REPEATER-MIB needs to be extracted from ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
 | 
			
		||||
MIBs required for L<SNMP::Info/"Required MIBs">
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
F<SNMP-REPEATER-MIB> needs to be extracted from
 | 
			
		||||
ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
@@ -242,7 +244,7 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
Gets the number of ports under the interface mib 
 | 
			
		||||
 | 
			
		||||
(B<ifNumber>)
 | 
			
		||||
(C<ifNumber>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -250,9 +252,17 @@ Gets the number of ports under the interface mib
 | 
			
		||||
 | 
			
		||||
=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()
 | 
			
		||||
 | 
			
		||||
Trys to discover the vendor from $l1->model() and $l1->vendor()
 | 
			
		||||
Tries to discover the vendor from $l1->model() and $l1->vendor()
 | 
			
		||||
 | 
			
		||||
=item $l1->ports()
 | 
			
		||||
 | 
			
		||||
@@ -262,15 +272,15 @@ Adds the values from rptr_ports() and ports_managed()
 | 
			
		||||
 | 
			
		||||
Number of 'groups' in the Repeater MIB
 | 
			
		||||
 | 
			
		||||
(B<rptrGroupCapacity>)
 | 
			
		||||
(C<rptrGroupCapacity>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info for details.
 | 
			
		||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
@@ -281,10 +291,16 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
@@ -295,32 +311,36 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
Number of ports in each group.
 | 
			
		||||
 | 
			
		||||
(B<rptrGroupPortCapacity>)
 | 
			
		||||
(C<rptrGroupPortCapacity>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_port()
 | 
			
		||||
 | 
			
		||||
Port number in Group
 | 
			
		||||
 | 
			
		||||
(B<rptrPortIndex>)
 | 
			
		||||
(C<rptrPortIndex>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_slot()
 | 
			
		||||
 | 
			
		||||
Group (slot) Number for given port.
 | 
			
		||||
 | 
			
		||||
(B<rptrPortGroupIndex>)
 | 
			
		||||
(C<rptrPortGroupIndex>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_up_admin()
 | 
			
		||||
 | 
			
		||||
(B<rptrPortAdminStatus>)
 | 
			
		||||
(C<rptrPortAdminStatus>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_up()
 | 
			
		||||
 | 
			
		||||
(B<rptrPortOperStatus>)
 | 
			
		||||
(C<rptrPortOperStatus>)
 | 
			
		||||
 | 
			
		||||
=item $l1->rptr_last_src()
 | 
			
		||||
 | 
			
		||||
(C<rptrAddrTrackNewLastSrcAddress>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info for details.
 | 
			
		||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
@@ -1,64 +1,60 @@
 | 
			
		||||
# SNMP::Info::Layer1::Allied
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer1::Allied::ISA = qw/SNMP::Info::Layer1 Exporter/;
 | 
			
		||||
@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/;
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer1::GLOBALS,
 | 
			
		||||
            'root_ip'   => 'actualIPAddr',
 | 
			
		||||
            );
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (%SNMP::Info::Layer1::FUNCS,
 | 
			
		||||
            'i_name2'    => 'ifName',
 | 
			
		||||
            'ati_p_name' => 'portName',
 | 
			
		||||
            'ati_up'     => 'linkTestLED',
 | 
			
		||||
            );
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer1::FUNCS,
 | 
			
		||||
    'ati_p_name' => 'portName',
 | 
			
		||||
    'ati_up'     => 'linkTestLED',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            %SNMP::Info::Layer1::MIBS,
 | 
			
		||||
            'ATI-MIB' => 'atiPortGroupIndex'
 | 
			
		||||
            );
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ATI-MIB' => 'atiPortGroupIndex' );
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (%SNMP::Info::Layer1::MUNGE,
 | 
			
		||||
            );
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'allied';
 | 
			
		||||
@@ -70,9 +66,9 @@ sub os {
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
    my $descr = $allied->description();
 | 
			
		||||
    
 | 
			
		||||
    if ($descr =~ m/version (\d+\.\d+)/){
 | 
			
		||||
    my $descr  = $allied->description();
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/version (\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -82,39 +78,40 @@ sub model {
 | 
			
		||||
 | 
			
		||||
    my $desc = $allied->description();
 | 
			
		||||
 | 
			
		||||
    if ($desc =~ /(AT-\d{4}\S{1}?)/){
 | 
			
		||||
    if ( $desc =~ /(AT-\d{4}\S{1}?)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return undef;
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name{
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $allied  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_name = $allied->i_name2();
 | 
			
		||||
    my $i_name     = $allied->orig_i_name($partial) || {};
 | 
			
		||||
    my $ati_p_name = $allied->ati_p_name($partial)  || {};
 | 
			
		||||
 | 
			
		||||
    my $ati_p_name = $allied->ati_p_name();
 | 
			
		||||
 | 
			
		||||
    foreach my $port (keys %$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*$/);
 | 
			
		||||
        $i_name->{$port} = $name if ( defined $name and $name !~ /^\s*$/ );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return $i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
    my $allied  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_up = SNMP::Info::Layer1::i_up($allied);
 | 
			
		||||
    my $ati_up = $allied->ati_up();
 | 
			
		||||
    my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
 | 
			
		||||
    my $ati_up = $allied->ati_up($partial) || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $port (keys %$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';
 | 
			
		||||
        $i_up->{$port} = 'up'   if $up eq 'nolinktesterror';
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return $i_up;
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
@@ -126,7 +123,7 @@ SNMP::Info::Layer1::Allied - SNMP Interface to old Allied Hubs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -134,14 +131,13 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $allied = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myhub',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $l1->class();
 | 
			
		||||
 my $class = $allied->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
@@ -162,16 +158,14 @@ inherited methods.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item ATI-MIB 
 | 
			
		||||
 | 
			
		||||
Download for your device from http://www.allied-telesyn.com/allied/support/
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes
 | 
			
		||||
 | 
			
		||||
MIBs listed in SNMP::Info::Layer1 and its inherited classes.
 | 
			
		||||
=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
 | 
			
		||||
@@ -196,19 +190,19 @@ Culls Version from description()
 | 
			
		||||
 | 
			
		||||
Returns IP Address of Managed Hub.
 | 
			
		||||
 | 
			
		||||
(B<actualIpAddr>)
 | 
			
		||||
(C<actualIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $allied->model()
 | 
			
		||||
 | 
			
		||||
Trys to cull out AT-nnnnX out of the description field.
 | 
			
		||||
Tries to cull out C<AT-nnnnX> out of the description field.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer1 for details.
 | 
			
		||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
@@ -231,16 +225,16 @@ the values of ati_up() to 'up' and 'down'.
 | 
			
		||||
 | 
			
		||||
=item $allied->ati_p_name()
 | 
			
		||||
 | 
			
		||||
(B<portName>)
 | 
			
		||||
(C<portName>)
 | 
			
		||||
 | 
			
		||||
=item $allied->ati_up()
 | 
			
		||||
 | 
			
		||||
(B<linkTestLED>)
 | 
			
		||||
(C<linkTestLED>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer1 for details.
 | 
			
		||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
@@ -1,79 +1,72 @@
 | 
			
		||||
# SNMP::Info::Layer1::Asante
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer1::Asante::ISA = qw/SNMP::Info::Layer1 Exporter/;
 | 
			
		||||
@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/;
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer1::GLOBALS,
 | 
			
		||||
            );
 | 
			
		||||
%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',
 | 
			
		||||
            );
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer1::FUNCS,
 | 
			
		||||
    'asante_port'  => 'ePortIndex',
 | 
			
		||||
    'asante_group' => 'ePortGrpIndex',
 | 
			
		||||
    'i_type'       => 'ePortStateType',
 | 
			
		||||
    'asante_up'    => 'ePortStateLinkStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            %SNMP::Info::Layer1::MIBS,
 | 
			
		||||
            'ASANTE-HUB1012-MIB' => 'asante'
 | 
			
		||||
            );
 | 
			
		||||
%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,
 | 
			
		||||
            );
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
    my $asante  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rptr_port = $asante->rptr_port();
 | 
			
		||||
    my $rptr_port = $asante->rptr_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %interfaces;
 | 
			
		||||
 | 
			
		||||
    foreach my $port (keys %$rptr_port){
 | 
			
		||||
    foreach my $port ( keys %$rptr_port ) {
 | 
			
		||||
        $interfaces{$port} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -86,13 +79,13 @@ sub os {
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
    my $descr = $asante->description();
 | 
			
		||||
    
 | 
			
		||||
    if ($descr =~ /software v(\d+\.\d+)/){
 | 
			
		||||
    my $descr  = $asante->description();
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ /software v(\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'asante';
 | 
			
		||||
}
 | 
			
		||||
@@ -100,31 +93,33 @@ sub vendor {
 | 
			
		||||
sub model {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
 | 
			
		||||
    my $id = $asante->id();
 | 
			
		||||
    my $id    = $asante->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
    my $asante  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $asante_up = $asante->asante_up();
 | 
			
		||||
    my $asante_up = $asante->asante_up($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my $i_up = {};
 | 
			
		||||
    foreach my $port (keys %$asante_up){
 | 
			
		||||
    foreach my $port ( keys %$asante_up ) {
 | 
			
		||||
        my $up = $asante_up->{$port};
 | 
			
		||||
        $i_up->{$port} = 'down' if $up =~ /on/;
 | 
			
		||||
        $i_up->{$port} = 'up' if $up =~ /off/;
 | 
			
		||||
        $i_up->{$port} = 'up'   if $up =~ /off/;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return $i_up;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
    my $asante  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_speed = $asante->i_speed2();
 | 
			
		||||
    my $i_speed = $asante->orig_i_speed($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_speed;
 | 
			
		||||
 | 
			
		||||
@@ -134,9 +129,10 @@ sub i_speed {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
    my $asante  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_mac = $asante->i_mac2();
 | 
			
		||||
    my $i_mac = $asante->orig_i_mac($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_mac;
 | 
			
		||||
 | 
			
		||||
@@ -146,13 +142,14 @@ sub i_mac {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_description {
 | 
			
		||||
    return undef;
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $asante = shift;
 | 
			
		||||
    my $asante  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_name = $asante->i_descr2();
 | 
			
		||||
    my $i_name = $asante->orig_i_descr($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
 | 
			
		||||
@@ -160,7 +157,9 @@ sub i_name {
 | 
			
		||||
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
@@ -169,7 +168,7 @@ SNMP::Info::Layer1::Asante - SNMP Interface to old Asante 1012 Hubs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -177,14 +176,13 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $asante = 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      = $asante->class();
 | 
			
		||||
 my $class = $asante->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
@@ -204,14 +202,14 @@ Asante device through SNMP.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item ASANTE-HUB1012-MIB
 | 
			
		||||
 | 
			
		||||
Download from http://www.mibdepot.com
 | 
			
		||||
 | 
			
		||||
=items MIBs listed in SNMP::Info::Layer1
 | 
			
		||||
=item F<ASANTE-HUB1012-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
@@ -230,28 +228,36 @@ Culls software version from description()
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
Cross references $asante->id() to the F<ASANTE-HUB1012-MIB> and returns
 | 
			
		||||
the results.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals inherited from SNMP::Info::Layer1
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer1 for details.
 | 
			
		||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=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.
 | 
			
		||||
@@ -259,7 +265,11 @@ 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'.
 | 
			
		||||
the values of asante_up() to 'up' and 'down'.
 | 
			
		||||
 | 
			
		||||
=item $asante->i_speed()
 | 
			
		||||
 | 
			
		||||
Speed of the link, human format.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -269,16 +279,16 @@ the values of ati_up() to 'up' and 'down'.
 | 
			
		||||
 | 
			
		||||
=item $asante->ati_p_name()
 | 
			
		||||
 | 
			
		||||
(B<portName>)
 | 
			
		||||
(C<portName>)
 | 
			
		||||
 | 
			
		||||
=item $asante->ati_up()
 | 
			
		||||
 | 
			
		||||
(B<linkTestLED>)
 | 
			
		||||
(C<linkTestLED>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer1 for details.
 | 
			
		||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										729
									
								
								Info/Layer1/Bayhub.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										729
									
								
								Info/Layer1/Bayhub.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,729 @@
 | 
			
		||||
# SNMP::Info::Layer1::Bayhub
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 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//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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_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. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $bayhub = new SNMP::Info::Layer1::Bayhub(...);
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
							
								
								
									
										444
									
								
								Info/Layer1/Cyclades.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										444
									
								
								Info/Layer1/Cyclades.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,444 @@
 | 
			
		||||
# SNMP::Info::Layer1::Cyclades
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Cyclades;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer1::Cyclades::ISA       = qw/SNMP::Info::Layer1 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer1::Cyclades::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer1::MIBS,
 | 
			
		||||
    'CYCLADES-ACS-SYS-MIB'  => 'cyACSversion',
 | 
			
		||||
    'CYCLADES-ACS-CONF-MIB' => 'cyEthIPaddr',
 | 
			
		||||
    'CYCLADES-ACS-INFO-MIB' => 'cyISPortTty',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
    # CYCLADES-ACS-SYS-MIB
 | 
			
		||||
    %SNMP::Info::Layer1::GLOBALS,
 | 
			
		||||
    'os_ver'     => 'cyACSversion',
 | 
			
		||||
    'cy_model'   => 'cyACSpname',
 | 
			
		||||
    'serial'     => 'cyACSDevId',
 | 
			
		||||
    'root_ip'    => 'cyEthIPaddr',
 | 
			
		||||
    'ps1_status' => 'cyACSPw1',
 | 
			
		||||
    'ps2_status' => 'cyACSPw2',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer1::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # CYCLADES-ACS-INFO-MIB::cyInfoSerialTable
 | 
			
		||||
    'cy_port_tty'   => 'cyISPortTty',
 | 
			
		||||
    'cy_port_name'  => 'cyISPortName',
 | 
			
		||||
    'cy_port_speed' => 'cyISPortSpeed',
 | 
			
		||||
    'cy_port_cd'    => 'cyISPortSigCD',
 | 
			
		||||
 | 
			
		||||
    # CYCLADES-ACS-CONF-MIB::cySerialPortTable
 | 
			
		||||
    'cy_port_socket' => 'cySPortSocketPort',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%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 'cyclades';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cyclades';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $cyclades = shift;
 | 
			
		||||
 | 
			
		||||
    my $model = $cyclades->cy_model();
 | 
			
		||||
 | 
			
		||||
    return unless defined $model;
 | 
			
		||||
 | 
			
		||||
    return lc($model);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 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->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->cy_port_socket()             || {};
 | 
			
		||||
    my $cy_p_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->cy_port_socket()       || {};
 | 
			
		||||
    my $cy_p_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->cy_port_socket()    || {};
 | 
			
		||||
    my $cy_p_up  = $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->cy_port_socket()             || {};
 | 
			
		||||
    my $cy_p_desc = $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->cy_port_socket()      || {};
 | 
			
		||||
    my $cy_p_desc = $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 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 device through SNMP.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $cyclades = new SNMP::Info::Layer1::Cyclades(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CYCLADES-ACS-SYS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CYCLADES-ACS-CONF-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CYCLADES-ACS-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<cyACSversion>)
 | 
			
		||||
 | 
			
		||||
=item $cyclades->serial()
 | 
			
		||||
 | 
			
		||||
(C<cyACSDevId>)
 | 
			
		||||
 | 
			
		||||
=item $cyclades->root_ip()
 | 
			
		||||
 | 
			
		||||
(C<cyEthIPaddr>)
 | 
			
		||||
 | 
			
		||||
=item $cyclades->ps1_status()
 | 
			
		||||
 | 
			
		||||
(C<cyACSPw1>)
 | 
			
		||||
 | 
			
		||||
=item $cyclades->ps2_status()
 | 
			
		||||
 | 
			
		||||
(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 'cyclades'
 | 
			
		||||
 | 
			
		||||
=item $cyclades->os()
 | 
			
		||||
 | 
			
		||||
Returns 'cyclades'
 | 
			
		||||
 | 
			
		||||
=item $cyclades->model()
 | 
			
		||||
 | 
			
		||||
Returns lower case (C<cyACSpname>)
 | 
			
		||||
 | 
			
		||||
=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, the listening socket port
 | 
			
		||||
C<cySPortSocketPort> to avoid conflicts with C<ifIndex>.  
 | 
			
		||||
 | 
			
		||||
=item $cyclades->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to physical ports.  Extended to include
 | 
			
		||||
serial ports, C<cyISPortTty>.
 | 
			
		||||
 | 
			
		||||
=item $cyclades->i_speed()
 | 
			
		||||
 | 
			
		||||
Returns interface speed.  Extended to include serial ports, C<cyISPortSpeed>. 
 | 
			
		||||
 | 
			
		||||
=item $cyclades->i_up()
 | 
			
		||||
 | 
			
		||||
Returns link status for each port.  Extended to include serial ports,
 | 
			
		||||
C<cyISPortSigCD>.
 | 
			
		||||
 | 
			
		||||
=item $cyclades->i_description()
 | 
			
		||||
 | 
			
		||||
Returns description of each port.  Extended to include serial ports,
 | 
			
		||||
C<cyISPortName>.
 | 
			
		||||
 | 
			
		||||
=item $cyclades->i_name()
 | 
			
		||||
 | 
			
		||||
Returns name of each port.  Extended to include serial ports, C<cyISPortName>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer1
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										548
									
								
								Info/Layer1/S3000.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										548
									
								
								Info/Layer1/S3000.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,548 @@
 | 
			
		||||
# SNMP::Info::Layer1::S3000
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer1::S3000::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer1::S3000::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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_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.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $s3000 = new SNMP::Info::Layer1::S3000(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
							
								
								
									
										257
									
								
								Info/Layer2.pm
									
									
									
									
									
								
							
							
						
						
									
										257
									
								
								Info/Layer2.pm
									
									
									
									
									
								
							@@ -1,95 +1,89 @@
 | 
			
		||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices 
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::Entity;
 | 
			
		||||
use SNMP::Info::PowerEthernet;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::CDP SNMP::Info::CiscoStats Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::ISA
 | 
			
		||||
    = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
 | 
			
		||||
 | 
			
		||||
# See SNMP::Info for the details of these data structures and 
 | 
			
		||||
#       the interworkings.
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS, 
 | 
			
		||||
          %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
          %SNMP::Info::CDP::MIBS,
 | 
			
		||||
          %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
          'CISCO-PRODUCTS-MIB' => 'sysName',
 | 
			
		||||
          'CISCO-STACK-MIB'    => 'wsc1900sysID',
 | 
			
		||||
        );
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,         %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
    %SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::GLOBALS,
 | 
			
		||||
            %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
            %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
            %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
            );
 | 
			
		||||
    %SNMP::Info::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Entity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::PowerEthernet::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::CDP::FUNCS,
 | 
			
		||||
            %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
           );
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,         %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
    %SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
            # Inherit all the built in munging
 | 
			
		||||
            %SNMP::Info::MUNGE,
 | 
			
		||||
            %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
            %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
            %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::MUNGE,
 | 
			
		||||
    %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
    %SNMP::Info::Entity::MUNGE,
 | 
			
		||||
    %SNMP::Info::PowerEthernet::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
# $l2->model() - Looks at sysObjectID which gives the oid of the system
 | 
			
		||||
#       name, contained in a propriatry MIB. 
 | 
			
		||||
#       name, contained in a propriatry MIB.
 | 
			
		||||
sub model {
 | 
			
		||||
    my $l2 = shift;
 | 
			
		||||
    my $id = $l2->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    
 | 
			
		||||
    my $l2    = shift;
 | 
			
		||||
    my $id    = $l2->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id) || $id || '';
 | 
			
		||||
 | 
			
		||||
    # HP
 | 
			
		||||
    $model =~ s/^hpswitch//i;
 | 
			
		||||
 | 
			
		||||
@@ -102,61 +96,71 @@ sub model {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $l2 = shift;
 | 
			
		||||
    my $l2    = shift;
 | 
			
		||||
    my $model = $l2->model();
 | 
			
		||||
    my $descr = $l2->description();
 | 
			
		||||
 | 
			
		||||
    if ($model =~ /hp/i or $descr =~ /hp/i) {
 | 
			
		||||
    if ( $model =~ /hp/i or $descr =~ /\bhp\b/i ) {
 | 
			
		||||
        return 'hp';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ($model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i) {
 | 
			
		||||
    if ( $model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i ) {
 | 
			
		||||
        return 'cisco';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $l2 = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_type = $l2->i_type();
 | 
			
		||||
    my $serial1  = $l2->serial1();
 | 
			
		||||
    my $e_descr  = $l2->e_descr() || {};
 | 
			
		||||
    my $e_serial = $l2->e_serial() || {};
 | 
			
		||||
 | 
			
		||||
    my $serial2 = $e_serial->{1} || undef;
 | 
			
		||||
    my $chassis = $e_descr->{1}  || undef;
 | 
			
		||||
 | 
			
		||||
    # precedence
 | 
			
		||||
    #   serial2,chassis parse,serial1
 | 
			
		||||
    return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
 | 
			
		||||
    return $1
 | 
			
		||||
        if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
 | 
			
		||||
    return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l2      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_type = $l2->i_type($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore = ();
 | 
			
		||||
 | 
			
		||||
    foreach my $if (keys %$i_type){
 | 
			
		||||
    foreach my $if ( keys %$i_type ) {
 | 
			
		||||
        my $type = $i_type->{$if};
 | 
			
		||||
        $i_ignore{$if}++ 
 | 
			
		||||
            if $type =~ /(loopback|propvirtual|other|cpu)/i;
 | 
			
		||||
        $i_ignore{$if}++
 | 
			
		||||
            if $type =~ /(loopback|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 $l2      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
    my $interfaces = $l2->i_index($partial)       || {};
 | 
			
		||||
    my $i_descr    = $l2->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    # Replace the Index with the ifDescr field.
 | 
			
		||||
    foreach my $iid ( keys %$i_descr ) {
 | 
			
		||||
        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;
 | 
			
		||||
        $interfaces->{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if
 | 
			
		||||
    return $interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -164,11 +168,11 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2 - Perl5 Interface to network devices serving Layer2 only.
 | 
			
		||||
SNMP::Info::Layer2 - SNMP Interface to network devices serving Layer2 only.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -176,7 +180,6 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $l2 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
@@ -199,14 +202,15 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
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. 
 | 
			
		||||
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(...);
 | 
			
		||||
 | 
			
		||||
@@ -218,9 +222,7 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
=item SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -228,21 +230,13 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item CISCO-PRODUCTS-MIB 
 | 
			
		||||
 | 
			
		||||
Needed for ID of Cisco Products
 | 
			
		||||
 | 
			
		||||
=item CISCO-STACK-MIB
 | 
			
		||||
 | 
			
		||||
Needed for ID of Cisco Products
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes
 | 
			
		||||
 | 
			
		||||
MIBs required by the inherited classes listed above.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
MIBs can be found in netdisco-mibs package.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
@@ -257,31 +251,31 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
Cross references $l2->id() with product IDs in the 
 | 
			
		||||
Cisco MIBs.
 | 
			
		||||
 | 
			
		||||
For HP devices, removes 'hpswitch' from the name
 | 
			
		||||
For HP devices, removes C<'hpswitch'> from the name
 | 
			
		||||
 | 
			
		||||
For Cisco devices, removes 'sysid' from the name
 | 
			
		||||
For Cisco devices, removes c<'sysid'> from the name
 | 
			
		||||
 | 
			
		||||
=item $l2->vendor()
 | 
			
		||||
 | 
			
		||||
Trys to discover the vendor from $l2->model() and $l2->description()
 | 
			
		||||
Tries to discover the vendor from $l2->model() and $l2->description()
 | 
			
		||||
 | 
			
		||||
=item $l2->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number if available through SNMP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info for details.
 | 
			
		||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Bridge for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::CDP for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::CiscoStats for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
@@ -294,32 +288,29 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=item $l2->interfaces()
 | 
			
		||||
 | 
			
		||||
Creates a map between the interface identifier (iid) and the physical port name.
 | 
			
		||||
Creates a map between the interface identifier (iid) and the physical port
 | 
			
		||||
name.
 | 
			
		||||
 | 
			
		||||
Defaults to B<ifDescr> but checks and overrides with B<ifName>
 | 
			
		||||
Defaults to C<ifDescr> but checks and overrides with C<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
 | 
			
		||||
Ignores ports with C<ifType> of loopback, propvirtual, other, and cpu
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info for details.
 | 
			
		||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Bridge for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::CDP for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::CiscoStats for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										385
									
								
								Info/Layer2/Airespace.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										385
									
								
								Info/Layer2/Airespace.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,385 @@
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
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//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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',
 | 
			
		||||
	# This is a cheat for 802.11a bonded
 | 
			
		||||
	m108 => '108',
 | 
			
		||||
    },
 | 
			
		||||
    40 => {
 | 
			
		||||
	m0  => '15',
 | 
			
		||||
	m1  => '30',
 | 
			
		||||
	m2  => '45',
 | 
			
		||||
	m3  => '60',
 | 
			
		||||
	m4  => '90',
 | 
			
		||||
	m5  => '120',
 | 
			
		||||
	m6  => '135',
 | 
			
		||||
	m7  => '157.5',
 | 
			
		||||
	m8  => '30',
 | 
			
		||||
	m9  => '60',
 | 
			
		||||
	m10 => '90',
 | 
			
		||||
	m11 => '120',
 | 
			
		||||
	m12 => '180',
 | 
			
		||||
	m13 => '240',
 | 
			
		||||
	m14 => '270',
 | 
			
		||||
	m15 => '300',
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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};
 | 
			
		||||
	    $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.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $airespace = new SNMP::Info::Layer2::Airespace(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
@@ -1,81 +1,132 @@
 | 
			
		||||
# SNMP::Info::Layer2::Aironet
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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;
 | 
			
		||||
$VERSION = 0.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::Entity;
 | 
			
		||||
use SNMP::Info::EtherLike;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::IEEE802dot11;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Aironet::ISA = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Aironet::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Aironet::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
            %SNMP::Info::Entity::GLOBALS,
 | 
			
		||||
            %SNMP::Info::EtherLike::GLOBALS,
 | 
			
		||||
            'serial' => 'entPhysicalSerialNum.1',
 | 
			
		||||
            'descr'  => 'sysDescr'
 | 
			
		||||
            );
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Entity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::EtherLike::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    'serial' => 'entPhysicalSerialNum.1',
 | 
			
		||||
    'descr'  => 'sysDescr'
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (%SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
            %SNMP::Info::Entity::FUNCS,
 | 
			
		||||
            %SNMP::Info::EtherLike::FUNCS
 | 
			
		||||
            );
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::FUNCS,
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::Entity::FUNCS,
 | 
			
		||||
    %SNMP::Info::EtherLike::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %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::Layer2::MIBS,
 | 
			
		||||
            %SNMP::Info::Entity::MIBS,
 | 
			
		||||
            %SNMP::Info::EtherLike::MIBS
 | 
			
		||||
            );
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MIBS,
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::Entity::MIBS,
 | 
			
		||||
    %SNMP::Info::EtherLike::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %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',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (%SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
            %SNMP::Info::Entity::MUNGE,
 | 
			
		||||
            %SNMP::Info::EtherLike::MUNGE
 | 
			
		||||
            );
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MUNGE,
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
    %SNMP::Info::Entity::MUNGE,
 | 
			
		||||
    %SNMP::Info::EtherLike::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %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 $i_description = $aironet->i_description();
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_description = $aironet->i_description($partial);
 | 
			
		||||
 | 
			
		||||
    return $i_description;
 | 
			
		||||
}
 | 
			
		||||
@@ -83,7 +134,7 @@ sub interfaces {
 | 
			
		||||
# Tag on e_descr.1
 | 
			
		||||
sub description {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $descr = $aironet->descr();
 | 
			
		||||
    my $descr   = $aironet->descr();
 | 
			
		||||
    my $e_descr = $aironet->e_descr();
 | 
			
		||||
 | 
			
		||||
    $descr = "$e_descr->{1}  $descr" if defined $e_descr->{1};
 | 
			
		||||
@@ -94,10 +145,12 @@ sub description {
 | 
			
		||||
# Fetch duplex from EtherLike
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $el_duplex = $aironet->el_duplex();
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $el_duplex = $aironet->el_duplex($partial);
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $d (keys %$el_duplex){
 | 
			
		||||
    foreach my $d ( keys %$el_duplex ) {
 | 
			
		||||
        my $val = $el_duplex->{$d};
 | 
			
		||||
        next unless defined $val;
 | 
			
		||||
        $i_duplex{$d} = 'full' if $val =~ /full/i;
 | 
			
		||||
@@ -107,16 +160,314 @@ sub i_duplex {
 | 
			
		||||
    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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running IOS.
 | 
			
		||||
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running
 | 
			
		||||
IOS.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -124,7 +475,6 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $aironet = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
@@ -136,7 +486,8 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides interface to SNMP Data available on newer Aironet devices running Cisco IOS.
 | 
			
		||||
Provides interface to SNMP Data available on newer Aironet devices running
 | 
			
		||||
Cisco IOS.
 | 
			
		||||
 | 
			
		||||
Note there are two classes for Aironet devices :
 | 
			
		||||
 | 
			
		||||
@@ -152,8 +503,8 @@ 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. 
 | 
			
		||||
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(...);
 | 
			
		||||
 | 
			
		||||
@@ -167,6 +518,10 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...);
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
@@ -191,23 +546,47 @@ Adds info from method e_descr() from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=item $aironet->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'cisco' :)
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $aironet->description()
 | 
			
		||||
 | 
			
		||||
System description
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer2 for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Entity for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::EtherLike for details.
 | 
			
		||||
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=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
 | 
			
		||||
 | 
			
		||||
@@ -217,22 +596,80 @@ See documentation in SNMP::Info::EtherLike for details.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
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. 
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer2 for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Entity for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::EtherLike for details.
 | 
			
		||||
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
									
								
								Info/Layer2/Allied.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										240
									
								
								Info/Layer2/Allied.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,240 @@
 | 
			
		||||
# SNMP::Info::Layer2::Allied
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Allied;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
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//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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 ( $descr =~ m/version (\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $allied = shift;
 | 
			
		||||
 | 
			
		||||
    my $desc = $allied->description();
 | 
			
		||||
 | 
			
		||||
    if ( $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
 | 
			
		||||
@@ -1,479 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer2::Bay
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
#       and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the 
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products 
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
# 
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 | 
			
		||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
			
		||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
			
		||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 | 
			
		||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 | 
			
		||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Bay;
 | 
			
		||||
$VERSION = 0.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
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 os {
 | 
			
		||||
    return 'bay';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
 | 
			
		||||
    # 303 / 304
 | 
			
		||||
    if ($descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/){
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # 450
 | 
			
		||||
    if ($descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/){
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_bin {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
 | 
			
		||||
    # 303 / 304
 | 
			
		||||
    if ($descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/){
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # 450
 | 
			
		||||
    if ($descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/){
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return undef;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 '450' if ($model =~ /BayStack450/);
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Hack in some CDP type stuff
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $entry (keys %$bay_topo_port){
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
        $c_if{"$port.1"} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $bay_topo_ip   = $bay->bay_topo_ip();
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
    my $ip = $bay->cdp_ip();
 | 
			
		||||
    
 | 
			
		||||
    # Count the number of devices seen on each port.
 | 
			
		||||
    #   more than one device seen means connected to a non-bay
 | 
			
		||||
    #   device, but other bay devices are squawking further away.
 | 
			
		||||
    my %ip_port;
 | 
			
		||||
    foreach my $entry (keys %$bay_topo_ip){
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
        my $ip   = $bay_topo_ip->{$entry};
 | 
			
		||||
        push(@{$ip_port{$port}},$ip);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $port (keys %ip_port){
 | 
			
		||||
        my $ips = $ip_port{$port};
 | 
			
		||||
        if (scalar @$ips == 1) {
 | 
			
		||||
            $c_ip{"$port.1"} = $ips->[0];
 | 
			
		||||
        } else {
 | 
			
		||||
            $c_ip{"$port.1"} = $ips;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
    my $bay_topo_seg = $bay->bay_topo_seg();
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $entry (keys %$bay_topo_seg){
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
 | 
			
		||||
        # For fake remotes (multiple IPs for a c_ip), use first found
 | 
			
		||||
        next if defined $c_port{"$port.1"};
 | 
			
		||||
 | 
			
		||||
        my $seg  = $bay_topo_seg->{$entry};
 | 
			
		||||
 | 
			
		||||
        # Segment id is (256 * remote slot_num) + (remote_port)
 | 
			
		||||
        my $remote_port = $seg % 256;
 | 
			
		||||
    
 | 
			
		||||
        $c_port{"$port.1"} = $remote_port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $bay_topo_port     = $bay->bay_topo_port();
 | 
			
		||||
    my $bay_topo_platform = $bay->bay_topo_platform();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $entry (keys %$bay_topo_platform){
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        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 BayStack Switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $bay = 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      = $bay->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 device through SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not after determining
 | 
			
		||||
a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $bay = new SNMP::Info::Layer2::Bay(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SYNOPTICS-ROOT-MIB
 | 
			
		||||
 | 
			
		||||
=item S5-ETH-MULTISEG-TOPOLOGY-MIB
 | 
			
		||||
 | 
			
		||||
=item Inherited classes
 | 
			
		||||
 | 
			
		||||
MIBs required by SNMP::Info::Layer2 and its superclasses.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
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.  Check also www.mibdepot.com
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'bay' :)
 | 
			
		||||
 | 
			
		||||
=item $bay->model()
 | 
			
		||||
 | 
			
		||||
Cross references $bay->id() to the 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
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer2 for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $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
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer2 for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										606
									
								
								Info/Layer2/Baystack.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										606
									
								
								Info/Layer2/Baystack.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,606 @@
 | 
			
		||||
# SNMP::Info::Layer2::Baystack
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info::SONMP;
 | 
			
		||||
use SNMP::Info::NortelStack;
 | 
			
		||||
use SNMP::Info::RapidCity;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Baystack::ISA
 | 
			
		||||
    = qw/SNMP::Info::SONMP SNMP::Info::NortelStack
 | 
			
		||||
    SNMP::Info::RapidCity SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Baystack::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS,
 | 
			
		||||
    %SNMP::Info::SONMP::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::RapidCity::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
 | 
			
		||||
    %SNMP::Info::SONMP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS,
 | 
			
		||||
    %SNMP::Info::SONMP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# 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::LLDP::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)-?//;
 | 
			
		||||
 | 
			
		||||
    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/ )
 | 
			
		||||
        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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $baystack = new SNMP::Info::Layer2::Baystack(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::NortelStack
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::RapidCity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=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::LLDP/"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>.
 | 
			
		||||
 | 
			
		||||
=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::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=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 $poe->peth_port_ifindex()
 | 
			
		||||
 | 
			
		||||
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
 | 
			
		||||
 | 
			
		||||
=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 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::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,77 +1,100 @@
 | 
			
		||||
# SNMP::Info::Layer2::C1900
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::CDP SNMP::Info::CiscoStats
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::Layer2
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
            'c1900_flash_status'    => 'upgradeFlashBankStatus',
 | 
			
		||||
            );
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    'c1900_flash_status' => 'upgradeFlashBankStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS   = (%SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
            'i_type2'              => 'ifType',
 | 
			
		||||
            'i_name2'              => 'ifName',
 | 
			
		||||
            # 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',
 | 
			
		||||
            );
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
            # Also known as the ESSWITCH-MIB
 | 
			
		||||
            'STAND-ALONE-ETHERNET-SWITCH-MIB' =>  'series2000'
 | 
			
		||||
            );
 | 
			
		||||
    # 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',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (%SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
            );
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::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::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';
 | 
			
		||||
}
 | 
			
		||||
@@ -82,122 +105,175 @@ sub os_ver {
 | 
			
		||||
    # 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 undef unless defined $c1900_flash_status;
 | 
			
		||||
 | 
			
		||||
    if ($c1900_flash_status =~ m/V(\d+\.\d+(\.\d+)?)/){
 | 
			
		||||
    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 undef;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $c1900 = shift;
 | 
			
		||||
    my $i_descr = $c1900->i_description();
 | 
			
		||||
    my $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid (keys %$i_descr){
 | 
			
		||||
    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 $interfaces     = $c1900->interfaces();
 | 
			
		||||
    my $c1900_p_index  = $c1900->c1900_p_index();
 | 
			
		||||
    my $c1900_p_duplex = $c1900->c1900_p_duplex();
 | 
			
		||||
 
 | 
			
		||||
    my $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my %reverse_1900 = reverse %$c1900_p_index;
 | 
			
		||||
    my $c1900_p_duplex = $c1900->c1900_p_duplex($partial) || {};
 | 
			
		||||
 | 
			
		||||
    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; 
 | 
			
		||||
    
 | 
			
		||||
    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; 
 | 
			
		||||
        $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 $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my %reverse_1900 = reverse %$c1900_p_index;
 | 
			
		||||
    my $c1900_p_admin = $c1900->c1900_p_duplex_admin($partial) || {};
 | 
			
		||||
 | 
			
		||||
    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; 
 | 
			
		||||
    
 | 
			
		||||
    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; 
 | 
			
		||||
        $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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $c1900 = shift;
 | 
			
		||||
    my $i_name = $c1900->i_name2();
 | 
			
		||||
    my $c1900_p_name = $c1900->c1900_p_name();
 | 
			
		||||
    
 | 
			
		||||
    foreach my $port (keys %$c1900_p_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);
 | 
			
		||||
 | 
			
		||||
    $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 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 - Perl5 Interface to SNMP data from Cisco Catlyst 1900 Network Switches running CatOS
 | 
			
		||||
SNMP::Info::Layer2::C1900 - SNMP Interface to data from Cisco Catalyst 1900
 | 
			
		||||
Network Switches running CatOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -205,7 +281,6 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $c1900 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
@@ -217,13 +292,13 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a Catalyst 1900 device through SNMP. 
 | 
			
		||||
See SNMP::Info for full documentation
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not after determining
 | 
			
		||||
a more specific class using the method above. 
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $c1900 = new SNMP::Info::Layer2::C1900(...);
 | 
			
		||||
 | 
			
		||||
@@ -231,6 +306,12 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
@@ -239,18 +320,24 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)
 | 
			
		||||
=item F<STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)>
 | 
			
		||||
 | 
			
		||||
ESSWITCH-MIB is included in the Version 1 MIBS from Cisco.
 | 
			
		||||
F<ESSWITCH-MIB> is included in the Version 1 MIBs from Cisco.
 | 
			
		||||
 | 
			
		||||
They can be found at ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
MIBs listed in SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=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::Layer2/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
@@ -262,7 +349,7 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
Usually contains the version of the software loaded in flash.
 | 
			
		||||
Used by os_ver()
 | 
			
		||||
 | 
			
		||||
B<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
 | 
			
		||||
C<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
 | 
			
		||||
 | 
			
		||||
=item $c1900->os()
 | 
			
		||||
 | 
			
		||||
@@ -281,43 +368,92 @@ 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::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer2 for details.
 | 
			
		||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=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
 | 
			
		||||
 | 
			
		||||
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_name()
 | 
			
		||||
 | 
			
		||||
Crosses ifName with c1900_p_name() and returns the human set port name if exists.
 | 
			
		||||
Crosses C<ifName> with $c1900->c1900_p_name() and returns the human set port
 | 
			
		||||
name if exists.
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_type()
 | 
			
		||||
=item $c1900->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IID to port type
 | 
			
		||||
Returns a mapping between the interface and the VLAN / bridge group if overlap
 | 
			
		||||
is not enabled.
 | 
			
		||||
 | 
			
		||||
Takes the default ifType and overrides it with 
 | 
			
		||||
=item $c1900->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
c1900_p_type() and c1900_p_media()  if they exist.
 | 
			
		||||
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->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 STAND-ALONE-ETHERNET-SWITCH-MIB Switch Port Table Entries:
 | 
			
		||||
=head2 F<STAND-ALONE-ETHERNET-SWITCH-MIB> Switch Port Table Entries:
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
@@ -325,48 +461,81 @@ c1900_p_type() and c1900_p_media()  if they exist.
 | 
			
		||||
 | 
			
		||||
Maps the Switch Port Table to the IID
 | 
			
		||||
 | 
			
		||||
B<swPortIfIndex>
 | 
			
		||||
C<swPortIfIndex>
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_duplex()
 | 
			
		||||
 | 
			
		||||
Gives Port Duplex Info
 | 
			
		||||
 | 
			
		||||
B<swPortDuplexStatus>
 | 
			
		||||
(C<swPortDuplexStatus>)
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Gives admin setting for Duplex Info
 | 
			
		||||
 | 
			
		||||
B<swPortFullDuplex>
 | 
			
		||||
(C<swPortFullDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_name()
 | 
			
		||||
 | 
			
		||||
Gives human set name for port 
 | 
			
		||||
 | 
			
		||||
B<swPortName>
 | 
			
		||||
(C<swPortName>)
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_up_admin()
 | 
			
		||||
 | 
			
		||||
Gives Admin status of port enabled.
 | 
			
		||||
 | 
			
		||||
B<swPortAdminStatus>
 | 
			
		||||
(C<swPortAdminStatus>)
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_type()
 | 
			
		||||
 | 
			
		||||
Gives Type of port, ie. "general-ethernet"
 | 
			
		||||
Gives Type of port, i.e. C<"general-ethernet">
 | 
			
		||||
 | 
			
		||||
B<swPortMediaCapability>
 | 
			
		||||
(C<swPortMediaCapability>)
 | 
			
		||||
 | 
			
		||||
=item $c1900->c1900_p_media()
 | 
			
		||||
 | 
			
		||||
Gives the media of the port , ie "fiber-sc"
 | 
			
		||||
Gives the media of the port , i.e. "C<fiber-sc>"
 | 
			
		||||
 | 
			
		||||
B<swPortConnectorType>
 | 
			
		||||
(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::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer2 for details.
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
@@ -1,163 +1,232 @@
 | 
			
		||||
# SNMP::Info::Layer2::C2900
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoConfig
 | 
			
		||||
    SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer2::GLOBALS
 | 
			
		||||
            );
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,     %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::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',
 | 
			
		||||
            );
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,
 | 
			
		||||
    'i_name' => 'ifAlias',
 | 
			
		||||
 | 
			
		||||
%MIBS    = (
 | 
			
		||||
            %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
            'CISCO-C2900-MIB' =>  'ciscoC2900MIB'
 | 
			
		||||
            );
 | 
			
		||||
    # C2900PortEntry
 | 
			
		||||
    'c2900_p_index'        => 'c2900PortIfIndex',
 | 
			
		||||
    'c2900_p_duplex'       => 'c2900PortDuplexStatus',
 | 
			
		||||
    'c2900_p_duplex_admin' => 'c2900PortDuplexState',
 | 
			
		||||
    'c2900_p_speed_admin'  => 'c2900PortAdminSpeed',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE   = (%SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
            );
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,     %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MIBS, 'CISCO-C2900-MIB' => 'ciscoC2900MIB',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,     %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cisco_comm_indexing {
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $c2900 = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $interfaces     = $c2900->interfaces();
 | 
			
		||||
    my $c2900_p_index  = $c2900->c2900_p_index();
 | 
			
		||||
    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){
 | 
			
		||||
    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; 
 | 
			
		||||
    
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $i_duplex{$if}=$duplex; 
 | 
			
		||||
        $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   = 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){
 | 
			
		||||
    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; 
 | 
			
		||||
    
 | 
			
		||||
        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; 
 | 
			
		||||
        $i_duplex_admin{$if} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_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_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 $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){
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $port = $i_descr->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $port =~ s/\./\//g if( $port =~ /\d+\.\d+$/);
 | 
			
		||||
        $port =~ s/\./\//g if ( $port =~ /\d+\.\d+$/ );
 | 
			
		||||
        $port =~ s/[^\d\/,()\w]+//gi;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
        $if{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if
 | 
			
		||||
    return \%if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches running IOS
 | 
			
		||||
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches
 | 
			
		||||
running IOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
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 on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        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();
 | 
			
		||||
 my $class = $c2900->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
@@ -165,8 +234,8 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
C2900 device through SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not after determining
 | 
			
		||||
a more specific class using the method above. 
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $c2900 = new SNMP::Info::Layer2::C2900(...);
 | 
			
		||||
 | 
			
		||||
@@ -174,6 +243,14 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
@@ -182,12 +259,24 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item CISCO-C2900-MIB
 | 
			
		||||
=item F<CISCO-C2900-MIB>
 | 
			
		||||
 | 
			
		||||
Part of the v2 MIBs from Cisco.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
@@ -198,15 +287,35 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $c2900->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'cisco' :)
 | 
			
		||||
Returns 'cisco' :)
 | 
			
		||||
 | 
			
		||||
=item $c2900->cisco_comm_indexing()
 | 
			
		||||
 | 
			
		||||
Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer2 for details.
 | 
			
		||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
@@ -217,64 +326,118 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=item $c2900->interfaces()
 | 
			
		||||
 | 
			
		||||
    Returns reference to the map between IID and physical Port.
 | 
			
		||||
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.
 | 
			
		||||
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)
 | 
			
		||||
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.
 | 
			
		||||
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
 | 
			
		||||
Returns reference to map of IIDs to current link duplex
 | 
			
		||||
 | 
			
		||||
    Crosses $c2900->c2900_p_index() with $c2900->c2900_p_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;
 | 
			
		||||
    
 | 
			
		||||
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 
 | 
			
		||||
=head2 F<C2900-MIB> Port Entry Table 
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_index()
 | 
			
		||||
 | 
			
		||||
    Maps the Switch Port Table to the IID
 | 
			
		||||
Maps the Switch Port Table to the IID
 | 
			
		||||
 | 
			
		||||
    B<c2900PortIfIndex>
 | 
			
		||||
(C<c2900PortIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_duplex()
 | 
			
		||||
 | 
			
		||||
    Gives Port Duplex Info
 | 
			
		||||
Gives Port Duplex Info
 | 
			
		||||
 | 
			
		||||
    B<c2900PortDuplexStatus>
 | 
			
		||||
(C<c2900PortDuplexStatus>)
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_duplex_admin()
 | 
			
		||||
 | 
			
		||||
    Gives admin setting for Duplex Info
 | 
			
		||||
 | 
			
		||||
    B<c2900PortDuplexState>
 | 
			
		||||
Gives admin setting for Duplex Info
 | 
			
		||||
 | 
			
		||||
(C<c2900PortDuplexState>)
 | 
			
		||||
 | 
			
		||||
=item $c2900->c2900_p_speed_admin()
 | 
			
		||||
 | 
			
		||||
    Gives Admin speed of port 
 | 
			
		||||
Gives Admin speed of port 
 | 
			
		||||
 | 
			
		||||
    B<c2900PortAdminSpeed>
 | 
			
		||||
(C<c2900PortAdminSpeed>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer2 for details.
 | 
			
		||||
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 $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
 | 
			
		||||
 
 | 
			
		||||
@@ -1,127 +1,82 @@
 | 
			
		||||
# SNMP::Info::Layer2::Catalyst
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoStack;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoPortSecurity;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/ ;
 | 
			
		||||
@SNMP::Info::Layer2::Catalyst::ISA = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Catalyst::ISA
 | 
			
		||||
    = qw/SNMP::Info::CiscoStack SNMP::Info::CiscoVTP
 | 
			
		||||
    SNMP::Info::CDP SNMP::Info::CiscoStats
 | 
			
		||||
    SNMP::Info::CiscoPortSecurity
 | 
			
		||||
    SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
# See SNMP::Info for the details of these data structures and 
 | 
			
		||||
#       the interworkings.
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS =    ( %SNMP::Info::Layer2::MIBS, 
 | 
			
		||||
             'CISCO-STACK-MIB' => 'moduleType',
 | 
			
		||||
             'CISCO-VTP-MIB'   => 'vtpVlanIndex'
 | 
			
		||||
           );
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,     %SNMP::Info::CiscoPortSecurity::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MIBS,   %SNMP::Info::CiscoStack::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
            # these are in CISCO-STACK-MIB
 | 
			
		||||
            'sysip'       => 'sysIpAddr',    
 | 
			
		||||
            'netmask'     => 'sysNetMask',    
 | 
			
		||||
            'broadcast'   => 'sysBroadcast',
 | 
			
		||||
            'serial'      => 'chassisSerialNumber',    
 | 
			
		||||
            'model'       => 'chassisModel',    
 | 
			
		||||
            'ps1_type'    => 'chassisPs1Type',    
 | 
			
		||||
            'ps1_status'  => 'chassisPs1Status',    
 | 
			
		||||
            'ps2_type'    => 'chassisPs2Type',    
 | 
			
		||||
            'ps2_status'  => 'chassisPs2Status',    
 | 
			
		||||
            'slots'       => 'chassisNumSlots',    
 | 
			
		||||
            'fan'         => 'chassisFanStatus',
 | 
			
		||||
           );
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS =   (
 | 
			
		||||
            %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
            '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,     %SNMP::Info::CiscoPortSecurity::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS, %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,   %SNMP::Info::CiscoStack::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE =   (
 | 
			
		||||
            %SNMP::Info::Layer2::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);
 | 
			
		||||
}
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,     %SNMP::Info::CiscoPortSecurity::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MUNGE,   %SNMP::Info::CiscoStack::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Overidden Methods
 | 
			
		||||
 | 
			
		||||
@@ -132,105 +87,13 @@ sub i_physical {
 | 
			
		||||
    my $p_port = $cat->p_port();
 | 
			
		||||
 | 
			
		||||
    my %i_physical;
 | 
			
		||||
    foreach my $port (keys %$p_port) {
 | 
			
		||||
    foreach my $port ( keys %$p_port ) {
 | 
			
		||||
        my $iid = $p_port->{$port};
 | 
			
		||||
        $i_physical{$iid} = 1;  
 | 
			
		||||
        $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};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        $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';
 | 
			
		||||
}
 | 
			
		||||
@@ -240,16 +103,74 @@ sub os {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $cat = shift;
 | 
			
		||||
    my $cat    = shift;
 | 
			
		||||
    my $os_ver = $cat->SUPER::os_ver();
 | 
			
		||||
    return $os_ver if defined $os_ver;
 | 
			
		||||
 | 
			
		||||
    my $m_swver = $cat->m_swver();
 | 
			
		||||
    return undef unless defined $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 undef;
 | 
			
		||||
    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;
 | 
			
		||||
@@ -257,11 +178,12 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Catalyst - Perl5 Interface to Cisco devices running Catalyst OS 
 | 
			
		||||
SNMP::Info::Layer2::Catalyst - SNMP Interface to Cisco Catalyst devices
 | 
			
		||||
running Catalyst OS.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -269,7 +191,6 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $cat = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
@@ -281,18 +202,25 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info subclass to provide information for Cisco Catalyst switches running CatOS.
 | 
			
		||||
SNMP::Info subclass to provide information for Cisco Catalyst series switches
 | 
			
		||||
running CatOS.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
This class includes the Catalyst 2920, 4000, 5000, 6000 (hybrid mode)
 | 
			
		||||
families.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not after determining
 | 
			
		||||
a more specific class using the method above. 
 | 
			
		||||
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(...);
 | 
			
		||||
 | 
			
		||||
@@ -300,6 +228,16 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
@@ -308,13 +246,20 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item CISCO-STACK-MIB
 | 
			
		||||
 | 
			
		||||
=item CISCO-VTP-MIB
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See SNMP::Info::Layer2 for its own MIB requirements.
 | 
			
		||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
 | 
			
		||||
requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -326,22 +271,6 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cat->broadcast()
 | 
			
		||||
 | 
			
		||||
(B<sysBroadcast>)
 | 
			
		||||
 | 
			
		||||
=item $cat->fan()
 | 
			
		||||
 | 
			
		||||
(B<chassisFanStatus>)
 | 
			
		||||
 | 
			
		||||
=item $cat->model()
 | 
			
		||||
 | 
			
		||||
(B<chassisModel>)
 | 
			
		||||
 | 
			
		||||
=item $cat->netmask()
 | 
			
		||||
 | 
			
		||||
(B<sysNetMask>)
 | 
			
		||||
 | 
			
		||||
=item $cat->os()
 | 
			
		||||
 | 
			
		||||
Returns 'catalyst'
 | 
			
		||||
@@ -351,41 +280,41 @@ Returns 'catalyst'
 | 
			
		||||
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->ps1_type()
 | 
			
		||||
 | 
			
		||||
(B<chassisPs1Type>)
 | 
			
		||||
 | 
			
		||||
=item $cat->ps2_type()
 | 
			
		||||
 | 
			
		||||
(B<chassisPs2Type>)
 | 
			
		||||
 | 
			
		||||
=item $cat->ps1_status()
 | 
			
		||||
 | 
			
		||||
(B<chassisPs1Status>)
 | 
			
		||||
 | 
			
		||||
=item $cat->ps2_status()
 | 
			
		||||
 | 
			
		||||
(B<chassisPs2Status>)
 | 
			
		||||
 | 
			
		||||
=item $cat->serial()
 | 
			
		||||
 | 
			
		||||
(B<chassisSerialNumberString>)
 | 
			
		||||
 | 
			
		||||
=item $cat->slots()
 | 
			
		||||
 | 
			
		||||
(B<chassisNumSlots>)
 | 
			
		||||
 | 
			
		||||
=item $cat->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $cat->cisco_comm_indexing()
 | 
			
		||||
 | 
			
		||||
Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer2 for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
@@ -396,195 +325,52 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=item $cat->interfaces()
 | 
			
		||||
 | 
			
		||||
Crosses p_port() with i_index() to get physical names.
 | 
			
		||||
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->i_type()
 | 
			
		||||
=item $cat->bp_index()
 | 
			
		||||
 | 
			
		||||
Crosses p_port() with p_type() and returns the results. 
 | 
			
		||||
Returns reference to hash of bridge port table entries map back to interface
 | 
			
		||||
identifier (iid)
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
Crosses (C<portCrossIndex>) to (C<portIfIndex>) since some devices seem to
 | 
			
		||||
have problems with F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Module table
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
This table holds configuration information for each of the blades installed in
 | 
			
		||||
the Catalyst device.
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item $cat->m_type()
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
(B<moduleType>)
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item $cat->m_model()
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
(B<moduleModel>)
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item $cat->m_serial()
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
(B<moduleSerialNumber>)
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
 | 
			
		||||
details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer2 for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										521
									
								
								Info/Layer2/Centillion.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										521
									
								
								Info/Layer2/Centillion.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,521 @@
 | 
			
		||||
# SNMP::Info::Layer2::Centillion
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
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//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $centillion = new SNMP::Info::Layer2::centillion(...);
 | 
			
		||||
 
 | 
			
		||||
Note:  This class supports version 4.X and 5.X which are VLAN based rather
 | 
			
		||||
than bridge group based.
 | 
			
		||||
 | 
			
		||||
=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/"Required MIBs"> 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->layers()
 | 
			
		||||
 | 
			
		||||
Returns 00000011.  Class emulates Layer 2 functionality through proprietary
 | 
			
		||||
MIBs.
 | 
			
		||||
 | 
			
		||||
=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/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::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/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::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
 | 
			
		||||
							
								
								
									
										242
									
								
								Info/Layer2/Cisco.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								Info/Layer2/Cisco.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,242 @@
 | 
			
		||||
# SNMP::Info::Layer2::Cisco
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Cisco;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoImage;
 | 
			
		||||
use SNMP::Info::CiscoRTT;
 | 
			
		||||
use SNMP::Info::CiscoQOS;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoImage
 | 
			
		||||
    SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::Layer2
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,     %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoQOS::MIBS,   %SNMP::Info::CiscoRTT::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,        %SNMP::Info::CiscoVTP::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,     %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoQOS::GLOBALS,   %SNMP::Info::CiscoRTT::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,        %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,     %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoQOS::FUNCS,   %SNMP::Info::CiscoRTT::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,        %SNMP::Info::CiscoVTP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,     %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoQOS::MUNGE,   %SNMP::Info::CiscoRTT::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,        %SNMP::Info::CiscoVTP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
 | 
			
		||||
that are not covered in other 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 Cisco Routers running IOS
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=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::CiscoStats/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoQOS/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::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::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::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::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										267
									
								
								Info/Layer2/CiscoSB.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								Info/Layer2/CiscoSB.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,267 @@
 | 
			
		||||
# SNMP::Info::Layer2::CiscoSB
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2013 Nic Bernstein
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::CiscoSB;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::Entity;
 | 
			
		||||
use SNMP::Info::EtherLike;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::CiscoSB::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# This will be filled in with the device's index into the EntPhysicalEntry
 | 
			
		||||
# table by the serial() function.
 | 
			
		||||
our $index = undef;
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Entity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::EtherLike::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    'descr'  => 'sysDescr'
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::Entity::FUNCS,
 | 
			
		||||
    %SNMP::Info::EtherLike::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::Entity::MIBS,
 | 
			
		||||
    %SNMP::Info::EtherLike::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
    %SNMP::Info::Entity::MUNGE,
 | 
			
		||||
    %SNMP::Info::EtherLike::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Walk the entPhysicalSerialNum table and return both the first serial
 | 
			
		||||
# number found as well as the index of that entry.
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $ciscosb  = shift;
 | 
			
		||||
    my $serial   = undef;  
 | 
			
		||||
    my $e_serial = $ciscosb->e_serial();
 | 
			
		||||
 | 
			
		||||
    # Find entity table entry for this unit
 | 
			
		||||
    foreach my $e ( keys %$e_serial ) {
 | 
			
		||||
        if (defined ($e_serial->{$e}) and $e_serial->{$e} !~ /^\s*$/) {
 | 
			
		||||
            $index = $e;
 | 
			
		||||
            last;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $e_serial->{$index} if defined $index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $ciscosb = shift;
 | 
			
		||||
    my $os_ver  = $ciscosb->e_swver();
 | 
			
		||||
 | 
			
		||||
    return $os_ver->{$index} if defined $index;
 | 
			
		||||
}
 | 
			
		||||
  
 | 
			
		||||
# Grab e_model from Entity and tag on e_hwver
 | 
			
		||||
sub model {
 | 
			
		||||
    my $ciscosb = shift;
 | 
			
		||||
    my $e_model   = $ciscosb->e_model();
 | 
			
		||||
    my $e_hwver = $ciscosb->e_hwver();
 | 
			
		||||
 | 
			
		||||
    if (defined ($index)) {
 | 
			
		||||
        my $model = "$e_model->{$index} $e_hwver->{$index}";
 | 
			
		||||
        return $model;
 | 
			
		||||
    }
 | 
			
		||||
    return $ciscosb->description();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# ifDescr is the same for all interfaces in a class, but the ifName is
 | 
			
		||||
# unique, so let's use that for port name.
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $ciscosb = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $ciscosb->i_name($partial);
 | 
			
		||||
 | 
			
		||||
    return $interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::CiscoSB - SNMP Interface to Cisco Small Business series
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Nic Bernstein (shamelessly stolen from Max Baker's Aironet code)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $ciscosb = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $ciscosb->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides interface to SNMP Data available on Cisco Small Business (nee LinkSys)
 | 
			
		||||
managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1)]
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes
 | 
			
		||||
 | 
			
		||||
MIBs required by the inherited classes listed above.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns software version (entPhysicalSoftwareRev)
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number of unit (entPhysicalSerialNum)
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->model()
 | 
			
		||||
 | 
			
		||||
Returns model and hardware revision of unit (entPhysicalModelName+entPhysicalHardwareRev)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->interfaces()
 | 
			
		||||
 | 
			
		||||
Uses the i_name() field.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										724
									
								
								Info/Layer2/HP4000.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										724
									
								
								Info/Layer2/HP4000.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,724 @@
 | 
			
		||||
# 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 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//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::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 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 succesful, 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.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $hp = new SNMP::Info::Layer2::HP4000(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=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->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
 | 
			
		||||
							
								
								
									
										209
									
								
								Info/Layer2/HPVC.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								Info/Layer2/HPVC.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,209 @@
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::HPVC::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $hp = new SNMP::Info::Layer2::HPVC(...);
 | 
			
		||||
 | 
			
		||||
=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 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 MUNGES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 SET METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that provide SNMP set functionality for overridden methods
 | 
			
		||||
or provide a simpler interface to complex set operations.  See
 | 
			
		||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
 | 
			
		||||
operations. 
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										180
									
								
								Info/Layer2/Kentrox.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								Info/Layer2/Kentrox.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,180 @@
 | 
			
		||||
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 Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Kentrox::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Kentrox::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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 ( $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $dsserial = shift;
 | 
			
		||||
    my $serial = $dsserial->ds_sysinfo();
 | 
			
		||||
    if ( $serial =~ /SERIAL\s(\S+)/){
 | 
			
		||||
        my $str = substr($1,8,10);
 | 
			
		||||
        return $str;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'Kentrox';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $dsmodel = shift;
 | 
			
		||||
    my $descr = $dsmodel->description();
 | 
			
		||||
    if ( $descr =~ /^(\S+\s\S+)/){
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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     => 1
 | 
			
		||||
                        )
 | 
			
		||||
    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 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										248
									
								
								Info/Layer2/N2270.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								Info/Layer2/N2270.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,248 @@
 | 
			
		||||
# SNMP::Info::Layer2::N2270
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
use SNMP::Info::SONMP;
 | 
			
		||||
use SNMP::Info::Airespace;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::N2270::ISA
 | 
			
		||||
    = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::SONMP SNMP::Info::Airespace Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::N2270::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,        %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
    %SNMP::Info::SONMP::MIBS, %SNMP::Info::Airespace::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::GLOBALS,        %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
    %SNMP::Info::SONMP::GLOBALS, %SNMP::Info::Airespace::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,        %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
    %SNMP::Info::SONMP::FUNCS, %SNMP::Info::Airespace::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::MUNGE,        %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
    %SNMP::Info::SONMP::MUNGE, %SNMP::Info::Airespace::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $n2270 = new SNMP::Info::Layer2::N2270(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Airespace
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::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
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 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
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::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
 | 
			
		||||
							
								
								
									
										586
									
								
								Info/Layer2/NAP222x.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										586
									
								
								Info/Layer2/NAP222x.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,586 @@
 | 
			
		||||
# SNMP::Info::Layer2::NAP222x
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 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//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $nap222x = new SNMP::Info::Layer2::NAP222x(...);
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
							
								
								
									
										1299
									
								
								Info/Layer2/NWSS2300.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1299
									
								
								Info/Layer2/NWSS2300.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										494
									
								
								Info/Layer2/Netgear.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										494
									
								
								Info/Layer2/Netgear.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,494 @@
 | 
			
		||||
# SNMP::Info::Layer2::Netgear
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Netgear;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::Entity;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Netgear::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Entity SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# This will be filled in with the device's index into the EntPhysicalEntry
 | 
			
		||||
# table by the serial() function.
 | 
			
		||||
our $index = undef;
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::Entity::MIBS, %SNMP::Info::LLDP::MIBS, );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Entity::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    ng_fsosver   => '.1.3.6.1.4.1.4526.11.11.1.0',
 | 
			
		||||
    ng_gsmserial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
 | 
			
		||||
    ng_gsmosver  => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Entity::FUNCS, %SNMP::Info::LLDP::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Entity::MUNGE, %SNMP::Info::LLDP::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 Enitity-MIB, we've got to work our way through a bunch of
 | 
			
		||||
    # different locales...
 | 
			
		||||
    return $netgear->ng_gsmserial() if defined $netgear->model and $netgear->model =~ m/GSM\d/i;;
 | 
			
		||||
    return 'none';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# If device supports Entity-MIB, index into that to divine model and
 | 
			
		||||
# hardware version, otherwise default to sysDescr.
 | 
			
		||||
sub model {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    if (defined($index)) {
 | 
			
		||||
        my $model   = $netgear->e_descr();
 | 
			
		||||
        my $e_hwver = $netgear->e_hwver();
 | 
			
		||||
 | 
			
		||||
        $model = "$model->{$index} $e_hwver->{$index}";
 | 
			
		||||
        return $model;
 | 
			
		||||
    }
 | 
			
		||||
    return $netgear->description();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# ifDescr is the same for all interfaces in a class, but the ifName is
 | 
			
		||||
# unique, so let's use that for port name.  If all else fails, 
 | 
			
		||||
# concatentate ifDesc and ifIndex.
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $netgear->i_index($partial)       || {};
 | 
			
		||||
    my $i_descr    = $netgear->i_description($partial) || {};
 | 
			
		||||
    my $i_name     = $netgear->i_name($partial);
 | 
			
		||||
    my $i_isset    = ();
 | 
			
		||||
    # Replace the description with the ifName field, if set
 | 
			
		||||
    foreach my $iid ( keys %$i_name ) {
 | 
			
		||||
        my $name = $i_name->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
        if (defined $name and $name !~ /^\s*$/) {
 | 
			
		||||
            $interfaces->{$iid} = $name;
 | 
			
		||||
            $i_isset->{$iid} = 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    # Replace the Index with the ifDescr field, appended with index
 | 
			
		||||
    # number, to deal with devices with non-unique ifDescr.
 | 
			
		||||
    foreach my $iid ( keys %$i_descr ) {
 | 
			
		||||
        my $port = $i_descr->{$iid} . '-' . $iid;
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if (defined $i_isset->{$iid} and $i_isset->{$iid} == 1);
 | 
			
		||||
        $interfaces->{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# This is model-dependent.  Some netgear brand devices don't implement
 | 
			
		||||
# the bridge MIB forwarding table, so we use the Q-BRIDGE-MIB forwarding
 | 
			
		||||
# table.  Fall back to the orig functions if the qb versions don't
 | 
			
		||||
# return anything.
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $ret     = $netgear->qb_fw_mac();
 | 
			
		||||
    $ret = $netgear->orig_fw_mac() if ( !defined($ret) );
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $ret     = $netgear->qb_fw_port();
 | 
			
		||||
    $ret = $netgear->orig_fw_port() if ( !defined($ret) );
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# these seem to work for GSM models but not GS
 | 
			
		||||
# https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $serial  = $netgear->serial(); # Make sure that index gets primed
 | 
			
		||||
    if (defined($index)) {
 | 
			
		||||
        my $os_ver  = $netgear->e_swver();
 | 
			
		||||
        return $os_ver->{$index} if defined $os_ver;
 | 
			
		||||
    }
 | 
			
		||||
    return $netgear->ng_gsmosver() if defined  $netgear->model and $netgear->model =~ m/GSM\d/i;
 | 
			
		||||
    return $netgear->ng_fsosver() if defined  $netgear->model and $netgear->model =~ m/FS\d/i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    return $netgear->hasLLDP() || $netgear->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $netgear->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $netgear->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $netgear->lldp_if($partial)     || {};
 | 
			
		||||
    my $cdp  = $netgear->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $netgear->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $netgear->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $netgear->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $netgear->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $id = $lldp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $netgear->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $netgear->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__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
 | 
			
		||||
=item SNMP::Info::Entity
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
 | 
			
		||||
classes.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=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 $netgear->fw_mac()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table MAC Addresses.
 | 
			
		||||
 | 
			
		||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
 | 
			
		||||
the C<Q-BRIDGE-MIB> forwarding table.  Fall back to the C<BRIDGE-MIB> if
 | 
			
		||||
C<Q-BRIDGE-MIB> doesn't return anything.
 | 
			
		||||
 | 
			
		||||
=item $netgear->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries port interface
 | 
			
		||||
identifier (iid)
 | 
			
		||||
 | 
			
		||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
 | 
			
		||||
the C<Q-BRIDGE-MIB> forwarding table.  Fall back to the C<BRIDGE-MIB> if
 | 
			
		||||
C<Q-BRIDGE-MIB> doesn't return anything.
 | 
			
		||||
 | 
			
		||||
=item $netgear->interfaces()
 | 
			
		||||
 | 
			
		||||
Uses the i_name() field.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the software version devices may support Link Layer Discovery 
 | 
			
		||||
Protocol (LLDP).
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netgear->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running LLDP.
 | 
			
		||||
 | 
			
		||||
=item $netgear->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $netgear->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-LLDP device in between two or
 | 
			
		||||
more devices or multiple devices which are not directly connected.  
 | 
			
		||||
 | 
			
		||||
Use the data from the Layer2 Topology Table below to dig deeper.
 | 
			
		||||
 | 
			
		||||
=item $netgear->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $netgear->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $netgear->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										312
									
								
								Info/Layer2/Orinoco.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										312
									
								
								Info/Layer2/Orinoco.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,312 @@
 | 
			
		||||
# SNMP::Info::Layer2::Orinoco
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 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//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MIBS,
 | 
			
		||||
 | 
			
		||||
    #'ORiNOCO-MIB' => 'orinoco',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS
 | 
			
		||||
    = ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # ORiNOCO-MIB:oriWirelessIfPropertiesTable
 | 
			
		||||
    #'ori_ssid'       => 'oriWirelessIfNetworkName',
 | 
			
		||||
    #'ori_channel'    => 'oriWirelessIfChannel',
 | 
			
		||||
    #'ori_closed_sys' => 'oriWirelessIfClosedSystem',
 | 
			
		||||
    # ORiNOCO-MIB:oriSystemInvMgmtComponentTable
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, );
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#sub i_ssidbcast {
 | 
			
		||||
#    my $orinoco = shift;
 | 
			
		||||
#    my $partial = shift;
 | 
			
		||||
#
 | 
			
		||||
#    my $bcast = $orinoco->ori_closed_sys($partial) || {};
 | 
			
		||||
#
 | 
			
		||||
#    my %i_ssidbcast;
 | 
			
		||||
#    foreach my $iid (keys %$bcast){
 | 
			
		||||
#        my $bc   = $bcast->{$iid};
 | 
			
		||||
#        next unless defined $bc;
 | 
			
		||||
#
 | 
			
		||||
#        $i_ssidbcast{$iid} = $bc;
 | 
			
		||||
#    }
 | 
			
		||||
#    return \%i_ssidbcast;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $orinoco = new SNMP::Info::Layer2::Orinoco(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
							
								
								
									
										1303
									
								
								Info/Layer2/Trapeze.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1303
									
								
								Info/Layer2/Trapeze.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										225
									
								
								Info/Layer2/ZyXEL_DSLAM.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								Info/Layer2/ZyXEL_DSLAM.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,225 @@
 | 
			
		||||
# SNMP::Info::Layer2::ZyXEL_DSLAM
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::ZyXEL_DSLAM;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::ZyXEL_DSLAM::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::ZyXEL_DSLAM::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    'ip_adresses'   => 'ipAdEntAddr',
 | 
			
		||||
    'i_name'        => 'ifDescr',
 | 
			
		||||
    'i_description' => 'adslLineConfProfile',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS
 | 
			
		||||
    = ( %SNMP::Info::Layer2::MIBS, 'ADSL-LINE-MIB' => 'adslLineConfProfile' );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE );
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
    my $zyxel  = shift;
 | 
			
		||||
    my $layers = $zyxel->layers();
 | 
			
		||||
    return $layers if defined $layers;
 | 
			
		||||
 | 
			
		||||
    # If these don't claim to have any layers, so we'll give them 1+2
 | 
			
		||||
    return '00000011';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'zyxel';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'zyxel';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $zyxel = shift;
 | 
			
		||||
    my $descr = $zyxel->description();
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/version (\S+) / ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $zyxel = shift;
 | 
			
		||||
 | 
			
		||||
    my $desc = $zyxel->description();
 | 
			
		||||
 | 
			
		||||
    if ( $desc =~ /8-port ADSL Module\(Annex A\)/ ) {
 | 
			
		||||
        return "AAM1008-61";
 | 
			
		||||
    }
 | 
			
		||||
    elsif ( $desc =~ /8-port ADSL Module\(Annex B\)/ ) {
 | 
			
		||||
        return "AAM1008-63";
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ip {
 | 
			
		||||
    my $zyxel   = shift;
 | 
			
		||||
    my $ip_hash = $zyxel->ip_addresses();
 | 
			
		||||
    my $found_ip;
 | 
			
		||||
 | 
			
		||||
    foreach my $ip ( keys %{$ip_hash} ) {
 | 
			
		||||
        $found_ip = $ip
 | 
			
		||||
            if ( defined $ip
 | 
			
		||||
            and $ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ );
 | 
			
		||||
    }
 | 
			
		||||
    return $found_ip;
 | 
			
		||||
}
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::ZyXEL_DSLAM - SNMP Interface to ZyXEL DSLAM
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Dmitry Sergienko (C<dmitry@trifle.net>)
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $zyxel = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myhub',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $l2->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
ZyXEL device through SNMP. See inherited classes' documentation for 
 | 
			
		||||
inherited methods.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ADSL-LINE-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes
 | 
			
		||||
 | 
			
		||||
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and their inherited
 | 
			
		||||
classes.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $zyxel->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'ZyXEL' :)
 | 
			
		||||
 | 
			
		||||
=item $zyxel->os()
 | 
			
		||||
 | 
			
		||||
Returns 'ZyXEL' 
 | 
			
		||||
 | 
			
		||||
=item $zyxel->os_ver()
 | 
			
		||||
 | 
			
		||||
Culls Version from description()
 | 
			
		||||
 | 
			
		||||
=item $zyxel->ip()
 | 
			
		||||
 | 
			
		||||
Returns IP Address of DSLAM.
 | 
			
		||||
 | 
			
		||||
(C<ipAdEntAddr>)
 | 
			
		||||
 | 
			
		||||
=item $zyxel->model()
 | 
			
		||||
 | 
			
		||||
Tries to cull out model out of the description field.
 | 
			
		||||
 | 
			
		||||
=item $zyxel->layers()
 | 
			
		||||
 | 
			
		||||
Returns 00000011.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $zyxel->i_name()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to port name (C<ifDescr>).
 | 
			
		||||
 | 
			
		||||
=item $zyxel->i_description()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to human-set port description (profile name).
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										689
									
								
								Info/Layer3.pm
									
									
									
									
									
								
							
							
						
						
									
										689
									
								
								Info/Layer3.pm
									
									
									
									
									
								
							@@ -1,134 +1,201 @@
 | 
			
		||||
# SNMP::Info::Layer3 - SNMP Interface to Layer3 devices
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
use SNMP::Info::EtherLike;
 | 
			
		||||
use SNMP::Info::Entity;
 | 
			
		||||
use SNMP::Info::PowerEthernet;
 | 
			
		||||
use SNMP::Info::IPv6;
 | 
			
		||||
use SNMP::Info::AdslLine;
 | 
			
		||||
 | 
			
		||||
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 SNMP::Info::CiscoStats Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::ISA = qw/
 | 
			
		||||
    SNMP::Info::PowerEthernet SNMP::Info::IPv6
 | 
			
		||||
    SNMP::Info::Entity SNMP::Info::EtherLike
 | 
			
		||||
    SNMP::Info::Bridge SNMP::Info::AdslLine
 | 
			
		||||
    SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS,
 | 
			
		||||
          %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
          %SNMP::Info::CDP::MIBS,
 | 
			
		||||
          %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
          %SNMP::Info::EtherLike::MIBS,
 | 
			
		||||
          'ENTITY-MIB'         => 'entPhysicalName',
 | 
			
		||||
          'CISCO-PRODUCTS-MIB' => 'sysName',
 | 
			
		||||
          'OSPF-MIB'           => 'ospfRouterId',
 | 
			
		||||
        );
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
    %SNMP::Info::AdslLine::MIBS,
 | 
			
		||||
    %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
    %SNMP::Info::EtherLike::MIBS,
 | 
			
		||||
    %SNMP::Info::Entity::MIBS,
 | 
			
		||||
    %SNMP::Info::PowerEthernet::MIBS,
 | 
			
		||||
    %SNMP::Info::IPv6::MIBS,
 | 
			
		||||
    'IP-MIB'   => 'ipNetToMediaIfIndex',
 | 
			
		||||
    'OSPF-MIB' => 'ospfRouterId',
 | 
			
		||||
    'BGP4-MIB' => 'bgpIdentifier',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            # Inherit the super class ones
 | 
			
		||||
            %SNMP::Info::GLOBALS,
 | 
			
		||||
            %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
            %SNMP::Info::CiscoStats::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::CiscoStats::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'
 | 
			
		||||
           );
 | 
			
		||||
    # Inherit the super class ones
 | 
			
		||||
    %SNMP::Info::GLOBALS,
 | 
			
		||||
    %SNMP::Info::AdslLine::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
    %SNMP::Info::EtherLike::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Entity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::PowerEthernet::GLOBALS,
 | 
			
		||||
    %SNMP::Info::IPv6::GLOBALS,
 | 
			
		||||
    'mac' => 'ifPhysAddress.1',
 | 
			
		||||
    'serial1' =>
 | 
			
		||||
        '.1.3.6.1.4.1.9.3.6.3.0',    # OLD-CISCO-CHASSIS-MIB::chassisId.0
 | 
			
		||||
    'router_ip'    => 'ospfRouterId.0',
 | 
			
		||||
    'bgp_id'       => 'bgpIdentifier.0',
 | 
			
		||||
    'bgp_local_as' => 'bgpLocalAs.0',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,
 | 
			
		||||
    %SNMP::Info::AdslLine::FUNCS,
 | 
			
		||||
    %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
    %SNMP::Info::EtherLike::FUNCS,
 | 
			
		||||
    %SNMP::Info::Entity::FUNCS,
 | 
			
		||||
    %SNMP::Info::PowerEthernet::FUNCS,
 | 
			
		||||
    %SNMP::Info::IPv6::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # Obsolete Address Translation Table (ARP Cache)
 | 
			
		||||
    'old_at_index'   => 'atIfIndex',
 | 
			
		||||
    'old_at_paddr'   => 'atPhysAddress',
 | 
			
		||||
    'old_at_netaddr' => 'atNetAddress',
 | 
			
		||||
 | 
			
		||||
    # IP-MIB IP Net to Media Table (ARP Cache)
 | 
			
		||||
    'at_index'   => 'ipNetToMediaIfIndex',
 | 
			
		||||
    'at_paddr'   => 'ipNetToMediaPhysAddress',
 | 
			
		||||
    'at_netaddr' => 'ipNetToMediaNetAddress',
 | 
			
		||||
 | 
			
		||||
    # OSPF-MIB::ospfIfTable
 | 
			
		||||
    'ospf_if_ip'    => 'ospfIfIpAddress',
 | 
			
		||||
    'ospf_if_area'  => 'ospfIfAreaId',
 | 
			
		||||
    'ospf_if_type'  => 'ospfIfType',
 | 
			
		||||
    'ospf_if_hello' => 'ospfIfHelloInterval',
 | 
			
		||||
    'ospf_if_dead'  => 'ospfIfRtrDeadInterval',
 | 
			
		||||
    'ospf_if_admin' => 'ospfIfAdminStat',
 | 
			
		||||
    'ospf_if_state' => 'ospfIfState',
 | 
			
		||||
 | 
			
		||||
    # OSPF-MIB::ospfNbrTable
 | 
			
		||||
    'ospf_ip'         => 'ospfHostIpAddress',
 | 
			
		||||
    'ospf_peers'      => 'ospfNbrIpAddr',
 | 
			
		||||
    'ospf_peer_id'    => 'ospfNbrRtrId',
 | 
			
		||||
    'ospf_peer_state' => 'ospfNbrState',
 | 
			
		||||
 | 
			
		||||
    # BGP4-MIB::bgpPeerTable
 | 
			
		||||
    'bgp_peers'               => 'bgpPeerLocalAddr',
 | 
			
		||||
    'bgp_peer_id'             => 'bgpPeerIdentifier',
 | 
			
		||||
    'bgp_peer_state'          => 'bgpPeerState',
 | 
			
		||||
    'bgp_peer_as'             => 'bgpPeerRemoteAs',
 | 
			
		||||
    'bgp_peer_addr'           => 'bgpPeerRemoteAddr',
 | 
			
		||||
    'bgp_peer_fsm_est_trans'  => 'bgpPeerFsmEstablishedTransitions',
 | 
			
		||||
    'bgp_peer_in_tot_msgs'    => 'bgpPeerInTotalMessages',
 | 
			
		||||
    'bgp_peer_in_upd_el_time' => 'bgpPeerInUpdateElapsedTime',
 | 
			
		||||
    'bgp_peer_in_upd'         => 'bgpPeerInUpdates',
 | 
			
		||||
    'bgp_peer_out_tot_msgs'   => 'bgpPeerOutTotalMessages',
 | 
			
		||||
    'bgp_peer_out_upd'        => 'bgpPeerOutUpdates',
 | 
			
		||||
 | 
			
		||||
    # IP-MIB Net to Physical Table (ARP Cache)
 | 
			
		||||
    'n2p_paddr' => 'ipNetToPhysicalPhysAddress',
 | 
			
		||||
    'n2p_lastupdate' => 'ipNetToPhysicalLastUpdated',
 | 
			
		||||
    'n2p_ptype' => 'ipNetToPhysicalType',
 | 
			
		||||
    'n2p_pstate' => 'ipNetToPhysicalState',
 | 
			
		||||
    'n2p_pstatus' => 'ipNetToPhysicalRowStatus',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
            # Inherit all the built in munging
 | 
			
		||||
            %SNMP::Info::MUNGE,
 | 
			
		||||
            %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
            %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
            %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
            %SNMP::Info::EtherLike::MUNGE,
 | 
			
		||||
            'at_paddr' => \&SNMP::Info::munge_mac,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::MUNGE,
 | 
			
		||||
    %SNMP::Info::AdslLine::MUNGE,
 | 
			
		||||
    %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
    %SNMP::Info::EtherLike::MUNGE,
 | 
			
		||||
    %SNMP::Info::Entity::MUNGE,
 | 
			
		||||
    %SNMP::Info::PowerEthernet::MUNGE,
 | 
			
		||||
    %SNMP::Info::IPv6::MUNGE,
 | 
			
		||||
    'old_at_paddr' => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'at_paddr'     => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'n2p_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();
 | 
			
		||||
    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){
 | 
			
		||||
    # if the router ip exists and is a route advertised by the device we prefer
 | 
			
		||||
    # it over the others
 | 
			
		||||
    return $router_ip
 | 
			
		||||
        if (( defined $router_ip )
 | 
			
		||||
        and ( $router_ip ne '0.0.0.0' )
 | 
			
		||||
        and ( grep { $ospf_ip->{$_} eq $router_ip } (keys %$ospf_ip))
 | 
			
		||||
        and ( $l3->snmp_connect_ip($router_ip) ) );
 | 
			
		||||
 | 
			
		||||
    # return the first one found here (should be only one)
 | 
			
		||||
    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;
 | 
			
		||||
            next if $ip eq '0.0.0.0';
 | 
			
		||||
            next unless $l3->snmp_connect_ip($ip);
 | 
			
		||||
            print " SNMP::Layer3::root_ip() using $ip\n" if $l3->debug();
 | 
			
		||||
            return $ip;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $router_ip if defined $router_ip;
 | 
			
		||||
    return undef;
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $interfaces = $l3->interfaces();
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l3->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if (keys %$interfaces) {
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
 | 
			
		||||
        # lo -> cisco aironet 350 loopback
 | 
			
		||||
        if ($interfaces->{$if} =~ /(tunnel|loopback|lo|null)/i){
 | 
			
		||||
        if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|null)/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -137,20 +204,41 @@ sub i_ignore {
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $chassis = $l3->chassis();
 | 
			
		||||
    
 | 
			
		||||
    return $1 if (defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i);
 | 
			
		||||
 | 
			
		||||
    my $serial1  = $l3->serial1();
 | 
			
		||||
    my $e_descr  = $l3->e_descr() || {};
 | 
			
		||||
    my $e_serial = $l3->e_serial() || {};
 | 
			
		||||
 | 
			
		||||
    my $serial2 = $e_serial->{1} || undef;
 | 
			
		||||
    my $chassis = $e_descr->{1}  || undef;
 | 
			
		||||
 | 
			
		||||
    # precedence
 | 
			
		||||
    #   serial2,chassis parse,serial1
 | 
			
		||||
    return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
 | 
			
		||||
    return $1
 | 
			
		||||
        if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
 | 
			
		||||
    return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $l3->model() - the sysObjectID returns an IID to an entry in 
 | 
			
		||||
# $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();
 | 
			
		||||
 | 
			
		||||
    unless ( defined $id ) {
 | 
			
		||||
        print
 | 
			
		||||
            " SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
 | 
			
		||||
            if $l3->debug();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^cisco//i;
 | 
			
		||||
    $model =~ s/^catalyst//;
 | 
			
		||||
    $model =~ s/^cat//;
 | 
			
		||||
@@ -158,31 +246,35 @@ sub 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 $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $l3->i_index($partial);
 | 
			
		||||
    my $i_alias = $l3->i_alias($partial);
 | 
			
		||||
    my $i_name2 = $l3->orig_i_name($partial);
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
    foreach my $iid (keys %$i_name2){
 | 
			
		||||
        my $name = $i_name2->{$iid};
 | 
			
		||||
    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;
 | 
			
		||||
        $i_name{$iid}
 | 
			
		||||
            = ( defined $alias and $alias !~ /^\s*$/ )
 | 
			
		||||
            ? $alias
 | 
			
		||||
            : $name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $el_index  = $l3->el_index($partial);
 | 
			
		||||
    my $el_duplex = $l3->el_duplex($partial);
 | 
			
		||||
 | 
			
		||||
    my $el_index = $l3->el_index();
 | 
			
		||||
    my $el_duplex = $l3->el_duplex();
 | 
			
		||||
    
 | 
			
		||||
    my %i_index;
 | 
			
		||||
    foreach my $el_port (keys %$el_duplex){
 | 
			
		||||
    foreach my $el_port ( keys %$el_duplex ) {
 | 
			
		||||
        my $iid = $el_index->{$el_port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
        my $duplex = $el_duplex->{$el_port};
 | 
			
		||||
@@ -198,18 +290,20 @@ sub i_duplex {
 | 
			
		||||
 | 
			
		||||
# $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 $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces   = $l3->i_index($partial);
 | 
			
		||||
    my $descriptions = $l3->i_description($partial);
 | 
			
		||||
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $desc = $descriptions->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
 | 
			
		||||
        $interfaces{$iid} = $desc;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -217,21 +311,52 @@ sub vendor {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $l3->description();
 | 
			
		||||
    my $id = $l3->id();
 | 
			
		||||
 | 
			
		||||
    return 'cisco' if ($descr =~ /(cisco|ios)/i);
 | 
			
		||||
    return 'foundry' if ($descr =~ /foundry/i);
 | 
			
		||||
    # .1.3.6.1.4.1.9.1 is the CISCO-PRODUCTS-MIB
 | 
			
		||||
    # .1.3.6.1.4.1.9.9.368.4 is an old tree that Cisco CSSs were numbered from
 | 
			
		||||
    return 'cisco'   if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/;
 | 
			
		||||
    return 'cisco'   if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/;
 | 
			
		||||
    return 'cisco'   if ( $descr =~ /(cisco|\bios\b)/i );
 | 
			
		||||
    return 'brocade' if ( $descr =~ /foundry/i );
 | 
			
		||||
 | 
			
		||||
    return 'unknown';
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub at_index {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $l3->orig_at_index($partial) || $l3->old_at_index($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub at_paddr {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $l3->orig_at_paddr($partial) || $l3->old_at_paddr($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub at_netaddr {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $l3->orig_at_netaddr($partial) || $l3->old_at_netaddr($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3 - Perl5 Interface to network devices serving Layer3 or Layers 2 & 3
 | 
			
		||||
SNMP::Info::Layer3 - SNMP Interface to network devices serving Layer3 or
 | 
			
		||||
Layers 2 & 3
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -239,14 +364,13 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $l3 = 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      = $l3->class();
 | 
			
		||||
 my $class = $l3->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
 # Let's get some basic Port information
 | 
			
		||||
@@ -262,14 +386,15 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This class is usually used as a superclass for more specific device classes listed under 
 | 
			
		||||
SNMP::Info::Layer3::*   Please read all docs under SNMP::Info first.
 | 
			
		||||
This class is usually used as a superclass for more specific device classes
 | 
			
		||||
listed under SNMP::Info::Layer3::*   Please read all docs under SNMP::Info
 | 
			
		||||
first.
 | 
			
		||||
 | 
			
		||||
Provides generic methods for accessing SNMP data for Layer 3 network devices. 
 | 
			
		||||
Includes support for Layer2+3 devices. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not after determining
 | 
			
		||||
a more specific class using the method above. 
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $l3 = new SNMP::Info::Layer3(...);
 | 
			
		||||
 | 
			
		||||
@@ -279,33 +404,43 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
=item SNMP::Info::Bridge (For L2/L3 devices)
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::PowerEthernet
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::IPv6
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item CISCO-PRODUCTS-MIB
 | 
			
		||||
=item F<IP-MIB>
 | 
			
		||||
 | 
			
		||||
=item ENTITY-MIB
 | 
			
		||||
=item F<OSPF-MIB>
 | 
			
		||||
 | 
			
		||||
=item OSPF-MIB
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes
 | 
			
		||||
 | 
			
		||||
MIBs required by the inherited classes listed above.
 | 
			
		||||
=item F<BGP4-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::EtherLike/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::PowerEthernet/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IPv6/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
@@ -313,21 +448,27 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l3->chassis()
 | 
			
		||||
 | 
			
		||||
Returns Chassis type (model).
 | 
			
		||||
 | 
			
		||||
(B<entPhysicalDescr.1>)
 | 
			
		||||
 | 
			
		||||
=item $l3->mac()
 | 
			
		||||
 | 
			
		||||
Returns root port mac address
 | 
			
		||||
 | 
			
		||||
(B<ifPhysAddress.1>)
 | 
			
		||||
(C<ifPhysAddress.1>)
 | 
			
		||||
 | 
			
		||||
=item $l3->router_ip()
 | 
			
		||||
 | 
			
		||||
(B<ospfRouterId.0>)
 | 
			
		||||
(C<ospfRouterId.0>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_id()
 | 
			
		||||
 | 
			
		||||
(C<bgpIdentifier.0>)
 | 
			
		||||
 | 
			
		||||
Returns the BGP identifier of the local system
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_local_as()
 | 
			
		||||
 | 
			
		||||
Returns the local autonomous system number 
 | 
			
		||||
 | 
			
		||||
(C<bgpLocalAs.0>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -337,41 +478,44 @@ Returns root port mac address
 | 
			
		||||
 | 
			
		||||
=item $l3->model()
 | 
			
		||||
 | 
			
		||||
Trys to reference $l3->id() to one of the product MIBs listed above
 | 
			
		||||
Tries to reference $l3->id() to one of the product MIBs listed above
 | 
			
		||||
 | 
			
		||||
Removes 'cisco'  from cisco devices for readability.
 | 
			
		||||
 | 
			
		||||
=item $l3->serial()
 | 
			
		||||
 | 
			
		||||
Trys to cull a serial number from $l3->chassis()
 | 
			
		||||
Tries to cull a serial number from F<ENTITY-MIB>, description, and
 | 
			
		||||
F<OLD-CISCO->... MIB.
 | 
			
		||||
 | 
			
		||||
=item $l3->vendor()
 | 
			
		||||
 | 
			
		||||
Trys to cull a Vendor name from B<sysDescr>
 | 
			
		||||
Tries to cull a Vendor name from C<sysDescr>
 | 
			
		||||
 | 
			
		||||
=item $l3->root_ip()
 | 
			
		||||
 | 
			
		||||
Returns the primary IP used to communicate with the device.  Returns the first
 | 
			
		||||
found:  OSPF Router ID (C<ospfRouterId>) or any OSPF Host IP Address
 | 
			
		||||
(C<ospfHostIpAddress>).
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info for details.
 | 
			
		||||
See L<SNMP::Info/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Bridge
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Bridge for details.
 | 
			
		||||
See L<SNMP::Info::Bridge/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::CDP for details.
 | 
			
		||||
See L<SNMP::Info::EtherLike/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::CiscoStats for details.
 | 
			
		||||
See L<SNMP::Info::Entity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::EtherLike for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
@@ -382,7 +526,8 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=item $l3->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns the map between SNMP Interface Identifier (iid) and physical port name. 
 | 
			
		||||
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()
 | 
			
		||||
 | 
			
		||||
@@ -396,7 +541,7 @@ Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to human set name. 
 | 
			
		||||
 | 
			
		||||
Defaults to B<ifName>, but checks for an B<ifAlias>
 | 
			
		||||
Defaults to C<ifName>, but checks for an C<ifAlias>
 | 
			
		||||
 | 
			
		||||
=item $l3->i_duplex()
 | 
			
		||||
 | 
			
		||||
@@ -405,52 +550,244 @@ 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.
 | 
			
		||||
See L<SNMP::Info::Etherlike> for the el_index() and el_duplex() methods.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 ARP Cache Entries
 | 
			
		||||
=head2 F<IP-MIB> Arp Cache Table (C<ipNetToMediaTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l3->at_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IID to Arp Cache Entry
 | 
			
		||||
Returns reference to hash.  Maps ARP table entries to Interface IIDs 
 | 
			
		||||
 | 
			
		||||
(B<atIfIndex>)
 | 
			
		||||
(C<ipNetToMediaIfIndex>)
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<ipNetToMediaIfIndex>, this will try
 | 
			
		||||
the deprecated C<atIfIndex>.
 | 
			
		||||
 | 
			
		||||
=item $l3->at_paddr()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of Arp Cache Entries to MAC address
 | 
			
		||||
Returns reference to hash.  Maps ARP table entries to MAC addresses. 
 | 
			
		||||
 | 
			
		||||
(B<atPhysAddress>)
 | 
			
		||||
(C<ipNetToMediaPhysAddress>)
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<ipNetToMediaPhysAddress>, this will try
 | 
			
		||||
the deprecated C<atPhysAddress>.
 | 
			
		||||
 | 
			
		||||
=item $l3->at_netaddr()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps ARP table entries to IP addresses. 
 | 
			
		||||
 | 
			
		||||
(C<ipNetToMediaNetAddress>)
 | 
			
		||||
 | 
			
		||||
If the device doesn't support C<ipNetToMediaNetAddress>, this will try
 | 
			
		||||
the deprecated C<atNetAddress>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 ARP Cache Entries
 | 
			
		||||
 | 
			
		||||
The C<atTable> has been deprecated since 1991.  You should never need
 | 
			
		||||
to use these methods.  See C<ipNetToMediaTable> above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l3->old_at_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IID to Arp Cache Entry
 | 
			
		||||
 | 
			
		||||
(C<atIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $l3->old_at_paddr()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of Arp Cache Entries to MAC address
 | 
			
		||||
 | 
			
		||||
(C<atPhysAddress>)
 | 
			
		||||
 | 
			
		||||
=item $l3->old_at_netaddr()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of Arp Cache Entries to IP Address
 | 
			
		||||
 | 
			
		||||
(B<atNetAddress>)
 | 
			
		||||
(C<atNetAddress>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 BGP Peer Table (C<bgpPeerTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peers()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to local IP address
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerLocalAddr>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peer_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to BGP peer identifier
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerIdentifier>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peer_state()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to BGP peer state
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerState>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peer_as()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to BGP peer autonomous system number
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerRemoteAs>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peer_addr()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to BGP peer IP address
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerRemoteAddr>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peer_fsm_est_trans()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to the total number of times the BGP FSM
 | 
			
		||||
transitioned into the established state
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerFsmEstablishedTransitions>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peer_in_tot_msgs()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to the total number of messages received
 | 
			
		||||
from the remote peer on this connection
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerInTotalMessages>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peer_in_upd_el_time()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to the elapsed time in seconds since
 | 
			
		||||
the last BGP UPDATE message was received from the peer.
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerInUpdateElapsedTime>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peer_in_upd()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to the number of BGP UPDATE messages
 | 
			
		||||
received on this connection
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerInUpdates>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peer_out_tot_msgs()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to the total number of messages
 | 
			
		||||
transmitted to the remote peer on this connection
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerOutTotalMessages>)
 | 
			
		||||
 | 
			
		||||
=item $l3->bgp_peer_out_upd()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of BGP peer to the number of BGP UPDATE messages
 | 
			
		||||
transmitted on this connection
 | 
			
		||||
 | 
			
		||||
(C<bgpPeerOutUpdates>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 OSPF Interface Table (C<ospfIfTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l3->ospf_if_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of OSPF interface IP addresses
 | 
			
		||||
 | 
			
		||||
(C<ospfIfIpAddress>)
 | 
			
		||||
 | 
			
		||||
=item $l3->ospf_if_area()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of the OSPF area to which the interfaces connect
 | 
			
		||||
 | 
			
		||||
(C<ospfIfAreaId>)
 | 
			
		||||
 | 
			
		||||
=item $l3->ospf_if_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of the OSPF interfaces' type
 | 
			
		||||
 | 
			
		||||
(C<ospfIfType>)
 | 
			
		||||
 | 
			
		||||
=item $l3->ospf_if_hello()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of the OSPF interfaces' hello interval
 | 
			
		||||
 | 
			
		||||
(C<ospfIfHelloInterval>)
 | 
			
		||||
 | 
			
		||||
=item $l3->ospf_if_dead()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of the OSPF interfaces' dead interval
 | 
			
		||||
 | 
			
		||||
(C<ospfIfRtrDeadInterval>)
 | 
			
		||||
 | 
			
		||||
=item $l3->ospf_if_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of the OSPF interfaces' administrative status
 | 
			
		||||
 | 
			
		||||
(C<ospfIfAdminStat>)
 | 
			
		||||
 | 
			
		||||
=item $l3->ospf_if_state()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of the OSPF interfaces' state
 | 
			
		||||
 | 
			
		||||
(C<ospfIfState>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 OSPF Neighbor Table (C<ospfNbrTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l3->ospf_peers()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IP addresses the neighbor is using in its
 | 
			
		||||
IP Source Addresses
 | 
			
		||||
 | 
			
		||||
(C<ospfNbrIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $l3->ospf_peer_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of neighbor Router IDs
 | 
			
		||||
 | 
			
		||||
(C<ospfNbrRtrId>)
 | 
			
		||||
 | 
			
		||||
=item $l3->ospf_peer_state()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of state of the relationship with the neighbor
 | 
			
		||||
routers
 | 
			
		||||
 | 
			
		||||
(C<ospfNbrState>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info for details.
 | 
			
		||||
See L<SNMP::Info/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Bridge
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Bridge for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::CDP for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::CiscoStats for details.
 | 
			
		||||
See L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::EtherLike for details.
 | 
			
		||||
See L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Entity/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::PowerEthernet
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::PowerEthernet/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::IPv6
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IPv6/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
@@ -1,86 +1,89 @@
 | 
			
		||||
# SNMP::Info::Layer3::Aironet
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
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::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Aironet::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
%MIBS =    (
 | 
			
		||||
            %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
            'AWCVX-MIB'        => 'awcIfTable',
 | 
			
		||||
            'IEEE802dot11-MIB' => 'dot11StationID',
 | 
			
		||||
           );
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%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',
 | 
			
		||||
           );
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    'mac' => 'dot11StationID.2',
 | 
			
		||||
 | 
			
		||||
%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',
 | 
			
		||||
          );
 | 
			
		||||
    # 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,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
    # 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,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'aironet';
 | 
			
		||||
@@ -88,35 +91,35 @@ sub os {
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $descr = $aironet->description();
 | 
			
		||||
    my $descr = $aironet->description() || '';
 | 
			
		||||
 | 
			
		||||
    # CAP340 11.21
 | 
			
		||||
    if ($descr =~ /AP\d{3}\s+(\d{2}\.\d{2})/){
 | 
			
		||||
        return $1;
 | 
			
		||||
    # CAP340 11.21, AP4800-E 11.21
 | 
			
		||||
    if ( $descr =~ /AP\d{3,4}(-\D+)?\s+(\d{2}\.\d{2})/ ) {
 | 
			
		||||
        return $2;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    if ($descr =~ /Series\s*AP\s+(\d{2}\.\d{2})/){
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ /Series\s*AP\s+(\d{2}\.\d{2})/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return undef;
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Override wireless port with static info
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $aironet    = shift;
 | 
			
		||||
    my $interfaces = $aironet->interfaces();
 | 
			
		||||
    my $bp_index = $aironet->bp_index2();
 | 
			
		||||
    
 | 
			
		||||
    foreach my $iid (keys %$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;
 | 
			
		||||
        if ( $port =~ /awc/ ) {
 | 
			
		||||
            $bp_index->{0} = $iid;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return $bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -125,17 +128,19 @@ sub fw_mac {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $fw_mac  = $aironet->fw_mac2();
 | 
			
		||||
    my $fw_port = $aironet->fw_port2();
 | 
			
		||||
    my $bs_mac  = $aironet->bs_mac();    
 | 
			
		||||
 
 | 
			
		||||
    my $bs_mac  = $aironet->bs_mac();
 | 
			
		||||
 | 
			
		||||
    # remove port 0 forwarding table entries, only port 0 static entries
 | 
			
		||||
    foreach my $fw (keys %$fw_mac){
 | 
			
		||||
    foreach my $fw ( keys %$fw_mac ) {
 | 
			
		||||
        my $port = $fw_port->{$fw};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        delete $fw_mac->{$fw} if $port == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $bs (keys %$bs_mac){
 | 
			
		||||
        $fw_mac->{$bs} = $bs_mac->{$bs};
 | 
			
		||||
    foreach my $bs ( keys %$bs_mac ) {
 | 
			
		||||
        my $entry = $bs;
 | 
			
		||||
        $entry =~ s/\.0$//;
 | 
			
		||||
        $fw_mac->{$entry} = $bs_mac->{$bs};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $fw_mac;
 | 
			
		||||
@@ -145,28 +150,28 @@ sub fw_mac {
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $fw_port = $aironet->fw_port2();
 | 
			
		||||
    my $bs_port = $aironet->bs_port();    
 | 
			
		||||
    my $bs_port = $aironet->bs_port();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    foreach my $bs (keys %$bs_port){
 | 
			
		||||
        $fw_port->{$bs} = $bs_port->{$bs};
 | 
			
		||||
    foreach my $bs ( keys %$bs_port ) {
 | 
			
		||||
        my $entry = $bs;
 | 
			
		||||
        $entry =~ s/\.0$//;
 | 
			
		||||
        $fw_port->{$entry} = $bs_port->{$bs};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $fw_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $aironet    = shift;
 | 
			
		||||
    my $interfaces = $aironet->interfaces();
 | 
			
		||||
    my $awc_duplex = $aironet->awc_duplex();
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid (keys %$interfaces){
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $name = $interfaces->{$iid};
 | 
			
		||||
 | 
			
		||||
        if ($name =~ /fec/){
 | 
			
		||||
        if ( $name =~ /fec/ ) {
 | 
			
		||||
            $i_duplex{$iid} = $awc_duplex;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -180,7 +185,7 @@ sub i_mac {
 | 
			
		||||
    my $i_mac   = $aironet->i_mac2();
 | 
			
		||||
    my $awc_mac = $aironet->awc_mac();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid (keys %$awc_mac){
 | 
			
		||||
    foreach my $iid ( keys %$awc_mac ) {
 | 
			
		||||
        next unless defined $i_mac->{$iid};
 | 
			
		||||
        $i_mac->{$iid} = $awc_mac->{$iid};
 | 
			
		||||
    }
 | 
			
		||||
@@ -189,14 +194,14 @@ sub i_mac {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $aironet    = shift;
 | 
			
		||||
    my $interfaces = $aironet->interfaces();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if (keys %$interfaces){
 | 
			
		||||
        $i_ignore{$if}++ if ($interfaces->{$if} =~ /(rptr|lo)/);
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
        $i_ignore{$if}++ if ( $interfaces->{$if} =~ /(rptr|lo)/ );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -210,11 +215,12 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Aironet - Perl5 Interface to Cisco Aironet Wireless Devices running Aironet software, not IOS
 | 
			
		||||
SNMP::Info::Layer3::Aironet - Perl5 Interface to Cisco Aironet Wireless
 | 
			
		||||
Devices running Aironet software, not IOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -222,7 +228,6 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $aironet = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
@@ -234,8 +239,8 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info subclass to provide access to SNMP data for an Aironet device running Aironet software,
 | 
			
		||||
not cisco IOS.
 | 
			
		||||
SNMP::Info subclass to provide access to SNMP data for an Aironet device
 | 
			
		||||
running Aironet software, not cisco IOS.
 | 
			
		||||
 | 
			
		||||
Note there are two classes for Aironet devices :
 | 
			
		||||
 | 
			
		||||
@@ -251,8 +256,8 @@ 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. 
 | 
			
		||||
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::Layer3::Aironet(...);
 | 
			
		||||
 | 
			
		||||
@@ -268,14 +273,14 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item AWCVX-MIB
 | 
			
		||||
=item F<AWCVX-MIB>
 | 
			
		||||
 | 
			
		||||
=item IEEE802dot11-MIB
 | 
			
		||||
=item F<IEEE802dot11-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
These MIBs are now included in the v2.tar.gz archive available from ftp.cisco.com.  Make sure you 
 | 
			
		||||
have a current version. 
 | 
			
		||||
These MIBs are now included in the v2.tar.gz archive available from
 | 
			
		||||
ftp.cisco.com.  Make sure you have a current version. 
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
@@ -287,13 +292,13 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
Gives the admin duplex setting for the Ethernet Port.
 | 
			
		||||
 | 
			
		||||
B<awcEtherDuplex.0>
 | 
			
		||||
C<awcEtherDuplex.0>
 | 
			
		||||
 | 
			
		||||
=item $aironet->mac()
 | 
			
		||||
 | 
			
		||||
Gives the MAC Address of the wireless side 
 | 
			
		||||
 | 
			
		||||
B<dot11StationID.2>
 | 
			
		||||
C<dot11StationID.2>
 | 
			
		||||
 | 
			
		||||
=item $aironet->os()
 | 
			
		||||
 | 
			
		||||
@@ -311,9 +316,9 @@ Returns 'cisco'.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer3 for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
@@ -324,18 +329,18 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=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)
 | 
			
		||||
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.
 | 
			
		||||
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()
 | 
			
		||||
Adds the static table port mappings to the forwarding table port mappings by
 | 
			
		||||
adding bs_port() to fw_port()
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_duplex()
 | 
			
		||||
 | 
			
		||||
@@ -359,34 +364,34 @@ Ignores ports that are of type ``rptr'' and ``lo''.
 | 
			
		||||
 | 
			
		||||
Gives the default MAC address of each interface.
 | 
			
		||||
 | 
			
		||||
B<awcIfDefaultPhyAddress>
 | 
			
		||||
C<awcIfDefaultPhyAddress>
 | 
			
		||||
 | 
			
		||||
=item $aironet->awc_mac()
 | 
			
		||||
 | 
			
		||||
Gives the actual MAC address of each interface.
 | 
			
		||||
 | 
			
		||||
B<awcIfPhyAddress>
 | 
			
		||||
C<awcIfPhyAddress>
 | 
			
		||||
 | 
			
		||||
=item $aironet->awc_ip()
 | 
			
		||||
 | 
			
		||||
Gives the IP Address assigned to each interface.
 | 
			
		||||
 | 
			
		||||
B<awcIfIpAddress>
 | 
			
		||||
C<awcIfIpAddress>
 | 
			
		||||
 | 
			
		||||
=item $aironet->awc_netmask()
 | 
			
		||||
 | 
			
		||||
Gives the NetMask for each interface.
 | 
			
		||||
 | 
			
		||||
B<awcIfIpNetMask>
 | 
			
		||||
C<awcIfIpNetMask>
 | 
			
		||||
 | 
			
		||||
=item $aironet->awc_msdu()
 | 
			
		||||
 | 
			
		||||
B<awcIfMSDUMaxLength>
 | 
			
		||||
C<awcIfMSDUMaxLength>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer3 for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										489
									
								
								Info/Layer3/AlcatelLucent.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										489
									
								
								Info/Layer3/AlcatelLucent.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,489 @@
 | 
			
		||||
# SNMP::Info::Layer3::AlcatelLucent
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
#
 | 
			
		||||
# 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::AlcatelLucent;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::AMAP;
 | 
			
		||||
# Use LLDP
 | 
			
		||||
# (or at least try.  The versions I've seen have two problems:
 | 
			
		||||
# 1. they report ifIndex values as 'local'; we don't support ifIndex
 | 
			
		||||
#    but *could*
 | 
			
		||||
# 2. They report 0.0.0.0 as the management address
 | 
			
		||||
# )
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::AMAP SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::MAU SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::AlcatelLucent::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::AMAP::MIBS,
 | 
			
		||||
    'ALCATEL-IND1-DEVICES'     => 'familyOmniSwitch7000',
 | 
			
		||||
    'ALCATEL-IND1-CHASSIS-MIB' => 'chasEntPhysOperStatus',
 | 
			
		||||
    'ALU-POWER-ETHERNET-MIB'   => 'pethPsePortDetectionStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Alcatel provides their own version of the POWER-ETHERNET-MIB,
 | 
			
		||||
# off in vendor-space, without renaming any of the objects.
 | 
			
		||||
# This means we have to *not* load the POWER-ETHERNET-MIB
 | 
			
		||||
# but can then still use the standard PowerEthernet module,
 | 
			
		||||
# but cannot try both so we hope Alcatel doesn't stop supporting
 | 
			
		||||
# their private version even if they get around to supporting the
 | 
			
		||||
# standard.
 | 
			
		||||
delete $MIBS{'POWER-ETHERNET-MIB'};
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS, %SNMP::Info::AMAP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS, %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS, %SNMP::Info::AMAP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE, %SNMP::Info::AMAP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# use MAU-MIB for admin. duplex and admin. speed
 | 
			
		||||
*SNMP::Info::Layer3::AlcatelLucent::i_duplex_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_duplex_admin;
 | 
			
		||||
*SNMP::Info::Layer3::AlcatelLucent::i_speed_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_speed_admin;
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $alu   = shift;
 | 
			
		||||
    my $id    = $alu->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^device//;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'AOS';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'alcatel-lucent';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $alu = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $alu->description();
 | 
			
		||||
    if ( $descr =~ m/^(\S+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # No clue what this will try but hey
 | 
			
		||||
    return $alu->SUPER::os_ver();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# ps1_type, ps1_status, ps2_type, ps2_status:
 | 
			
		||||
# Find the list of power supplies in the ENTITY-MIB
 | 
			
		||||
# e_class = powerSupply
 | 
			
		||||
# e_descr = ps_type
 | 
			
		||||
# chasEntPhysOperStatus = ps_status
 | 
			
		||||
sub _power_supplies {
 | 
			
		||||
    my $alu = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_class  = $alu->e_class();
 | 
			
		||||
    my @supplies = ();
 | 
			
		||||
 | 
			
		||||
    foreach my $key ( sort { int($a) cmp int($b) } keys %$e_class ) {
 | 
			
		||||
        if ( $e_class->{$key} eq 'powerSupply' ) {
 | 
			
		||||
            push( @supplies, int($key) );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return @supplies;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _ps_type {
 | 
			
		||||
    my $alu   = shift;
 | 
			
		||||
    my $psnum = shift;
 | 
			
		||||
    my @ps    = $alu->_power_supplies();
 | 
			
		||||
 | 
			
		||||
    if ( $psnum > $#ps ) {
 | 
			
		||||
        return "none";
 | 
			
		||||
    }
 | 
			
		||||
    my $supply = $ps[$psnum];
 | 
			
		||||
    my $descr  = $alu->e_descr($supply);
 | 
			
		||||
    return $descr->{$supply};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _ps_status {
 | 
			
		||||
    my $alu   = shift;
 | 
			
		||||
    my $psnum = shift;
 | 
			
		||||
    my @ps    = $alu->_power_supplies();
 | 
			
		||||
 | 
			
		||||
    if ( $psnum > $#ps ) {
 | 
			
		||||
        return "not present";
 | 
			
		||||
    }
 | 
			
		||||
    my $supply = $ps[$psnum];
 | 
			
		||||
    my $status = $alu->chasEntPhysOperStatus($supply);
 | 
			
		||||
    return $status->{$supply};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_type {
 | 
			
		||||
    my $alu = shift;
 | 
			
		||||
    return $alu->_ps_type(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_type {
 | 
			
		||||
    my $alu = shift;
 | 
			
		||||
    return $alu->_ps_type(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $alu = shift;
 | 
			
		||||
    return $alu->_ps_status(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_status {
 | 
			
		||||
    my $alu = shift;
 | 
			
		||||
    return $alu->_ps_status(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# The interface description contains the software version, so
 | 
			
		||||
# to avoid losing historical information through a software upgrade
 | 
			
		||||
# we use interface name instead.
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->orig_i_name($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use Q-BRIDGE-MIB
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->qb_fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Work around buggy bp_index in 6.3.1.871.R01 and 6.3.1.975.R01
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $bp_index = $alu->SUPER::bp_index($partial);
 | 
			
		||||
 | 
			
		||||
    #
 | 
			
		||||
    # This device sometimes reports an ifIndex and sometimes reports
 | 
			
		||||
    # dot1dBasePort for the dot1d port values - e.g.,
 | 
			
		||||
    # in 6.3.1.871.R01 both dot1dTpFdbPort and dot1qTpFdbPort report
 | 
			
		||||
    # the ifIndex; in 6.3.1.975.R01 dot1dTpFdbPort has been updated
 | 
			
		||||
    # to report the dot1dBasePort but dot1qTpFdbPort still returns an
 | 
			
		||||
    # ifIndex.  For this reason, we augment the dot1dBasePort
 | 
			
		||||
    # mapping with ifIndex->ifIndex mappings -- we can do this because
 | 
			
		||||
    # the ifIndex and dot1dBasePort spaces don't overlap, at least for
 | 
			
		||||
    # the ports we care about.
 | 
			
		||||
    my @keys = keys %$bp_index;
 | 
			
		||||
    foreach my $idx (@keys) {
 | 
			
		||||
        my $ifIndex = $bp_index->{$idx};
 | 
			
		||||
        $bp_index->{$ifIndex} = $ifIndex;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #
 | 
			
		||||
    # In addition, aggregates aren't reported at all in bp_index.
 | 
			
		||||
    # We grab them from i_index.
 | 
			
		||||
    my $i_index = $alu->i_index();
 | 
			
		||||
    foreach my $idx ( keys %$i_index ) {
 | 
			
		||||
        my $ifIndex = $i_index->{$idx};
 | 
			
		||||
        if ( int($ifIndex) > 40000001 ) {
 | 
			
		||||
            $bp_index->{$ifIndex} = $ifIndex;
 | 
			
		||||
 | 
			
		||||
            # dot1dTpFdbPort seems to use 4098, 4099, 4100 for
 | 
			
		||||
            # 40000001, 40000002, 40000003.  I guess this is
 | 
			
		||||
            # 4096 + 1 + aggregate number.
 | 
			
		||||
            my $tmp = sprintf( "%d", int($ifIndex) - 39995903 );
 | 
			
		||||
            $bp_index->{$tmp} = $ifIndex;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Workaround for unimplemented Q-BRIDGE-MIB::dot1qPvid
 | 
			
		||||
# If there is only one VLAN on which a given port is output
 | 
			
		||||
# untagged, then call that one the PVID.  This is a guess that
 | 
			
		||||
# works in obvious configurations but may be wrong in
 | 
			
		||||
# subtle cases (like there's one output VLAN but a different
 | 
			
		||||
# input one - the only way to know that is via the dot1qPvid
 | 
			
		||||
# object)
 | 
			
		||||
#
 | 
			
		||||
# Newer versions have implemented dot1qPvid (but wrong, but
 | 
			
		||||
# that's just life)
 | 
			
		||||
#sub i_vlan {
 | 
			
		||||
#    my $alu = shift;
 | 
			
		||||
#
 | 
			
		||||
#    my $qb_v_untagged = $alu->qb_v_untagged();
 | 
			
		||||
#    my $bp_index = $alu->bp_index();
 | 
			
		||||
#    my $vlan_list = {};
 | 
			
		||||
#    foreach my $vlan (keys %$qb_v_untagged) {
 | 
			
		||||
#	my $portlist = $qb_v_untagged->{$vlan};
 | 
			
		||||
#	my $port;
 | 
			
		||||
#	for ($port = 0; $port <= $#$portlist; $port++) {
 | 
			
		||||
#	    if ($portlist->[$port]) {
 | 
			
		||||
#		my $ifindex = $bp_index->{$port + 1};
 | 
			
		||||
#		if ($ifindex) {
 | 
			
		||||
#		    push(@{$vlan_list->{$ifindex}}, int($vlan));
 | 
			
		||||
#		}
 | 
			
		||||
#	    }
 | 
			
		||||
#	}
 | 
			
		||||
#    }
 | 
			
		||||
#
 | 
			
		||||
#    my $i_vlan = {};
 | 
			
		||||
#    foreach my $ifindex (keys %$vlan_list) {
 | 
			
		||||
#	if ($#{$vlan_list->{$ifindex}} == 0) {
 | 
			
		||||
#	    $i_vlan->{$ifindex} = ${$vlan_list->{$ifindex}}[0];
 | 
			
		||||
#	}
 | 
			
		||||
#    }
 | 
			
		||||
#    return $i_vlan;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
# Power-Ethernet ifIndex mapping.  I've only seen this from a
 | 
			
		||||
# fixed-config single-module system, so this is only a plausible
 | 
			
		||||
# guess as to the mapping on a stack or modular system.
 | 
			
		||||
sub peth_port_ifindex {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $peth_port_status  = $alu->peth_port_status($partial);
 | 
			
		||||
    my $peth_port_ifindex = {};
 | 
			
		||||
 | 
			
		||||
    foreach my $key ( keys %$peth_port_status ) {
 | 
			
		||||
        my @oid = split( m/\./, $key );
 | 
			
		||||
        $peth_port_ifindex->{$key} = int( $oid[0] ) * 1000 + int( $oid[1] );
 | 
			
		||||
    }
 | 
			
		||||
    return $peth_port_ifindex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::AlcatelLucent - SNMP Interface to Alcatel-Lucent OmniSwitch
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Bill Fenner
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $alu = 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      = $alu->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Alcatel-Lucent OmniSwitch devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ALCATEL-IND1-DEVICES>
 | 
			
		||||
 | 
			
		||||
=item F<ALCATEL-IND1-CHASSIS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<ALU-POWER-ETHERNET-MIB>
 | 
			
		||||
 | 
			
		||||
Note that Alcatel-Lucent distributes their own proprietary version of the
 | 
			
		||||
F<POWER-ETHERNET-MIB>, but the MIB module name that they distribute is
 | 
			
		||||
simply F<POWER-ETHERNET-MIB>.  This module must be hand-edited to change the
 | 
			
		||||
module name to F<ALU-POWER-ETHERNET-MIB> so that it can be used simultaneously
 | 
			
		||||
with the standard F<POWER-ETHERNET-MIB>.
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $alu->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'alcatel-lucent'
 | 
			
		||||
 | 
			
		||||
=item $alu->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $alu->id() to one of the product MIBs listed above
 | 
			
		||||
 | 
			
		||||
Removes 'device' from the name for readability.
 | 
			
		||||
 | 
			
		||||
=item $alu->os()
 | 
			
		||||
 | 
			
		||||
Returns 'AOS'
 | 
			
		||||
 | 
			
		||||
=item $alu->os_ver()
 | 
			
		||||
 | 
			
		||||
Grabs the os version from C<sysDescr>
 | 
			
		||||
 | 
			
		||||
=item $alu->ps1_type()
 | 
			
		||||
 | 
			
		||||
Return the type of the first power supply from the F<ENTITY-MIB>
 | 
			
		||||
 | 
			
		||||
=item $alu->ps2_type()
 | 
			
		||||
 | 
			
		||||
Return the type of the second power supply from the F<ENTITY-MIB>
 | 
			
		||||
 | 
			
		||||
=item $alu->ps1_status()
 | 
			
		||||
 | 
			
		||||
Return the status of the first power supply from the F<ALCATEL-IND1-CHASSIS-MIB>
 | 
			
		||||
 | 
			
		||||
=item $alu->ps2_status()
 | 
			
		||||
 | 
			
		||||
Return the status of the second power supply from the F<ALCATEL-IND1-CHASSIS-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $alu->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns interface name from C<ifName>, since the default return value
 | 
			
		||||
of C<ifDescr> includes the OS version.
 | 
			
		||||
 | 
			
		||||
=item $alu->fw_mac()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $alu->fw_port()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $alu->bp_index()
 | 
			
		||||
 | 
			
		||||
Work around various bugs in the F<BRIDGE-MIB> and
 | 
			
		||||
F<Q-BRIDGE-MIB> implementations, by returning both
 | 
			
		||||
C<ifIndex> and C<dot1dBasePort> mappings to C<ifIndex> values.
 | 
			
		||||
 | 
			
		||||
=item $alu->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
=item $alu->i_speed_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
=item $alu->peth_port_ifindex()
 | 
			
		||||
 | 
			
		||||
Returns the C<ifIndex> value for power-ethernet ports
 | 
			
		||||
using the OmniSwitch algorithm.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										600
									
								
								Info/Layer3/AlteonAD.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										600
									
								
								Info/Layer3/AlteonAD.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,600 @@
 | 
			
		||||
# SNMP::Info::Layer3::AlteonAD
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer3::AlteonAD;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::AlteonAD::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::AlteonAD::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'ALTEON-ROOT-MIB'            => 'aceswitch184',
 | 
			
		||||
    'ALTEON-TIGON-SWITCH-MIB'    => 'hwPowerSupplyStatus',
 | 
			
		||||
    'ALTEON-CHEETAH-SWITCH-MIB'  => 'hwFanStatus',
 | 
			
		||||
    'ALTEON-TS-PHYSICAL-MIB'     => 'agPortTableMaxEnt',
 | 
			
		||||
    'ALTEON-CS-PHYSICAL-MIB'     => 'vlanCurCfgLearn',
 | 
			
		||||
    'ALTEON-TS-NETWORK-MIB'      => 'ripCurCfgSupply',
 | 
			
		||||
    'ALTEON-CHEETAH-NETWORK-MIB' => 'ripCurCfgIntfSupply',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    'old_sw_ver'      => 'ALTEON_TIGON_SWITCH_MIB__agSoftwareVersion',
 | 
			
		||||
    'new_sw_ver'      => 'ALTEON_CHEETAH_SWITCH_MIB__agSoftwareVersion',
 | 
			
		||||
    'old_tftp_action' => 'ALTEON_TIGON_SWITCH_MIB__agTftpAction',
 | 
			
		||||
    'new_tftp_action' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpAction',
 | 
			
		||||
    'old_tftp_host'   => 'ALTEON_TIGON_SWITCH_MIB__agTftpServer',
 | 
			
		||||
    'new_tftp_host'   => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpServer',
 | 
			
		||||
    'old_tftp_file'   => 'ALTEON_TIGON_SWITCH_MIB__agTftpCfgFileName',
 | 
			
		||||
    'new_tftp_file'   => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpCfgFileName',
 | 
			
		||||
    'old_tftp_result' => 'ALTEON_TIGON_SWITCH_MIB__agTftpLastActionStatus',
 | 
			
		||||
    'new_tftp_result' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpLastActionStatus',
 | 
			
		||||
    'old_ip_max'      => 'ALTEON_TS_NETWORK_MIB__ipInterfaceTableMax',
 | 
			
		||||
    'new_ip_max'      => 'ALTEON_CHEETAH_NETWORK_MIB__ipInterfaceTableMax',
 | 
			
		||||
    'fan'             => 'ALTEON_CHEETAH_SWITCH_MIB__hwFanStatus',
 | 
			
		||||
    'old_ps1_stat'    => 'ALTEON_TIGON_SWITCH_MIB__hwPowerSupplyStatus',
 | 
			
		||||
    'old_ps2_stat'    => 'ALTEON_TIGON_SWITCH_MIB__hwRedundantPSStatus',
 | 
			
		||||
    'new_ps_stat'     => 'ALTEON_CHEETAH_SWITCH_MIB__hwPowerSupplyStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # From agPortCurCfgTable
 | 
			
		||||
    'old_ag_p_cfg_idx'  => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgIndx',
 | 
			
		||||
    'new_ag_p_cfg_idx'  => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgIndx',
 | 
			
		||||
    'old_ag_p_cfg_pref' => 'agPortCurCfgPrefLink',
 | 
			
		||||
    'new_ag_p_cfg_pref' => 'agPortCurCfgPreferred',
 | 
			
		||||
    'old_ag_p_cfg_pvid' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgPVID',
 | 
			
		||||
    'new_ag_p_cfg_pvid' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgPVID',
 | 
			
		||||
    'old_ag_p_cfg_fe_auto' =>
 | 
			
		||||
        'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgFastEthAutoNeg',
 | 
			
		||||
    'new_ag_p_cfg_fe_auto' =>
 | 
			
		||||
        'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgFastEthAutoNeg',
 | 
			
		||||
    'old_ag_p_cfg_fe_mode' =>
 | 
			
		||||
        'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgFastEthMode',
 | 
			
		||||
    'new_ag_p_cfg_fe_mode' =>
 | 
			
		||||
        'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgFastEthMode',
 | 
			
		||||
    'old_ag_p_cfg_ge_auto' =>
 | 
			
		||||
        'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgGigEthAutoNeg',
 | 
			
		||||
    'new_ag_p_cfg_ge_auto' =>
 | 
			
		||||
        'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgGigEthAutoNeg',
 | 
			
		||||
    'old_ag_p_cfg_name' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgPortName',
 | 
			
		||||
    'new_ag_p_cfg_name' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgPortName',
 | 
			
		||||
 | 
			
		||||
    # From portInfoTable
 | 
			
		||||
    'old_p_info_idx'  => 'ALTEON_TS_PHYSICAL_MIB__portInfoIndx',
 | 
			
		||||
    'new_p_info_idx'  => 'ALTEON_CHEETAH_SWITCH_MIB__portInfoIndx',
 | 
			
		||||
    'old_p_info_mode' => 'ALTEON_TS_PHYSICAL_MIB__portInfoMode',
 | 
			
		||||
    'new_p_info_mode' => 'ALTEON_CHEETAH_SWITCH_MIB__portInfoMode',
 | 
			
		||||
 | 
			
		||||
    # From ipCurCfgIntfTable
 | 
			
		||||
    'old_ip_cfg_vlan' => 'ALTEON_TS_NETWORK_MIB__ipCurCfgIntfVlan',
 | 
			
		||||
    'new_ip_cfg_vlan' => 'ALTEON_CHEETAH_NETWORK_MIB__ipCurCfgIntfVlan',
 | 
			
		||||
 | 
			
		||||
    # From vlanCurCfgTable
 | 
			
		||||
    'old_vlan_id'    => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgVlanId',
 | 
			
		||||
    'new_vlan_id'    => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgVlanId',
 | 
			
		||||
    'old_vlan_state' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgState',
 | 
			
		||||
    'new_vlan_state' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgState',
 | 
			
		||||
    'old_vlan_name'  => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgVlanName',
 | 
			
		||||
    'new_vlan_name'  => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgVlanName',
 | 
			
		||||
    'old_vlan_ports' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgPorts',
 | 
			
		||||
    'new_vlan_ports' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgPorts',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
 | 
			
		||||
    my $id = $alteon->id();
 | 
			
		||||
 | 
			
		||||
    unless ( defined $id ) {
 | 
			
		||||
        print
 | 
			
		||||
            " SNMP::Info::Layer3::AlteonAD::model() - Device does not support sysObjectID\n"
 | 
			
		||||
            if $alteon->debug();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^(aceswitch|aws|ods)//;
 | 
			
		||||
    $model =~ s/^acedirector/AD/;
 | 
			
		||||
    $model =~ s/^(copper|fiber)Module/BladeCenter GbESM/;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'radware';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'alteon';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
    my $version = $alteon->new_sw_ver() || $alteon->old_sw_ver();
 | 
			
		||||
    return unless defined $version;
 | 
			
		||||
 | 
			
		||||
    return $version;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
    my $old_ps = $alteon->old_ps1_stat();
 | 
			
		||||
    my $new_ps = $alteon->new_ps_stat();
 | 
			
		||||
    
 | 
			
		||||
    return $old_ps if $old_ps;
 | 
			
		||||
    
 | 
			
		||||
    if ($new_ps) {
 | 
			
		||||
        return 'ok' if ($new_ps eq 'singlePowerSupplyOk');
 | 
			
		||||
        return 'failed' if ($new_ps eq 'firstPowerSupplyFailed');
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_status {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
    my $old_ps = $alteon->old_ps2_stat();
 | 
			
		||||
    my $new_ps = $alteon->new_ps_stat();
 | 
			
		||||
    
 | 
			
		||||
    return $old_ps if $old_ps;
 | 
			
		||||
    
 | 
			
		||||
    if ($new_ps) {
 | 
			
		||||
        return 'ok' if ($new_ps eq 'doublePowerSupplyOk');
 | 
			
		||||
        return 'failed' if ($new_ps eq 'secondPowerSupplyFailed');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $alteon       = shift;
 | 
			
		||||
    my $interfaces   = $alteon->i_index();
 | 
			
		||||
    my $descriptions = $alteon->i_description();
 | 
			
		||||
    my $ip_max       = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $desc = $descriptions->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
 | 
			
		||||
        if ( $desc =~ /(^net\d+)/ ) {
 | 
			
		||||
            $desc = $1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # IP interfaces are first followed by physical, number possible
 | 
			
		||||
        # varies by switch model
 | 
			
		||||
        elsif ( defined $ip_max and $iid > $ip_max ) {
 | 
			
		||||
            $desc = ( $iid % $ip_max );
 | 
			
		||||
            $desc = 'mgmt' if $desc == 231;
 | 
			
		||||
        }
 | 
			
		||||
        $interfaces{$iid} = $desc;
 | 
			
		||||
    }
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_mode = $alteon->new_p_info_mode()
 | 
			
		||||
        || $alteon->old_p_info_mode()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $if ( keys %$p_mode ) {
 | 
			
		||||
        my $duplex = $p_mode->{$if};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
 | 
			
		||||
        $duplex = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $duplex = 'full' if $duplex =~ /full/i;
 | 
			
		||||
 | 
			
		||||
        my $idx;
 | 
			
		||||
        $idx = $if + $ip_max if ( defined $ip_max );
 | 
			
		||||
 | 
			
		||||
        $i_duplex{$idx} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
 | 
			
		||||
    my $ag_pref 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_pref()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_pref()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ag_fe_auto 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_fe_auto()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_fe_auto()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ag_fe_mode 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_fe_mode()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_fe_mode()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ag_ge_auto 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_ge_auto()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_ge_auto()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ip_max  = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
    my $i_speed = $alteon->i_speed()    || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $if ( keys %$ag_ge_auto ) {
 | 
			
		||||
        my $pref    = $ag_pref->{$if}    || '';
 | 
			
		||||
        my $speed   = $i_speed->{$if}    || '';
 | 
			
		||||
        my $ge_auto = $ag_ge_auto->{$if} || '';
 | 
			
		||||
        my $fe_auto = $ag_fe_auto->{$if} || '';
 | 
			
		||||
        my $fe_mode = $ag_fe_mode->{$if} || '';
 | 
			
		||||
 | 
			
		||||
        # Default to auto
 | 
			
		||||
        my $string = 'auto';
 | 
			
		||||
 | 
			
		||||
        if ( $ge_auto =~ /off/i
 | 
			
		||||
            && ( $pref =~ /gigabit/i || $speed eq '1.0 Gbps' ) )
 | 
			
		||||
        {
 | 
			
		||||
            $string = 'full';
 | 
			
		||||
        }
 | 
			
		||||
        if ( $fe_auto =~ /off/i
 | 
			
		||||
            && ( $pref =~ /fast/i || $speed =~ /100?\sMbps/ ) )
 | 
			
		||||
        {
 | 
			
		||||
            $string = 'half'
 | 
			
		||||
                if ( $fe_mode =~ /half/i );
 | 
			
		||||
            $string = 'full'
 | 
			
		||||
                if ( $fe_mode =~ /full/i );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $idx;
 | 
			
		||||
        $idx = $if + $ip_max if ( defined $ip_max );
 | 
			
		||||
 | 
			
		||||
        $i_duplex_admin{$idx} = $string;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_name = $alteon->new_ag_p_cfg_name()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_name()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
    foreach my $iid ( keys %$p_name ) {
 | 
			
		||||
        my $name = $p_name->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
        my $idx;
 | 
			
		||||
        $idx = $iid + $ip_max if ( defined $ip_max );
 | 
			
		||||
        $i_name{$idx} = $name;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub v_index {
 | 
			
		||||
    my $alteon  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alteon->new_vlan_id($partial) || $alteon->old_vlan_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub v_name {
 | 
			
		||||
    my $alteon  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alteon->new_vlan_name($partial)
 | 
			
		||||
        || $alteon->old_vlan_name($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
 | 
			
		||||
    my $ag_vlans = $alteon->new_ag_p_cfg_pvid()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_pvid()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ip_vlans = $alteon->new_ip_cfg_vlan()
 | 
			
		||||
        || $alteon->old_ip_cfg_vlan()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
 | 
			
		||||
    my %i_vlan;
 | 
			
		||||
    foreach my $if ( keys %$ip_vlans ) {
 | 
			
		||||
        my $ip_vlanid = $ip_vlans->{$if};
 | 
			
		||||
        next unless defined $ip_vlanid;
 | 
			
		||||
 | 
			
		||||
        $i_vlan{$if} = $ip_vlanid;
 | 
			
		||||
    }
 | 
			
		||||
    foreach my $if ( keys %$ag_vlans ) {
 | 
			
		||||
        my $ag_vlanid = $ag_vlans->{$if};
 | 
			
		||||
        next unless defined $ag_vlanid;
 | 
			
		||||
 | 
			
		||||
        my $idx;
 | 
			
		||||
        $idx = $if + $ip_max if ( defined $ip_max );
 | 
			
		||||
        $i_vlan{$idx} = $ag_vlanid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
 | 
			
		||||
    my $v_ports = $alteon->old_vlan_ports()
 | 
			
		||||
        || $alteon->new_vlan_ports()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    foreach my $vlan ( keys %$v_ports ) {
 | 
			
		||||
        my $portlist = [ split( //, unpack( "B*", $v_ports->{$vlan} ) ) ];
 | 
			
		||||
        my $ret = [];
 | 
			
		||||
 | 
			
		||||
        # Convert portlist bit array to ifIndex array
 | 
			
		||||
        for ( my $i = 0; $i <= scalar(@$portlist); $i++ ) {
 | 
			
		||||
            my $idx;
 | 
			
		||||
            $idx = $i + $ip_max if ( defined $ip_max );
 | 
			
		||||
            push( @{$ret}, $idx ) if ( @$portlist[$i] );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #Create HoA ifIndex -> VLAN array
 | 
			
		||||
        foreach my $port ( @{$ret} ) {
 | 
			
		||||
            push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Bridge MIB does not map Bridge Port to ifIndex correctly on some code
 | 
			
		||||
# versions
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
 | 
			
		||||
    my $b_index = $alteon->orig_bp_index();
 | 
			
		||||
    my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
 | 
			
		||||
    my %bp_index;
 | 
			
		||||
    foreach my $iid ( keys %$b_index ) {
 | 
			
		||||
        my $port = $b_index->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        $port = $port + $ip_max if ( defined $ip_max and $iid == $ip_max );
 | 
			
		||||
 | 
			
		||||
        $bp_index{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Radware Alteon ADC
 | 
			
		||||
Switches.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $alteon = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $alteon->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Radware Alteon Series ADC switches and
 | 
			
		||||
Nortel BladeCenter Layer2-3 GbE Switch Modules.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $alteon = new SNMP::Info::Layer3::AlteonAD(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ALTEON-ROOT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<ALTEON-TIGON-SWITCH-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<ALTEON-TS-PHYSICAL-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<ALTEON-TS-NETWORK-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<ALTEON-CS-PHYSICAL-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<ALTEON-CHEETAH-SWITCH-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<ALTEON-CHEETAH-NETWORK-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $alteon->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.  Checks $alteon->id() against the F<ALTEON-ROOT-MIB> and
 | 
			
		||||
then parses out C<aceswitch>, C<aws>, and C<ods> replaces C<acedirector>
 | 
			
		||||
with AD, and replaces copperModule/fiberModule with BladeCenter GbESM.
 | 
			
		||||
 | 
			
		||||
=item $alteon->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'radware'
 | 
			
		||||
 | 
			
		||||
=item $alteon->os()
 | 
			
		||||
 | 
			
		||||
Returns 'alteon'
 | 
			
		||||
 | 
			
		||||
=item $alteon->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version reported by C<agSoftwareVersion>
 | 
			
		||||
 | 
			
		||||
=item $alteon->tftp_action()
 | 
			
		||||
 | 
			
		||||
(C<agTftpAction>)
 | 
			
		||||
 | 
			
		||||
=item $alteon->tftp_host()
 | 
			
		||||
 | 
			
		||||
(C<agTftpServer>)
 | 
			
		||||
 | 
			
		||||
=item $alteon->tftp_file()
 | 
			
		||||
 | 
			
		||||
(C<agTftpCfgFileName>)
 | 
			
		||||
 | 
			
		||||
=item $alteon->tftp_result()
 | 
			
		||||
 | 
			
		||||
(C<agTftpLastActionStatus>)
 | 
			
		||||
 | 
			
		||||
=item $alteon->fan()
 | 
			
		||||
 | 
			
		||||
(C<hwFanStatus>)
 | 
			
		||||
 | 
			
		||||
=item $alteon->ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns status of primary power supply
 | 
			
		||||
 | 
			
		||||
=item $alteon->ps2_status()
 | 
			
		||||
 | 
			
		||||
Returns status of redundant power supply
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a
 | 
			
		||||
reference to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $alteon->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to the map between IID and physical port.
 | 
			
		||||
 | 
			
		||||
Utilizes description for network interfaces.  Ports are determined by
 | 
			
		||||
formula (C<ifIndex mod 256>).
 | 
			
		||||
 | 
			
		||||
=item $alteon->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps port operational duplexes to IIDs.
 | 
			
		||||
 | 
			
		||||
=item $alteon->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps port admin duplexes to IIDs.
 | 
			
		||||
 | 
			
		||||
=item $alteon->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
 | 
			
		||||
 | 
			
		||||
=item $alteon->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.
 | 
			
		||||
 | 
			
		||||
  Example:
 | 
			
		||||
  my $interfaces = $alteon->interfaces();
 | 
			
		||||
  my $vlans      = $alteon->i_vlan_membership();
 | 
			
		||||
  
 | 
			
		||||
  foreach my $iid (sort keys %$interfaces) {
 | 
			
		||||
    my $port = $interfaces->{$iid};
 | 
			
		||||
    my $vlan = join(',', sort(@{$vlans->{$iid}}));
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $alteon->v_index()
 | 
			
		||||
 | 
			
		||||
Returns VLAN IDs
 | 
			
		||||
 | 
			
		||||
=item $alteon->v_name()
 | 
			
		||||
 | 
			
		||||
Human-entered name for vlans.
 | 
			
		||||
 | 
			
		||||
=item $alteon->i_name()
 | 
			
		||||
 | 
			
		||||
Maps (C<agPortCurCfgPortName>) to port and returns the human set port name if
 | 
			
		||||
exists.
 | 
			
		||||
 | 
			
		||||
=item $alteon->bp_index()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the Bridge Table.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										392
									
								
								Info/Layer3/Altiga.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										392
									
								
								Info/Layer3/Altiga.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,392 @@
 | 
			
		||||
# SNMP::Info::Layer3::Altiga
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Jeroen van Ingen Schenau
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
# 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::Altiga;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Altiga::ISA = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Altiga::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE 
 | 
			
		||||
            $int_include_vpn $fake_idx $type_class/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
            %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
            'ALTIGA-VERSION-STATS-MIB'  => 'alVersionString',
 | 
			
		||||
            'ALTIGA-SESSION-STATS-MIB'  => 'alActiveSessionCount',
 | 
			
		||||
            'ALTIGA-HARDWARE-STATS-MIB' => 'alHardwarePs1Type',  
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
            # From ALTIGA-VERSION-STATS-MIB
 | 
			
		||||
            'os_ver'          => 'alVersionString',
 | 
			
		||||
            # From ALTIGA-SESSION-STATS-MIB
 | 
			
		||||
            'vpn_act_sess'    => 'alActiveSessionCount',
 | 
			
		||||
            'vpn_total_sess'  => 'alTotalSessionCount',
 | 
			
		||||
            'vpn_max_sess'    => 'alMaxSessionCount',
 | 
			
		||||
            'vpn_l2l_sess'    => 'alActiveLanToLanSessionCount',
 | 
			
		||||
            'vpn_mgmt_sess'   => 'alActiveManagementSessionCount',
 | 
			
		||||
            'vpn_ras_sess'    => 'alActiveRemoteAccessSessionCount',
 | 
			
		||||
            # From ALTIGA-HARDWARE-STATS-MIB
 | 
			
		||||
            'ps1_type'        => 'alHardwarePs1Type',
 | 
			
		||||
            'ps1_3v_alarm'    => 'alHardwarePs1Voltage3vAlarm',
 | 
			
		||||
            'ps1_5v_alarm'    => 'alHardwarePs1Voltage5vAlarm',
 | 
			
		||||
            'ps2_type'        => 'alHardwarePs2Type',
 | 
			
		||||
            'ps2_3v_alarm'    => 'alHardwarePs2Voltage3vAlarm',
 | 
			
		||||
            'ps2_5v_alarm'    => 'alHardwarePs2Voltage5vAlarm',
 | 
			
		||||
            'fan1_alarm'      => 'alHardwareFan1RpmAlarm',
 | 
			
		||||
            'fan2_alarm'      => 'alHardwareFan2RpmAlarm',
 | 
			
		||||
            'fan3_alarm'      => 'alHardwareFan3RpmAlarm',
 | 
			
		||||
            
 | 
			
		||||
       );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
            %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
            'i_type2'           => 'ifType',
 | 
			
		||||
            'i_lastchange2'     => 'ifLastChange',
 | 
			
		||||
            'vpn_sess_status'   => 'alActiveSessionRowStatus',
 | 
			
		||||
            'vpn_sess_user'     => 'alActiveSessionUserName',
 | 
			
		||||
            'vpn_sess_peer_ip'  => 'alActiveSessionIpAddress',
 | 
			
		||||
            'vpn_sess_protocol' => 'alActiveSessionProtocol',
 | 
			
		||||
            'vpn_sess_encr'     => 'alActiveSessionEncrType',
 | 
			
		||||
            'vpn_sess_start'    => 'alActiveSessionStartTime',
 | 
			
		||||
            'vpn_sess_conntime' => 'alActiveSessionConnectTime',
 | 
			
		||||
            'vpn_sess_out_oct'  => 'alActiveSessionOctetsSent',
 | 
			
		||||
            'vpn_sess_in_oct'   => 'alActiveSessionOctetsRcvd',
 | 
			
		||||
            'vpn_sess_group'    => 'alActiveSessionGroupName',
 | 
			
		||||
            'vpn_sess_gid'      => 'alActiveSessionGroupId',
 | 
			
		||||
            'vpn_sess_rem_ip'   => 'alActiveSessionPublicIpAddress',
 | 
			
		||||
     );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
            %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
            'ps1_3v_alarm'    => \&munge_alarm,
 | 
			
		||||
            'ps1_5v_alarm'    =>  \&munge_alarm,
 | 
			
		||||
            'ps2_3v_alarm'    =>  \&munge_alarm,
 | 
			
		||||
            'ps2_5v_alarm'    =>  \&munge_alarm,
 | 
			
		||||
            'fan1_alarm'      =>  \&munge_alarm,
 | 
			
		||||
            'fan2_alarm'      =>  \&munge_alarm,
 | 
			
		||||
            'fan3_alarm'      =>  \&munge_alarm,
 | 
			
		||||
 | 
			
		||||
     );
 | 
			
		||||
 | 
			
		||||
# Variable to modify behaviour of "interfaces" subroutine.
 | 
			
		||||
# * When set to 0, "interfaces" returns only fixed interfaces from the IF-MIB,
 | 
			
		||||
# * When set to 1, "interfaces" returns fixed interfaces from IF-MIB and LAN-to-LAN tunnels from ALTIGA-SESSION-MIB
 | 
			
		||||
# TODO: This should be an instance method, not a class global
 | 
			
		||||
$int_include_vpn = 1;
 | 
			
		||||
 | 
			
		||||
# Variable to prepended to each tunnel index when tunnel is added to %interfaces, to avoid overwriting "real" ifIndex entries
 | 
			
		||||
$fake_idx = 3076;
 | 
			
		||||
 | 
			
		||||
# Variable to classify session types into categories: 0 - unclassified, 1 - LAN-to-LAN or fixed, 2 - RAS or dynamic, 3 - administrative
 | 
			
		||||
$type_class = {
 | 
			
		||||
    'pptp'                  => 2,
 | 
			
		||||
    'l2tp'                  => 2,
 | 
			
		||||
    'ipsec'                 => 2,
 | 
			
		||||
    'http'                  => 3,
 | 
			
		||||
    'ftp'                   => 3,
 | 
			
		||||
    'telnet'                => 3,
 | 
			
		||||
    'snmp'                  => 3,
 | 
			
		||||
    'tftp'                  => 3,
 | 
			
		||||
    'console'               => 3,
 | 
			
		||||
    'debugTelnet'           => 3,
 | 
			
		||||
    'debugConsole'          => 3,
 | 
			
		||||
    'other'                 => 3,
 | 
			
		||||
    'ike'                   => 0,
 | 
			
		||||
    'l2tpOverIpSec'         => 2,
 | 
			
		||||
    'ipsecLanToLan'         => 1,
 | 
			
		||||
    'ipsecOverUdp'          => 2,
 | 
			
		||||
    'ssh'                   => 3,
 | 
			
		||||
    'vcaLanToLan'           => 1,
 | 
			
		||||
    'ipsecOverTcp'          => 2,
 | 
			
		||||
    'pppoe'                 => 2,
 | 
			
		||||
    'ipsecOverNatT'         => 2,
 | 
			
		||||
    'ipsecLan2LanOverNatT'  => 1,
 | 
			
		||||
    'l2tpOverIpsecOverNatT' => 2,
 | 
			
		||||
    'userHttps'             => 2,
 | 
			
		||||
    'pop3s'                 => 2,
 | 
			
		||||
    'imap4s'                => 2,
 | 
			
		||||
    'smtps'                 => 2,
 | 
			
		||||
    'httpsTunnel'           => 2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'altiga';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'altiga';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $altiga->interfaces() - Map the Interfaces to their physical names
 | 
			
		||||
# Add interface number to interface name to prevent duplicate ifDescr
 | 
			
		||||
# Included statically configured VPN tunnels if ($int_include_vpn)
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $altiga = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $altiga->i_index($partial);
 | 
			
		||||
    my $descriptions = $altiga->i_description($partial);
 | 
			
		||||
 | 
			
		||||
    my %int_rev = ();
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid (sort {$a cmp $b} keys %$interfaces) {
 | 
			
		||||
        my $desc = $descriptions->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
        if (!exists $int_rev{$desc}) {
 | 
			
		||||
            $interfaces{$iid} = $desc;
 | 
			
		||||
            $int_rev{$desc} = $iid;
 | 
			
		||||
        } else {
 | 
			
		||||
            my $done = 0;
 | 
			
		||||
            my $unique_desc;
 | 
			
		||||
            my $cnt = 1;
 | 
			
		||||
            until ($done) {
 | 
			
		||||
                $cnt++;
 | 
			
		||||
                $unique_desc = sprintf("%s (%d)", $desc, $cnt);
 | 
			
		||||
                if (!exists $int_rev{$unique_desc}) {
 | 
			
		||||
                    $done++;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            $int_rev{$unique_desc} = $iid;
 | 
			
		||||
            $interfaces{$iid} = $unique_desc;
 | 
			
		||||
            $interfaces{ $int_rev{$desc} } = sprintf("%s (%d)", $desc, 1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if ($int_include_vpn) {
 | 
			
		||||
        my $tun_type = $altiga->vpn_sess_protocol();
 | 
			
		||||
        my $peer = $altiga->vpn_sess_peer_ip();
 | 
			
		||||
        my $remote = $altiga->vpn_sess_rem_ip(); 
 | 
			
		||||
        my $group = $altiga->vpn_sess_gid();
 | 
			
		||||
        foreach my $tunnel (keys %$tun_type) {
 | 
			
		||||
            if ($type_class->{$tun_type->{$tunnel}} eq 1) {
 | 
			
		||||
                $interfaces{"$fake_idx.$tunnel"} = sprintf("%s VPN to %s", uc($tun_type->{$tunnel}), $remote->{$tunnel});
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
            
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_type {
 | 
			
		||||
    my $altiga = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    my $types = $altiga->i_type2();
 | 
			
		||||
    if ($int_include_vpn) {
 | 
			
		||||
        my $tun_type = $altiga->vpn_sess_protocol();
 | 
			
		||||
        foreach my $tunnel (keys %$tun_type) {
 | 
			
		||||
            $types->{"$fake_idx.$tunnel"} = $tun_type->{$tunnel};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $types;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_lastchange {
 | 
			
		||||
    my $altiga = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # TODO: This is what munges are for.
 | 
			
		||||
    my $lastchange = $altiga->i_lastchange2();
 | 
			
		||||
    if ($int_include_vpn) {
 | 
			
		||||
        my $tun_start = $altiga->vpn_sess_start();
 | 
			
		||||
        foreach my $tunnel (keys %$tun_start) {
 | 
			
		||||
            $lastchange->{"$fake_idx.$tunnel"} = $tun_start->{$tunnel};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $lastchange;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $altiga = shift;
 | 
			
		||||
    my $alarm_3v = $altiga->ps1_3v_alarm() || "";
 | 
			
		||||
    my $alarm_5v = $altiga->ps1_5v_alarm() || "";
 | 
			
		||||
    return sprintf("3V: %s, 5V: %s", $alarm_3v, $alarm_5v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_status {
 | 
			
		||||
    my $altiga = shift;
 | 
			
		||||
    my $alarm_3v = $altiga->ps2_3v_alarm() || "";
 | 
			
		||||
    my $alarm_5v = $altiga->ps2_5v_alarm() || "";
 | 
			
		||||
    return sprintf("3V: %s, 5V: %s", $alarm_3v, $alarm_5v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fan {
 | 
			
		||||
    my $altiga = shift;
 | 
			
		||||
    my $alarm_fan1 = $altiga->fan1_alarm() || "";
 | 
			
		||||
    my $alarm_fan2 = $altiga->fan2_alarm() || "";
 | 
			
		||||
    my $alarm_fan3 = $altiga->fan3_alarm() || "";
 | 
			
		||||
    return sprintf("Fan 1: %s, Fan 2: %s, Fan 3: %s", $alarm_fan1, $alarm_fan2, $alarm_fan3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_alarm {
 | 
			
		||||
    my $alarm = shift;
 | 
			
		||||
    if ($alarm eq 'false') {
 | 
			
		||||
        return 'OK';
 | 
			
		||||
    } elsif ($alarm eq 'true') {
 | 
			
		||||
        return 'FAIL';
 | 
			
		||||
    } else {
 | 
			
		||||
        return "(n/a)";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Altiga - SNMP Interface to Cisco (formerly Altiga) VPN concentrators
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Jeroen van Ingen Schenau
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $altiga = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'my_vpn_host',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $altiga->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Cisco (formerly Altiga) VPN concentrators
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Class Variables (options)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $SNMP::Info::Layer3::Altiga::int_include_vpn
 | 
			
		||||
 | 
			
		||||
Variable to modify behavior of "interfaces" subroutine.
 | 
			
		||||
 | 
			
		||||
  * When set to 0, "interfaces" returns only fixed interfaces from the IF-MIB,
 | 
			
		||||
  * When set to 1, "interfaces" returns fixed interfaces from IF-MIB and
 | 
			
		||||
    LAN-to-LAN tunnels from ALTIGA-SESSION-MIB (default)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $altiga->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'altiga'
 | 
			
		||||
 | 
			
		||||
=item $altiga->os()
 | 
			
		||||
 | 
			
		||||
Returns 'altiga'
 | 
			
		||||
 | 
			
		||||
=item $altiga->os_ver()
 | 
			
		||||
 | 
			
		||||
Tries to determine OS version from the C<sysDescr.0> field. Returns version or C<sysDescr.0>
 | 
			
		||||
 | 
			
		||||
=item $altiga->fan()
 | 
			
		||||
 | 
			
		||||
Combines results from C<fan1_alarm>, C<fan2_alarm>, and C<fam3_alarm> methods.
 | 
			
		||||
 | 
			
		||||
=item $altiga->ps1_status()
 | 
			
		||||
 | 
			
		||||
Combines C<ps1_3v_alarm> and C<ps1_5v_alarm> methods.
 | 
			
		||||
 | 
			
		||||
=item $altiga->ps2_status()
 | 
			
		||||
 | 
			
		||||
Combines C<ps2_3v_alarm> and C<ps2_5v_alarm> methods.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $altiga->interfaces()
 | 
			
		||||
 | 
			
		||||
This method overrides the interfaces() method inherited from SNMP::Info.
 | 
			
		||||
It provides a mapping between the Interface Table Index (iid) and the physical 
 | 
			
		||||
port name, adding a port number to the port name to prevent duplicate names.
 | 
			
		||||
 | 
			
		||||
=item $altiga->i_lastchange()
 | 
			
		||||
 | 
			
		||||
Filters out the results depending on the value of $SNMP::Info::Layer3::Altiga::int_include_vpn
 | 
			
		||||
 | 
			
		||||
=item $altiga->i_type()
 | 
			
		||||
 | 
			
		||||
Filters out the results depending on the value of $SNMP::Info::Layer3::Altiga::int_include_vpn
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 MUNGES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item munge_alarm()
 | 
			
		||||
 | 
			
		||||
Changes C<true> and C<false> to C<FAIL>, C<OK>, and C<(n/a)>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										257
									
								
								Info/Layer3/Arista.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										257
									
								
								Info/Layer3/Arista.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,257 @@
 | 
			
		||||
# SNMP::Info::Layer3::Arista
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Arista Networks, Inc.
 | 
			
		||||
# 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 Arista Networks, Inc. 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::Arista;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Arista::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Arista::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'ARISTA-PRODUCTS-MIB' => 'aristaProducts',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# use MAU-MIB for admin. duplex and admin. speed
 | 
			
		||||
*SNMP::Info::Layer3::Arista::i_duplex_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_duplex_admin;
 | 
			
		||||
*SNMP::Info::Layer3::Arista::i_speed_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_speed_admin;
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'arista';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'EOS';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $arista = shift;
 | 
			
		||||
    my $descr   = $arista->description();
 | 
			
		||||
    my $os_ver  = undef;
 | 
			
		||||
 | 
			
		||||
    $os_ver = $1 if ( $descr =~ /\s+EOS\s+version\s+(\S+)\s+/ );
 | 
			
		||||
    return $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $arista = shift;
 | 
			
		||||
    my $id     = $arista->id();
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^arista//;
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use Q-BRIDGE-MIB
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->qb_fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Arista - SNMP Interface to Arista Networks EOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Bill Fenner
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $arista = 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      = $arista->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Arista Networks EOS-based devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ARISTA-PRODUCTS-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $arista->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'Arista Networks, Inc.'
 | 
			
		||||
 | 
			
		||||
=item $arista->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $arista->id() to one of the product MIBs listed above
 | 
			
		||||
 | 
			
		||||
Removes 'arista' from the name for readability.
 | 
			
		||||
 | 
			
		||||
=item $arista->os()
 | 
			
		||||
 | 
			
		||||
Returns 'EOS'
 | 
			
		||||
 | 
			
		||||
=item $arista->os_ver()
 | 
			
		||||
 | 
			
		||||
Grabs the os version from C<sysDescr>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $arista->fw_mac()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $arista->fw_port()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $arista->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
=item $arista->i_speed_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										658
									
								
								Info/Layer3/Aruba.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										658
									
								
								Info/Layer3/Aruba.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,658 @@
 | 
			
		||||
# SNMP::Info::Layer3::Aruba
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer3::Aruba;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Aruba::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Aruba::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'WLSX-SWITCH-MIB'         => 'wlsxHostname',
 | 
			
		||||
    'WLSX-WLAN-MIB'           => 'wlanAPFQLN',
 | 
			
		||||
    'WLSR-AP-MIB'             => 'wlsrHideSSID',
 | 
			
		||||
    #'ALCATEL-IND1-TP-DEVICES' => 'familyOmniAccessWireless',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # WLSX-SWITCH-MIB::wlsxSwitchAccessPointTable
 | 
			
		||||
    # Table index leafs do not return information
 | 
			
		||||
    # therefore unable to use apBSSID.  We extract
 | 
			
		||||
    # the information from the IID instead.
 | 
			
		||||
    'aruba_ap_name'      => 'apLocation',
 | 
			
		||||
    'aruba_ap_ip'        => 'apIpAddress',
 | 
			
		||||
    'aruba_ap_essid'     => 'apESSID',
 | 
			
		||||
    'aruba_ap_ssidbcast' => 'wlsrHideSSID',
 | 
			
		||||
 | 
			
		||||
    # WLSX-WLAN-MIB::wlsxWlanAPTable
 | 
			
		||||
    'aruba_perap_fqln'   => 'wlanAPFQLN',
 | 
			
		||||
 | 
			
		||||
    # WLSR-AP-MIB::wlsrConfigTable
 | 
			
		||||
    'aruba_ap_channel' => 'apCurrentChannel',
 | 
			
		||||
 | 
			
		||||
    # WLSX-SWITCH-MIB::wlsxSwitchStationMgmtTable
 | 
			
		||||
    # Table index leafs do not return information
 | 
			
		||||
    # therefore unable to use staAccessPointBSSID
 | 
			
		||||
    # or staPhyAddress.  We extract the information from
 | 
			
		||||
    # the IID instead.
 | 
			
		||||
    #'fw_port'             => 'staAccessPointBSSID',
 | 
			
		||||
    #'fw_mac'              => 'staPhyAddress',
 | 
			
		||||
    'fw_user' => 'staUserName',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
    return '00000111';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $aruba = shift;
 | 
			
		||||
    my %osmap = (
 | 
			
		||||
        'alcatel-lucent' => 'aos-w',
 | 
			
		||||
                );
 | 
			
		||||
    return $osmap{$aruba->vendor()} || 'airos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $aruba = shift;
 | 
			
		||||
    my $id     = $aruba->id() || 'undef';
 | 
			
		||||
    my %oidmap = (
 | 
			
		||||
                  6486 => 'alcatel-lucent',
 | 
			
		||||
                );
 | 
			
		||||
    $id = $1 if (defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/);
 | 
			
		||||
 | 
			
		||||
    if (defined($id) and exists($oidmap{$id})) {
 | 
			
		||||
        return $oidmap{$id};
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return 'aruba';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $aruba = shift;
 | 
			
		||||
    my $descr = $aruba->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/Version\s+(\d+\.\d+\.\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $aruba = shift;
 | 
			
		||||
    my $id    = $aruba->id();
 | 
			
		||||
    return unless defined $id;
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Thin APs do not support ifMIB requirement
 | 
			
		||||
#
 | 
			
		||||
# We return all BSSIDs as pseudo-ports on the controller.
 | 
			
		||||
 | 
			
		||||
sub i_index {
 | 
			
		||||
    my $aruba   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index  = $aruba->orig_i_index($partial)  || {};
 | 
			
		||||
    my $ap_index = $aruba->aruba_ap_name($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %if_index;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
 | 
			
		||||
        $if_index{$iid} = $index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Get Attached APs as Interfaces
 | 
			
		||||
    foreach my $ap_id ( keys %$ap_index ) {
 | 
			
		||||
 | 
			
		||||
        # Convert the 0.254.123.456 index entry to a MAC address.
 | 
			
		||||
        my $mac = join( ':',
 | 
			
		||||
            map { sprintf( "%02x", $_ ) } split( /\./, $ap_id ) );
 | 
			
		||||
 | 
			
		||||
        $if_index{$ap_id} = $mac;
 | 
			
		||||
    }
 | 
			
		||||
    return \%if_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $aruba   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $aruba->i_index($partial)       || {};
 | 
			
		||||
    my $i_descr = $aruba->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
 | 
			
		||||
        if ( $index =~ /^\d+$/ ) {
 | 
			
		||||
 | 
			
		||||
            # Replace the Index with the ifDescr field.
 | 
			
		||||
            my $port = $i_descr->{$iid};
 | 
			
		||||
            next unless defined $port;
 | 
			
		||||
            $if{$iid} = $port;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
 | 
			
		||||
            $if{$index} = $index;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Most items are indexed by BSSID.
 | 
			
		||||
# aruba_perap_fqln is indexed by AP, so we use the
 | 
			
		||||
# [haven't decided yet] index to figure out all of the
 | 
			
		||||
# BSSIDs served by a given radio.
 | 
			
		||||
sub aruba_ap_fqln {
 | 
			
		||||
    my $aruba  = shift;
 | 
			
		||||
    # I don't think $partial is meaningful in this context
 | 
			
		||||
 | 
			
		||||
    my $perap_fqln = $aruba->aruba_perap_fqln();
 | 
			
		||||
    my $channel = $aruba->wlanAPBssidChannel();
 | 
			
		||||
    my $aruba_ap_fqln = {};
 | 
			
		||||
 | 
			
		||||
    # Channel index is: AP, radio, BSSID
 | 
			
		||||
    foreach my $idx (keys %$channel) {
 | 
			
		||||
	my @oid = split(/\./, $idx );
 | 
			
		||||
	my $ap = join(".", @oid[0..5]);
 | 
			
		||||
        my $bssid = join(".", @oid[7..12]);
 | 
			
		||||
	$aruba_ap_fqln->{$bssid} = $perap_fqln->{$ap};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $aruba_ap_fqln;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $aruba   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $aruba->i_index($partial)       || {};
 | 
			
		||||
    my $i_name2 = $aruba->orig_i_name($partial)   || {};
 | 
			
		||||
    my $ap_name = $aruba->aruba_ap_name($partial) || {};
 | 
			
		||||
    my $ap_fqln = $aruba->aruba_ap_fqln($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
 | 
			
		||||
        if ( $index =~ /^\d+$/ ) {
 | 
			
		||||
            my $name = $i_name2->{$iid};
 | 
			
		||||
            next unless defined $name;
 | 
			
		||||
            $i_name{$index} = $name;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
 | 
			
		||||
            my $name = $ap_fqln->{$iid} || $ap_name->{$iid};
 | 
			
		||||
            next unless defined $name;
 | 
			
		||||
            $i_name{$index} = $name;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ssidlist {
 | 
			
		||||
    my $aruba   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $aruba->i_index($partial)        || {};
 | 
			
		||||
    my $ap_ssid = $aruba->aruba_ap_essid($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ssid;
 | 
			
		||||
    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}/ ) {
 | 
			
		||||
            my $ssid = $ap_ssid->{$iid};
 | 
			
		||||
            next unless defined $ssid;
 | 
			
		||||
            $i_ssid{$index} = $ssid;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ssid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_80211channel {
 | 
			
		||||
    my $aruba   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $aruba->i_index($partial)          || {};
 | 
			
		||||
    my $ap_ch   = $aruba->aruba_ap_channel($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ch;
 | 
			
		||||
    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}/ ) {
 | 
			
		||||
            my $ch = $ap_ch->{$iid};
 | 
			
		||||
            next unless defined $ch;
 | 
			
		||||
            $i_ch{$index} = $ch;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ch;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ssidbcast {
 | 
			
		||||
    my $aruba   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $aruba->i_index($partial)            || {};
 | 
			
		||||
    my $ap_bc   = $aruba->aruba_ap_ssidbcast($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_bc;
 | 
			
		||||
    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}/ ) {
 | 
			
		||||
            my $bc = $ap_bc->{$iid};
 | 
			
		||||
            next unless defined $bc;
 | 
			
		||||
            $bc = ( $bc ? 0 : 1 );
 | 
			
		||||
            $i_bc{$index} = $bc;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_bc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Wireless switches do not support the standard Bridge MIB
 | 
			
		||||
# Wired switches currently (AOS 7.2.0.0) do, but it seems only for
 | 
			
		||||
# dot1q ports or access ports that are 'untrusted' ?
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $aruba   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index  = $aruba->orig_i_index($partial)  || {};
 | 
			
		||||
    my $ap_index = $aruba->aruba_ap_name($partial) || {};
 | 
			
		||||
 | 
			
		||||
    # Collect standard bp_index first
 | 
			
		||||
    my $wired_bp_index = $aruba->SUPER::bp_index($partial) || {};
 | 
			
		||||
    my %bp_index = %$wired_bp_index;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next if exists $bp_index{$iid}; # Only augment bp_index, don't overwrite any existing mappings 
 | 
			
		||||
 | 
			
		||||
        $bp_index{$iid} = $index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Get Attached APs as Interfaces
 | 
			
		||||
    foreach my $ap_id ( keys %$ap_index ) {
 | 
			
		||||
 | 
			
		||||
        # Convert the 0.254.123.456 index entry to a MAC address.
 | 
			
		||||
        my $mac = join( ':',
 | 
			
		||||
            map { sprintf( "%02x", $_ ) } split( /\./, $ap_id ) );
 | 
			
		||||
 | 
			
		||||
        $bp_index{$mac} = $mac;
 | 
			
		||||
    }
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $aruba   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $fw_idx = $aruba->fw_user($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my $wired_fw_port = $aruba->SUPER::qb_fw_port($partial) || {};
 | 
			
		||||
    my %fw_port = %$wired_fw_port;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$fw_idx ) {
 | 
			
		||||
        if ( $iid
 | 
			
		||||
            =~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/
 | 
			
		||||
            )
 | 
			
		||||
        {
 | 
			
		||||
            my $port = join( ':',
 | 
			
		||||
                map { sprintf( "%02x", $_ ) } split( /\./, $2 ) );
 | 
			
		||||
            $fw_port{$iid} = $port;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%fw_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $aruba   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $fw_idx = $aruba->fw_user($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my $wired_fw_mac = $aruba->SUPER::qb_fw_mac($partial) || {};
 | 
			
		||||
    my %fw_mac = %$wired_fw_mac;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$fw_idx ) {
 | 
			
		||||
        if ( $iid
 | 
			
		||||
            =~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/
 | 
			
		||||
            )
 | 
			
		||||
        {
 | 
			
		||||
            my $mac = join( ':',
 | 
			
		||||
                map { sprintf( "%02x", $_ ) } split( /\./, $1 ) );
 | 
			
		||||
            $fw_mac{$iid} = $mac;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%fw_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Return the BSSID in i_mac.
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $aruba = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Start with the i_mac entries for the physical ports.
 | 
			
		||||
    my $i_mac = $aruba->orig_i_mac($partial) || {};
 | 
			
		||||
 | 
			
		||||
    # Add in all the BSSID entries.
 | 
			
		||||
    my $i_index  = $aruba->i_index($partial) || {};
 | 
			
		||||
    foreach my $iid (keys %$i_index) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
	if ($index =~ /:/) {
 | 
			
		||||
	    $i_mac->{$index} = $index;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Aruba - SNMP Interface to Aruba wireless switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
    my $aruba = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
    my $class = $aruba->class();
 | 
			
		||||
    print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Aruba is a subclass of SNMP::Info that provides an
 | 
			
		||||
interface to Aruba wireless switches.  The Aruba platform utilizes
 | 
			
		||||
intelligent wireless switches which control thin access points.  The thin
 | 
			
		||||
access points themselves are unable to be polled for end station information.
 | 
			
		||||
 | 
			
		||||
This class emulates bridge functionality for the wireless switch. This enables
 | 
			
		||||
end station MAC addresses collection and correlation to the thin access point
 | 
			
		||||
the end station is using for communication.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $aruba = new SNMP::Info::Layer3::Aruba(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<WLSX-SWITCH-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<WLSR-AP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aruba->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.  Cross references $aruba->id() with product IDs in the 
 | 
			
		||||
Aruba MIB.
 | 
			
		||||
 | 
			
		||||
=item $aruba->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'aruba'
 | 
			
		||||
 | 
			
		||||
=item $aruba->os()
 | 
			
		||||
 | 
			
		||||
Returns 'airos'
 | 
			
		||||
 | 
			
		||||
=item $aruba->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted from C<sysDescr>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aruba->layers()
 | 
			
		||||
 | 
			
		||||
Returns 00000011.  Class emulates Layer 2 functionality for Thin APs through
 | 
			
		||||
proprietary MIBs.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=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 $aruba->i_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to Interface index. 
 | 
			
		||||
 | 
			
		||||
Extends C<ifIndex> to support thin APs as device interfaces.
 | 
			
		||||
 | 
			
		||||
=item $aruba->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to ports.  Thin APs are implemented as device 
 | 
			
		||||
interfaces.  The thin AP BSSID is used as the port identifier.
 | 
			
		||||
 | 
			
		||||
=item $aruba->i_name()
 | 
			
		||||
 | 
			
		||||
Interface name.  Returns (C<ifName>) for Ethernet interfaces and
 | 
			
		||||
(C<wlanAPFQLN> or C<apLocation>) for thin AP interfaces.
 | 
			
		||||
 | 
			
		||||
=item $aruba->i_mac()
 | 
			
		||||
 | 
			
		||||
Interface MAC address.  Returns interface MAC address for Ethernet
 | 
			
		||||
interfaces and BSSID for thin AP interfaces.
 | 
			
		||||
 | 
			
		||||
=item $aruba->bp_index()
 | 
			
		||||
 | 
			
		||||
Simulates bridge MIB by returning reference to a hash containing the index for
 | 
			
		||||
both the keys and values.
 | 
			
		||||
 | 
			
		||||
=item $aruba->fw_port()
 | 
			
		||||
 | 
			
		||||
(C<staAccessPointBSSID>) as extracted from the IID.
 | 
			
		||||
 | 
			
		||||
=item $aruba->fw_mac()
 | 
			
		||||
 | 
			
		||||
(C<staPhyAddress>) as extracted from the IID.
 | 
			
		||||
 | 
			
		||||
=item $aruba->i_ssidlist()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  SSID's recognized by the radio interface.
 | 
			
		||||
 | 
			
		||||
(C<apESSID>)
 | 
			
		||||
 | 
			
		||||
=item $aruba->i_ssidbcast()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Indicates whether the SSID is broadcast, true or
 | 
			
		||||
false.
 | 
			
		||||
 | 
			
		||||
(C<wlsrHideSSID>)
 | 
			
		||||
 | 
			
		||||
=item $aruba->i_80211channel()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current operating frequency channel of the radio
 | 
			
		||||
interface.
 | 
			
		||||
 | 
			
		||||
(C<apCurrentChannel>)
 | 
			
		||||
 | 
			
		||||
=item $aruba->aruba_ap_fqln()
 | 
			
		||||
 | 
			
		||||
Returns F<aruba_perap_fqln> indexed by BSSID instead of by AP.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Aruba Switch AP Table  (C<wlsxSwitchAccessPointTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aruba->aruba_ap_name()
 | 
			
		||||
 | 
			
		||||
(C<apLocation>)
 | 
			
		||||
 | 
			
		||||
=item $aruba->aruba_ap_ip()
 | 
			
		||||
 | 
			
		||||
(C<apIpAddress>)
 | 
			
		||||
 | 
			
		||||
=item $aruba->aruba_ap_essid()
 | 
			
		||||
 | 
			
		||||
(C<apESSID>)
 | 
			
		||||
 | 
			
		||||
=item $aruba->aruba_ap_ssidbcast()
 | 
			
		||||
 | 
			
		||||
(C<wlsrHideSSID>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Aruba AP Table (C<wlsxWlanAPTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aruba->aruba_perap_fqln()
 | 
			
		||||
 | 
			
		||||
(C<wlanAPFQLN>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Aruba Switch Station Management Table (C<wlsxSwitchStationMgmtTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aruba->fw_user()
 | 
			
		||||
 | 
			
		||||
(C<staUserName>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Aruba Wireless AP Configuration Table (C<wlsrConfigTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aruba->aruba_ap_channel()
 | 
			
		||||
 | 
			
		||||
(C<apCurrentChannel>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										1648
									
								
								Info/Layer3/BayRS.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1648
									
								
								Info/Layer3/BayRS.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										168
									
								
								Info/Layer3/BlueCoatSG.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								Info/Layer3/BlueCoatSG.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
			
		||||
package SNMP::Info::Layer3::BlueCoatSG;
 | 
			
		||||
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::BlueCoatSG::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::BlueCoatSG::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'BLUECOAT-SG-PROXY-MIB' => 'sgProxyAdmin',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    #From BLUECOAT-SG-PROXY-MIB
 | 
			
		||||
    'serial1'=> 'sgProxySerialNumber',
 | 
			
		||||
    'sw_ver' => 'sgProxyVersion',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Layer3::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'Blue Coat';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'sgos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $sg = shift;
 | 
			
		||||
    my $os_string = $sg->sw_ver();
 | 
			
		||||
    if ($os_string =~ /^Version:\s(\w+)\s([\d\.]+)/) {
 | 
			
		||||
        return $2;
 | 
			
		||||
    } else {
 | 
			
		||||
        return ''; # perhaps we can try sysDescr or some other object...
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::BlueCoatSG - SNMP Interface to Blue Coat SG Series proxy devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Jeroen van Ingen
 | 
			
		||||
 | 
			
		||||
=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     => 1
 | 
			
		||||
                        )
 | 
			
		||||
    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 Blue Coat SG Series proxy devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
 BLUECOAT-SG-PROXY-MIB
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $router->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'Blue Coat'>
 | 
			
		||||
 | 
			
		||||
=item $router->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'sgos'>
 | 
			
		||||
 | 
			
		||||
=item $router->os_ver()
 | 
			
		||||
 | 
			
		||||
Tries to resolve version string from C<"sgProxyVersion">.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
@@ -1,170 +1,118 @@
 | 
			
		||||
# SNMP::Info::Layer3::C3550
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2003, Regents of the University of California
 | 
			
		||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
# Copyright (c) 2004 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
# 
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
# 
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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::C3550;
 | 
			
		||||
$VERSION = 0.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::CiscoStack;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoImage;
 | 
			
		||||
use SNMP::Info::CiscoPortSecurity;
 | 
			
		||||
use SNMP::Info::CiscoPower;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::CiscoStpExtensions;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
# NOTE : Top-most items gets precedence for @ISA
 | 
			
		||||
@SNMP::Info::Layer3::C3550::ISA = qw/
 | 
			
		||||
    SNMP::Info::CiscoVTP
 | 
			
		||||
    SNMP::Info::CiscoStpExtensions
 | 
			
		||||
    SNMP::Info::CiscoStack
 | 
			
		||||
    SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::CDP
 | 
			
		||||
    SNMP::Info::CiscoStats
 | 
			
		||||
    SNMP::Info::CiscoImage
 | 
			
		||||
    SNMP::Info::CiscoPortSecurity
 | 
			
		||||
    SNMP::Info::CiscoConfig
 | 
			
		||||
    SNMP::Info::CiscoPower
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    Exporter/;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/ ;
 | 
			
		||||
@SNMP::Info::Layer3::C3550::ISA = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# See SNMP::Info for the details of these data structures and 
 | 
			
		||||
#       the interworkings.
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
# NOTE: Order creates precedence
 | 
			
		||||
#       Example: v_name exists in Bridge.pm and CiscoVTP.pm
 | 
			
		||||
#       Bridge is called from Layer3 and CiscoStpExtensions
 | 
			
		||||
#       So we want CiscoVTP to come last to get the right one.
 | 
			
		||||
# The @ISA order should match these orders.
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
         %SNMP::Info::Layer3::MIBS,  
 | 
			
		||||
         'CISCO-STACK-MIB' => 'moduleType',
 | 
			
		||||
         'CISCO-VTP-MIB'   => 'vtpVlanIndex'
 | 
			
		||||
        );
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,             %SNMP::Info::CiscoPower::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,        %SNMP::Info::CiscoPortSecurity::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MIBS,         %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,               %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MIBS,         %SNMP::Info::CiscoStpExtensions::MIBS, 
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
            %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
            'ports2'      => 'ifNumber',
 | 
			
		||||
            # these are in CISCO-STACK-MIB
 | 
			
		||||
            'serial'      => 'chassisSerialNumberString',    
 | 
			
		||||
            'ps1_type'    => 'chassisPs1Type',    
 | 
			
		||||
            'ps1_status'  => 'chassisPs1Status',    
 | 
			
		||||
            'ps2_type'    => 'chassisPs2Type',    
 | 
			
		||||
            'ps2_status'  => 'chassisPs2Status',    
 | 
			
		||||
            'fan'         => 'chassisFanStatus'
 | 
			
		||||
             );
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPower::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
            %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
            'i_type2'        => 'ifType',
 | 
			
		||||
            # 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',
 | 
			
		||||
        );
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,             %SNMP::Info::CiscoPower::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,        %SNMP::Info::CiscoPortSecurity::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::FUNCS,         %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,               %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::FUNCS,         %SNMP::Info::CiscoStpExtensions::FUNCS, 
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
            # Inherit all the built in munging
 | 
			
		||||
            %SNMP::Info::Layer3::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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Overidden Methods
 | 
			
		||||
 | 
			
		||||
sub i_type {
 | 
			
		||||
    my $c3550 = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_port = $c3550->p_port();
 | 
			
		||||
    my $p_type  = $c3550->p_type();
 | 
			
		||||
 | 
			
		||||
    # Get more generic port types from IF-MIB
 | 
			
		||||
    my $i_type  = $c3550->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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $c3550 = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_port = $c3550->p_port();
 | 
			
		||||
    my $p_duplex  = $c3550->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 $c3550 = shift;
 | 
			
		||||
 | 
			
		||||
    my $p_port          = $c3550->p_port();
 | 
			
		||||
    my $p_duplex_admin  = $c3550->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; 
 | 
			
		||||
}
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,             %SNMP::Info::CiscoPower::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,        %SNMP::Info::CiscoPortSecurity::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MUNGE,         %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,               %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MUNGE,         %SNMP::Info::CiscoStpExtensions::MUNGE, 
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
@@ -172,11 +120,14 @@ sub vendor {
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $c3550 = shift;
 | 
			
		||||
    my $id = $c3550->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    my $id    = $c3550->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id) || $id;
 | 
			
		||||
    $model =~ s/^catalyst//;
 | 
			
		||||
    $model =~ s/(24|48)$//;
 | 
			
		||||
 | 
			
		||||
    # turn 355048 into 3550-48
 | 
			
		||||
    if ( $model =~ /^(35\d\d)(\d\d(T|G)?)$/ ) {
 | 
			
		||||
        $model = "$1-$2";
 | 
			
		||||
    }
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -184,14 +135,105 @@ sub model {
 | 
			
		||||
sub ports {
 | 
			
		||||
    my $c3550 = shift;
 | 
			
		||||
 | 
			
		||||
    my $ports2 = $c3550->ports2();    
 | 
			
		||||
 | 
			
		||||
    my $id = $c3550->id();
 | 
			
		||||
    my $id    = $c3550->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    if ($model =~ /(24|48)$/) {
 | 
			
		||||
    if ( $model =~ /(12|24|48)(C|T|TS|G|TS-E|TS-S|T-E)?$/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return $ports2;
 | 
			
		||||
 | 
			
		||||
    my $ports = $c3550->orig_ports();
 | 
			
		||||
    return $ports;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Verions prior to 12.1(22)EA1a use the older CiscoStack method
 | 
			
		||||
#  Newer versions use the ETHERLIKE-MIB to report operational duplex.
 | 
			
		||||
#  See http://www.ciscosystems.com/en/US/products/hw/switches/ps646/prod_release_note09186a00802a08ee.html
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $c3550   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $el_duplex = $c3550->el_duplex($partial);
 | 
			
		||||
 | 
			
		||||
    # Newer software
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Fall back to CiscoStack method
 | 
			
		||||
    else {
 | 
			
		||||
        return $c3550->SUPER::i_duplex($partial);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Software >= 12.1(22)EA1a uses portDuplex as admin setting
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $c3550   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $el_duplex = $c3550->el_duplex($partial);
 | 
			
		||||
 | 
			
		||||
    # Newer software
 | 
			
		||||
    if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
 | 
			
		||||
        my $p_port   = $c3550->p_port()   || {};
 | 
			
		||||
        my $p_duplex = $c3550->p_duplex() || {};
 | 
			
		||||
 | 
			
		||||
        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$/ );
 | 
			
		||||
 | 
			
		||||
            $i_duplex_admin->{$iid} = $p_duplex->{$port};
 | 
			
		||||
        }
 | 
			
		||||
        return $i_duplex_admin;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Fall back to CiscoStack method
 | 
			
		||||
    else {
 | 
			
		||||
        return $c3550->SUPER::i_duplex_admin($partial);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 $c3550 = shift;
 | 
			
		||||
    my ( $duplex, $iid ) = @_;
 | 
			
		||||
 | 
			
		||||
    my $el_duplex = $c3550->el_duplex($iid);
 | 
			
		||||
 | 
			
		||||
    # Auto duplex only supported on newer software
 | 
			
		||||
    if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
 | 
			
		||||
        my $p_port = $c3550->p_port() || {};
 | 
			
		||||
        my %reverse_p_port = reverse %$p_port;
 | 
			
		||||
 | 
			
		||||
        $duplex = lc($duplex);
 | 
			
		||||
 | 
			
		||||
        return 0 unless defined $duplexes{$duplex};
 | 
			
		||||
 | 
			
		||||
        $iid = $reverse_p_port{$iid};
 | 
			
		||||
 | 
			
		||||
        return $c3550->set_p_duplex( $duplexes{$duplex}, $iid );
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return $c3550->SUPER::set_i_duplex_admin;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cisco_comm_indexing {
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -199,22 +241,23 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::C3550 - Perl5 Interface to Cisco Catalyst 3550 Layer 2/3 Switches running IOS
 | 
			
		||||
SNMP::Info::Layer3::C3550 - SNMP Interface to Cisco Catalyst 3550 Layer 2/3
 | 
			
		||||
Switches running IOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $c3550 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        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";
 | 
			
		||||
 | 
			
		||||
@@ -225,12 +268,12 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Cisco Catalyst 3550 Layer 2/3 Switches.  
 | 
			
		||||
 | 
			
		||||
These devices run IOS but have some of the same charactersitics as the Catalyst WS-C family (5xxx,6xxx). 
 | 
			
		||||
For example, forwarding tables are held in VLANs, and extened interface information
 | 
			
		||||
is gleened from CISCO-SWITCH-MIB.
 | 
			
		||||
These devices run IOS but have some of the same characteristics as the
 | 
			
		||||
Catalyst WS-C family (5xxx,6xxx).  For example, forwarding tables are held in
 | 
			
		||||
VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not after determining
 | 
			
		||||
a more specific class using the method above. 
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $c3550 = new SNMP::Info::Layer3::C3550(...);
 | 
			
		||||
 | 
			
		||||
@@ -240,15 +283,52 @@ a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoSTPExtensions
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item CISCO-STACK-MIB
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
=item CISCO-VTP-MIB
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
 | 
			
		||||
requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -258,41 +338,68 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c3550->serial()
 | 
			
		||||
(B<chassisSerialNumberString>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->model()
 | 
			
		||||
(B<chassisModel>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->ps1_type()
 | 
			
		||||
(B<chassisPs1Type>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->ps2_type()
 | 
			
		||||
(B<chassisPs2Type>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->ps1_status()
 | 
			
		||||
(B<chassisPs1Status>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->ps2_status()
 | 
			
		||||
(B<chassisPs2Status>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->slots()
 | 
			
		||||
(B<chassisNumSlots>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->fan()
 | 
			
		||||
(B<chassisFanStatus>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'cisco'
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $c3550->model()
 | 
			
		||||
 | 
			
		||||
Will take the translated model number and try to format it better.
 | 
			
		||||
 | 
			
		||||
 355048 -> 3550-48
 | 
			
		||||
 355012G -> 3550-12G
 | 
			
		||||
 | 
			
		||||
=item $c3550->ports()
 | 
			
		||||
 | 
			
		||||
Tries to cull the number of ports from the model number.
 | 
			
		||||
 | 
			
		||||
=item $c3550->cisco_comm_indexing()
 | 
			
		||||
 | 
			
		||||
Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer3 for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"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::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
@@ -301,103 +408,81 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c3550->i_type()
 | 
			
		||||
 | 
			
		||||
Crosses p_port() with p_type() and returns the results. 
 | 
			
		||||
 | 
			
		||||
Overrides with ifType if p_type() isn't available.
 | 
			
		||||
 | 
			
		||||
=item $c3550->i_name()
 | 
			
		||||
 | 
			
		||||
Crosses p_name with p_port and returns results.
 | 
			
		||||
 | 
			
		||||
=item $c3550->i_duplex()
 | 
			
		||||
 | 
			
		||||
Crosses p_duplex with p_port and returns results.
 | 
			
		||||
Returns reference to hash of iid to current link duplex setting.
 | 
			
		||||
 | 
			
		||||
Software version 12.1(22)EA1a or greater returns duplex based upon the
 | 
			
		||||
result of $c3550->el_duplex().  Otherwise it uses the result of
 | 
			
		||||
the call to CiscoStack::i_duplex().
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Etherlike> for el_duplex() method and
 | 
			
		||||
L<SNMP::Info::CiscoStack> for its i_duplex() method.
 | 
			
		||||
 | 
			
		||||
=item $c3550->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Crosses p_duplex_admin with p_port.
 | 
			
		||||
Returns reference to hash of iid to administrative duplex setting.
 | 
			
		||||
 | 
			
		||||
Munges bit_string returned from p_duplex_admin to get duplex settings.
 | 
			
		||||
Software version 12.1(22)EA1a or greater returns duplex based upon the
 | 
			
		||||
result of $c3550->p_duplex().  Otherwise it uses the result of
 | 
			
		||||
the call to CiscoStack::i_duplex().
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
See L<SNMP::Info::CiscoStack> for its i_duplex() and p_duplex() methods.
 | 
			
		||||
 | 
			
		||||
=head2 Port Entry Table (CISCO-STACK-MIB::portTable)
 | 
			
		||||
=item $c3550->set_i_duplex_admin(duplex, ifIndex)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
=item $c3550->p_name()
 | 
			
		||||
Speed choices are 'auto', 'half', 'full'.
 | 
			
		||||
 | 
			
		||||
(B<portName>)
 | 
			
		||||
Crosses $c3550->p_port() with $c3550->p_duplex() to utilize port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
=item $c3550->p_type()
 | 
			
		||||
 | 
			
		||||
(B<portType>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->p_status()
 | 
			
		||||
 | 
			
		||||
(B<portOperStatus>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->p_status2()
 | 
			
		||||
 | 
			
		||||
(B<portAdditionalStatus>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->p_speed()
 | 
			
		||||
 | 
			
		||||
(B<portAdminSpeed>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->p_duplex()
 | 
			
		||||
 | 
			
		||||
(B<portDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->p_port()
 | 
			
		||||
 | 
			
		||||
(B<portIfIndex>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Port Capability Table (CISCO-STACK-MIB::portCpbTable)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c3550->p_speed_admin()
 | 
			
		||||
 | 
			
		||||
(B<portCpbSpeed>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->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 $c3550->v_state()
 | 
			
		||||
 | 
			
		||||
(B<vtpVlanState>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->v_type()
 | 
			
		||||
 | 
			
		||||
(B<vtpVlanType>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->v_name()
 | 
			
		||||
 | 
			
		||||
(B<vtpVlanName>)
 | 
			
		||||
 | 
			
		||||
=item $c3550->v_mtu()
 | 
			
		||||
 | 
			
		||||
(B<vtpVlanMtu>)
 | 
			
		||||
    Example:
 | 
			
		||||
    my %if_map = reverse %{$c3550->interfaces()};
 | 
			
		||||
    $c3550->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) 
 | 
			
		||||
        or die "Couldn't change port duplex. ",$c3550->error(1);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Layer3 for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
 | 
			
		||||
details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										319
									
								
								Info/Layer3/C4000.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										319
									
								
								Info/Layer3/C4000.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,319 @@
 | 
			
		||||
# SNMP::Info::Layer3::C4000
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::C4000;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoImage;
 | 
			
		||||
use SNMP::Info::CiscoPortSecurity;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::C4000::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoImage
 | 
			
		||||
    SNMP::Info::CiscoPortSecurity
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::MAU
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::C4000::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MIBS,
 | 
			
		||||
    'CISCO-ENVMON-MIB' => 'ciscoEnvMonMIB',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
    'ps1_type'   => 'ciscoEnvMonSupplyStatusDescr.1',
 | 
			
		||||
    'ps1_status' => 'ciscoEnvMonSupplyState.1',
 | 
			
		||||
    'ps2_type'   => 'ciscoEnvMonSupplyStatusDescr.2',
 | 
			
		||||
    'ps2_status' => 'ciscoEnvMonSupplyState.2',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,
 | 
			
		||||
    'fan_state' => 'ciscoEnvMonFanState',
 | 
			
		||||
    'fan_descr' => 'ciscoEnvMonFanStatusDescr',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,      %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MUNGE,  %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,         %SNMP::Info::CiscoVTP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Override Inheritance for these specific methods
 | 
			
		||||
# use MAU-MIB for admin. duplex and admin. speed
 | 
			
		||||
*SNMP::Info::Layer3::C4000::i_duplex_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_duplex_admin;
 | 
			
		||||
*SNMP::Info::Layer3::C4000::i_speed_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_speed_admin;
 | 
			
		||||
 | 
			
		||||
sub fan {
 | 
			
		||||
    my $c4000     = shift;
 | 
			
		||||
    my $fan_state = $c4000->fan_state();
 | 
			
		||||
    my $fan_descr = $c4000->fan_descr();
 | 
			
		||||
    my $ret       = "";
 | 
			
		||||
    my $s         = "";
 | 
			
		||||
    foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
 | 
			
		||||
        $ret .= $s . $fan_descr->{$i} . ": " . $fan_state->{$i};
 | 
			
		||||
        $s = ", ";
 | 
			
		||||
    }
 | 
			
		||||
    return if ( $s eq "" );
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cisco_comm_indexing { return 1; }
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::C4000 - SNMP Interface to Cisco Catalyst 4000 Layer 2/3
 | 
			
		||||
Switches running IOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Bill Fenner
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $c4000 = 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      = $c4000->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Cisco Catalyst 4000 Layer 2/3 Switches.  
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $c4000 = new SNMP::Info::Layer3::C4000(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=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::CiscoImage/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
 | 
			
		||||
requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c4000->cisco_comm_indexing()
 | 
			
		||||
 | 
			
		||||
Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=item $c4000->fan()
 | 
			
		||||
 | 
			
		||||
Returns fan status
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c4000->i_duplex()
 | 
			
		||||
 | 
			
		||||
Parses mau_index and mau_link to return the duplex information for
 | 
			
		||||
interfaces.
 | 
			
		||||
 | 
			
		||||
=item $c4000->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Parses C<mac_index>,C<mau_autostat>,C<mau_type_admin> in
 | 
			
		||||
order to find the admin duplex setting for all the interfaces.
 | 
			
		||||
 | 
			
		||||
Returns either (auto,full,half).
 | 
			
		||||
 | 
			
		||||
=item $c4000->i_speed_admin()
 | 
			
		||||
 | 
			
		||||
Returns administrative speed for interfaces.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
 | 
			
		||||
details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										449
									
								
								Info/Layer3/C6500.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										449
									
								
								Info/Layer3/C6500.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,449 @@
 | 
			
		||||
# SNMP::Info::Layer3::C6500
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008-2009 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::Layer3::C6500;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoStack;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoImage;
 | 
			
		||||
use SNMP::Info::CiscoPortSecurity;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CiscoPower;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::CiscoStpExtensions;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
# NOTE : Top-most items gets precedence for @ISA
 | 
			
		||||
@SNMP::Info::Layer3::C6500::ISA = qw/
 | 
			
		||||
    SNMP::Info::CiscoVTP 
 | 
			
		||||
    SNMP::Info::CiscoStpExtensions
 | 
			
		||||
    SNMP::Info::CiscoStack
 | 
			
		||||
    SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::CDP 
 | 
			
		||||
    SNMP::Info::CiscoImage
 | 
			
		||||
    SNMP::Info::CiscoStats
 | 
			
		||||
    SNMP::Info::CiscoPortSecurity
 | 
			
		||||
    SNMP::Info::CiscoConfig
 | 
			
		||||
    SNMP::Info::CiscoPower
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    Exporter
 | 
			
		||||
/;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::C6500::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# NOTE: Order creates precedence
 | 
			
		||||
#       Example: v_name exists in Bridge.pm and CiscoVTP.pm
 | 
			
		||||
#       Bridge is called from Layer3 and CiscoStpExtensions
 | 
			
		||||
#       So we want CiscoVTP to come last to get the right one.
 | 
			
		||||
# The @ISA order should match these orders.
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,             %SNMP::Info::CiscoPower::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,        %SNMP::Info::CiscoPortSecurity::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MIBS,         %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,                %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MIBS,         %SNMP::Info::CiscoStpExtensions::MIBS, 
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MIBS,    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPower::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,             %SNMP::Info::CiscoPower::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,        %SNMP::Info::CiscoPortSecurity::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::FUNCS,         %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,                %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::FUNCS,         %SNMP::Info::CiscoStpExtensions::FUNCS, 
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,             %SNMP::Info::CiscoPower::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,        %SNMP::Info::CiscoPortSecurity::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MUNGE,         %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,                %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MUNGE,         %SNMP::Info::CiscoStpExtensions::MUNGE, 
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MUNGE,    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cisco_comm_indexing { return 1; }
 | 
			
		||||
 | 
			
		||||
#  Newer versions use the ETHERLIKE-MIB to report operational duplex.
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $c6500   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $el_duplex = $c6500->el_duplex($partial);
 | 
			
		||||
 | 
			
		||||
    # Newer software
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Fall back to CiscoStack method
 | 
			
		||||
    else {
 | 
			
		||||
        return $c6500->SUPER::i_duplex($partial);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Newer software uses portDuplex as admin setting
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $c6500   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $el_duplex = $c6500->el_duplex($partial);
 | 
			
		||||
 | 
			
		||||
    # Newer software
 | 
			
		||||
    if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
 | 
			
		||||
        my $p_port   = $c6500->p_port()   || {};
 | 
			
		||||
        my $p_duplex = $c6500->p_duplex() || {};
 | 
			
		||||
 | 
			
		||||
        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$/ );
 | 
			
		||||
 | 
			
		||||
            $i_duplex_admin->{$iid} = $p_duplex->{$port};
 | 
			
		||||
        }
 | 
			
		||||
        return $i_duplex_admin;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Fall back to CiscoStack method
 | 
			
		||||
    else {
 | 
			
		||||
        return $c6500->SUPER::i_duplex_admin($partial);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 $c6500 = shift;
 | 
			
		||||
    my ( $duplex, $iid ) = @_;
 | 
			
		||||
 | 
			
		||||
    my $el_duplex = $c6500->el_duplex($iid);
 | 
			
		||||
 | 
			
		||||
    # Auto duplex only supported on newer software
 | 
			
		||||
    if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
 | 
			
		||||
        my $p_port = $c6500->p_port() || {};
 | 
			
		||||
        my %reverse_p_port = reverse %$p_port;
 | 
			
		||||
 | 
			
		||||
        $duplex = lc($duplex);
 | 
			
		||||
 | 
			
		||||
        return 0 unless defined $duplexes{$duplex};
 | 
			
		||||
 | 
			
		||||
        $iid = $reverse_p_port{$iid};
 | 
			
		||||
 | 
			
		||||
        return $c6500->set_p_duplex( $duplexes{$duplex}, $iid );
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return $c6500->SUPER::set_i_duplex_admin;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::C6500 - SNMP Interface to Cisco Catalyst 6500 Layer 2/3
 | 
			
		||||
Switches running IOS and/or CatOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $c6500 = 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      = $c6500->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Cisco Catalyst 6500 Layer 2/3 Switches.  
 | 
			
		||||
 | 
			
		||||
These devices run IOS but have some of the same characteristics as the
 | 
			
		||||
Catalyst WS-C family (5xxx). For example, forwarding tables are held in
 | 
			
		||||
VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $c6500 = new SNMP::Info::Layer3::C6500(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
=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::CiscoStack/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
 | 
			
		||||
requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c6500->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $c6500->cisco_comm_indexing()
 | 
			
		||||
 | 
			
		||||
Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c6500->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to current link duplex setting.
 | 
			
		||||
 | 
			
		||||
Newer software versions return duplex based upon the result of
 | 
			
		||||
$c6500->el_duplex().  Otherwise it uses the result of the call to
 | 
			
		||||
CiscoStack::i_duplex().
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Etherlike> for el_duplex() method and
 | 
			
		||||
L<SNMP::Info::CiscoStack> for its i_duplex() method.
 | 
			
		||||
 | 
			
		||||
=item $c6500->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to administrative duplex setting.
 | 
			
		||||
 | 
			
		||||
Newer software versions return duplex based upon the result of
 | 
			
		||||
$c6500->p_duplex().  Otherwise it uses the result of the call to
 | 
			
		||||
CiscoStack::i_duplex().
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStack> for its i_duplex() and p_duplex() methods.
 | 
			
		||||
 | 
			
		||||
=item $c6500->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 $c6500->p_port() with $c6500->p_duplex() to utilize port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
    Example:
 | 
			
		||||
    my %if_map = reverse %{$c6500->interfaces()};
 | 
			
		||||
    $c6500->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) 
 | 
			
		||||
        or die "Couldn't change port duplex. ",$c6500->error(1);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
 | 
			
		||||
details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										315
									
								
								Info/Layer3/Cisco.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										315
									
								
								Info/Layer3/Cisco.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,315 @@
 | 
			
		||||
# SNMP::Info::Layer3::Cisco
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Cisco;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoImage;
 | 
			
		||||
use SNMP::Info::CiscoRTT;
 | 
			
		||||
use SNMP::Info::CiscoQOS;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CiscoPower;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoImage
 | 
			
		||||
    SNMP::Info::CiscoRTT  SNMP::Info::CiscoQOS
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::CiscoPower
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Cisco::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoPower::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoQOS::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MIBS,
 | 
			
		||||
    'CISCO-EIGRP-MIB' => 'cEigrpAsRouterId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,      %SNMP::Info::CiscoPower::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS, %SNMP::Info::CiscoQOS::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::GLOBALS,    %SNMP::Info::CiscoImage::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,  %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS, 'eigrp_id' => 'cEigrpAsRouterId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoPower::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoQOS::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # EIGRP
 | 
			
		||||
    'eigrp_peers' => 'cEigrpPeerAddr',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoPower::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoQOS::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MUNGE,
 | 
			
		||||
    'eigrp_peers' => \&SNMP::Info::munge_ip,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my ($cisco)   = shift;
 | 
			
		||||
    my ($partial) = shift;
 | 
			
		||||
 | 
			
		||||
    my ($i_type)  = $cisco->i_type($partial);
 | 
			
		||||
    my ($i_descr) = $cisco->i_description($partial);
 | 
			
		||||
    my %i_vlan;
 | 
			
		||||
 | 
			
		||||
    foreach my $idx ( keys %$i_descr ) {
 | 
			
		||||
        if ( $i_type->{$idx} eq 'l2vlan' || $i_type->{$idx} eq 135 ) {
 | 
			
		||||
            if ( $i_descr->{$idx} =~ /\.(\d+)$/ ) {
 | 
			
		||||
                $i_vlan{$idx} = $1;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
 | 
			
		||||
that are not covered in other 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 Cisco Routers running IOS
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Power
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-EIGRP-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoQOS/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cisco->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $cisco->eigrp_id()
 | 
			
		||||
 | 
			
		||||
(C<cEigrpAsRouterId>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cisco->eigrp_peers()
 | 
			
		||||
 | 
			
		||||
Returns EIGRP peer IP addresses
 | 
			
		||||
 | 
			
		||||
(C<cEigrpPeerAddr>)
 | 
			
		||||
 | 
			
		||||
=item $cisco->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										252
									
								
								Info/Layer3/CiscoASA.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								Info/Layer3/CiscoASA.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,252 @@
 | 
			
		||||
# SNMP::Info::Layer3::CiscoASA
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2013 Moe Kraus
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR
 | 
			
		||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::CiscoASA;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoImage;
 | 
			
		||||
use SNMP::Info::CiscoRTT;
 | 
			
		||||
use SNMP::Info::CiscoQOS;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CiscoPower;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::Layer3::Cisco;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::CiscoASA::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoImage
 | 
			
		||||
    SNMP::Info::CiscoRTT  SNMP::Info::CiscoQOS
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::CiscoPower
 | 
			
		||||
    SNMP::Info::Layer3::Cisco
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::CiscoASA::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
       %SNMP::Info::Layer3::Cisco::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
       %SNMP::Info::Layer3::Cisco::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
       %SNMP::Info::Layer3::Cisco::FUNCS,
 | 
			
		||||
    'mac_table' => 'ifPhysAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
       %SNMP::Info::Layer3::Cisco::MUNGE,
 | 
			
		||||
    'mac_table'  => \&SNMP::Info::munge_mac, );
 | 
			
		||||
 | 
			
		||||
sub b_mac {
 | 
			
		||||
       my ($asa) = shift;
 | 
			
		||||
       my $macs = $asa->mac_table();
 | 
			
		||||
       my @macs;
 | 
			
		||||
       # gather physical addresses
 | 
			
		||||
       foreach my $i ( keys %$macs ) {
 | 
			
		||||
               my $mac = $macs->{$i};
 | 
			
		||||
               # don't catch the bad macs with zeroed OUI
 | 
			
		||||
               if ( $mac !~ m/(0{1,2}:){3}/ ) {
 | 
			
		||||
                       push( @macs, $mac);
 | 
			
		||||
               }
 | 
			
		||||
               @macs = sort( @macs );
 | 
			
		||||
       }
 | 
			
		||||
       # return the least mac
 | 
			
		||||
       return $macs[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_description {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_descr = $self->orig_i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $ifindex ( keys %$i_descr ) {
 | 
			
		||||
        $i_descr->{$ifindex} =~ /'(.*)'/;
 | 
			
		||||
        $i_descr->{$ifindex} = $1
 | 
			
		||||
            if defined $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::CiscoASA - Cisco Adaptive Security Appliance
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Moe Kraus
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $cisco = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $asa->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass: $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Cisco ASAs
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-EIGRP-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $asa->b_mac()
 | 
			
		||||
 | 
			
		||||
Returns base mac.
 | 
			
		||||
Overrides base mac function in L<SNMP::Info::Layer3>.
 | 
			
		||||
 | 
			
		||||
=item $asa->i_description()
 | 
			
		||||
 | 
			
		||||
Overrides base interface description function in L<SNMP::Info> to return the
 | 
			
		||||
configured interface name instead of "Adaptive Security Appliance
 | 
			
		||||
'$configured interface name' interface".
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a
 | 
			
		||||
reference to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										223
									
								
								Info/Layer3/CiscoFWSM.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								Info/Layer3/CiscoFWSM.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,223 @@
 | 
			
		||||
# SNMP::Info::Layer3::CiscoFWSM
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2010 Brian De Wolf
 | 
			
		||||
# 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::CiscoFWSM;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3::Cisco;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::Layer3::Cisco
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::CiscoFWSM::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::Cisco::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::Cisco::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::Cisco::FUNCS,
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::Cisco::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# For FWSMs, the ipNetToPhysicalPhysAddress table appears to be of the form:
 | 
			
		||||
# $ifindex.$inetaddresstype.$proto.$ip_address -> $mac_address
 | 
			
		||||
#
 | 
			
		||||
# Using the output of ipNetToPhysicalPhysAddress, we can emulate the other
 | 
			
		||||
# functions.
 | 
			
		||||
#
 | 
			
		||||
# This doesn't really line up to what at_* return, so we munge it
 | 
			
		||||
 | 
			
		||||
sub at_paddr {
 | 
			
		||||
    my ($fwsm)    = shift;
 | 
			
		||||
    my ($partial)  = shift;
 | 
			
		||||
 | 
			
		||||
    my $paddrs = $fwsm->n2p_paddr($partial);
 | 
			
		||||
    my $n_paddrs = {};
 | 
			
		||||
    
 | 
			
		||||
    foreach my $key (keys %$paddrs) {
 | 
			
		||||
        my $paddr = $paddrs->{$key};
 | 
			
		||||
        my @parts = split /\./, $key;
 | 
			
		||||
	my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
 | 
			
		||||
	my $ip = join ".", @parts;
 | 
			
		||||
 | 
			
		||||
	next if($proto != 4); # at_paddr doesn't support non-IPv4
 | 
			
		||||
 | 
			
		||||
        $n_paddrs->{"$ifindex.$ip"} = $paddr;
 | 
			
		||||
    }
 | 
			
		||||
    return $n_paddrs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub at_netaddr {
 | 
			
		||||
    my ($fwsm)    = shift;
 | 
			
		||||
    my ($partial)  = shift;
 | 
			
		||||
 | 
			
		||||
    my $paddrs = $fwsm->n2p_paddr($partial);
 | 
			
		||||
 | 
			
		||||
    my $netaddrs = {};
 | 
			
		||||
    
 | 
			
		||||
    foreach my $key (keys %$paddrs) {
 | 
			
		||||
        my $paddr = $paddrs->{$key};
 | 
			
		||||
        my @parts = split /\./, $key;
 | 
			
		||||
	my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
 | 
			
		||||
	my $ip = join ".", @parts;
 | 
			
		||||
 | 
			
		||||
	next if($proto != 4); # at_netaddr doesn't support non-IPv4
 | 
			
		||||
 | 
			
		||||
        $netaddrs->{"$ifindex.$ip"} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return $netaddrs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub at_ifaddr {
 | 
			
		||||
    my ($fwsm)    = shift;
 | 
			
		||||
    my ($partial)  = shift;
 | 
			
		||||
 | 
			
		||||
    my $paddrs = $fwsm->n2p_paddr($partial);
 | 
			
		||||
 | 
			
		||||
    my $ifaddrs = {};
 | 
			
		||||
    
 | 
			
		||||
    foreach my $key (keys %$paddrs) {
 | 
			
		||||
        my $paddr = $paddrs->{$key};
 | 
			
		||||
        my @parts = split /\./, $key;
 | 
			
		||||
	my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
 | 
			
		||||
	my $ip = join ".", @parts;
 | 
			
		||||
 | 
			
		||||
	next if($proto != 4); # at_ifaddr doesn't support non-IPv4
 | 
			
		||||
 | 
			
		||||
        $ifaddrs->{"$ifindex.$ip"} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return $ifaddrs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::CiscoFWSM - SNMP Interface to Firewall Services Modules for
 | 
			
		||||
features not covered elsewhere.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Brian De Wolf
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $fwsm = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $fwsm->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Cisco Firewall Services Modules
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $fwsm->at_paddr()
 | 
			
		||||
 | 
			
		||||
This function derives the at_paddr information from the n2p_paddr() table as
 | 
			
		||||
the MIB to provide that information isn't supported on FWSM.
 | 
			
		||||
 | 
			
		||||
=item $fwsm->at_netaddr()
 | 
			
		||||
 | 
			
		||||
This function derives the at_netaddr information from the n2p_paddr() table as
 | 
			
		||||
the MIB to provide that information isn't supported on FWSM.
 | 
			
		||||
 | 
			
		||||
=item $fwsm->at_ifaddr()
 | 
			
		||||
 | 
			
		||||
This function derives the at_ifaddr information from the n2p_paddr() table as
 | 
			
		||||
the MIB to provide that information isn't supported on FWSM.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										314
									
								
								Info/Layer3/Contivity.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										314
									
								
								Info/Layer3/Contivity.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,314 @@
 | 
			
		||||
# SNMP::Info::Layer3::Contivity
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2010 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Contivity;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::Entity;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Contivity::ISA
 | 
			
		||||
    = qw/SNMP::Info SNMP::Info::Layer3 SNMP::Info::Entity Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Contivity::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Entity::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS, %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::Entity::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::MUNGE, %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::Entity::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
    return '00000100';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $contivity = shift;
 | 
			
		||||
    my $e_model = $contivity->e_model() || {};
 | 
			
		||||
 | 
			
		||||
    my $model = $e_model->{1} || undef;
 | 
			
		||||
 | 
			
		||||
    return $1 if ( defined $model and $model =~ /(CES\d+|NVR\d+)/i );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'contivity';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $contivity = shift;
 | 
			
		||||
    my $descr     = $contivity->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/V(\d+_\d+\.\d+)/i ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mac {
 | 
			
		||||
    my $contivity = shift;
 | 
			
		||||
    my $i_mac     = $contivity->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 $contivity = shift;
 | 
			
		||||
    my $e_serial = $contivity->e_serial() || {};
 | 
			
		||||
 | 
			
		||||
    my $serial = $e_serial->{1} || undef;
 | 
			
		||||
 | 
			
		||||
    return $1 if ( defined $serial and $serial =~ /(\d+)/ );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $contivity = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $description = $contivity->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid ( keys %$description ) {
 | 
			
		||||
        my $desc = $description->{$iid};
 | 
			
		||||
 | 
			
		||||
        # Skip everything except Ethernet interfaces
 | 
			
		||||
        next unless ( defined $desc and $desc =~ /fe/i );
 | 
			
		||||
 | 
			
		||||
        $interfaces{$iid} = $desc;
 | 
			
		||||
    }
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $contivity = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_name2 = $contivity->orig_i_name($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_name;
 | 
			
		||||
    foreach my $iid ( keys %$i_name2 ) {
 | 
			
		||||
        my $name = $i_name2->{$iid};
 | 
			
		||||
 | 
			
		||||
        #Skip everything except Ethernet interfaces
 | 
			
		||||
        next unless ( defined $name and $name =~ /fe/i );
 | 
			
		||||
 | 
			
		||||
        $name = $1 if $name =~ /(fei\.\d+\.\d+)/;
 | 
			
		||||
 | 
			
		||||
        $i_name{$iid} = $name;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Contivity - SNMP Interface to Avaya/Nortel VPN Routers
 | 
			
		||||
(formerly Contivity Extranet Switches).
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $contivity = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $contivity->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Avaya/Nortel VPN Routers (formerly Contivity
 | 
			
		||||
Extranet Switch).  
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $contivity = new SNMP::Info::Layer3::Contivity(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Entity/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $contivity->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $contivity->model()
 | 
			
		||||
 | 
			
		||||
Returns the chassis name.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalModelName.1>)
 | 
			
		||||
 | 
			
		||||
=item $contivity->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'CES'>
 | 
			
		||||
 | 
			
		||||
=item $contivity->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted from (C<sysDescr>).
 | 
			
		||||
 | 
			
		||||
=item $contivity->serial()
 | 
			
		||||
 | 
			
		||||
Returns the chassis serial number.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalSerialNum.1>)
 | 
			
		||||
 | 
			
		||||
=item $contivity->mac()
 | 
			
		||||
 | 
			
		||||
Returns the MAC address of the first Ethernet Interface.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $contivity->layers()
 | 
			
		||||
 | 
			
		||||
Returns 00000100.  Contivity does not support bridge MIB, so override reported
 | 
			
		||||
layers.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $contivity->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to the map between IID and physical Port.  Skips loopback
 | 
			
		||||
and tunnel interfaces.
 | 
			
		||||
 | 
			
		||||
=item $contivity->i_name()
 | 
			
		||||
 | 
			
		||||
Interface Name field.  Skips loopback and tunnel interfaces.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										436
									
								
								Info/Layer3/Dell.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										436
									
								
								Info/Layer3/Dell.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,436 @@
 | 
			
		||||
# SNMP::Info::Layer3::Dell - SNMP Interface to Dell devices
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer3::Dell;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Dell::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Dell::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'RADLAN-Physicaldescription-MIB' => 'rlPhdStackReorder',
 | 
			
		||||
    'RADLAN-rlInterfaces'            => 'rlIfNumOfLoopbackPorts',
 | 
			
		||||
    'RADLAN-HWENVIROMENT'            => 'rlEnvPhysicalDescription',
 | 
			
		||||
    'Dell-Vendor-MIB'                => 'productIdentificationVersion',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    'os_ver'       => 'productIdentificationVersion',
 | 
			
		||||
    'dell_id_name' => 'productIdentificationDisplayName',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # RADLAN-rlInterfaces:swIfTable
 | 
			
		||||
    'dell_duplex_admin' => 'swIfDuplexAdminMode',
 | 
			
		||||
    'dell_duplex'       => 'swIfDuplexOperMode',
 | 
			
		||||
    'dell_tag_mode'     => 'swIfTaggedMode',
 | 
			
		||||
    'dell_i_type'       => 'swIfType',
 | 
			
		||||
    'dell_fc_admin'     => 'swIfFlowControlMode',
 | 
			
		||||
    'dell_speed_admin'  => 'swIfSpeedAdminMode',
 | 
			
		||||
    'dell_auto'         => 'swIfSpeedDuplexAutoNegotiation',
 | 
			
		||||
    'dell_fc'           => 'swIfOperFlowControlMode',
 | 
			
		||||
 | 
			
		||||
    # RADLAN-Physicaldescription-MIB:rlPhdUnitGenParamTable
 | 
			
		||||
    'dell_unit'      => 'rlPhdUnitGenParamStackUnit',
 | 
			
		||||
    'dell_sw_ver'    => 'rlPhdUnitGenParamSoftwareVersion',
 | 
			
		||||
    'dell_fw_ver'    => 'rlPhdUnitGenParamFirmwareVersion',
 | 
			
		||||
    'dell_hw_ver'    => 'rlPhdUnitGenParamHardwareVersion',
 | 
			
		||||
    'dell_serial_no' => 'rlPhdUnitGenParamSerialNum',
 | 
			
		||||
    'dell_asset_no'  => 'rlPhdUnitGenParamAssetTag',
 | 
			
		||||
 | 
			
		||||
    # RADLAN-COPY-MIB:rlCopyTable
 | 
			
		||||
    'dell_cp_idx'     => 'rlCopyIndex',
 | 
			
		||||
    'dell_cp_sloc'    => 'rlCopySourceLocation',
 | 
			
		||||
    'dell_cp_sip'     => 'rlCopySourceIpAddress',
 | 
			
		||||
    'dell_cp_sunit'   => 'rlCopySourceUnitNumber',
 | 
			
		||||
    'dell_cp_sfile'   => 'rlCopySourceFileName',
 | 
			
		||||
    'dell_cp_stype'   => 'rlCopySourceFileType',
 | 
			
		||||
    'dell_cp_dloc'    => 'rlCopyDestinationLocation',
 | 
			
		||||
    'dell_cp_dip'     => 'rlCopyDestinationIpAddress',
 | 
			
		||||
    'dell_cp_dunit'   => 'rlCopyDestinationUnitNumber',
 | 
			
		||||
    'dell_cp_dfile'   => 'rlCopyDestinationFileName',
 | 
			
		||||
    'dell_cp_dtype'   => 'rlCopyDestinationFileType',
 | 
			
		||||
    'dell_cp_state'   => 'rlCopyOperationState',
 | 
			
		||||
    'dell_cp_bkgnd'   => 'rlCopyInBackground',
 | 
			
		||||
    'dell_cp_rstatus' => 'rlCopyRowStatus',
 | 
			
		||||
 | 
			
		||||
    # RADLAN-HWENVIROMENT:rlEnvMonSupplyStatusTable
 | 
			
		||||
    'dell_pwr_src'   => 'rlEnvMonSupplySource',
 | 
			
		||||
    'dell_pwr_state' => 'rlEnvMonSupplyState',
 | 
			
		||||
    'dell_pwr_desc'  => 'rlEnvMonSupplyStatusDescr',
 | 
			
		||||
 | 
			
		||||
    # RADLAN-HWENVIROMENT:rlEnvMonFanStatusTable
 | 
			
		||||
    'dell_fan_state' => 'rlEnvMonFanState',
 | 
			
		||||
    'dell_fan_desc'  => 'rlEnvMonFanStatusDescr',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE, );
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $dell = shift;
 | 
			
		||||
 | 
			
		||||
    my $name  = $dell->dell_id_name();
 | 
			
		||||
    my $descr = $dell->description();
 | 
			
		||||
 | 
			
		||||
    if ( defined $name and $name =~ m/(\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Don't have a vendor MIB for D-Link
 | 
			
		||||
    else {
 | 
			
		||||
        return $descr;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $dell = shift;
 | 
			
		||||
 | 
			
		||||
    return $dell->_vendor();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $dell = shift;
 | 
			
		||||
 | 
			
		||||
    return $dell->_vendor();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $dell = shift;
 | 
			
		||||
 | 
			
		||||
    my $numbers = $dell->dell_serial_no();
 | 
			
		||||
 | 
			
		||||
    foreach my $key ( keys %$numbers ) {
 | 
			
		||||
        my $serial = $numbers->{$key};
 | 
			
		||||
        return $serial if ( defined $serial and $serial !~ /^\s*$/ );
 | 
			
		||||
        next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Last resort
 | 
			
		||||
    return $dell->SUPER::serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $dell    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_descr = $dell->i_description($partial) || {};
 | 
			
		||||
    my $i_name  = $dell->orig_i_name($partial)   || {};
 | 
			
		||||
 | 
			
		||||
    # Descriptions are all the same on some Dells, so use name instead if
 | 
			
		||||
    # available
 | 
			
		||||
    foreach my $iid ( keys %$i_name ) {
 | 
			
		||||
        my $name = $i_name->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
        $i_descr->{$iid} = $name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $dell    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces  = $dell->interfaces($partial)        || {};
 | 
			
		||||
    my $dell_duplex = $dell->dell_duplex_admin($partial) || {};
 | 
			
		||||
    my $dell_auto   = $dell->dell_auto($partial)         || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
        my $duplex = $dell_duplex->{$if};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
        my $auto = $dell_auto->{$if} || 'false';
 | 
			
		||||
 | 
			
		||||
        $duplex = 'half' if ( $duplex =~ /half/i and $auto =~ /false/i );
 | 
			
		||||
        $duplex = 'full' if ( $duplex =~ /half/i and $auto =~ /false/i );
 | 
			
		||||
        $duplex = 'auto' if $auto =~ /true/i;
 | 
			
		||||
        $i_duplex_admin{$if} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use same methods as netgear.  Some device didn't implement the bridge MIB
 | 
			
		||||
# forwarding table and some don't return MACs for VLANs other than default yet
 | 
			
		||||
# don't support community indexing, so we use the Q-BRIDGE-MIB forwarding
 | 
			
		||||
# table.  Fall back to the orig functions if the qb versions don't
 | 
			
		||||
# return anything.
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $dell = shift;
 | 
			
		||||
    my $ret  = $dell->qb_fw_mac();
 | 
			
		||||
    $ret = $dell->orig_fw_mac() if ( !defined($ret) );
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $dell = shift;
 | 
			
		||||
    my $ret  = $dell->qb_fw_port();
 | 
			
		||||
    $ret = $dell->orig_fw_port() if ( !defined($ret) );
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _vendor {
 | 
			
		||||
    my $dell = shift;
 | 
			
		||||
 | 
			
		||||
    my $id = $dell->id() || 'undef';
 | 
			
		||||
    my %oidmap = (
 | 
			
		||||
        2    => 'ibm',
 | 
			
		||||
        171  => 'dlink',
 | 
			
		||||
        674  => 'dell',
 | 
			
		||||
        3955 => 'linksys',
 | 
			
		||||
    );
 | 
			
		||||
    $id = $1 if ( defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/ );
 | 
			
		||||
 | 
			
		||||
    if ( defined($id) and exists( $oidmap{$id} ) ) {
 | 
			
		||||
        return $oidmap{$id};
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return 'dlink';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Dell - SNMP Interface to Dell Power Connect Network
 | 
			
		||||
Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $dell = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $dell->class();
 | 
			
		||||
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from an 
 | 
			
		||||
Dell Power Connect device through SNMP.  D-Link and the IBM BladeCenter
 | 
			
		||||
Gigabit Ethernet Switch Module also use this module based upon MIB support. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $dell = new SNMP::Info::Layer3::Dell(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<Dell-Vendor-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<RADLAN-Physicaldescription-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<RADLAN-rlInterfaces>
 | 
			
		||||
 | 
			
		||||
=item F<RADLAN-HWENVIROMENT>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See classes listed above for their required MIBs.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dell->os_ver()
 | 
			
		||||
 | 
			
		||||
(C<productIdentificationVersion>)
 | 
			
		||||
 | 
			
		||||
=item $dell->dell_id_name()
 | 
			
		||||
 | 
			
		||||
(C<productIdentificationDisplayName>)
 | 
			
		||||
 | 
			
		||||
=item $dell->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.  Returns numeric from
 | 
			
		||||
(C<productIdentificationDisplayName>) if available, otherwise if returns
 | 
			
		||||
description().
 | 
			
		||||
 | 
			
		||||
=item $dell->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
 | 
			
		||||
id().  Defaults to 'dlink'.
 | 
			
		||||
 | 
			
		||||
=item $dell->os()
 | 
			
		||||
 | 
			
		||||
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
 | 
			
		||||
id().  Defaults to 'dlink'.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dell->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number. Returns (C<rlPhdUnitGenParamSerialNum>) if available,
 | 
			
		||||
otherwise uses the Layer3 serial method.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 RADLAN Interface Table (C<swIfTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dell->dell_duplex_admin()
 | 
			
		||||
 | 
			
		||||
(C<swIfDuplexAdminMode>)
 | 
			
		||||
 | 
			
		||||
=item $dell->dell_duplex()
 | 
			
		||||
 | 
			
		||||
(C<swIfDuplexOperMode>)
 | 
			
		||||
 | 
			
		||||
=item $dell->dell_tag_mode()
 | 
			
		||||
 | 
			
		||||
(C<swIfTaggedMode>)
 | 
			
		||||
 | 
			
		||||
=item $dell->dell_i_type()
 | 
			
		||||
 | 
			
		||||
(C<swIfType>)
 | 
			
		||||
 | 
			
		||||
=item $dell->dell_fc_admin()
 | 
			
		||||
 | 
			
		||||
(C<swIfFlowControlMode>)
 | 
			
		||||
 | 
			
		||||
=item $dell->dell_speed_admin()
 | 
			
		||||
 | 
			
		||||
(C<swIfSpeedAdminMode>)
 | 
			
		||||
 | 
			
		||||
=item $dell->dell_auto()
 | 
			
		||||
 | 
			
		||||
(C<swIfSpeedDuplexAutoNegotiation>)
 | 
			
		||||
 | 
			
		||||
=item $dell->dell_fc()
 | 
			
		||||
 | 
			
		||||
(C<swIfOperFlowControlMode>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $dell->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns the map between SNMP Interface Identifier (iid) and physical port
 | 
			
		||||
name.  Uses name if available instead of description since descriptions are 
 | 
			
		||||
sometimes not unique.
 | 
			
		||||
 | 
			
		||||
=item $dell->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to current link administrative duplex
 | 
			
		||||
setting.
 | 
			
		||||
 | 
			
		||||
=item $dell->fw_mac()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table MAC Addresses.
 | 
			
		||||
 | 
			
		||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
 | 
			
		||||
the C<Q-BRIDGE-MIB> forwarding table.  Fall back to the C<BRIDGE-MIB> if
 | 
			
		||||
C<Q-BRIDGE-MIB> doesn't return anything.
 | 
			
		||||
 | 
			
		||||
=item $dell->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries port interface
 | 
			
		||||
identifier (iid)
 | 
			
		||||
 | 
			
		||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
 | 
			
		||||
the C<Q-BRIDGE-MIB> forwarding table.  Fall back to the C<BRIDGE-MIB> if
 | 
			
		||||
C<Q-BRIDGE-MIB> doesn't return anything.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										427
									
								
								Info/Layer3/Enterasys.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										427
									
								
								Info/Layer3/Enterasys.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,427 @@
 | 
			
		||||
# SNMP::Info::Layer3::Enterasys - SNMP Interface to Enterasys devices
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer3::Enterasys;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Enterasys::ISA = qw/SNMP::Info::MAU SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::CDP SNMP::Info::Layer3
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Enterasys::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS, %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    'ENTERASYS-OIDS-MIB' => 'etsysOidDevice',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,   %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    'mac' => 'dot1dBaseBridgeAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS, %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,   %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE, %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,   %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $id        = $enterasys->id();
 | 
			
		||||
 | 
			
		||||
    unless ( defined $id ) {
 | 
			
		||||
        print
 | 
			
		||||
            " SNMP::Info::Layer3::Enterasys::model() - Device does not support sysObjectID\n"
 | 
			
		||||
            if $enterasys->debug();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^etsysOidDev//i;
 | 
			
		||||
    $model =~ s/^etsysOidPhy//i;
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'enterasys';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'enterasys';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $descr     = $enterasys->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/\bRev ([\d.]*)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use ifName as it is used for CDP and LLDP.
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    #  We need the original ifName, SUPER:: would give us a method definition
 | 
			
		||||
    #  in a higher class, we could use orig_ but just call the MIB leaf since
 | 
			
		||||
    #  that's what we really want anyway.
 | 
			
		||||
    return $enterasys->ifName($partial)
 | 
			
		||||
        || $enterasys->i_description($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $enterasys->i_type($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
        if ( $interfaces->{$if} =~ /(rs232|tunnel|loopback|\blo\b|null)/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $enterasys->mau_i_duplex($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $enterasys->mau_i_duplex_admin($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Normal BRIDGE-MIB has issues on some devices, duplicates and
 | 
			
		||||
# non-increasing oids, Use Q-BRIDGE-MIB for macsuck
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $enterasys->qb_fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $enterasys->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  LLDP table timefilter implementation continuously increments when walked
 | 
			
		||||
#  and we may never reach the end of the table.  This behavior can be
 | 
			
		||||
#  modified with the "set snmp timefilter break disable" command,
 | 
			
		||||
#  unfortunately it is not the default.  Query with a partial value of zero
 | 
			
		||||
#  which means no time filter.
 | 
			
		||||
 | 
			
		||||
sub lldp_ip {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift || 0;
 | 
			
		||||
 | 
			
		||||
    return $enterasys->SUPER::lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# [3564920] LLDP-MIB::lldpLocPortDesc isn't always unique,
 | 
			
		||||
# use LLDP-MIB::lldpLocPortId this cross references to ifName
 | 
			
		||||
sub lldp_if {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift || 0;
 | 
			
		||||
 | 
			
		||||
    my $addr    = $lldp->lldp_rem_pid($partial) || {};
 | 
			
		||||
    my $i_descr = $lldp->ifName() || {};
 | 
			
		||||
    my %r_i_descr = reverse %$i_descr;
 | 
			
		||||
    
 | 
			
		||||
    my %lldp_if;
 | 
			
		||||
    foreach my $key ( keys %$addr ) {
 | 
			
		||||
        my @aOID = split( '\.', $key );
 | 
			
		||||
        my $port = $aOID[1];
 | 
			
		||||
        next unless $port;
 | 
			
		||||
        # Local LLDP port may not equate to ifIndex
 | 
			
		||||
        # Cross reference lldpLocPortId with ifName to get ifIndex
 | 
			
		||||
        my $lldp_desc = $lldp->lldpLocPortId($port);
 | 
			
		||||
        my $desc = $lldp_desc->{$port};
 | 
			
		||||
        # If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
 | 
			
		||||
        if ( exists $r_i_descr{$desc} ) {
 | 
			
		||||
            $port = $r_i_descr{$desc};
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        $lldp_if{$key} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_port {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift || 0;
 | 
			
		||||
 | 
			
		||||
    return $enterasys->SUPER::lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_id {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift || 0;
 | 
			
		||||
 | 
			
		||||
    return  $enterasys->SUPER::lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_platform {
 | 
			
		||||
    my $enterasys = shift;
 | 
			
		||||
    my $partial   = shift || 0;
 | 
			
		||||
 | 
			
		||||
    return  $enterasys->SUPER::lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Enterasys - SNMP Interface to Enterasys Network Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $enterasys = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $enterasys->class();
 | 
			
		||||
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from an 
 | 
			
		||||
Enterasys device through SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $enterasys = new SNMP::Info::Layer3::Enterasys(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ENTERASYS-OIDS-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::MAU/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"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 $enterasys->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.  Checks $enterasys->id() against the
 | 
			
		||||
F<ENTERASYS-OIDS-MIB>.
 | 
			
		||||
 | 
			
		||||
=item $enterasys->vendor()
 | 
			
		||||
 | 
			
		||||
Returns enterasys
 | 
			
		||||
 | 
			
		||||
=item $enterasys->os()
 | 
			
		||||
 | 
			
		||||
Returns enterasys
 | 
			
		||||
 | 
			
		||||
=item $enterasys->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns os version extracted from C<sysDescr>
 | 
			
		||||
 | 
			
		||||
=item $enterasys->mac()
 | 
			
		||||
 | 
			
		||||
Returns base mac
 | 
			
		||||
 | 
			
		||||
(C<dot1dBaseBridgeAddress>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $enterasys->interfaces()
 | 
			
		||||
 | 
			
		||||
Mapping between the Interface Table Index (iid) and the physical port name.
 | 
			
		||||
 | 
			
		||||
=item $enterasys->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Creates a key for each IID that should be ignored.
 | 
			
		||||
 | 
			
		||||
Currently looks for rs232, tunnel,loopback,lo,null from
 | 
			
		||||
$enterasys->interfaces()
 | 
			
		||||
 | 
			
		||||
=item $enterasys->i_duplex()
 | 
			
		||||
 | 
			
		||||
See documentation for mau_i_duplex() in L<SNMP::Info::MAU/"TABLE METHODS">.
 | 
			
		||||
 | 
			
		||||
=item $enterasys->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
See documentation for mau_i_duplex_admin() in
 | 
			
		||||
L<SNMP::Info::MAU/"TABLE METHODS">.
 | 
			
		||||
 | 
			
		||||
=item $enterasys->fw_mac()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table MAC Addresses.
 | 
			
		||||
 | 
			
		||||
=item $enterasys->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries port interface
 | 
			
		||||
identifier (iid).
 | 
			
		||||
 | 
			
		||||
(C<dot1qTpFdbPort>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Link Layer Discovery Protocol (LLDP) Overrides
 | 
			
		||||
 | 
			
		||||
The LLDP table time filter implementation continuously increments when
 | 
			
		||||
walked and we may never reach the end of the table.  This behavior can be
 | 
			
		||||
modified with the C<"set snmp timefilter break disable"> command,
 | 
			
		||||
unfortunately it is not the default.  These methods are overridden to
 | 
			
		||||
supply a partial value of zero which means no time filter.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $enterasys->lldp_if()
 | 
			
		||||
 | 
			
		||||
=item $enterasys->lldp_ip()
 | 
			
		||||
 | 
			
		||||
=item $enterasys->lldp_port()
 | 
			
		||||
 | 
			
		||||
=item $enterasys->lldp_id()
 | 
			
		||||
 | 
			
		||||
=item $enterasys->lldp_platform()
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										1053
									
								
								Info/Layer3/Extreme.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1053
									
								
								Info/Layer3/Extreme.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										416
									
								
								Info/Layer3/F5.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										416
									
								
								Info/Layer3/F5.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,416 @@
 | 
			
		||||
# SNMP::Info::Layer3::F5
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All Rights Reserved
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::F5;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::F5::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::F5::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'F5-BIGIP-SYSTEM-MIB' => 'sysAttrArpMaxEntries',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    'os_ver'     => 'sysProductVersion',
 | 
			
		||||
    'mkt_name'   => 'sysPlatformInfoMarketingName',
 | 
			
		||||
    'ps1_status' => 'sysChassisPowerSupplyStatus.1',
 | 
			
		||||
    'ps2_status' => 'sysChassisPowerSupplyStatus.2',
 | 
			
		||||
 | 
			
		||||
    # Named serial1 to override serial1 in L3 serial method
 | 
			
		||||
    'serial1'  => 'sysGeneralChassisSerialNum',
 | 
			
		||||
    'qb_vlans' => 'sysVlanNumber',
 | 
			
		||||
    'ports'    => 'sysInterfaceNumber',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # sysInterfaceTable
 | 
			
		||||
    'i_index'       => 'sysInterfaceName',
 | 
			
		||||
    'i_description' => 'sysInterfaceName',
 | 
			
		||||
    'i_mtu'         => 'sysInterfaceMtu',
 | 
			
		||||
    'i_speed'       => 'sysInterfaceMediaActiveSpeed',
 | 
			
		||||
    'i_mac'         => 'sysInterfaceMacAddr',
 | 
			
		||||
    'i_up_admin'    => 'sysInterfaceEnabled',
 | 
			
		||||
    'i_up'          => 'sysInterfaceStatus',
 | 
			
		||||
 | 
			
		||||
    # sysIfxStatTable
 | 
			
		||||
    'i_octet_in'       => 'sysIfxStatHcInOctets',
 | 
			
		||||
    'i_octet_out'      => 'sysIfxStatHcOutOctets',
 | 
			
		||||
    'i_pkts_ucast_in'  => 'sysIfxStatHcInUcastPkts',
 | 
			
		||||
    'i_pkts_ucast_out' => 'sysIfxStatHcOutUcastPkts',
 | 
			
		||||
 | 
			
		||||
    # sysInterfaceStatTable
 | 
			
		||||
    'i_discards_in'  => 'sysInterfaceStatDropsIn',
 | 
			
		||||
    'i_discards_out' => 'sysInterfaceStatDropsOut',
 | 
			
		||||
    'i_errors_in'    => 'sysInterfaceStatErrorsIn',
 | 
			
		||||
    'i_errors_out'   => 'sysInterfaceStatErrorsOut',
 | 
			
		||||
 | 
			
		||||
    # sysInterfaceTable
 | 
			
		||||
    'sys_i_duplex' => 'sysInterfaceMediaActiveDuplex',
 | 
			
		||||
 | 
			
		||||
    # sysChassisFanTable
 | 
			
		||||
    'fan_state' => 'sysChassisFanStatus',
 | 
			
		||||
 | 
			
		||||
    # sysVlanTable
 | 
			
		||||
    'sys_v_id' => 'sysVlanId',
 | 
			
		||||
    'v_name'   => 'sysVlanVname',
 | 
			
		||||
 | 
			
		||||
    # sysVlanMemberTable
 | 
			
		||||
    'sys_vm_tagged' => 'sysVlanMemberTagged',
 | 
			
		||||
    'sys_vm_name'   => 'sysVlanMemberVmname',
 | 
			
		||||
    'sys_vmp_name'  => 'sysVlanMemberParentVname',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'f5';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'f5';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fan {
 | 
			
		||||
    my $f5        = shift;
 | 
			
		||||
    my $fan_state = $f5->fan_state();
 | 
			
		||||
    my $ret       = "";
 | 
			
		||||
    my $s         = "";
 | 
			
		||||
    foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
 | 
			
		||||
        $ret .= $s . $i . ": " . $fan_state->{$i};
 | 
			
		||||
        $s = ", ";
 | 
			
		||||
    }
 | 
			
		||||
    return if ( $s eq "" );
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $f5 = shift;
 | 
			
		||||
 | 
			
		||||
    my $name = $f5->mkt_name();
 | 
			
		||||
 | 
			
		||||
    if ( defined $name ) { return $name; }
 | 
			
		||||
 | 
			
		||||
    my $id    = $f5->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    if ( !defined $model ) { return $id; }
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Override L3 interfaces
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $f5->i_index($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Override L3 i_name
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $f5->i_index($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# We don't have this, so fake it
 | 
			
		||||
sub i_type {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $idx = $f5->i_index($partial);
 | 
			
		||||
 | 
			
		||||
    my %i_type;
 | 
			
		||||
    foreach my $if ( keys %$idx ) {
 | 
			
		||||
 | 
			
		||||
        $i_type{$if} = 'ethernetCsmacd';
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Override L3 i_duplex
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $duplexes = $f5->sys_i_duplex() || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $if ( keys %$duplexes ) {
 | 
			
		||||
        my $duplex = $duplexes->{$if};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
        next if ( $duplex eq 'none' );
 | 
			
		||||
 | 
			
		||||
        $i_duplex{$if} = $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Override Bridge v_index
 | 
			
		||||
sub v_index {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $f5->sys_v_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index  = $f5->i_index($partial) || {};
 | 
			
		||||
    my $tagged = $f5->sys_vm_tagged()   || {};
 | 
			
		||||
    my $vlans  = $f5->v_index()         || {};
 | 
			
		||||
 | 
			
		||||
    my $i_vlan = {};
 | 
			
		||||
    foreach my $iid ( keys %$tagged ) {
 | 
			
		||||
        my $tag = $tagged->{$iid};
 | 
			
		||||
        next if ( $tag eq 'true' );
 | 
			
		||||
 | 
			
		||||
        # IID is length.vlan name index.length.interface index
 | 
			
		||||
        # Split out and use as the IID to get the VLAN ID and ifIndex
 | 
			
		||||
        my @iid_array = split /\./, $iid;
 | 
			
		||||
        my $len       = $iid_array[0];
 | 
			
		||||
        my $v_idx     = join '.', ( splice @iid_array, 0, $len + 1 );
 | 
			
		||||
        my $idx       = join '.', @iid_array;
 | 
			
		||||
 | 
			
		||||
        # Check to make sure we can map to a port
 | 
			
		||||
        my $p_idx = $index->{$idx};
 | 
			
		||||
        next unless $p_idx;
 | 
			
		||||
 | 
			
		||||
        my $vlan = $vlans->{$v_idx};
 | 
			
		||||
        next unless $vlan;
 | 
			
		||||
 | 
			
		||||
        $i_vlan->{$idx} = $vlan;
 | 
			
		||||
    }
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $f5      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index  = $f5->i_index($partial) || {};
 | 
			
		||||
    my $tagged = $f5->sys_vm_tagged()   || {};
 | 
			
		||||
    my $vlans  = $f5->v_index()         || {};
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    foreach my $iid ( keys %$tagged ) {
 | 
			
		||||
 | 
			
		||||
        # IID is length.vlan name index.length.interface index
 | 
			
		||||
        # Split out and use as the IID to get the VLAN ID and ifIndex
 | 
			
		||||
        my @iid_array = split /\./, $iid;
 | 
			
		||||
        my $len       = $iid_array[0];
 | 
			
		||||
        my $v_idx     = join '.', ( splice @iid_array, 0, $len + 1 );
 | 
			
		||||
        my $idx       = join '.', @iid_array;
 | 
			
		||||
 | 
			
		||||
        # Check to make sure we can map to a port
 | 
			
		||||
        my $p_idx = $index->{$idx};
 | 
			
		||||
        next unless $p_idx;
 | 
			
		||||
 | 
			
		||||
        my $vlan = $vlans->{$v_idx};
 | 
			
		||||
        next unless $vlan;
 | 
			
		||||
 | 
			
		||||
        push( @{ $i_vlan_membership->{$idx} }, $vlan );
 | 
			
		||||
    }
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::F5 - SNMP Interface to F5 network devices.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $f5 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $f5->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for F5 network devices.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $f5 = new SNMP::Info::Layer3::F5(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<F5-BIGIP-COMMON-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<F5-BIGIP-SYSTEM-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $f5->model()
 | 
			
		||||
 | 
			
		||||
Return (C<sysPlatformInfoMarketingName>), otherwise tries to reference
 | 
			
		||||
$f5->id() to F<F5-BIGIP-COMMON-MIB>. 
 | 
			
		||||
 | 
			
		||||
=item $f5->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'f5'
 | 
			
		||||
 | 
			
		||||
=item $f5->os()
 | 
			
		||||
 | 
			
		||||
Returns 'f5'
 | 
			
		||||
 | 
			
		||||
=item $f5->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version reported by C<sysProductVersion>
 | 
			
		||||
 | 
			
		||||
=item $f5->fan()
 | 
			
		||||
 | 
			
		||||
Combines (C<sysChassisFanStatus>) into a single string.
 | 
			
		||||
 | 
			
		||||
=item $f5->ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns status of primary power supply
 | 
			
		||||
 | 
			
		||||
=item $f5->ps2_status()
 | 
			
		||||
 | 
			
		||||
Returns status of redundant power supply
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a
 | 
			
		||||
reference to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $f5->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to the map between IID and physical port.
 | 
			
		||||
 | 
			
		||||
(C<sysInterfaceName>).
 | 
			
		||||
 | 
			
		||||
=item $f5->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps port operational duplexes to IIDs.
 | 
			
		||||
 | 
			
		||||
=item $f5->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the default VLAN.
 | 
			
		||||
 | 
			
		||||
=item $f5->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.
 | 
			
		||||
 | 
			
		||||
  Example:
 | 
			
		||||
  my $interfaces = $f5->interfaces();
 | 
			
		||||
  my $vlans      = $f5->i_vlan_membership();
 | 
			
		||||
  
 | 
			
		||||
  foreach my $iid (sort keys %$interfaces) {
 | 
			
		||||
    my $port = $interfaces->{$iid};
 | 
			
		||||
    my $vlan = join(',', sort(@{$vlans->{$iid}}));
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $f5->v_index()
 | 
			
		||||
 | 
			
		||||
Returns VLAN IDs
 | 
			
		||||
 | 
			
		||||
=item $f5->v_name()
 | 
			
		||||
 | 
			
		||||
Human-entered name for vlans.
 | 
			
		||||
 | 
			
		||||
=item $f5->i_name()
 | 
			
		||||
 | 
			
		||||
Returns the human set port name if exists.
 | 
			
		||||
 | 
			
		||||
=item $f5->i_type()
 | 
			
		||||
 | 
			
		||||
Returns C<'ethernetCsmacd'> for each C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										333
									
								
								Info/Layer3/Force10.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										333
									
								
								Info/Layer3/Force10.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,333 @@
 | 
			
		||||
# SNMP::Info::Layer3::Force10
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 William Bulley
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Force10;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Force10::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Force10::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'F10-PRODUCTS-MIB' => 'f10Products',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# use MAU-MIB for admin. duplex and admin. speed
 | 
			
		||||
*SNMP::Info::Layer3::Force10::i_duplex_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_duplex_admin;
 | 
			
		||||
*SNMP::Info::Layer3::Force10::i_speed_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_speed_admin;
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'force10';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'ftos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $descr   = $force10->description();
 | 
			
		||||
    my $os_ver  = undef;
 | 
			
		||||
 | 
			
		||||
    $os_ver = $1 if ( $descr =~ /Force10\s+Application\s+Software\s+Version:\s+(\S+)/s );
 | 
			
		||||
 | 
			
		||||
    return $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $id      = $force10->id();
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use Q-BRIDGE-MIB
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $force10->qb_fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $force10->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub v_name {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $force10->qb_v_name($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# ------------------- stub for now-----------------
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_vlan = {};
 | 
			
		||||
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $force10 = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $force10->bp_index();
 | 
			
		||||
    my $v_index = $force10->v_index();
 | 
			
		||||
 | 
			
		||||
    my $v_ports  = $force10->qb_v_egress();
 | 
			
		||||
 | 
			
		||||
    # If given a partial it will be an ifIndex, we need to use dot1dBasePort
 | 
			
		||||
    if ($partial) {
 | 
			
		||||
        my %r_index = reverse %$index;
 | 
			
		||||
        $partial    = $r_index{$partial};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
 | 
			
		||||
    foreach my $idx ( sort keys %{$v_ports} ) {
 | 
			
		||||
        next unless ( defined $v_ports->{$idx} );
 | 
			
		||||
        my $portlist = $v_ports->{$idx}; # is an array reference
 | 
			
		||||
        my $ret      = [];
 | 
			
		||||
        my $vlan_ndx = $idx;
 | 
			
		||||
 | 
			
		||||
        # Convert portlist bit array to bp_index array
 | 
			
		||||
        for ( my $i = 0; $i <= $#$portlist; $i++ ) {
 | 
			
		||||
            push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #Create HoA ifIndex -> VLAN array
 | 
			
		||||
        foreach my $port ( @{$ret} ) {
 | 
			
		||||
            my $ifindex = $index->{$port};
 | 
			
		||||
            next unless ( defined($ifindex) );    # shouldn't happen
 | 
			
		||||
            next if ( defined $partial and $ifindex !~ /^$partial$/ );
 | 
			
		||||
            my $vlan_tag = $v_index->{$vlan_ndx};
 | 
			
		||||
 | 
			
		||||
            # FIXME: would be preferable to use
 | 
			
		||||
            # the mapping from Q-BRIDGE-MIB::dot1qVlanFdbId 
 | 
			
		||||
            my $mod = $vlan_tag % 4096;
 | 
			
		||||
 | 
			
		||||
            push ( @{ $i_vlan_membership->{$ifindex} }, ($mod) );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Force10 - SNMP Interface to Force10 Networks FTOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
William Bulley
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $force10 = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $force10->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Force10 Networks FTOS-based devices.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<F10-PRODUCTS-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP:
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $force10->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'force10'>
 | 
			
		||||
 | 
			
		||||
=item $force10->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $force10->id() to the Force10 product MIB listed above.
 | 
			
		||||
 | 
			
		||||
=item $force10->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'ftos'>.
 | 
			
		||||
 | 
			
		||||
=item $force10->os_ver()
 | 
			
		||||
 | 
			
		||||
Grabs the operating system version from C<sysDescr>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $force10->v_name()
 | 
			
		||||
 | 
			
		||||
Returns the VLAN names.
 | 
			
		||||
 | 
			
		||||
=item $force10->i_vlan()
 | 
			
		||||
 | 
			
		||||
Currently not implemented.
 | 
			
		||||
 | 
			
		||||
=item $force10->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays:
 | 
			
		||||
key = C<ifIndex>, value = array of VLAN IDs.
 | 
			
		||||
These are the VLANs which are members of the egress list for the port.
 | 
			
		||||
 | 
			
		||||
=item $force10->fw_mac()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $force10->fw_port()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $force10->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
=item $force10->i_speed_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,133 +1,102 @@
 | 
			
		||||
# SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry devices
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::FDP;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
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::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Foundry::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS,
 | 
			
		||||
          %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
          'FOUNDRY-SN-ROOT-MIB' => 'foundry',
 | 
			
		||||
          # IP-FORWARD-MIB
 | 
			
		||||
          # ETHERLIKE-MIB
 | 
			
		||||
          # RFC1398-MIB
 | 
			
		||||
          # RMON-MIB
 | 
			
		||||
          # IF-MIB
 | 
			
		||||
        );
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::FDP::MIBS,
 | 
			
		||||
    'FOUNDRY-SN-ROOT-MIB'         => 'foundry',
 | 
			
		||||
    'FOUNDRY-SN-AGENT-MIB'        => 'snChasPwrSupplyDescription',
 | 
			
		||||
    'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%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'
 | 
			
		||||
           );
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::FDP::GLOBALS,
 | 
			
		||||
    'mac'        => 'ifPhysAddress.1',
 | 
			
		||||
    'chassis'    => 'entPhysicalDescr.1',
 | 
			
		||||
    'temp'       => 'snChasActualTemperature',
 | 
			
		||||
    'ps1_type'   => 'snChasPwrSupplyDescription.1',
 | 
			
		||||
    'ps1_status' => 'snChasPwrSupplyOperStatus.1',
 | 
			
		||||
    'fan'        => 'snChasFanOperStatus.1',
 | 
			
		||||
    'img_ver'    => 'snAgImgVer',
 | 
			
		||||
    'ch_serial'  => 'snChasSerNum',
 | 
			
		||||
 | 
			
		||||
%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',
 | 
			
		||||
           );
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::FDP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # FOUNDRY-SN-SWITCH-GROUP-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;
 | 
			
		||||
}
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::FDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $interfaces = $foundry->interfaces();
 | 
			
		||||
    my $i_descr    = $foundry->i_descr();
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $foundry->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if (keys %$interfaces) {
 | 
			
		||||
        # lo -> cisco aironet 350 loopback
 | 
			
		||||
        if ($interfaces->{$if} =~ /(tunnel|loopback|lo|lb|null)/i){
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
        if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|lb|null)/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -136,12 +105,18 @@ sub i_ignore {
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $sw_index = $foundry->sw_index();
 | 
			
		||||
    my $sw_duplex= $foundry->sw_duplex();
 | 
			
		||||
    
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $sw_index  = $foundry->sw_index($partial);
 | 
			
		||||
    my $sw_duplex = $foundry->sw_duplex($partial);
 | 
			
		||||
 | 
			
		||||
    unless ( defined $sw_index and defined $sw_duplex ) {
 | 
			
		||||
        return $foundry->SUPER::i_duplex();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $sw_port (keys %$sw_duplex){
 | 
			
		||||
        my $iid = $sw_index->{$sw_port};
 | 
			
		||||
    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;
 | 
			
		||||
@@ -150,83 +125,162 @@ sub i_duplex {
 | 
			
		||||
    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);
 | 
			
		||||
    my $id      = $foundry->id();
 | 
			
		||||
    my $model   = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    $model = $1 if $desc =~ /\s+([a-z]{2}\d{4})\D/i;
 | 
			
		||||
    
 | 
			
		||||
    # EdgeIron
 | 
			
		||||
    if ( $id =~ /\.1991\.1\.[45]\./ ) {
 | 
			
		||||
 | 
			
		||||
        my $e_name = $foundry->e_name();
 | 
			
		||||
 | 
			
		||||
        # Find entity table entry for "unit.1"
 | 
			
		||||
        my $unit_iid = undef;
 | 
			
		||||
        foreach my $e ( keys %$e_name ) {
 | 
			
		||||
            my $name = $e_name->{$e} || '';
 | 
			
		||||
            $unit_iid = $e if $name eq 'unit.1';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Find Model Name
 | 
			
		||||
        my $e_model = $foundry->e_model();
 | 
			
		||||
        if ( defined $e_model->{$unit_iid} ) {
 | 
			
		||||
            return $e_model->{$unit_iid};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^sn//;
 | 
			
		||||
 | 
			
		||||
    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 os {
 | 
			
		||||
    return 'brocade';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'foundry';
 | 
			
		||||
    return 'brocade';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    return $foundry->img_ver() if ( defined $foundry->img_ver() );
 | 
			
		||||
 | 
			
		||||
    # Some older ones don't have this value,so we cull it from the description
 | 
			
		||||
    my $descr = $foundry->description();
 | 
			
		||||
    if ( $descr =~ m/Version (\d\S*)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # EdgeIron
 | 
			
		||||
    my $e_name = $foundry->e_name();
 | 
			
		||||
 | 
			
		||||
    # find entity table entry for "stackmanaget.1"
 | 
			
		||||
    my $unit_iid = undef;
 | 
			
		||||
    foreach my $e ( keys %$e_name ) {
 | 
			
		||||
        my $name = $e_name->{$e} || '';
 | 
			
		||||
        $unit_iid = $e if $name eq 'stackmanaget.1';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( defined $unit_iid ) {
 | 
			
		||||
 | 
			
		||||
        # Find Model Name
 | 
			
		||||
        my $e_fwver = $foundry->e_fwver();
 | 
			
		||||
        if ( defined $e_fwver->{$unit_iid} ) {
 | 
			
		||||
            return $e_fwver->{$unit_iid};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # See if we report from Flash if wouldn't report from running above
 | 
			
		||||
    return $foundry->snAgFlashImgVer() if ( defined $foundry->snAgFlashImgVer() );
 | 
			
		||||
    
 | 
			
		||||
    # Last resort
 | 
			
		||||
    return $foundry->SUPER::os_ver();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    # Return chassis serial number if available
 | 
			
		||||
    return $foundry->ch_serial() if ( $foundry->ch_serial() );
 | 
			
		||||
 | 
			
		||||
    # If no chassis serial use first module serial
 | 
			
		||||
    my $mod_serials = $foundry->snAgentConfigModuleSerialNumber() || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $mod ( sort keys %$mod_serials ) {
 | 
			
		||||
        my $serial = $mod_serials->{$mod} || '';
 | 
			
		||||
        next unless defined $serial;
 | 
			
		||||
        return $serial;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # EdgeIron
 | 
			
		||||
    my $e_name = $foundry->e_name();
 | 
			
		||||
 | 
			
		||||
    # find entity table entry for "unit.1"
 | 
			
		||||
    my $unit_iid = undef;
 | 
			
		||||
    foreach my $e ( keys %$e_name ) {
 | 
			
		||||
        my $name = $e_name->{$e} || '';
 | 
			
		||||
        $unit_iid = $e if $name eq 'unit.1';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( defined $unit_iid ) {
 | 
			
		||||
 | 
			
		||||
        # Look up serial of found entry.
 | 
			
		||||
        my $e_serial = $foundry->e_serial();
 | 
			
		||||
        return $e_serial->{$unit_iid} if defined $e_serial->{$unit_iid};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Last resort
 | 
			
		||||
    return $foundry->SUPER::serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_descr = $foundry->i_description($partial) || {};
 | 
			
		||||
    my $i_name  = $foundry->i_name($partial)        || {};
 | 
			
		||||
 | 
			
		||||
    # Use ifName for EdgeIrons else use ifDescr
 | 
			
		||||
    foreach my $iid ( keys %$i_name ) {
 | 
			
		||||
        my $name = $i_name->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
        $i_descr->{$iid} = $name
 | 
			
		||||
            if $name =~ /^port\d+/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Reported hangs on a EdgeIron 24G
 | 
			
		||||
sub stp_p_state {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $foundry->description();
 | 
			
		||||
    if ( $descr =~ m/\bEdgeIron 24G\b/ ) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $foundry->SUPER::stp_p_state($partial) || {};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Foundry - Perl5 Interface to Foundry FastIron Network Devices
 | 
			
		||||
SNMP::Info::Layer3::Foundry - SNMP Interface to Brocade (Foundry) Network
 | 
			
		||||
Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -234,26 +288,22 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 my $foundry = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          # These arguments are passed directly on to SNMP::Session
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $foundry->class();
 | 
			
		||||
 my $class = $foundry->class();
 | 
			
		||||
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This subclass no longer supported.
 | 
			
		||||
Abstraction subclass for Brocade (Foundry) Networks devices.
 | 
			
		||||
 | 
			
		||||
This module provides limited functionality from older Foundry devices.
 | 
			
		||||
 | 
			
		||||
Specifically designed for a FI4802.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not after determining
 | 
			
		||||
a more specific class using the method above.  Turn off the AutoSpecify flag.
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
 my $foundry = new SNMP::Info::Layer3::Foundry(...);
 | 
			
		||||
 | 
			
		||||
@@ -261,9 +311,11 @@ a more specific class using the method above.  Turn off the AutoSpecify flag.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info
 | 
			
		||||
=item SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Bridge
 | 
			
		||||
=item SNMP::Info::FDP;
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -271,16 +323,22 @@ a more specific class using the method above.  Turn off the AutoSpecify flag.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item FOUNDRY-SN-ROOT-MIB
 | 
			
		||||
=item F<FOUNDRY-SN-ROOT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<FOUNDRY-SN-AGENT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See classes listed above for their required MIBs.
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::FDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
The Foundry MIBS can be downloaded from www.mibdepot.com and ??
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
@@ -289,66 +347,88 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $foundry->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.  Checks $foundry->id() against the 
 | 
			
		||||
FOUNDRY-SN-ROOT-MIB and then parses out xxNNNN
 | 
			
		||||
Returns model type.  Checks $foundry->id() against the F<FOUNDRY-SN-ROOT-MIB>
 | 
			
		||||
and removes 'C<sn>'.  EdgeIron models determined through F<ENTITY-MIB>.  
 | 
			
		||||
 | 
			
		||||
=item $foundry->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'foundry' :)
 | 
			
		||||
Returns 'brocade'
 | 
			
		||||
 | 
			
		||||
=item $foundry->os()
 | 
			
		||||
 | 
			
		||||
Returns 'brocade'
 | 
			
		||||
 | 
			
		||||
=item $foundry->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version
 | 
			
		||||
 | 
			
		||||
=item $foundry->mac()
 | 
			
		||||
 | 
			
		||||
Returns MAC Address of root port.
 | 
			
		||||
 | 
			
		||||
(B<ifPhysAddress.1>)
 | 
			
		||||
(C<ifPhysAddress.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->chassis()
 | 
			
		||||
 | 
			
		||||
Returns Chassis type.
 | 
			
		||||
 | 
			
		||||
(B<entPhysicalDescr.1>)
 | 
			
		||||
(C<entPhysicalDescr.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number of device.
 | 
			
		||||
 | 
			
		||||
(B<snChasSerNum>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->temp()
 | 
			
		||||
 | 
			
		||||
Returns the chassis temperature
 | 
			
		||||
 | 
			
		||||
(B<snChasActualTemperature>)
 | 
			
		||||
(C<snChasActualTemperature>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->ps1_type()
 | 
			
		||||
 | 
			
		||||
Returns the Description for the power supply
 | 
			
		||||
 | 
			
		||||
(B<snChasPwrSupplyDescription.1>)
 | 
			
		||||
(C<snChasPwrSupplyDescription.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns the status of the power supply.
 | 
			
		||||
 | 
			
		||||
(B<snChasPwrSupplyOperStatus.1>)
 | 
			
		||||
(C<snChasPwrSupplyOperStatus.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->fan()
 | 
			
		||||
 | 
			
		||||
Returns the status of the chassis fan.
 | 
			
		||||
 | 
			
		||||
(B<snChasFanOperStatus.1>)
 | 
			
		||||
(C<snChasFanOperStatus.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->img_ver()
 | 
			
		||||
 | 
			
		||||
Returns device image version.
 | 
			
		||||
 | 
			
		||||
(C<snAgImgVer.0>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->ch_serial()
 | 
			
		||||
 | 
			
		||||
Returns chassis serial number.
 | 
			
		||||
 | 
			
		||||
(C<snChasSerNum.0>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Bridge
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::FDP
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Bridge for details.
 | 
			
		||||
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
@@ -361,13 +441,6 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
@@ -380,46 +453,18 @@ Returns reference to hash of interface link duplex status.
 | 
			
		||||
 | 
			
		||||
Crosses $foundry->sw_duplex() with $foundry->sw_index()
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_type()
 | 
			
		||||
=item $foundry->stp_p_state()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface types.
 | 
			
		||||
"The port's current state as defined by application of the Spanning Tree
 | 
			
		||||
Protocol.
 | 
			
		||||
 | 
			
		||||
Crosses $foundry->sw_type() with $foundry->sw_index()
 | 
			
		||||
Skipped if device is an EdgeIron 24G due to reports of hangs.
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_speed()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface speeds .
 | 
			
		||||
 | 
			
		||||
Crosses $foundry->sw_speeD() with $foundry->sw_index() and 
 | 
			
		||||
does a little munging.
 | 
			
		||||
(C<dot1dStpPortState>)
 | 
			
		||||
 | 
			
		||||
=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>)
 | 
			
		||||
=head2 Foundry Switch Port Information Table (C<snSwPortIfTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
@@ -427,34 +472,38 @@ Returns reference to hash.  Maps ARP table entries to IPs
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps Table to Interface IID. 
 | 
			
		||||
 | 
			
		||||
(B<snSwPortIfIndex>)
 | 
			
		||||
(C<snSwPortIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.   Current duplex status for switch ports. 
 | 
			
		||||
 | 
			
		||||
(B<snSwPortInfoChnMode>)
 | 
			
		||||
(C<snSwPortInfoChnMode>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current Port Type .
 | 
			
		||||
 | 
			
		||||
(B<snSwPortInfoMediaType>)
 | 
			
		||||
(C<snSwPortInfoMediaType>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_speed()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current Port Speed. 
 | 
			
		||||
 | 
			
		||||
(B<snSwPortInfoSpeed>)
 | 
			
		||||
(C<snSwPortInfoSpeed>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Bridge
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::FDP
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::Info::Bridge for details.
 | 
			
		||||
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										256
									
								
								Info/Layer3/H3C.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								Info/Layer3/H3C.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,256 @@
 | 
			
		||||
# SNMP::Info::Layer3::H3C
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Jeroen van Ingen
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::H3C;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::H3C::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::H3C::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'HH3C-LswDEVM-MIB'     => 'hh3cDevMFanStatus',
 | 
			
		||||
    'HH3C-LswINF-MIB'      => 'hh3cSlotPortMax',
 | 
			
		||||
    'HH3C-LSW-DEV-ADM-MIB' => 'hh3cLswSysVersion',
 | 
			
		||||
    'HH3C-PRODUCT-ID-MIB'  => 'hh3c-s5500-28C-EI',
 | 
			
		||||
    'HH3C-ENTITY-VENDORTYPE-OID-MIB' => 'hh3cevtOther',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    'fan' => 'hh3cDevMFanStatus.1',
 | 
			
		||||
    'ps1_status' => 'hh3cDevMPowerStatus.1',
 | 
			
		||||
    'ps2_status' => 'hh3cDevMPowerStatus.2',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    i_duplex_admin => 'hh3cifEthernetDuplex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $h3c = shift;
 | 
			
		||||
    my $mfg = $h3c->entPhysicalMfgName(1) || {};
 | 
			
		||||
    return $mfg->{1};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $h3c = shift;
 | 
			
		||||
    my $descr   = $h3c->description();
 | 
			
		||||
 | 
			
		||||
    return $1 if ( $descr =~ /(\S+)\s+Platform Software/ );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $h3c = shift;
 | 
			
		||||
    my $descr   = $h3c->description();
 | 
			
		||||
#    my $version = $h3c->hh3cLswSysVersion(); # Don't use, indicates base version only, no release details
 | 
			
		||||
    my $ver_release = $h3c->entPhysicalSoftwareRev(2) || {};
 | 
			
		||||
    my $os_ver  = undef;
 | 
			
		||||
 | 
			
		||||
    $os_ver = "$1 $2" if ( $descr =~ /Software Version ([^,]+),.*(Release\s\S+)/i );
 | 
			
		||||
 | 
			
		||||
    return $ver_release->{2} || $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l3->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
 | 
			
		||||
        # lo0 etc
 | 
			
		||||
        if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use Q-BRIDGE-MIB
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $l3  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $l3->qb_fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $l3  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $l3->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::H3C - SNMP Interface to L3 Devices, H3C & HP A-series
 | 
			
		||||
 | 
			
		||||
=head1 AUTHORS
 | 
			
		||||
 | 
			
		||||
Jeroen van Ingen
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $h3c = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $h3c->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for H3C & HP A-series devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<HH3C-LswDEVM-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HH3C-LswINF-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HH3C-LSW-DEV-ADM-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HH3C-PRODUCT-ID-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HH3C-ENTITY-VENDORTYPE-OID-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $h3c->vendor()
 | 
			
		||||
 | 
			
		||||
Returns value for C<entPhysicalMfgName.1>.
 | 
			
		||||
 | 
			
		||||
=item $h3c->os()
 | 
			
		||||
 | 
			
		||||
Returns the OS extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $h3c->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version. Either C<entPhysicalSoftwareRev.2> or extracted from 
 | 
			
		||||
C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $h3c->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Increments value of IID if port is to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores loopback
 | 
			
		||||
 | 
			
		||||
=item $h3c->fw_mac()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=item $h3c->fw_port()
 | 
			
		||||
 | 
			
		||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										414
									
								
								Info/Layer3/HP9300.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										414
									
								
								Info/Layer3/HP9300.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,414 @@
 | 
			
		||||
# SNMP::Info::Layer3::HP9300 - SNMP Interface to HP Foundry OEM devices
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer3::HP9300;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::FDP;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::HP9300::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::HP9300::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::FDP::MIBS,
 | 
			
		||||
    'HP-SN-ROOT-MIB'         => 'hp',
 | 
			
		||||
    'HP-SN-AGENT-MIB'        => 'snChasPwrSupplyDescription',
 | 
			
		||||
    'HP-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::FDP::GLOBALS,
 | 
			
		||||
    'mac'        => 'ifPhysAddress.1',
 | 
			
		||||
    'chassis'    => 'entPhysicalDescr.1',
 | 
			
		||||
    'temp'       => 'snChasActualTemperature',
 | 
			
		||||
    'ps1_type'   => 'snChasPwrSupplyDescription.1',
 | 
			
		||||
    'ps1_status' => 'snChasPwrSupplyOperStatus.1',
 | 
			
		||||
    'fan'        => 'snChasFanOperStatus.1',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::FDP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # HP-SN-SWITCH-GROUP-MIB
 | 
			
		||||
    # snSwPortInfoTable - Switch Port Information Group
 | 
			
		||||
    # Fully qualify these since FDP class will load
 | 
			
		||||
    # FOUNDRY-SN-SWITCH-GROUP-MIB which contains the same leaf names
 | 
			
		||||
    'sw_index'  => 'HP_SN_SWITCH_GROUP_MIB__snSwPortIfIndex',
 | 
			
		||||
    'sw_duplex' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoChnMode',
 | 
			
		||||
    'sw_type'   => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoMediaType',
 | 
			
		||||
    'sw_speed'  => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoSpeed',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::FDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $hp9300  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $hp9300->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
        if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|lb|null)/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $hp9300  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $sw_index  = $hp9300->sw_index($partial);
 | 
			
		||||
    my $sw_duplex = $hp9300->sw_duplex($partial);
 | 
			
		||||
 | 
			
		||||
    unless ( defined $sw_index and defined $sw_duplex ) {
 | 
			
		||||
        return $hp9300->SUPER::i_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 model {
 | 
			
		||||
    my $hp9300 = shift;
 | 
			
		||||
    my $id     = $hp9300->id();
 | 
			
		||||
    my $model  = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^hpSwitch//;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'hp';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'hp';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $hp9300 = shift;
 | 
			
		||||
 | 
			
		||||
    return $hp9300->snAgImgVer() if ( defined $hp9300->snAgImgVer() );
 | 
			
		||||
 | 
			
		||||
    # Some older ones don't have this value,so we cull it from the description
 | 
			
		||||
    my $descr = $hp9300->description();
 | 
			
		||||
    if ( $descr =~ m/Version (\d\S*)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Last resort
 | 
			
		||||
    return $hp9300->SUPER::os_ver();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $hp9300 = shift;
 | 
			
		||||
 | 
			
		||||
    # Return chassis serial number if available
 | 
			
		||||
    return $hp9300->snChasSerNum() if ( $hp9300->snChasSerNum() );
 | 
			
		||||
 | 
			
		||||
    # If no chassis serial use first module serial
 | 
			
		||||
    my $mod_serials = $hp9300->snAgentConfigModuleSerialNumber();
 | 
			
		||||
 | 
			
		||||
    foreach my $mod ( sort keys %$mod_serials ) {
 | 
			
		||||
        my $serial = $mod_serials->{$mod} || '';
 | 
			
		||||
        next unless defined $serial;
 | 
			
		||||
        return $serial;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Last resort
 | 
			
		||||
    return $hp9300->SUPER::serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $hp9300  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_descr = $hp9300->i_description($partial) || {};
 | 
			
		||||
    my $i_name  = $hp9300->i_name($partial)        || {};
 | 
			
		||||
 | 
			
		||||
    # Use ifName for EdgeIrons else use ifDescr
 | 
			
		||||
    foreach my $iid ( keys %$i_name ) {
 | 
			
		||||
        my $name = $i_name->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
        $i_descr->{$iid} = $name
 | 
			
		||||
            if $name =~ /^port\d+/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::HP9300 - SNMP Interface to HP Foundry OEM Network Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $hp9300 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $hp9300->class();
 | 
			
		||||
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for HP network devices which Foundry Networks was the
 | 
			
		||||
Original Equipment Manufacturer (OEM) such as the HP ProCurve 9300 series.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
 my $hp9300 = new SNMP::Info::Layer3::HP9300(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::FDP;
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<HP-SN-ROOT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HP-SN-AGENT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<HP-SN-SWITCH-GROUP-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::FDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp9300->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.  Checks $hp9300->id() against the F<HP-SN-ROOT-MIB>
 | 
			
		||||
and removes C<hpSwitch>.
 | 
			
		||||
 | 
			
		||||
=item $hp9300->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'hp'
 | 
			
		||||
 | 
			
		||||
=item $hp9300->os()
 | 
			
		||||
 | 
			
		||||
Returns 'hp'
 | 
			
		||||
 | 
			
		||||
=item $hp9300->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version
 | 
			
		||||
 | 
			
		||||
=item $hp9300->mac()
 | 
			
		||||
 | 
			
		||||
Returns MAC Address of root port.
 | 
			
		||||
 | 
			
		||||
(C<ifPhysAddress.1>)
 | 
			
		||||
 | 
			
		||||
=item $hp9300->chassis()
 | 
			
		||||
 | 
			
		||||
Returns Chassis type.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalDescr.1>)
 | 
			
		||||
 | 
			
		||||
=item $hp9300->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number of device.
 | 
			
		||||
 | 
			
		||||
=item $hp9300->temp()
 | 
			
		||||
 | 
			
		||||
Returns the chassis temperature
 | 
			
		||||
 | 
			
		||||
(C<snChasActualTemperature>)
 | 
			
		||||
 | 
			
		||||
=item $hp9300->ps1_type()
 | 
			
		||||
 | 
			
		||||
Returns the Description for the power supply
 | 
			
		||||
 | 
			
		||||
(C<snChasPwrSupplyDescription.1>)
 | 
			
		||||
 | 
			
		||||
=item $hp9300->ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns the status of the power supply.
 | 
			
		||||
 | 
			
		||||
(C<snChasPwrSupplyOperStatus.1>)
 | 
			
		||||
 | 
			
		||||
=item $hp9300->fan()
 | 
			
		||||
 | 
			
		||||
Returns the status of the chassis fan.
 | 
			
		||||
 | 
			
		||||
(C<snChasFanOperStatus.1>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::FDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp9300->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface names to iids.
 | 
			
		||||
 | 
			
		||||
=item $hp9300->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interfaces to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores interfaces with descriptions of  tunnel,loopback,null 
 | 
			
		||||
 | 
			
		||||
=item $hp9300->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface link duplex status. 
 | 
			
		||||
 | 
			
		||||
Crosses $hp9300->sw_duplex() with $hp9300->sw_index()
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Switch Port Information Table (C<snSwPortIfTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp9300->sw_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps Table to Interface IID. 
 | 
			
		||||
 | 
			
		||||
(C<snSwPortIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $hp9300->sw_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.   Current duplex status for switch ports. 
 | 
			
		||||
 | 
			
		||||
(C<snSwPortInfoChnMode>)
 | 
			
		||||
 | 
			
		||||
=item $hp9300->sw_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current Port Type .
 | 
			
		||||
 | 
			
		||||
(C<snSwPortInfoMediaType>)
 | 
			
		||||
 | 
			
		||||
=item $hp9300->sw_speed()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current Port Speed. 
 | 
			
		||||
 | 
			
		||||
(C<snSwPortInfoSpeed>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::FDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										765
									
								
								Info/Layer3/Juniper.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										765
									
								
								Info/Layer3/Juniper.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,765 @@
 | 
			
		||||
# SNMP::Info::Layer3::Juniper
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Juniper;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Juniper::ISA       = qw/SNMP::Info::Layer3 SNMP::Info::LLDP  Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Juniper::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'JUNIPER-CHASSIS-DEFINES-MIB' => 'jnxChassisDefines',
 | 
			
		||||
    'JUNIPER-MIB'                 => 'jnxBoxAnatomy',
 | 
			
		||||
    'JUNIPER-VIRTUALCHASSIS-MIB'  => 'jnxVirtualChassisMemberTable',
 | 
			
		||||
    'JUNIPER-VLAN-MIB'            => 'jnxVlanMIBObjects',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, 
 | 
			
		||||
	     %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
	     'serial'    => 'jnxBoxSerialNo.0',
 | 
			
		||||
	     'mac'       => 'dot1dBaseBridgeAddress',
 | 
			
		||||
	     'box_descr' => 'jnxBoxDescr'
 | 
			
		||||
	     );
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, 
 | 
			
		||||
	   %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
	   
 | 
			
		||||
	   # JUNIPER-VLAN-MIB::jnxExVlanTable
 | 
			
		||||
	   'v_index'    => 'jnxExVlanTag',
 | 
			
		||||
	   'v_type'     => 'jnxExVlanType',
 | 
			
		||||
	   'v_name'     => 'jnxExVlanName',
 | 
			
		||||
	   
 | 
			
		||||
	   # JUNIPER-VLAN-MIB::jnxExVlanPortGroupTable
 | 
			
		||||
	   'i_trunk'    => 'jnxExVlanPortAccessMode',
 | 
			
		||||
	   
 | 
			
		||||
	   # JUNPIER-MIB
 | 
			
		||||
           'e_contents_type'   => 'jnxContentsType',
 | 
			
		||||
           'e_containers_type' => 'jnxContainersType',
 | 
			
		||||
           'e_hwver'           => 'jnxContentsRevision',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, 
 | 
			
		||||
	   %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
	   'e_containers_type' => \&SNMP::Info::munge_e_type,
 | 
			
		||||
	   'e_contents_type' => \&SNMP::Info::munge_e_type,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'juniper';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'junos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr        = $juniper->description() || '';
 | 
			
		||||
    my $lldp_descr   = $juniper->lldp_sysdesc() || '';
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/kernel JUNOS (\S+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    elsif ( $lldp_descr =~ m/version\s(\S+)\s/ ) {
 | 
			
		||||
	return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
    my $id = $l3->id();
 | 
			
		||||
 | 
			
		||||
    unless ( defined $id ) {
 | 
			
		||||
        print
 | 
			
		||||
            " SNMP::Info::Layer3::Juniper::model() - Device does not support sysObjectID\n"
 | 
			
		||||
            if $l3->debug();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^jnxProductName//i;
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Override the fancy Layer3.pm serial function
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
    return $juniper->orig_serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 'i_trunk'    => 'jnxExVlanPortAccessMode',
 | 
			
		||||
sub i_trunk {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $access  = $juniper->jnxExVlanPortAccessMode($partial);
 | 
			
		||||
 | 
			
		||||
    my %i_trunk;
 | 
			
		||||
 | 
			
		||||
    foreach (keys %$access)
 | 
			
		||||
    {
 | 
			
		||||
	my $old_key = $_;
 | 
			
		||||
	m/^\d+\.(\d+)$/o;
 | 
			
		||||
	my $new_key = $1;
 | 
			
		||||
	$i_trunk{$new_key} = $access->{$old_key};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_trunk;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 'v_type'     => 'jnxExVlanType',
 | 
			
		||||
sub v_type {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $v_type  = $juniper->jnxExVlanType($partial);
 | 
			
		||||
 | 
			
		||||
    return $v_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 'v_index'    => 'jnxExVlanTag',
 | 
			
		||||
sub v_index {
 | 
			
		||||
    my ($juniper) = shift;
 | 
			
		||||
    my ($partial) = shift;
 | 
			
		||||
 | 
			
		||||
    my ($v_index)  = $juniper->jnxExVlanTag($partial);
 | 
			
		||||
 | 
			
		||||
    return $v_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $juniper->bp_index();
 | 
			
		||||
 | 
			
		||||
    # If given a partial it will be an ifIndex, we need to use dot1dBasePort
 | 
			
		||||
    if ($partial) {
 | 
			
		||||
        my %r_index = reverse %$index;
 | 
			
		||||
        $partial = $r_index{$partial};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $v_index  = $juniper->jnxExVlanTag();
 | 
			
		||||
    my $i_pvid   = $juniper->qb_i_vlan($partial) || {};
 | 
			
		||||
    my $i_vlan = {};
 | 
			
		||||
 | 
			
		||||
    foreach my $bport ( keys %$i_pvid ) {
 | 
			
		||||
        my $q_vlan  = $i_pvid->{$bport};
 | 
			
		||||
	my $vlan    = $v_index->{$q_vlan};
 | 
			
		||||
        my $ifindex = $index->{$bport};
 | 
			
		||||
        unless ( defined $ifindex ) {
 | 
			
		||||
            print "  Port $bport has no bp_index mapping. Skipping.\n"
 | 
			
		||||
                if $DEBUG;
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
        $i_vlan->{$ifindex} = $vlan;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $juniper->bp_index();
 | 
			
		||||
    my ($v_index)  = $juniper->jnxExVlanTag($partial);
 | 
			
		||||
 | 
			
		||||
    my $v_ports = $juniper->qb_v_egress() || {};
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
 | 
			
		||||
    foreach my $idx ( sort keys %$v_ports ) {
 | 
			
		||||
        next unless ( defined $v_ports->{$idx} );
 | 
			
		||||
        my $portlist = $v_ports->{$idx}; # is an array reference
 | 
			
		||||
        my $ret      = [];
 | 
			
		||||
        my $vlan_ndx = $idx;
 | 
			
		||||
 | 
			
		||||
        # Convert portlist bit array to bp_index array
 | 
			
		||||
        for ( my $i = 0; $i <= $#$portlist; $i++ ) {
 | 
			
		||||
            push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #Create HoA ifIndex -> VLAN array
 | 
			
		||||
        foreach my $port ( @{$ret} ) {
 | 
			
		||||
            my $ifindex = $index->{$port};
 | 
			
		||||
            next unless ( defined($ifindex) );    # shouldn't happen
 | 
			
		||||
            next if ( defined $partial and $ifindex !~ /^$partial$/ );
 | 
			
		||||
            push ( @{ $i_vlan_membership->{$ifindex} }, $v_index->{$vlan_ndx} );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use Q-BRIDGE-MIB for bridge forwarding tables
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->qb_fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Pseudo ENTITY-MIB methods
 | 
			
		||||
 | 
			
		||||
# This class supports both virtual chassis (stackable) and physical chassis
 | 
			
		||||
# based devices, identify if we have a virtual chassis so that we return
 | 
			
		||||
# appropriate entPhysicalClass and correct ordering
 | 
			
		||||
 | 
			
		||||
sub _e_is_virtual {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $v_test = $juniper->jnxVirtualChassisMemberRole() || {};
 | 
			
		||||
    
 | 
			
		||||
    #If we are functioning as a stack someone should be master
 | 
			
		||||
    foreach my $iid ( keys %$v_test ) {
 | 
			
		||||
	my $role = $v_test->{$iid};
 | 
			
		||||
	return 1 if ($role =~ /master/i);
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _e_virtual_index {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $containers = $juniper->jnxContainersWithin() || {};
 | 
			
		||||
    my $members    = $juniper->jnxVirtualChassisMemberRole() || {};
 | 
			
		||||
    
 | 
			
		||||
    my %v_index;
 | 
			
		||||
    foreach my $key (keys %$containers) {
 | 
			
		||||
	foreach my $member ( keys %$members ) {
 | 
			
		||||
	    # Virtual chassis members start at zero
 | 
			
		||||
	    $member++;
 | 
			
		||||
	    # We will be duplicating and eliminating some keys,
 | 
			
		||||
	    # but this is for the benefit of e_parent()
 | 
			
		||||
	    my $index  = sprintf ("%02d", $key) . sprintf ("%02d", $member) . "0000";
 | 
			
		||||
	    my $iid = "$key\.$member\.0\.0";
 | 
			
		||||
	    $v_index{$iid} = $index;
 | 
			
		||||
	}
 | 
			
		||||
	unless ($containers->{$key}) {
 | 
			
		||||
	    my $index = sprintf ("%02d", $key) . "000000";
 | 
			
		||||
	    $v_index{$key} = $index;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return \%v_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_index {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $contents   = $juniper->jnxContentsDescr() || {};
 | 
			
		||||
    my $containers = $juniper->jnxContainersDescr() || {};
 | 
			
		||||
    my $virtuals   = $juniper->_e_virtual_index() || {};
 | 
			
		||||
    my $is_virtual = $juniper->_e_is_virtual();
 | 
			
		||||
 | 
			
		||||
    # Format into consistent integer format so that numeric sorting works     
 | 
			
		||||
    my %e_index;
 | 
			
		||||
    if ($is_virtual) {
 | 
			
		||||
	foreach my $key ( keys %$virtuals ) {
 | 
			
		||||
	    $e_index{$key} = $virtuals->{$key};
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
	foreach my $key ( keys %$containers ) {
 | 
			
		||||
	    $e_index{$key} = sprintf ("%02d", $key) . "000000";
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    foreach my $key ( keys %$contents ) {
 | 
			
		||||
	$e_index{$key} = join( '', map { sprintf "%02d", $_ } split /\./, $key );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
    return \%e_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_class {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_index    = $juniper->e_index() || {};
 | 
			
		||||
    my $fru_type   = $juniper->jnxFruType() || {};
 | 
			
		||||
    my $c_type     = $juniper->jnxContainersDescr() || {};
 | 
			
		||||
    my $is_virtual = $juniper->_e_is_virtual();
 | 
			
		||||
 | 
			
		||||
    my %e_class;
 | 
			
		||||
    foreach my $iid ( keys %$e_index ) {
 | 
			
		||||
	
 | 
			
		||||
	my $type      = $fru_type->{$iid} || 0;
 | 
			
		||||
	my $container = $c_type->{$iid} || 0;
 | 
			
		||||
	
 | 
			
		||||
        if ( $type =~ /power/i  ) {
 | 
			
		||||
            $e_class{$iid} = 'powerSupply';
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $type =~ /fan/i ) {
 | 
			
		||||
            $e_class{$iid} = 'fan';
 | 
			
		||||
        }
 | 
			
		||||
	elsif ( $type ) {
 | 
			
		||||
	    $e_class{$iid} = 'module';
 | 
			
		||||
	}
 | 
			
		||||
	# Shouldn't get here if we have type which means
 | 
			
		||||
	# we only have container, chassis, and stack left
 | 
			
		||||
        elsif (($container =~ /chassis/i) and (!$is_virtual) ) {
 | 
			
		||||
            $e_class{$iid} = 'chassis';
 | 
			
		||||
        }
 | 
			
		||||
        elsif (($container =~ /chassis/i) and ($is_virtual)) {
 | 
			
		||||
            $e_class{$iid} = 'stack';
 | 
			
		||||
	}
 | 
			
		||||
	# Were calling the second level chassis a container in the case
 | 
			
		||||
	# of a virtual chassis but not sure that it really matters
 | 
			
		||||
        else {
 | 
			
		||||
            $e_class{$iid} = 'container';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%e_class;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_descr {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_index    = $juniper->e_index() || {};
 | 
			
		||||
    my $box_descr  = $juniper->box_descr;
 | 
			
		||||
    my $contents   = $juniper->jnxContentsDescr() || {};
 | 
			
		||||
    my $containers = $juniper->jnxContainersDescr() || {};
 | 
			
		||||
 | 
			
		||||
    my %e_descr;
 | 
			
		||||
    foreach my $iid ( keys %$e_index ) {
 | 
			
		||||
	
 | 
			
		||||
	my $content_descr   = $contents->{$iid} || 0;
 | 
			
		||||
	my $container_descr = $containers->{$iid} || 0;
 | 
			
		||||
	
 | 
			
		||||
	if ($content_descr) {
 | 
			
		||||
	    $e_descr{$iid} = $content_descr;
 | 
			
		||||
	}
 | 
			
		||||
	elsif ($container_descr and $container_descr !~ /chassis/) {
 | 
			
		||||
	    $e_descr{$iid} = $container_descr;
 | 
			
		||||
	}
 | 
			
		||||
	elsif ($container_descr and $container_descr =~ /chassis/) {
 | 
			
		||||
	    $e_descr{$iid} = $box_descr;
 | 
			
		||||
	}
 | 
			
		||||
	# We should only be left with virtual entries created in
 | 
			
		||||
	# _e_virtual_index()
 | 
			
		||||
	elsif ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) {
 | 
			
		||||
	    my $descr = $containers->{$1};
 | 
			
		||||
	    $e_descr{$iid} = $descr;
 | 
			
		||||
	}
 | 
			
		||||
	# Anything past here undef
 | 
			
		||||
    }
 | 
			
		||||
    return \%e_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_serial {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_index    = $juniper->e_index() || {};
 | 
			
		||||
    my $serials    = $juniper->jnxContentsSerialNo() || {};
 | 
			
		||||
    my $e_class    = $juniper->e_class() || {};
 | 
			
		||||
    my $is_virtual = $juniper->_e_is_virtual();
 | 
			
		||||
    my $box_serial = $juniper->serial();
 | 
			
		||||
 | 
			
		||||
    my %e_serial;
 | 
			
		||||
    foreach my $iid ( keys %$e_index ) {
 | 
			
		||||
	my $serial = $serials->{$iid} || '';
 | 
			
		||||
	my $class  = $e_class->{$iid} || '';
 | 
			
		||||
	# Chassis serial number is seperate on true chassis
 | 
			
		||||
	# Virtual chassis (stack) report master switch serial
 | 
			
		||||
	if (!$is_virtual and ($class =~ /chassis/i)){
 | 
			
		||||
	    $e_serial{$iid} = $box_serial;
 | 
			
		||||
	}
 | 
			
		||||
	elsif (($serial !~ /^\w/) or ($serial =~ /builtin/i)) {
 | 
			
		||||
	    next;
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
	    $e_serial{$iid} = $serial;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return  \%e_serial;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_fru {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_index = $juniper->e_index() || {};
 | 
			
		||||
    my $frus    = $juniper->jnxContentsPartNo() || {};
 | 
			
		||||
 | 
			
		||||
    my %e_fru;
 | 
			
		||||
    foreach my $iid ( keys %$e_index ) {
 | 
			
		||||
	my $fru = $frus->{$iid} || '';
 | 
			
		||||
	if ( ($fru !~ /^\w/) or ($fru =~ /builtin/i)) {
 | 
			
		||||
	    $e_fru{$iid} = "false";
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
	    $e_fru{$iid} = "true";
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return  \%e_fru;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_type {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_index    = $juniper->e_index() || {};
 | 
			
		||||
    my $contents   = $juniper->e_contents_type() || {};
 | 
			
		||||
    my $containers = $juniper->e_containers_type() || {};
 | 
			
		||||
 | 
			
		||||
    my %e_type;
 | 
			
		||||
    foreach my $iid ( keys %$e_index ) {
 | 
			
		||||
	
 | 
			
		||||
	my $content_type   = $contents->{$iid} || 0;
 | 
			
		||||
	my $container_type = $containers->{$iid} || 0;
 | 
			
		||||
	
 | 
			
		||||
	if ($content_type) {
 | 
			
		||||
	    $content_type =~ s/\.0//;
 | 
			
		||||
	    $e_type{$iid} = $content_type;
 | 
			
		||||
	}
 | 
			
		||||
	elsif ($container_type) {
 | 
			
		||||
	    $container_type =~ s/\.0//;
 | 
			
		||||
	    $e_type{$iid} = $container_type;
 | 
			
		||||
	}
 | 
			
		||||
	# We should only be left with virtual entries created in
 | 
			
		||||
	# _e_virtual_index()
 | 
			
		||||
	elsif ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) {
 | 
			
		||||
	    my $descr = $containers->{$1};
 | 
			
		||||
	    $descr =~ s/\.0//;
 | 
			
		||||
	    $e_type{$iid} = $descr;
 | 
			
		||||
	}
 | 
			
		||||
	# Anything past here undef
 | 
			
		||||
    }
 | 
			
		||||
    return \%e_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_vendor {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_idx = $juniper->e_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %e_vendor;
 | 
			
		||||
    foreach my $iid ( keys %$e_idx ) {
 | 
			
		||||
        $e_vendor{$iid} = 'juniper';
 | 
			
		||||
    }
 | 
			
		||||
    return \%e_vendor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_pos {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    # We could look at index levels, but his will work as well
 | 
			
		||||
    return $juniper->e_index();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub e_parent {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_idx      = $juniper->e_index() || {};
 | 
			
		||||
    my $c_within   = $juniper->jnxContainersWithin() || {};
 | 
			
		||||
    my $e_descr    = $juniper->e_descr() || {};
 | 
			
		||||
    my $is_virtual = $juniper->_e_is_virtual();
 | 
			
		||||
    
 | 
			
		||||
    my %e_parent;
 | 
			
		||||
    foreach my $iid ( keys %$e_idx ) {
 | 
			
		||||
        next unless $iid;
 | 
			
		||||
	
 | 
			
		||||
	my ($idx, $l1,$l2, $l3) = split /\./, $iid;
 | 
			
		||||
	my $within = $c_within->{$idx};
 | 
			
		||||
	my $descr  = $e_descr->{$iid};
 | 
			
		||||
	
 | 
			
		||||
        if ( !$is_virtual and ($iid =~ /^(\d+)\.\d+/) ) {
 | 
			
		||||
            $e_parent{$iid} = sprintf ("%02d", $1) . "000000";
 | 
			
		||||
        }
 | 
			
		||||
	elsif ( $is_virtual and ($descr =~ /chassis/i) and ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) ) {
 | 
			
		||||
	    $e_parent{$iid} = sprintf ("%02d", $1) . "000000";
 | 
			
		||||
	}
 | 
			
		||||
	elsif ( $is_virtual and ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) ) {
 | 
			
		||||
	    $e_parent{$iid} = sprintf ("%02d", $within) . sprintf ("%02d", $2) . "0000";
 | 
			
		||||
	}
 | 
			
		||||
	elsif ( $is_virtual and ($iid =~ /^(\d+)\.(\d+)\.[1-9]+/) ) {
 | 
			
		||||
	    $e_parent{$iid} = sprintf ("%02d", $1) . sprintf ("%02d", $2) . "0000";
 | 
			
		||||
	}
 | 
			
		||||
	elsif ( defined $within and $iid =~ /\d+/ ) {
 | 
			
		||||
            $e_parent{$iid} = sprintf ("%02d", $within) . "000000";
 | 
			
		||||
	}
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%e_parent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Juniper - SNMP Interface to L3 Juniper Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Bill Fenner
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $juniper = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $juniper->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Juniper Devices running JUNOS
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<JUNIPER-VLAN-MIB> dated "200901090000Z" or later.
 | 
			
		||||
 | 
			
		||||
=item F<JUNIPER-CHASSIS-DEFINES-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<JUNIPER-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<JUNIPER-VIRTUALCHASSIS-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $juniper->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'juniper'
 | 
			
		||||
 | 
			
		||||
=item $juniper->os()
 | 
			
		||||
 | 
			
		||||
Returns 'junos'
 | 
			
		||||
 | 
			
		||||
=item $juniper->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted first from C<sysDescr> or
 | 
			
		||||
C<lldpLocSysDesc> if not available in C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $juniper->model()
 | 
			
		||||
 | 
			
		||||
Returns the model from C<sysObjectID>, with C<jnxProductName> removed from the
 | 
			
		||||
beginning.
 | 
			
		||||
 | 
			
		||||
=item $juniper->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number
 | 
			
		||||
 | 
			
		||||
(C<jnxBoxSerialNo.0>)
 | 
			
		||||
 | 
			
		||||
=item $juniper->mac()
 | 
			
		||||
 | 
			
		||||
Returns the MAC address used by this bridge when it must be referred
 | 
			
		||||
to in a unique fashion.
 | 
			
		||||
 | 
			
		||||
(C<dot1dBaseBridgeAddress>)
 | 
			
		||||
 | 
			
		||||
=item $juniper->box_descr()
 | 
			
		||||
 | 
			
		||||
The name, model, or detailed description of the device.
 | 
			
		||||
 | 
			
		||||
(C<jnxBoxDescr.0>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $juniper->v_index()
 | 
			
		||||
 | 
			
		||||
(C<jnxExVlanTag>)
 | 
			
		||||
 | 
			
		||||
=item $juniper->v_name()
 | 
			
		||||
 | 
			
		||||
(C<jnxExVlanName>)
 | 
			
		||||
 | 
			
		||||
=item $juniper->v_type()
 | 
			
		||||
 | 
			
		||||
(C<jnxExVlanType>)
 | 
			
		||||
 | 
			
		||||
=item $juniper->i_trunk()
 | 
			
		||||
 | 
			
		||||
(C<jnxExVlanPortAccessMode>)
 | 
			
		||||
 | 
			
		||||
=item $juniper->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
 | 
			
		||||
 | 
			
		||||
=item $juniper->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 Forwarding Table (C<dot1dTpFdbEntry>)
 | 
			
		||||
 | 
			
		||||
=over 
 | 
			
		||||
 | 
			
		||||
=item $juniper->fw_mac()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table MAC Addresses
 | 
			
		||||
 | 
			
		||||
(C<dot1dTpFdbAddress>)
 | 
			
		||||
 | 
			
		||||
=item $juniper->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries port interface
 | 
			
		||||
identifier (iid)
 | 
			
		||||
 | 
			
		||||
(C<dot1dTpFdbPort>)
 | 
			
		||||
 | 
			
		||||
=back 
 | 
			
		||||
 | 
			
		||||
=head2 Pseudo F<ENTITY-MIB> information
 | 
			
		||||
 | 
			
		||||
These methods emulate F<ENTITY-MIB> Physical Table methods using
 | 
			
		||||
F<JUNIPER-MIB> and F<JUNIPER-VIRTUALCHASSIS-MIB>. 
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $juniper->e_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: Integer, Indices are combined
 | 
			
		||||
into a eight digit integer, each index is two digits padded with leading zero
 | 
			
		||||
if required.
 | 
			
		||||
 | 
			
		||||
=item $juniper->e_class()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: General hardware type.
 | 
			
		||||
 | 
			
		||||
=item $juniper->e_descr()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: Human friendly name
 | 
			
		||||
 | 
			
		||||
=item $juniper->e_hwver()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: Hardware version
 | 
			
		||||
 | 
			
		||||
=item $juniper->e_vendor()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: juniper
 | 
			
		||||
 | 
			
		||||
=item $juniper->e_serial()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: Serial number
 | 
			
		||||
 | 
			
		||||
=item $juniper->e_pos()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: The relative position among all
 | 
			
		||||
entities sharing the same parent.
 | 
			
		||||
 | 
			
		||||
=item $juniper->e_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: Type of component/sub-component
 | 
			
		||||
as defined in F<JUNIPER-CHASSIS-DEFINES-MIB>.
 | 
			
		||||
 | 
			
		||||
=item $juniper->e_parent()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: The value of e_index() for the
 | 
			
		||||
entity which 'contains' this entity.  A value of zero indicates	this entity
 | 
			
		||||
is not contained in any other entity.
 | 
			
		||||
 | 
			
		||||
=item $entity->e_fru()
 | 
			
		||||
 | 
			
		||||
BOOLEAN. Is a Field Replaceable unit?
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalFRU>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										271
									
								
								Info/Layer3/Lantronix.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								Info/Layer3/Lantronix.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,271 @@
 | 
			
		||||
# SNMP::Info::Layer3::Lantronix
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 J R Binks
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Lantronix;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Lantronix::ISA = qw/
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    Exporter
 | 
			
		||||
    /;
 | 
			
		||||
@SNMP::Info::Layer3::Lantronix::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'LANTRONIX-MIB'     => 'products',
 | 
			
		||||
    'LANTRONIX-SLC-MIB' => 'slcNetwork',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    'slc_os_ver'       => 'slcSystemFWRev',
 | 
			
		||||
    'slc_serial'       => 'slcSystemSerialNo',
 | 
			
		||||
    'slc_model'        => 'slcSystemModel',
 | 
			
		||||
    'slc_psu_a_status' => 'slcDevPowerSupplyA',
 | 
			
		||||
    'slc_psu_b_status' => 'slcDevPowerSupplyB',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
# General notes:
 | 
			
		||||
#
 | 
			
		||||
# Products like the EDS have very minimal MIB support for the basics.
 | 
			
		||||
# Much information has to be derived from sysDescr string.
 | 
			
		||||
#
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'lantronix';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $descr = $device->description() || '';
 | 
			
		||||
    my $os;
 | 
			
		||||
 | 
			
		||||
    # On EDS, it is called the "Evolution OS"
 | 
			
		||||
    # Not sure what, if any, name it has a name on other products
 | 
			
		||||
    $os = 'EvolutionOS' if ( $descr =~ m/Lantronix EDS\w+ V([\d\.R]+)/ );
 | 
			
		||||
 | 
			
		||||
    return 'LantronixOS';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $descr = $device->description() || '';
 | 
			
		||||
    my $slc_os_ver = $device->slc_os_ver;
 | 
			
		||||
    my $os_ver;
 | 
			
		||||
 | 
			
		||||
    return $slc_os_ver if defined $slc_os_ver;
 | 
			
		||||
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
 | 
			
		||||
    $os_ver = $1 if ( $descr =~ m/Lantronix EDS\w+ V([\d\.R]+)/ );
 | 
			
		||||
 | 
			
		||||
    return $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $descr = $device->description() || '';
 | 
			
		||||
    my $slc_serial = $device->slc_serial;
 | 
			
		||||
    my $serial;
 | 
			
		||||
 | 
			
		||||
    return $slc_serial if defined $slc_serial;
 | 
			
		||||
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
 | 
			
		||||
    $serial = $1 if ( $descr =~ m/Lantronix EDS\w+ V[\d\.R]+ \((\w+)\)/ );
 | 
			
		||||
 | 
			
		||||
    return $serial;
 | 
			
		||||
}       
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $descr = $device->description() || '';
 | 
			
		||||
    my $slc_model = $device->slc_model;
 | 
			
		||||
    my $model;
 | 
			
		||||
 | 
			
		||||
    return $slc_model if defined $slc_model;
 | 
			
		||||
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
 | 
			
		||||
    $model = $1 if ( $descr =~ m/Lantronix (EDS\w+)/ );
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $slc_psu_a_status = $device->slc_psu_a_status;
 | 
			
		||||
 | 
			
		||||
    return $slc_psu_a_status if defined $slc_psu_a_status;
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_status {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $slc_psu_b_status = $device->slc_psu_b_status;
 | 
			
		||||
 | 
			
		||||
    return $slc_psu_b_status if defined $slc_psu_b_status;
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Lantronix - SNMP Interface to Lantronix devices such as terminal servers
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
J R Binks
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $device = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'mydevice',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $device->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Lantronix devices such as terminal servers.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<LANTRONIX-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<LANTRONIX-SLC-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $device->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'lantronix'.
 | 
			
		||||
 | 
			
		||||
=item $device->os()
 | 
			
		||||
 | 
			
		||||
Returns 'EvolutionOS' for EDS devices.
 | 
			
		||||
 | 
			
		||||
=item $device->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version.
 | 
			
		||||
 | 
			
		||||
=item $device->model()
 | 
			
		||||
 | 
			
		||||
Returns the model.
 | 
			
		||||
 | 
			
		||||
=item $device->serial()
 | 
			
		||||
 | 
			
		||||
Returns the serial number.
 | 
			
		||||
 | 
			
		||||
=item $device->ps1_status()
 | 
			
		||||
 | 
			
		||||
Power supply 1 status
 | 
			
		||||
 | 
			
		||||
=item $device->ps2_status()
 | 
			
		||||
 | 
			
		||||
Power supply 2 status
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $device->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Increments value of IID if port is to be ignored.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Lantronix specific items
 | 
			
		||||
 | 
			
		||||
None at present.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										196
									
								
								Info/Layer3/Microsoft.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								Info/Layer3/Microsoft.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,196 @@
 | 
			
		||||
# SNMP::Info::Layer3::Microsoft
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer3::Microsoft;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Microsoft::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Microsoft::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'microsoft';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'windows';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    return '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    return 'Windows Router';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    return '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $l3->interfaces() - Map the Interfaces to their physical names
 | 
			
		||||
# Add interface number to interface name because if MS Win
 | 
			
		||||
# have identical interface cards ("HP NC7782 Gigabit Server Adapter"
 | 
			
		||||
# for example), than MS Win return identical ifDescr
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces   = $l3->i_index($partial);
 | 
			
		||||
    my $descriptions = $l3->i_description($partial);
 | 
			
		||||
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $desc = $descriptions->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
 | 
			
		||||
        $interfaces{$iid} = sprintf( "(%U) %s", $iid, $desc );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Microsoft - SNMP Interface to L3 Microsoft Windows router
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
begemot
 | 
			
		||||
 | 
			
		||||
=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     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    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 Generic Microsoft Routers running Microsoft Windows OS
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $router->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'microsoft'>
 | 
			
		||||
 | 
			
		||||
=item $router->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'windows'>
 | 
			
		||||
 | 
			
		||||
=item $router->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns ''
 | 
			
		||||
 | 
			
		||||
=item $router->model()
 | 
			
		||||
 | 
			
		||||
Returns C<'Windows Router'>
 | 
			
		||||
 | 
			
		||||
=item $router->serial()
 | 
			
		||||
 | 
			
		||||
Returns ''
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $router->interfaces()
 | 
			
		||||
 | 
			
		||||
Map the Interfaces to their physical names.  Adds interface number to
 | 
			
		||||
interface name because identical interface cards return identical C<ifDescr>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										175
									
								
								Info/Layer3/Mikrotik.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								Info/Layer3/Mikrotik.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,175 @@
 | 
			
		||||
# SNMP::Info::Layer3::Mikrotik
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer3::Mikrotik;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Mikrotik::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Mikrotik::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'HOST-RESOURCES-MIB'       => 'hrSystem',
 | 
			
		||||
    'MIKROTIK-MIB'             => 'mtxrLicVersion',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    'hrSystemUptime' => 'hrSystemUptime',
 | 
			
		||||
    'os_ver'         => 'mtxrLicVersion',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'mikrotik';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $mikrotik = shift;
 | 
			
		||||
    my $descr = $mikrotik->description() || '';
 | 
			
		||||
    my $model = undef;
 | 
			
		||||
    $model = $1 if ( $descr =~ /^RouterOS\s+(\S+)$/i );
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'routeros';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Mikrotik - SNMP Interface to Mikrotik devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHORS
 | 
			
		||||
 | 
			
		||||
Jeroen van Ingen
 | 
			
		||||
initial version based on SNMP::Info::Layer3::NetSNMP by Bradley Baetz and Bill Fenner
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $mikrotik = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $mikrotik->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Mikrotik devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<HOST-RESOURCES-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<MIKROTIK-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $mikrotik->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'mikrotik'>.
 | 
			
		||||
 | 
			
		||||
=item $mikrotik->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'routeros'>.
 | 
			
		||||
 | 
			
		||||
=item $mikrotik->model()
 | 
			
		||||
 | 
			
		||||
Tries to extract the device model from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $mikrotik->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the value of C<mtxrLicVersion>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										319
									
								
								Info/Layer3/N1600.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										319
									
								
								Info/Layer3/N1600.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,319 @@
 | 
			
		||||
# SNMP::Info::Layer3::N1600 - SNMP Interface to Nortel N16XX devices
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer3::N1600;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::SONMP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::N1600::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer3 SNMP::Info::SONMP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::N1600::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::SONMP::MIBS,
 | 
			
		||||
    'SWL2MGMT-MIB' => 'swL2MgmtMIB',
 | 
			
		||||
    'RAPID-CITY'   => 'rapidCity',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::SONMP::GLOBALS, );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::SONMP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # SWL2MGMT-MIB
 | 
			
		||||
    # swL2PortInfoTable
 | 
			
		||||
    'n1600_nway_status' => 'swL2PortInfoNwayStatus',
 | 
			
		||||
 | 
			
		||||
    # swL2PortCtrlTable
 | 
			
		||||
    'n1600_nway_state' => 'swL2PortCtrlNwayState',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::SONMP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $n1600 = shift;
 | 
			
		||||
    my $id    = $n1600->id();
 | 
			
		||||
 | 
			
		||||
    unless ( defined $id ) {
 | 
			
		||||
        print
 | 
			
		||||
            " SNMP::Info::Layer3::N1600::model() - Device does not support sysObjectID\n"
 | 
			
		||||
            if $n1600->debug();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^rcA//i;
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'passport';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $n1600 = shift;
 | 
			
		||||
    my $descr = $n1600->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/(\d+\.\d+\.\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $n1600   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $n1600->i_index($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %if;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
 | 
			
		||||
        my $slotport = "1.$index";
 | 
			
		||||
        $if{$iid} = $slotport;
 | 
			
		||||
    }
 | 
			
		||||
    return \%if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex {
 | 
			
		||||
    my $n1600   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $nway_status = $n1600->n1600_nway_status($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $iid ( keys %$nway_status ) {
 | 
			
		||||
        my $duplex = $nway_status->{$iid};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
        next if $duplex =~ /other/i;
 | 
			
		||||
        $i_duplex{$iid} = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $i_duplex{$iid} = 'full' if $duplex =~ /full/i;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $n1600   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $nway_state = $n1600->n1600_nway_state($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex;
 | 
			
		||||
    foreach my $iid ( keys %$nway_state ) {
 | 
			
		||||
        my $duplex = $nway_state->{$iid};
 | 
			
		||||
        next unless defined $duplex;
 | 
			
		||||
        next if $duplex =~ /other/i;
 | 
			
		||||
        $i_duplex{$iid} = 'half' if $duplex =~ /half/i;
 | 
			
		||||
        $i_duplex{$iid} = 'full' if $duplex =~ /full/i;
 | 
			
		||||
        $i_duplex{$iid} = 'auto' if $duplex =~ /nway-enabled/i;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Required for SNMP::Info::SONMP
 | 
			
		||||
sub index_factor {
 | 
			
		||||
    return 64;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::N1600 - SNMP Interface to Avaya/Nortel 16XX Network
 | 
			
		||||
Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $n1600 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $n1600->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/Nortel N16XX device through SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $n1600 = new SNMP::Info::Layer3::N1600(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<SWL2MGMT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<RAPID-CITY>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See classes listed above for their required MIBs.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $n1600->bulkwalk_no
 | 
			
		||||
 | 
			
		||||
Return C<1>.  Bulkwalk is currently turned off for this class.
 | 
			
		||||
 | 
			
		||||
=item $n1600->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.  Checks $n1600->id() against the 
 | 
			
		||||
F<RAPID-CITY-MIB> and then parses out C<rcA>.
 | 
			
		||||
 | 
			
		||||
=item $n1600->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $n1600->os()
 | 
			
		||||
 | 
			
		||||
Returns 'passport'
 | 
			
		||||
 | 
			
		||||
=item $n1600->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns os version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item  $n1600->index_factor()
 | 
			
		||||
 | 
			
		||||
Required by SNMP::Info::SONMP.  Number representing the number of ports
 | 
			
		||||
reserved per slot within the device MIB.
 | 
			
		||||
 | 
			
		||||
Returns 64 since largest switch has 48 ports.  Since these switches can
 | 
			
		||||
not stack, the only requirement to reserve more than the max number of ports.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See documentation in SNMP::SONMP::Layer3 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 $n1600->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface names to iids.
 | 
			
		||||
 | 
			
		||||
Places a 1 in front of index number.  This is required for compatibility with
 | 
			
		||||
SNMP::Info::SONMP.
 | 
			
		||||
 | 
			
		||||
=item $n1600->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface operational link duplex status. 
 | 
			
		||||
 | 
			
		||||
=item $n1600->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface administrative link duplex status. 
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::SONMP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										272
									
								
								Info/Layer3/NetSNMP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								Info/Layer3/NetSNMP.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,272 @@
 | 
			
		||||
# SNMP::Info::Layer3::NetSNMP
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::NetSNMP;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::NetSNMP::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::NetSNMP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'UCD-SNMP-MIB'       => 'versionTag',
 | 
			
		||||
    'NET-SNMP-TC'        => 'netSnmpAgentOIDs',
 | 
			
		||||
    'HOST-RESOURCES-MIB' => 'hrSystem',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    'netsnmp_vers'   => 'versionTag',
 | 
			
		||||
    'hrSystemUptime' => 'hrSystemUptime',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'Net-SNMP';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $netsnmp = shift;
 | 
			
		||||
    my $descr   = $netsnmp->description();
 | 
			
		||||
 | 
			
		||||
    return $1 if ( $descr =~ /^(\S+)\s+/ );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $netsnmp = shift;
 | 
			
		||||
    my $descr   = $netsnmp->description();
 | 
			
		||||
    my $vers    = $netsnmp->netsnmp_vers();
 | 
			
		||||
    my $os_ver  = undef;
 | 
			
		||||
 | 
			
		||||
    $os_ver = $1 if ( $descr =~ /^\S+\s+\S+\s+(\S+)\s+/ );
 | 
			
		||||
    if ($vers) {
 | 
			
		||||
        $os_ver = "???" unless defined($os_ver);
 | 
			
		||||
        $os_ver .= " / Net-SNMP " . $vers;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    return '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# sysUptime gives us the time since the SNMP daemon has restarted,
 | 
			
		||||
# so return the system uptime since that's probably what the user
 | 
			
		||||
# wants.  (Caution: this could cause trouble if using
 | 
			
		||||
# sysUptime-based discontinuity timers or other TimeStamp
 | 
			
		||||
# objects.
 | 
			
		||||
sub uptime {
 | 
			
		||||
    my $netsnmp = shift;
 | 
			
		||||
    my $uptime;
 | 
			
		||||
 | 
			
		||||
    $uptime = $netsnmp->hrSystemUptime();
 | 
			
		||||
    return $uptime if defined $uptime;
 | 
			
		||||
 | 
			
		||||
    return $netsnmp->SUPER::uptime();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l3->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
 | 
			
		||||
        # lo0 etc
 | 
			
		||||
        if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::NetSNMP - SNMP Interface to L3 Net-SNMP Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHORS
 | 
			
		||||
 | 
			
		||||
Bradley Baetz and Bill Fenner
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $netsnmp = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $netsnmp->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Generic Net-SNMP devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<UCD-SNMP-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<NET-SNMP-TC>
 | 
			
		||||
 | 
			
		||||
=item F<HOST-RESOURCES-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'Net-SNMP'.
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->os()
 | 
			
		||||
 | 
			
		||||
Returns the OS extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted from C<sysDescr>, along
 | 
			
		||||
with the Net-SNMP version.
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->uptime()
 | 
			
		||||
 | 
			
		||||
Returns the system uptime instead of the agent uptime.
 | 
			
		||||
NOTE: discontinuity timers and other Time Stamp based objects
 | 
			
		||||
are based on agent uptime, so use orig_uptime().
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->serial()
 | 
			
		||||
 | 
			
		||||
Returns ''.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netsnmp->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Increments value of IID if port is to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores loopback
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP> for details.
 | 
			
		||||
 | 
			
		||||
=head1 NOTES
 | 
			
		||||
 | 
			
		||||
In order to cause SNMP::Info to classify your device into this class, it
 | 
			
		||||
may be necessary to put a configuration line into your F<snmpd.conf>
 | 
			
		||||
similar to
 | 
			
		||||
 | 
			
		||||
  sysobjectid .1.3.6.1.4.1.8072.3.2.N
 | 
			
		||||
 | 
			
		||||
where N is the object ID for your OS from the C<NET-SNMP-TC> MIB (or
 | 
			
		||||
255 if not listed).  Some Net-SNMP installations default to an
 | 
			
		||||
incorrect return value for C<system.sysObjectId>.
 | 
			
		||||
 | 
			
		||||
In order to recognize a Net-SNMP device as Layer3, it may be necessary
 | 
			
		||||
to put a configuration line similar to
 | 
			
		||||
 | 
			
		||||
  sysservices 76
 | 
			
		||||
 | 
			
		||||
in your F<snmpd.conf>.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										740
									
								
								Info/Layer3/Netscreen.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										740
									
								
								Info/Layer3/Netscreen.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,740 @@
 | 
			
		||||
# SNMP::Info::Layer3::Netscreen
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Netscreen;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::IEEE802dot11;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Netscreen::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer3 SNMP::Info::IEEE802dot11 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Netscreen::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MIBS,
 | 
			
		||||
    'NETSCREEN-SMI'           => 'netscreenSetting',
 | 
			
		||||
    'NETSCREEN-PRODUCTS-MIB'  => 'netscreenGeneric',
 | 
			
		||||
    'NETSCREEN-INTERFACE-MIB' => 'nsIfIndex',
 | 
			
		||||
    'NETSCREEN-SET-GEN-MIB'   => 'nsSetGenSwVer',
 | 
			
		||||
    'NETSCREEN-IP-ARP-MIB'    => 'nsIpArpAOD',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::GLOBALS,
 | 
			
		||||
    'os_version' => 'nsSetGenSwVer',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::FUNCS,
 | 
			
		||||
 | 
			
		||||
    ns_i_index       => 'nsIfIndex',
 | 
			
		||||
    ns_i_name        => 'nsIfName',
 | 
			
		||||
    ns_i_description => 'nsIfDescr',
 | 
			
		||||
    ns_i_mac         => 'nsIfMAC',
 | 
			
		||||
    ns_i_up          => 'nsIfStatus',
 | 
			
		||||
    ns_ip_table      => 'nsIfIp',
 | 
			
		||||
    ns_ip_netmask    => 'nsIfNetmask',
 | 
			
		||||
    at_index         => 'nsIpArpIfIdx',
 | 
			
		||||
    at_paddr         => 'nsIpArpMac',
 | 
			
		||||
    at_netaddr       => 'nsIpArpIp',
 | 
			
		||||
    bp_index         => 'nsIfInfo',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MUNGE,
 | 
			
		||||
    'ns_i_mac' => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'at_paddr' => \&SNMP::Info::munge_mac,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
    return '01001110';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'juniper';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'screenos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $netscreen->description();
 | 
			
		||||
    if ( $descr =~ m/version (\d\S*) \(SN: / ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_serial = $netscreen->e_serial() || {};
 | 
			
		||||
 | 
			
		||||
    my $serial = $e_serial->{1} || undef;
 | 
			
		||||
 | 
			
		||||
    return $1 if ( defined $serial and $serial =~ /(\d+)/ );
 | 
			
		||||
    my $descr = $netscreen->description();
 | 
			
		||||
    if ( $descr =~ m/version .*\(SN: (\d\S*),/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $id = $netscreen->id();
 | 
			
		||||
 | 
			
		||||
    unless ( defined $id ) {
 | 
			
		||||
        print
 | 
			
		||||
            " SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
 | 
			
		||||
            if $netscreen->debug();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^netscreen//i;
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# provides mapping from IF-MIB to nsIf interfaces - many to 1 (!)
 | 
			
		||||
# - on WLAN devices wireless0/0(|-[ag]) -> wireless0/0 !!
 | 
			
		||||
sub _if_nsif_map {
 | 
			
		||||
    my $netscreen   = shift;
 | 
			
		||||
    my $i_descr     = $netscreen->SUPER::i_description;
 | 
			
		||||
    my $ns_descr    = $netscreen->i_description;
 | 
			
		||||
    my %if_nsif_map = ();
 | 
			
		||||
    my @ikeys       = sort { $a <=> $b } keys %$i_descr;
 | 
			
		||||
    my @nskeys      = sort { $a <=> $b } keys %$ns_descr;
 | 
			
		||||
    my $i           = 0;
 | 
			
		||||
    my $n           = 0;
 | 
			
		||||
 | 
			
		||||
    # assumes descriptions are in the same order from both walks
 | 
			
		||||
    while ( $i < @ikeys && $n < @nskeys ) {
 | 
			
		||||
 | 
			
		||||
        # find matching sub interfaces
 | 
			
		||||
        while (
 | 
			
		||||
            $i < @ikeys
 | 
			
		||||
            && substr(
 | 
			
		||||
                $i_descr->{ $ikeys[$i] },
 | 
			
		||||
                0,
 | 
			
		||||
                length $ns_descr->{ $nskeys[$n] }
 | 
			
		||||
            ) eq $ns_descr->{ $nskeys[$n] }
 | 
			
		||||
            )
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            $if_nsif_map{ $ikeys[$i] } = $nskeys[$n];
 | 
			
		||||
            $i++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $n++;
 | 
			
		||||
 | 
			
		||||
        # skip non-matching interfaces (e.g. tunnel.N)
 | 
			
		||||
        while (
 | 
			
		||||
            $i < @ikeys
 | 
			
		||||
            && substr(
 | 
			
		||||
                $i_descr->{ $ikeys[$i] },
 | 
			
		||||
                0,
 | 
			
		||||
                length $ns_descr->{ $nskeys[$n] }
 | 
			
		||||
            ) ne $ns_descr->{ $nskeys[$n] }
 | 
			
		||||
            && $n < @nskeys
 | 
			
		||||
            )
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            $if_nsif_map{ $ikeys[$i] } = 0;    # no matching interface
 | 
			
		||||
            $i++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%if_nsif_map;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Provides mapping from nsIf interfaces to IF-MIB interfaces - many to 1
 | 
			
		||||
# Example, tunnel.# interfaces are not present in IF-MIB.  There exist no
 | 
			
		||||
# mapping of index IID's between the tables so create mapping based on names
 | 
			
		||||
sub _nsif_if_map {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_descr      = $netscreen->SUPER::i_description;
 | 
			
		||||
    my $ns_descr     = $netscreen->i_description;
 | 
			
		||||
    my %rev_i_descr  = reverse %$i_descr;
 | 
			
		||||
    my %rev_ns_descr = reverse %$ns_descr;
 | 
			
		||||
 | 
			
		||||
    my %nsif_if_map = ();
 | 
			
		||||
    foreach my $value ( values %$ns_descr ) {
 | 
			
		||||
        if ( exists $rev_i_descr{$value} ) {
 | 
			
		||||
            $nsif_if_map{ $rev_ns_descr{$value} } = $rev_i_descr{$value};
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $nsif_if_map{ $rev_ns_descr{$value} } = 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%nsif_if_map;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
    return $netscreen->i_description();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_index {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
    return $netscreen->ns_i_index();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
    return $netscreen->ns_i_name();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_description {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    # Versions prior to 5.4 do not support nsIfDescr but do have nsIfName
 | 
			
		||||
    return $netscreen->ns_i_description() || $netscreen->ns_i_name();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $ns_mac   = $netscreen->ns_i_mac()     || {};
 | 
			
		||||
    my $if_i_mac = $netscreen->SUPER::i_mac() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_nsif_if_map();
 | 
			
		||||
 | 
			
		||||
    my %i_mac = ();
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_mac{$iid} = $ns_mac->{$iid} || $if_i_mac->{ $ns_i_map->{$iid} };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_lastchange {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $if_i_lastchange = $netscreen->SUPER::i_lastchange() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_nsif_if_map();
 | 
			
		||||
    my %i_lastchange;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_lastchange{$iid} = $if_i_lastchange->{ $ns_i_map->{$iid} };
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_lastchange;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
    return $netscreen->ns_i_up();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_up_admin {
 | 
			
		||||
    my $netscreen  = shift;
 | 
			
		||||
    my $i_up       = $netscreen->i_up();
 | 
			
		||||
    my $i_up_admin = $netscreen->SUPER::i_up_admin();
 | 
			
		||||
    my $ns_i_map   = $netscreen->_nsif_if_map();
 | 
			
		||||
    my %i_up_admin;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_up_admin{$iid} 
 | 
			
		||||
            = $i_up->{$iid} eq "up" && "up"
 | 
			
		||||
            || $i_up_admin->{ $ns_i_map->{$iid} }
 | 
			
		||||
            || 0;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_up_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_type {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $if_i_type = $netscreen->SUPER::i_type() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_nsif_if_map();
 | 
			
		||||
    my %i_type;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_type{$iid} = $if_i_type->{ $ns_i_map->{$iid} } || "tunnel";
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mtu {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_type = $netscreen->SUPER::i_mtu() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_nsif_if_map();
 | 
			
		||||
    my %i_mtu;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_mtu{$iid} = $i_type->{ $ns_i_map->{$iid} };
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_mtu;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_speed  = $netscreen->SUPER::i_speed();
 | 
			
		||||
    my $i_name   = $netscreen->i_name();
 | 
			
		||||
    my $ns_i_map = $netscreen->_nsif_if_map;
 | 
			
		||||
    my %i_speed;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ns_i_map ) {
 | 
			
		||||
        $i_speed{$iid} 
 | 
			
		||||
            = $i_speed->{ $ns_i_map->{$iid} }
 | 
			
		||||
            || $i_name->{$iid} =~ /tunnel/ && "vpn"
 | 
			
		||||
            || 0;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_speed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _mac_map {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $arp_mac = $netscreen->nsIpArpMac() || {};
 | 
			
		||||
 | 
			
		||||
    my %mac_map = ();
 | 
			
		||||
    foreach my $iid ( keys %$arp_mac ) {
 | 
			
		||||
        my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
 | 
			
		||||
        $mac_map{$oid} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%mac_map;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ip_index {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $ns_ip = $netscreen->ns_ip_table() || {};
 | 
			
		||||
 | 
			
		||||
    my %ip_index = ();
 | 
			
		||||
    foreach my $iid ( keys %$ns_ip ) {
 | 
			
		||||
        $ip_index{ $ns_ip->{$iid} } = $iid if $ns_ip->{$iid} ne "0.0.0.0";
 | 
			
		||||
    }
 | 
			
		||||
    return \%ip_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ip_table {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $ip_index = $netscreen->ip_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %ip_table = ();
 | 
			
		||||
    foreach my $iid ( keys %$ip_index ) {
 | 
			
		||||
        $ip_table{$iid} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%ip_table;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ip_netmask {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $ip_index = $netscreen->ip_index() || {};
 | 
			
		||||
    my $ns_netmask = $netscreen->ns_ip_netmask();
 | 
			
		||||
 | 
			
		||||
    my %ip_netmask = ();
 | 
			
		||||
    foreach my $iid ( keys %$ip_index ) {
 | 
			
		||||
        $ip_netmask{$iid} = $ns_netmask->{ $ip_index->{$iid} };
 | 
			
		||||
    }
 | 
			
		||||
    return \%ip_netmask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_index {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
    my %fw_index  = ();
 | 
			
		||||
    my $arp_mac   = $netscreen->nsIpArpMac() || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$arp_mac ) {
 | 
			
		||||
        my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
 | 
			
		||||
        $fw_index{$iid} = $oid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%fw_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $mac_map = $netscreen->_mac_map() || {};
 | 
			
		||||
 | 
			
		||||
    my %fw_mac = ();
 | 
			
		||||
    foreach my $oid ( keys %$mac_map ) {
 | 
			
		||||
        my $mac
 | 
			
		||||
            = join( ":", ( map { sprintf "%lx", $_ } split( /\./, $oid ) ) );
 | 
			
		||||
        $fw_mac{$oid} = $mac;
 | 
			
		||||
    }
 | 
			
		||||
    return \%fw_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $if_info = $netscreen->nsIfInfo() || {};
 | 
			
		||||
 | 
			
		||||
    my %bp_index = ();
 | 
			
		||||
    foreach my $iid ( keys %$if_info ) {
 | 
			
		||||
        $bp_index{ $if_info->{$iid} } = $iid;
 | 
			
		||||
    }
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $fw_index = $netscreen->fw_index();
 | 
			
		||||
    my $arp_if = $netscreen->nsIpArpIfIdx() || {};
 | 
			
		||||
 | 
			
		||||
    my %fw_port;
 | 
			
		||||
    foreach my $iid ( keys %$arp_if ) {
 | 
			
		||||
        $fw_port{ $fw_index->{$iid} } = $arp_if->{$iid}
 | 
			
		||||
            if defined $fw_index->{$iid};
 | 
			
		||||
    }
 | 
			
		||||
    return \%fw_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# need to remap from IF-MIB index to nsIf index
 | 
			
		||||
sub i_ssidlist {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_ssidlist = $netscreen->SUPER::i_ssidlist() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_if_nsif_map();
 | 
			
		||||
 | 
			
		||||
    my %i_ssidlist;
 | 
			
		||||
    foreach my $iid ( keys %$i_ssidlist ) {
 | 
			
		||||
        $i_ssidlist{ $ns_i_map->{$iid} } = $i_ssidlist->{$iid};
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ssidlist;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_80211channel {
 | 
			
		||||
    my $netscreen = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_80211channel = $netscreen->SUPER::i_80211channel() || {};
 | 
			
		||||
    my $ns_i_map = $netscreen->_if_nsif_map();
 | 
			
		||||
 | 
			
		||||
    my %i_80211channel;
 | 
			
		||||
    foreach my $iid ( keys %$i_80211channel ) {
 | 
			
		||||
        $i_80211channel{ $ns_i_map->{$iid} } = $i_80211channel->{$iid};
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_80211channel;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Netscreen - SNMP Interface to Juniper Netscreen Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Kent Hamilton
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
    #Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 | 
			
		||||
    my $netscreen = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
    my $class = $netscreen->class();
 | 
			
		||||
    print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Juniper Netscreen devices through SNMP.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<NETSCREEN-SMI>
 | 
			
		||||
 | 
			
		||||
=item F<NETSCREEN-PRODUCTS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<NETSCREEN-INTERFACE-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<NETSCREEN-SET-GEN-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<NETSCREEN-IP-ARP-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netscreen->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $netscreen->id() to F<NETSCREEN-PRODUCTS-MIB>
 | 
			
		||||
 | 
			
		||||
=item $netscreen->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'juniper'>
 | 
			
		||||
 | 
			
		||||
=item $netscreen->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'screenos'>
 | 
			
		||||
 | 
			
		||||
=item $netscreen->os_ver()
 | 
			
		||||
 | 
			
		||||
Extracts the OS version from the description string.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netscreen->layers()
 | 
			
		||||
 | 
			
		||||
Returns 01001110.  Device doesn't report layers properly, modified to reflect 
 | 
			
		||||
Layer 2 and 3 functionality.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=head3 Interface Information
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netscreen->interfaces()
 | 
			
		||||
 | 
			
		||||
Creates a map between the interface identifier (iid) and the physical port
 | 
			
		||||
name.
 | 
			
		||||
 | 
			
		||||
Defaults to C<insIfDescr> if available, uses C<nsIfName> if not.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_description() 
 | 
			
		||||
 | 
			
		||||
Description of the interface. Uses C<insIfDescr> if available, C<nsIfName>
 | 
			
		||||
if not.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns without defining any interfaces to ignore.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_index()
 | 
			
		||||
 | 
			
		||||
Default SNMP IID to Interface index.
 | 
			
		||||
 | 
			
		||||
(C<nsIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_lastchange()
 | 
			
		||||
 | 
			
		||||
The value of C<sysUpTime> when this port last changed states (up,down), 
 | 
			
		||||
maps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
(C<ifLastChange>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_mac() 
 | 
			
		||||
 | 
			
		||||
MAC address of the interface.  Note this is just the MAC of the port, not
 | 
			
		||||
anything connected to it.  Uses C<nsIfMAC> if available, C<ifPhysAddress>
 | 
			
		||||
if not.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_mtu()
 | 
			
		||||
 | 
			
		||||
INTEGER. Interface MTU value, maps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
(C<ifMtu>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_name()
 | 
			
		||||
 | 
			
		||||
Interface Name field.
 | 
			
		||||
 | 
			
		||||
(C<nsIfName>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_speed()
 | 
			
		||||
 | 
			
		||||
Speed of the link, maps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_type()
 | 
			
		||||
 | 
			
		||||
Interface type.  Maps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
(C<ifType>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_up() 
 | 
			
		||||
 | 
			
		||||
Link Status of the interface.  Typical values are 'up' and 'down'.
 | 
			
		||||
 | 
			
		||||
(C<nsIfStatus>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->i_up_admin()
 | 
			
		||||
 | 
			
		||||
Administrative status of the port.  Checks both C<ifAdminStatus> and
 | 
			
		||||
C<nsIfStatus>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head3 IP Address Table
 | 
			
		||||
 | 
			
		||||
Each entry in this table is an IP address in use on this device.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netscreen->ip_index()
 | 
			
		||||
 | 
			
		||||
Maps the IP Table to the IID
 | 
			
		||||
 | 
			
		||||
=item $netscreen->ip_table()
 | 
			
		||||
 | 
			
		||||
Maps the Table to the IP address
 | 
			
		||||
 | 
			
		||||
(C<nsIfIp>)
 | 
			
		||||
 | 
			
		||||
=item $netscreen->ip_netmask()
 | 
			
		||||
 | 
			
		||||
Gives netmask setting for IP table entry.
 | 
			
		||||
 | 
			
		||||
(C<nsIfNetmask>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head3 Forwarding Table
 | 
			
		||||
 | 
			
		||||
Uses C<nsIpArpTable> to emulate the forwarding table.
 | 
			
		||||
 | 
			
		||||
=over 
 | 
			
		||||
 | 
			
		||||
=item $netscreen->fw_index()
 | 
			
		||||
 | 
			
		||||
Maps the Forwarding Table to the IID
 | 
			
		||||
 | 
			
		||||
=item $netscreen->fw_mac()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table MAC Addresses.
 | 
			
		||||
 | 
			
		||||
=item $netscreen->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries port interface
 | 
			
		||||
identifier (IID).
 | 
			
		||||
 | 
			
		||||
=item $netscreen->bp_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of bridge port table entries map back to interface
 | 
			
		||||
identifier (IID).
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head3 Wireless Information
 | 
			
		||||
 | 
			
		||||
=over 
 | 
			
		||||
 | 
			
		||||
=item $dot11->i_ssidlist()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  SSID's recognized by the radio interface.
 | 
			
		||||
Remaps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
(C<dot11DesiredSSID>)
 | 
			
		||||
 | 
			
		||||
=item $dot11->i_80211channel()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current operating frequency channel of the radio
 | 
			
		||||
interface.  Remaps from C<ifIndex> to C<nsIfIndex>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										391
									
								
								Info/Layer3/Nexus.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										391
									
								
								Info/Layer3/Nexus.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,391 @@
 | 
			
		||||
# SNMP::Info::Layer3::Nexus
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Nexus;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoImage;
 | 
			
		||||
use SNMP::Info::CiscoPortSecurity;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CiscoPower;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::CiscoStpExtensions;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
# NOTE : Top-most items gets precedence for @ISA
 | 
			
		||||
@SNMP::Info::Layer3::Nexus::ISA = qw/
 | 
			
		||||
    SNMP::Info::CiscoVTP 
 | 
			
		||||
    SNMP::Info::CiscoStpExtensions
 | 
			
		||||
    SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::CDP 
 | 
			
		||||
    SNMP::Info::CiscoImage
 | 
			
		||||
    SNMP::Info::CiscoPortSecurity
 | 
			
		||||
    SNMP::Info::CiscoConfig
 | 
			
		||||
    SNMP::Info::CiscoPower
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    Exporter
 | 
			
		||||
/;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Nexus::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
# NOTE: Order creates precedence
 | 
			
		||||
#       Example: v_name exists in Bridge.pm and CiscoVTP.pm
 | 
			
		||||
#       Bridge is called from Layer3 and CiscoStpExtensions
 | 
			
		||||
#       So we want CiscoVTP to come last to get the right one.
 | 
			
		||||
# The @ISA order should be reverse of these orders.
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoPower::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MIBS, 
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MIBS,
 | 
			
		||||
    'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevMIBObjects',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPower::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
    'mac' => 'dot1dBaseBridgeAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoPower::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoImage::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::FUNCS, 
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoPower::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MUNGE,         
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MUNGE, 
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MUNGE,    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub cisco_comm_indexing { return 1; }
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'nx-os';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $nexus = shift; 
 | 
			
		||||
    my $descr = $nexus->description();
 | 
			
		||||
    
 | 
			
		||||
    return $1 if ( $descr =~ /\),\s+Version\s+(.+?),/ );
 | 
			
		||||
    return $descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $nexus = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_class = $nexus->e_class();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$e_class ) {
 | 
			
		||||
        my $class = $e_class->{$iid} || '';
 | 
			
		||||
        if ($class =~ /chassis/) {
 | 
			
		||||
	    my $serial = $nexus->e_serial($iid);
 | 
			
		||||
	    return $serial->{$iid};
 | 
			
		||||
	}
 | 
			
		||||
    }    
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# sysObjectID returns an IID to an entry in the CISCO-ENTITY-VENDORTYPE-OID-MIB.
 | 
			
		||||
# Look it up and return it.
 | 
			
		||||
sub model {
 | 
			
		||||
    my $nexus = shift;
 | 
			
		||||
    my $id    = $nexus->id();
 | 
			
		||||
 | 
			
		||||
    unless ( defined $id ) {
 | 
			
		||||
        print
 | 
			
		||||
            " SNMP::Info::Layer3::Nexus::model() - Device does not support sysObjectID\n"
 | 
			
		||||
            if $nexus->debug();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^cevChassis//i;
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Nexus - SNMP Interface to Cisco Nexus Switches running
 | 
			
		||||
NX-OS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $nexus = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $nexus->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Cisco Nexus Switches running NX-OS.  
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $nexus = new SNMP::Info::Layer3::Nexus(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
 | 
			
		||||
requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return a scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $nexus->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $nexus->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'nx-os'>
 | 
			
		||||
 | 
			
		||||
=item $nexus->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns operating system version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $nexus->serial()
 | 
			
		||||
 | 
			
		||||
Returns the serial number of the chassis from F<ENTITY-MIB>.
 | 
			
		||||
 | 
			
		||||
=item $nexus->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $nexus->id() to F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
 | 
			
		||||
 | 
			
		||||
Removes C<'cevChassis'> for readability.
 | 
			
		||||
 | 
			
		||||
=item $nexus->mac()
 | 
			
		||||
 | 
			
		||||
C<dot1dBaseBridgeAddress>
 | 
			
		||||
 | 
			
		||||
=item $nexus->cisco_comm_indexing()
 | 
			
		||||
 | 
			
		||||
Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
 | 
			
		||||
details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										220
									
								
								Info/Layer3/PacketFront.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								Info/Layer3/PacketFront.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,220 @@
 | 
			
		||||
# SNMP::Info::Layer3::PacketFront
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer3::PacketFront;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::PacketFront::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::PacketFront::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'UCD-SNMP-MIB'             => 'versionTag',
 | 
			
		||||
    'NET-SNMP-TC'              => 'netSnmpAgentOIDs',
 | 
			
		||||
    'HOST-RESOURCES-MIB'       => 'hrSystem',
 | 
			
		||||
    'PACKETFRONT-PRODUCTS-MIB' => 'drg100',
 | 
			
		||||
    'PACKETFRONT-DRG-MIB'      => 'productName',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    'snmpd_vers'     => 'versionTag',
 | 
			
		||||
    'hrSystemUptime' => 'hrSystemUptime',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'packetfront';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    # Only DRGOS for now (not tested with other product lines than DRG series)
 | 
			
		||||
    my $pfront = shift;
 | 
			
		||||
    my $descr   = $pfront->description();
 | 
			
		||||
    if ( $descr =~ /drgos/i ) {
 | 
			
		||||
        return 'drgos';
 | 
			
		||||
    } else {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $pfront = shift;
 | 
			
		||||
    my $descr   = $pfront->description();
 | 
			
		||||
    my $os_ver  = undef;
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ /Version:\sdrgos-(\w+)-([\w\-\.]+)/ ) {
 | 
			
		||||
        $os_ver = $2;
 | 
			
		||||
    }
 | 
			
		||||
    return $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $pfront = shift;
 | 
			
		||||
    return $pfront->productSerialNo();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l3->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
 | 
			
		||||
        # lo0 etc
 | 
			
		||||
        if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::PacketFront - SNMP Interface to PacketFront devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHORS
 | 
			
		||||
 | 
			
		||||
Jeroen van Ingen
 | 
			
		||||
initial version based on SNMP::Info::Layer3::NetSNMP by Bradley Baetz and Bill Fenner
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $pfront = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $pfront->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for PacketFront devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<UCD-SNMP-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<NET-SNMP-TC>
 | 
			
		||||
 | 
			
		||||
=item F<HOST-RESOURCES-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<PACKETFRONT-PRODUCTS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<PACKETFRONT-DRG-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $pfront->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'packetfront'>.
 | 
			
		||||
 | 
			
		||||
=item $pfront->os()
 | 
			
		||||
 | 
			
		||||
Returns the OS extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $pfront->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $pfront->serial()
 | 
			
		||||
 | 
			
		||||
Returns the value of C<productSerialNo>. 
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $pfront->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Increments value of IID if port is to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores loopback
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										1311
									
								
								Info/Layer3/Passport.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1311
									
								
								Info/Layer3/Passport.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										230
									
								
								Info/Layer3/Pf.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								Info/Layer3/Pf.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,230 @@
 | 
			
		||||
# SNMP::Info::Layer3::Pf
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2010 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 Pf Networks, Inc. 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::Pf;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Pf::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Pf::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    # Enterprise container where BEGEMOT-* lives
 | 
			
		||||
    'FOKUS-MIB' => 'fokus',
 | 
			
		||||
    # MIBs used included in Layer3 and above:
 | 
			
		||||
    # UDP-MIB
 | 
			
		||||
    # TCP-MIB
 | 
			
		||||
    # IF-MIB
 | 
			
		||||
    #
 | 
			
		||||
    # Stuff in these MIBs but not used for Netdisco yet for my test device:
 | 
			
		||||
    #
 | 
			
		||||
    #'BEGEMOT-SNMPD-MIB',
 | 
			
		||||
    #'BEGEMOT-PF-MIB',
 | 
			
		||||
    #'BEGEMOT-NETGRAPH-MIB',
 | 
			
		||||
    #'BEGEMOT-MIB2-MIB',
 | 
			
		||||
    #'BEGEMOT-HOSTRES-MIB',
 | 
			
		||||
    # HOST-RESOURCES-MIB
 | 
			
		||||
    # IP-FORWARD-MIB
 | 
			
		||||
    #
 | 
			
		||||
    # Nothing in these MIBs for my test device:
 | 
			
		||||
    #
 | 
			
		||||
    #'BEGEMOT-IP-MIB',
 | 
			
		||||
    #'BEGEMOT-MIB',
 | 
			
		||||
    #'BEGEMOT-BRIDGE-MIB',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'FreeBSD';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $pf = shift;
 | 
			
		||||
    my $descr   = $pf->description() || '';
 | 
			
		||||
    my $model  = undef;
 | 
			
		||||
    $model = $1 if ( $descr =~ /FreeBSD\s+(\S+)/ );
 | 
			
		||||
    return $model if defined $model;
 | 
			
		||||
    return $pf->os_ver();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'Pf';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $pf = shift;
 | 
			
		||||
    my $id = $pf->id();
 | 
			
		||||
 | 
			
		||||
    my $os_ver = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $os_ver;
 | 
			
		||||
 | 
			
		||||
    # From /usr/share/snmp/defs/tree.def on a Pf Machine
 | 
			
		||||
    # (2 begemotSnmpdDefs
 | 
			
		||||
    #   (1 begemotSnmpdAgent
 | 
			
		||||
    #     (1 begemotSnmpdAgentFreeBSD OID op_dummy)
 | 
			
		||||
    # We're leaving the 1.1 and trimming off up to the 2
 | 
			
		||||
    $os_ver =~ s/fokus.1.1.2.//;
 | 
			
		||||
    return $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Pf - SNMP Interface to FreeBSD-Based Firewalls using Pf /Pf Sense
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $pf = 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      = $pf->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Free-BSD PF-Based devices
 | 
			
		||||
 | 
			
		||||
=head1 LLDP Support
 | 
			
		||||
 | 
			
		||||
LLDP Support is included but untested in this Device Class.  It is reported
 | 
			
		||||
that the available CDP/LLDP modules for net-snmp don't work on FreeBSD (on
 | 
			
		||||
which pfSense is based) as they assume certain Linux specific Ethernet
 | 
			
		||||
structures.  This problem is apparently solved on PF based firewall appliances
 | 
			
		||||
by using the ladvd package, for which a port may be found here:
 | 
			
		||||
L<http://www.freshports.org/net/ladvd/>.  I'm not sure if this module ties into 
 | 
			
		||||
Net-SNMP or not.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<FOKUS-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $pf->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'FreeBSD'
 | 
			
		||||
 | 
			
		||||
=item $pf->model()
 | 
			
		||||
 | 
			
		||||
Grabs the os version from C<sysDescr>
 | 
			
		||||
 | 
			
		||||
=item $pf->os()
 | 
			
		||||
 | 
			
		||||
Returns 'Pf'
 | 
			
		||||
 | 
			
		||||
=item $pf->os_ver()
 | 
			
		||||
 | 
			
		||||
Tries to reference $pf->id() to one of the product MIBs listed above.
 | 
			
		||||
Will probably return a truncation of the default OID for pf-based systems 
 | 
			
		||||
C<enterprises.12325.1.1.2.1.1>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										189
									
								
								Info/Layer3/SonicWALL.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								Info/Layer3/SonicWALL.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,189 @@
 | 
			
		||||
package SNMP::Info::Layer3::SonicWALL;
 | 
			
		||||
 | 
			
		||||
# 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 Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::SonicWALL::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::SonicWALL::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'SNWL-COMMON-MIB' => 'snwlCommonModule',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    #From SNWL-COMMON-MIB
 | 
			
		||||
    'sw_model' => 'snwlSysModel',
 | 
			
		||||
    'sw_serial' => 'snwlSysSerialNumber',
 | 
			
		||||
    'sw_firmware' => 'snwlSysFirmwareVersion',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Layer3::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'SonicWALL';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
        my $sonicos = shift;
 | 
			
		||||
        my $swos = $sonicos->sw_firmware();
 | 
			
		||||
        if ($swos =~ /Enhanced/) {
 | 
			
		||||
            return 'SonicOS Enhanced';
 | 
			
		||||
        }
 | 
			
		||||
        return 'SonicOS Standard';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $sonicosver = shift;
 | 
			
		||||
        my $osver = $sonicosver->sw_firmware();
 | 
			
		||||
        if ( $osver =~ /\S+\s\S+\s(\S+)/) {
 | 
			
		||||
            return $1
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
        my $sw = shift;
 | 
			
		||||
        my $serial = $sw->sw_serial();
 | 
			
		||||
        return $serial;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
        my $swmodel = shift;
 | 
			
		||||
        my $model = $swmodel->sw_model();
 | 
			
		||||
        return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::SonicWALL - SNMP Interface to L3 SonicWALL Firewall
 | 
			
		||||
 | 
			
		||||
=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     => 1
 | 
			
		||||
                        )
 | 
			
		||||
    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 Generic SonicWALL Firewalls
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $router->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'SonicWALL'>
 | 
			
		||||
 | 
			
		||||
=item $router->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'SonicOS'>
 | 
			
		||||
 | 
			
		||||
=item $router->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns '4.2.0.0-10e'
 | 
			
		||||
 | 
			
		||||
=item $router->model()
 | 
			
		||||
 | 
			
		||||
Returns C<'PRO 3060 Enhanced'>
 | 
			
		||||
 | 
			
		||||
=item $router->serial()
 | 
			
		||||
 | 
			
		||||
Returns the MAC address of the first X0/LAN interface.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										204
									
								
								Info/Layer3/Sun.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								Info/Layer3/Sun.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,204 @@
 | 
			
		||||
# SNMP::Info::Layer3::Sun
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer3::Sun;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Sun::ISA       = qw/SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Sun::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    'sun_hostid' => '.1.3.6.1.4.1.42.3.1.2.0',
 | 
			
		||||
    'motd'       => '.1.3.6.1.4.1.42.3.1.3.0',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'sun';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'sun';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $sun   = shift;
 | 
			
		||||
    my $descr = $sun->motd();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/SunOS (\S+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    return 'Solaris Router';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $sun = shift;
 | 
			
		||||
    my $serial = unpack( "H*", $sun->sun_hostid() );
 | 
			
		||||
    return $serial;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l3->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
 | 
			
		||||
        # lo0
 | 
			
		||||
        if ( $interfaces->{$if} =~ /\blo0\b/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Sun - SNMP Interface to L3 Sun Solaris
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
begemot
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $sun = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'mysunrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $sun->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Generic Sun Routers running SunOS
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $sun->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'sun'
 | 
			
		||||
 | 
			
		||||
=item $sun->os()
 | 
			
		||||
 | 
			
		||||
Returns 'sun'
 | 
			
		||||
 | 
			
		||||
=item $sun->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted from message of the day.
 | 
			
		||||
 | 
			
		||||
=item $sun->model()
 | 
			
		||||
 | 
			
		||||
Returns 'Solaris Router'
 | 
			
		||||
 | 
			
		||||
=item $sun->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.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $sun->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Increments value of IID if port is to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores loopback
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										298
									
								
								Info/Layer3/Tasman.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										298
									
								
								Info/Layer3/Tasman.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,298 @@
 | 
			
		||||
# SNMP::Info::Layer3::Tasman
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All Rights Reserved
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Tasman;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Tasman::ISA = qw/SNMP::Info::MAU
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Tasman::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    'NT-ENTERPRISE-DATA-MIB' => 'ntEnterpriseRouters',
 | 
			
		||||
    'SYSTEM-MIB'             => 'nnsysVersion',
 | 
			
		||||
    'CHASSIS-MIB'            => 'nnchassisModel',
 | 
			
		||||
    'ENVIRONMENT-MIB'        => 'nnenvPwrsupStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    'ps1_type'      => 'nnenvPwrsupType.1',
 | 
			
		||||
    'ps1_status'    => 'nnenvPwrsupStatus.1',
 | 
			
		||||
    'ps2_type'      => 'nnenvPwrsupType.2',
 | 
			
		||||
    'ps2_status'    => 'nnenvPwrsupStatus.2',
 | 
			
		||||
    'nn_sys_ver'    => 'nnsysVersion',
 | 
			
		||||
    'nn_ch_model'   => 'nnchassisModel',
 | 
			
		||||
    'nn_ch_op_stat' => 'nnchassisOperStatus',
 | 
			
		||||
    'nn_ch_serial'  => 'nnchassisSerialNumber',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# use MAU-MIB for admin. duplex and admin. speed
 | 
			
		||||
*SNMP::Info::Layer3::Tasman::i_duplex_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_duplex_admin;
 | 
			
		||||
*SNMP::Info::Layer3::Tasman::i_speed_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_speed_admin;
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'tasman';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $tasman  = shift;
 | 
			
		||||
    my $version = $tasman->nn_sys_ver() || "";
 | 
			
		||||
    my $descr   = $tasman->description()  || "";
 | 
			
		||||
 | 
			
		||||
    # Newer versions
 | 
			
		||||
    return $1 if ( $version =~ /^SW:\s+(.+?)\s+/ );
 | 
			
		||||
    # Older versions
 | 
			
		||||
    return $1 if ( $descr =~ /Software Version\s+=\s+[r]*(.+),/);
 | 
			
		||||
    # Can't find
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $tasman = shift;
 | 
			
		||||
 | 
			
		||||
    my $id        = $tasman->id();
 | 
			
		||||
    my $ch_model = $tasman->nn_ch_model();
 | 
			
		||||
    
 | 
			
		||||
    return $ch_model if $ch_model;
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^ntSecureRouter/SR/;
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $tasman = shift;
 | 
			
		||||
 | 
			
		||||
    # Newer versions of the software redefined the MIB in a non-backwards
 | 
			
		||||
    # compatible manner.  Try the old OID first.
 | 
			
		||||
    my $serial = $tasman->nn_ch_op_stat();
 | 
			
		||||
    # Newer versions populate status, serial should contain some numbers
 | 
			
		||||
    return $serial if ($serial !~ /^\D+$/);
 | 
			
		||||
 | 
			
		||||
    # Unfortunately newer versions don't seem to populate the newer OID.
 | 
			
		||||
    return $tasman->nn_ch_serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Tasman - SNMP Interface to Avaya Secure Routers
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $tasman = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $tasman->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Avaya Secure Routers
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<NT-ENTERPRISE-DATA-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<SYSTEM-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CHASSIS-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<ENVIRONMENT-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $tasman->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'avaya'>
 | 
			
		||||
 | 
			
		||||
=item $tasman->model()
 | 
			
		||||
 | 
			
		||||
Tries to get the model from C<nnchassisModel> and if not available 
 | 
			
		||||
cross references $tasman->id() to F<NT-ENTERPRISE-DATA-MIB>.
 | 
			
		||||
 | 
			
		||||
Substitutes 'SR' for C<'ntSecureRouter'> in the name for readability.
 | 
			
		||||
 | 
			
		||||
=item $tasman->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'tasman'>
 | 
			
		||||
 | 
			
		||||
=item $tasman->os_ver()
 | 
			
		||||
 | 
			
		||||
Grabs the os version from C<nnsysVersion>
 | 
			
		||||
 | 
			
		||||
=item $tasman->ps1_type()
 | 
			
		||||
 | 
			
		||||
(C<nnenvPwrsupType.1>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->ps1_status()
 | 
			
		||||
 | 
			
		||||
(C<nnenvPwrsupStatus.1>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->ps2_type()
 | 
			
		||||
 | 
			
		||||
(C<nnenvPwrsupType.2>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->ps2_status()
 | 
			
		||||
 
 | 
			
		||||
(C<nnenvPwrsupStatus.2>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->nn_sys_ver()
 | 
			
		||||
 | 
			
		||||
(C<nnsysVersion.0>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->nn_ch_model()
 | 
			
		||||
 | 
			
		||||
(C<nnchassisModel.0>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->nn_ch_op_stat()
 | 
			
		||||
 | 
			
		||||
(C<nnchassisOperStatus.0>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->nn_ch_serial()
 | 
			
		||||
 | 
			
		||||
(C<nnchassisSerialNumber.0>)
 | 
			
		||||
 | 
			
		||||
=item $tasman->serial()
 | 
			
		||||
 | 
			
		||||
Tries both (C<nnchassisOperStatus>) and (C<nnchassisSerialNumber>) as oid
 | 
			
		||||
was redefined between versions.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over 4
 | 
			
		||||
 | 
			
		||||
=item $stack->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to administrative duplex setting.
 | 
			
		||||
 | 
			
		||||
First checks for fixed gigabit ports which are always full duplex. Next checks
 | 
			
		||||
the port administrative speed (C<portAdminSpeed>) which if set to
 | 
			
		||||
autonegotiate then the duplex will also autonegotiate, otherwise it uses the
 | 
			
		||||
reported port duplex (C<portDuplex>).
 | 
			
		||||
 | 
			
		||||
=item $stack->i_speed_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to administrative speed setting.
 | 
			
		||||
 | 
			
		||||
C<portAdminSpeed>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										194
									
								
								Info/Layer3/Timetra.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								Info/Layer3/Timetra.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,194 @@
 | 
			
		||||
# SNMP::Info::Layer3::Timetra
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
#
 | 
			
		||||
# 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::Timetra;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Timetra::ISA = qw/SNMP::Info::Layer3
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Timetra::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, 'TIMETRA-GLOBAL-MIB' => 'timetraReg', );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $timetra = shift;
 | 
			
		||||
    my $id      = $timetra->id();
 | 
			
		||||
    my $model   = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^tmnxModel//;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'TiMOS';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'alcatel-lucent';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $timetra = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $timetra->description();
 | 
			
		||||
    if ( $descr =~ m/^TiMOS-(\S+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # No clue what this will try but hey
 | 
			
		||||
    return $timetra->SUPER::os_ver();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# The interface description contains the SFP type, so
 | 
			
		||||
# to avoid losing historical information through a configuration change
 | 
			
		||||
# we use interface name instead.
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->orig_i_name($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Timetra - SNMP Interface to Alcatel-Lucent SR
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Bill Fenner
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $alu = 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      = $alu->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Alcatel-Lucent Service Routers
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<TIMETRA-GLOBAL-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $alu->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'alcatel-lucent'
 | 
			
		||||
 | 
			
		||||
=item $alu->os()
 | 
			
		||||
 | 
			
		||||
Returns 'TiMOS'
 | 
			
		||||
 | 
			
		||||
=item $alu->os_ver()
 | 
			
		||||
 | 
			
		||||
Grabs the version string from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $alu->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $alu->id() to one of the product MIBs listed above
 | 
			
		||||
 | 
			
		||||
Removes 'tmnxModel' from the name for readability.
 | 
			
		||||
 | 
			
		||||
=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 $alu->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns C<ifName>, since the default Layer3 C<ifDescr> varies based
 | 
			
		||||
upon the transceiver inserted.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										244
									
								
								Info/Layer7.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								Info/Layer7.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,244 @@
 | 
			
		||||
# SNMP::Info::Layer7 - SNMP Interface to Layer7 Devices
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer7;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer7::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Layer7::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# $l7->model() - Looks at sysObjectID which gives the oid of the system
 | 
			
		||||
#       name, contained in a proprietary  MIB.
 | 
			
		||||
sub model {
 | 
			
		||||
    my $l7    = shift;
 | 
			
		||||
    my $id    = $l7->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    # Neoteris (Juniper IVE)    
 | 
			
		||||
    $model =~ s/^ive//i;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $l7    = shift;
 | 
			
		||||
    my $id    = $l7->id();
 | 
			
		||||
    my $vendor = 'unknown';
 | 
			
		||||
    if ( defined($id) && $id =~ /^(\.1\.3\.6\.1\.4\.1\.\d+)/ ) {
 | 
			
		||||
        my $enterprise = &SNMP::translateObj($1);
 | 
			
		||||
        $vendor = $enterprise if defined $enterprise;
 | 
			
		||||
    }
 | 
			
		||||
    return $vendor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# By Default we'll use the description field
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $l7      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l7->i_index($partial)       || {};
 | 
			
		||||
    my $i_descr    = $l7->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    # Replace the Index with the ifDescr field.
 | 
			
		||||
    foreach my $iid ( keys %$i_descr ) {
 | 
			
		||||
        my $port = $i_descr->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        $interfaces->{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return $interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l7      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_type = $l7->i_type($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore = ();
 | 
			
		||||
 | 
			
		||||
    foreach my $if ( keys %$i_type ) {
 | 
			
		||||
        my $type = $i_type->{$if};
 | 
			
		||||
        $i_ignore{$if}++
 | 
			
		||||
            if $type =~ /(loopback|other|cpu)/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer7 - SNMP Interface to network devices serving Layer7 only.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Jeroen van Ingen
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $l7 = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $l7->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
 # Let's get some basic Port information
 | 
			
		||||
 my $interfaces = $l7->interfaces();
 | 
			
		||||
 my $i_up       = $l7->i_up();
 | 
			
		||||
 my $i_speed    = $l7->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::Layer7::*   Please read all docs under SNMP::Info
 | 
			
		||||
first.
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Layer7 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 $l7 = new SNMP::Info::Layer7(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes 
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs 
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item None
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
MIBs required for L<SNMP::Info/"Required MIBs">
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $l7->model()
 | 
			
		||||
 | 
			
		||||
Cross references $l7->id() with product IDs.
 | 
			
		||||
 | 
			
		||||
=item $l7->vendor()
 | 
			
		||||
 | 
			
		||||
Tries to discover the vendor by looking up the enterprise number in
 | 
			
		||||
C<sysObjectID>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"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 $l7->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to the map between IID and physical Port.
 | 
			
		||||
 | 
			
		||||
=item $l7->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Increments value of IID if port is to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores loopback, other, and cpu
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										237
									
								
								Info/Layer7/APC.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										237
									
								
								Info/Layer7/APC.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,237 @@
 | 
			
		||||
# SNMP::Info::Layer7::APC - SNMP Interface to APC UPS devices
 | 
			
		||||
#
 | 
			
		||||
# 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::Layer7::APC;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer7;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer7::APC::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer7 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer7::APC::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer7::MIBS,
 | 
			
		||||
    'PowerNet-MIB' => 'upsBasicIdentModel',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer7::GLOBALS,
 | 
			
		||||
    'ups_serial'   => 'upsAdvIdentSerialNumber.0',
 | 
			
		||||
    'mgmt_serial'  => 'experimental.2.4.1.2.1',
 | 
			
		||||
    'os_ver'       => 'experimental.2.4.1.4.1',
 | 
			
		||||
    'os_bin'       => 'experimental.2.4.1.4.2',
 | 
			
		||||
    'ups_model'    => 'upsBasicIdentModel.0',
 | 
			
		||||
    'ps1_status'   => 'upsBasicOutputStatus.0',
 | 
			
		||||
    'ps2_status'   => 'upsBasicBatteryStatus.0',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer7::FUNCS,
 | 
			
		||||
    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::Layer7::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Method Overrides
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'aos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'apc';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $apc = shift;
 | 
			
		||||
    return $apc->ups_model();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $apc = shift;
 | 
			
		||||
    my $ups = $apc->ups_serial() || 'unknown';
 | 
			
		||||
    my $mgmt = $apc->mgmt_serial() || 'unknown';
 | 
			
		||||
    return sprintf("UPS: %s, management card: %s", $ups, $mgmt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_type {
 | 
			
		||||
    return 'UPS status';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_type {
 | 
			
		||||
    return 'Battery status';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer7::APC - SNMP Interface to APC UPS devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Jeroen van Ingen
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $apc = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $apc->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
APC UPS via SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $apc = new SNMP::Info::Layer7::APC(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<POWERNET-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 $apc->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'aos'>
 | 
			
		||||
 | 
			
		||||
=item $apc->os_bin()
 | 
			
		||||
 | 
			
		||||
C<POWERNET-MIB::experimental.2.4.1.4.2>
 | 
			
		||||
 | 
			
		||||
=item $apc->os_ver()
 | 
			
		||||
 | 
			
		||||
C<POWERNET-MIB::experimental.2.4.1.4.1>
 | 
			
		||||
 | 
			
		||||
=item $apc->serial()
 | 
			
		||||
 | 
			
		||||
Combines the UPS serial C<upsAdvIdentSerialNumber.0> with the management
 | 
			
		||||
card serial C<POWERNET-MIB::experimental.2.4.1.2.1> into a pretty string.
 | 
			
		||||
 | 
			
		||||
=item $apc->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'apc'>
 | 
			
		||||
 | 
			
		||||
=item $apc->model()
 | 
			
		||||
 | 
			
		||||
C<upsBasicIdentModel.0>
 | 
			
		||||
 | 
			
		||||
=item $apc->ps1_type()
 | 
			
		||||
 | 
			
		||||
Returns 'UPS status'
 | 
			
		||||
 | 
			
		||||
=item $apc->ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns the main UPS status from C<upsBasicOutputStatus.0>
 | 
			
		||||
 | 
			
		||||
=item $apc->ps2_type()
 | 
			
		||||
 | 
			
		||||
Returns 'Battery status'
 | 
			
		||||
 | 
			
		||||
=item $apc->ps2_status()
 | 
			
		||||
 | 
			
		||||
Returns the battery status from C<upsBasicBatteryStatus.0>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer7/"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
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer7/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 MUNGES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 SET METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that provide SNMP set functionality for overridden methods
 | 
			
		||||
or provide a simpler interface to complex set operations.  See
 | 
			
		||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
 | 
			
		||||
operations. 
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										164
									
								
								Info/Layer7/Neoteris.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								Info/Layer7/Neoteris.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,164 @@
 | 
			
		||||
# SNMP::Info::Layer7::Neoteris
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer7::Neoteris;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer7;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer7::Neoteris::ISA       = qw/SNMP::Info::Layer7 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer7::Neoteris::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer7::MIBS,
 | 
			
		||||
    'UCD-SNMP-MIB'       => 'versionTag',
 | 
			
		||||
    'JUNIPER-IVE-MIB'    => 'productVersion',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer7::GLOBALS,
 | 
			
		||||
    'os_ver' => 'productVersion',
 | 
			
		||||
    'cpu'    => 'iveCpuUtil',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer7::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer7::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'juniper';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'ive';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    return '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer7::Neoteris - SNMP Interface to Juniper SSL VPN appliances
 | 
			
		||||
 | 
			
		||||
=head1 AUTHORS
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $neoteris = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $neoteris->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Juniper SSL VPN appliances
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<UCD-SNMP-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<JUNIPER-IVE-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer7> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $neoteris->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'juniper'.
 | 
			
		||||
 | 
			
		||||
=item $neoteris->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'ive'>.
 | 
			
		||||
 | 
			
		||||
=item $neoteris->os_ver()
 | 
			
		||||
 | 
			
		||||
C<productVersion>
 | 
			
		||||
 | 
			
		||||
=item $neoteris->cpu()
 | 
			
		||||
 | 
			
		||||
C<iveCpuUtil>
 | 
			
		||||
 | 
			
		||||
=item $neoteris->serial()
 | 
			
		||||
 | 
			
		||||
Returns ''.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer7> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer7> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										215
									
								
								Info/Layer7/Netscaler.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								Info/Layer7/Netscaler.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,215 @@
 | 
			
		||||
# SNMP::Info::Layer7::Netscaler
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer7::Netscaler;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer7;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer7::Netscaler::ISA       = qw/SNMP::Info::Layer7 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer7::Netscaler::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer7::MIBS,
 | 
			
		||||
    'NS-ROOT-MIB' => 'sysBuildVersion',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer7::GLOBALS,
 | 
			
		||||
    'build_ver'   => 'sysBuildVersion',
 | 
			
		||||
    'sys_hw_desc' => 'sysHardwareVersionDesc',
 | 
			
		||||
    'cpu'         => 'resCpuUsage',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer7::FUNCS,
 | 
			
		||||
    # IP Address Table - NS-ROOT-MIB::nsIpAddrTable
 | 
			
		||||
    'ip_index'    => 'ipAddr',
 | 
			
		||||
    'ip_netmask'  => 'ipNetmask',
 | 
			
		||||
    # TODO VLAN - NS-ROOT-MIB::vlanTable
 | 
			
		||||
    'ns_vid'      =>'vlanId',
 | 
			
		||||
    'ns_vlan_mem' => 'vlanMemberInterfaces',
 | 
			
		||||
    'ns_vtag_int' => 'vlanTaggedInterfaces',
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer7::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'citrix';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'netscaler';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    return '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $ns    = shift;
 | 
			
		||||
    my $desc  = $ns->sys_hw_desc() || '';
 | 
			
		||||
   
 | 
			
		||||
    $desc =~ s/^.+\bNS//i;
 | 
			
		||||
 | 
			
		||||
    return $desc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $ns    = shift;
 | 
			
		||||
    my $ver  = $ns->build_ver() || '';
 | 
			
		||||
    
 | 
			
		||||
    if ($ver =~ /^.+\bNS(\d+\.\d+)/) {
 | 
			
		||||
        $ver = $1;
 | 
			
		||||
    }
 | 
			
		||||
    return $ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer7::Netscaler - SNMP Interface to Citrix Netscaler appliances
 | 
			
		||||
 | 
			
		||||
=head1 AUTHORS
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $ns = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $ns->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Citrix Netscaler appliances
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<NS-ROOT-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer7> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ns->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'citrix'.
 | 
			
		||||
 | 
			
		||||
=item $ns->os()
 | 
			
		||||
 | 
			
		||||
Returns 'netscaler'.
 | 
			
		||||
 | 
			
		||||
=item $ns->os_ver()
 | 
			
		||||
 | 
			
		||||
Release extracted from C<sysBuildVersion>.
 | 
			
		||||
 | 
			
		||||
=item $ns->model()
 | 
			
		||||
 | 
			
		||||
Model extracted from C<sysHardwareVersionDesc>.
 | 
			
		||||
 | 
			
		||||
=item $ns->cpu()
 | 
			
		||||
 | 
			
		||||
C<resCpuUsage>
 | 
			
		||||
 | 
			
		||||
=item $ns->build_ver()
 | 
			
		||||
 | 
			
		||||
C<sysBuildVersion>
 | 
			
		||||
 | 
			
		||||
=item $ns->sys_hw_desc()
 | 
			
		||||
 | 
			
		||||
C<sysHardwareVersionDesc>
 | 
			
		||||
 | 
			
		||||
=item $ns->serial()
 | 
			
		||||
 | 
			
		||||
Returns ''.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer7> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ns->ip_index()
 | 
			
		||||
 | 
			
		||||
C<ipAddr>
 | 
			
		||||
 | 
			
		||||
=item $ns->ip_netmask()
 | 
			
		||||
 | 
			
		||||
C<ipNetmask>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer7
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer7> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										372
									
								
								Info/MAU.pm
									
									
									
									
									
								
							
							
						
						
									
										372
									
								
								Info/MAU.pm
									
									
									
									
									
								
							@@ -1,119 +1,286 @@
 | 
			
		||||
# SNMP::Info::MAU - Media Access Unit - RFC2668
 | 
			
		||||
# Max Baker <max@warped.org>
 | 
			
		||||
# SNMP::Info::MAU - Media Access Unit - RFC 2668
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#
 | 
			
		||||
# 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 
 | 
			
		||||
#     * 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.
 | 
			
		||||
#
 | 
			
		||||
# 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.4;
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
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::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::MAU::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$DEBUG=0;
 | 
			
		||||
$SNMP::debugging=$DEBUG;
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$INIT = 0;
 | 
			
		||||
$VERSION = '3.04_001';
 | 
			
		||||
 | 
			
		||||
%MIBS = ('MAU-MIB' => 'mauMod');
 | 
			
		||||
%MIBS = ( 'MAU-MIB' => 'mauMod' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
           );
 | 
			
		||||
%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',
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
    # 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,
 | 
			
		||||
         );
 | 
			
		||||
 | 
			
		||||
    # 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));
 | 
			
		||||
    return unless defined $int;
 | 
			
		||||
    return unpack( "B32", pack( "N", $int ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _isfullduplex{
 | 
			
		||||
    my $mau = shift;
 | 
			
		||||
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')
 | 
			
		||||
    foreach my $type (@full_types) {
 | 
			
		||||
        return 1 if ( substr( $mautype, 32 - $type, 1 ) eq '1' );
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _ishalfduplex{
 | 
			
		||||
    my $mau = shift;
 | 
			
		||||
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')
 | 
			
		||||
    foreach my $type (@half_types) {
 | 
			
		||||
        return 1 if ( substr( $mautype, 32 - $type, 1 ) eq '1' );
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my %_mau_i_speed_map = (
 | 
			
		||||
    '10'    => '10 Mbps',
 | 
			
		||||
    '100'   => '100 Mbps',
 | 
			
		||||
    '1000'  => '1.0 Gbps',
 | 
			
		||||
    '10Gig' => '10 Gbps',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub mau_i_speed_admin {
 | 
			
		||||
    my $mau = shift;
 | 
			
		||||
 | 
			
		||||
    my $mau_index      = $mau->mau_index();
 | 
			
		||||
    my $mau_type_admin = $mau->mau_type_admin();
 | 
			
		||||
 | 
			
		||||
    my %i_speed_admin;
 | 
			
		||||
    foreach my $mau_port ( keys %$mau_type_admin ) {
 | 
			
		||||
        my $iid = $mau_index->{$mau_port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
 | 
			
		||||
        my $type_adminoid = $mau_type_admin->{$mau_port};
 | 
			
		||||
        my $type_admin    = &SNMP::translateObj($type_adminoid);
 | 
			
		||||
        next unless defined $type_admin;
 | 
			
		||||
 | 
			
		||||
        if ( $type_adminoid eq '.0.0' ) {
 | 
			
		||||
            $i_speed_admin{$iid} = 'auto';
 | 
			
		||||
        }
 | 
			
		||||
        elsif ($type_admin =~ /^dot3MauType(.*)Base/
 | 
			
		||||
            && $_mau_i_speed_map{$1} )
 | 
			
		||||
        {
 | 
			
		||||
            $i_speed_admin{$iid} = $_mau_i_speed_map{$1};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_speed_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mau_i_duplex {
 | 
			
		||||
    my $mau = shift;
 | 
			
		||||
 | 
			
		||||
    my $mau_index = $mau->mau_index();
 | 
			
		||||
    my $mau_link  = $mau->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 mau_i_duplex_admin {
 | 
			
		||||
    my $mau     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $mau_index = $mau->mau_index() || {};
 | 
			
		||||
 | 
			
		||||
    if ($partial) {
 | 
			
		||||
        my %rev_mau_index = reverse %$mau_index;
 | 
			
		||||
        $partial = $rev_mau_index{$partial};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $mau_autostat   = $mau->mau_autostat($partial)   || {};
 | 
			
		||||
    my $mau_type_admin = $mau->mau_type_admin($partial) || {};
 | 
			
		||||
 | 
			
		||||
    # Older HP4000's don't implement ifMauDefaultType, but we can
 | 
			
		||||
    # figure out from ifMauAutoNegCapAdvertised what we'd like.
 | 
			
		||||
    if ( !defined($mau_type_admin) ) {
 | 
			
		||||
        if ( defined($mau_index) ) {
 | 
			
		||||
            return mau_i_duplex_admin_old( $mau, $mau_index, $mau_autostat );
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $mau_port ( keys %$mau_type_admin ) {
 | 
			
		||||
        my $iid = $mau_index->{$mau_port};
 | 
			
		||||
        next unless defined $iid;
 | 
			
		||||
 | 
			
		||||
        my $autostat = $mau_autostat->{$mau_port};
 | 
			
		||||
        if ( defined $autostat and $autostat =~ /enabled/i ) {
 | 
			
		||||
            $i_duplex_admin{$iid} = 'auto';
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $type_adminoid = $mau_type_admin->{$mau_port};
 | 
			
		||||
        my $type_admin    = &SNMP::translateObj($type_adminoid);
 | 
			
		||||
        next unless defined $type_admin;
 | 
			
		||||
 | 
			
		||||
        my $duplex = undef;
 | 
			
		||||
 | 
			
		||||
        if ( $type_admin =~ /fd$/i ) {
 | 
			
		||||
            $duplex = 'full';
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $type_admin =~ /hd$/i ) {
 | 
			
		||||
            $duplex = 'half';
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $type_admin eq 'zeroDotZero' ) {
 | 
			
		||||
            $duplex = 'auto';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $i_duplex_admin{$iid} = $duplex if defined $duplex;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mau_i_duplex_admin_old {
 | 
			
		||||
    my $mau          = shift;
 | 
			
		||||
    my $mau_index    = shift;
 | 
			
		||||
    my $mau_autostat = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces   = $mau->interfaces();
 | 
			
		||||
    my $mau_autosent = $mau->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 = $mau->_isfullduplex($type);
 | 
			
		||||
        my $half = $mau->_ishalfduplex($type);
 | 
			
		||||
 | 
			
		||||
        if ( $full and !$half ) {
 | 
			
		||||
            $i_duplex_admin{$iid} = 'full';
 | 
			
		||||
        }
 | 
			
		||||
        elsif ($half) {
 | 
			
		||||
            $i_duplex_admin{$iid} = 'half';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::MAU - Perl5 Interface to Medium Access Unit (MAU) MIB (RFC2668) via SNMP
 | 
			
		||||
SNMP::Info::MAU - SNMP Interface to Medium Access Unit (MAU) MIB (RFC 2668)
 | 
			
		||||
via SNMP
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker (C<max@warped.org>)
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@@ -130,14 +297,15 @@ Max Baker (C<max@warped.org>)
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::MAU is a sublcass of SNMP::Info that supplies access to the
 | 
			
		||||
MAU-MIB (RFC2668). This MIB is sometimes implemented on Layer 2 network devices like HP Switches.
 | 
			
		||||
MAU = Media Access Unit.
 | 
			
		||||
SNMP::Info::MAU is a subclass of SNMP::Info that supplies access to the
 | 
			
		||||
F<MAU-MIB> (RFC 2668). This MIB is sometimes implemented on Layer 2 network
 | 
			
		||||
devices like HP Switches.  MAU = Media Access Unit.
 | 
			
		||||
 | 
			
		||||
The MAU table contains link and duplex info for the port itself and the device
 | 
			
		||||
connected to that port.
 | 
			
		||||
 | 
			
		||||
Normally you use or create a subclass of SNMP::Info that inherits this one.  Do not use directly.
 | 
			
		||||
Normally you use or create a subclass of SNMP::Info that inherits this one.
 | 
			
		||||
Do not use directly.
 | 
			
		||||
 | 
			
		||||
For debugging purposes call the class directly as you would SNMP::Info
 | 
			
		||||
 | 
			
		||||
@@ -151,7 +319,7 @@ None.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item MAU-MIB
 | 
			
		||||
=item F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -170,21 +338,50 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 MAU INTERFACE TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_i_duplex()
 | 
			
		||||
 | 
			
		||||
Parses mau_index and mau_link to return the duplex information for
 | 
			
		||||
interfaces.
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Parses C<mac_index>,C<mau_autostat>,C<mau_type_admin> in
 | 
			
		||||
order to find the admin duplex setting for all the interfaces.
 | 
			
		||||
 | 
			
		||||
Returns either (auto,full,half).
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_i_duplex_admin_old()
 | 
			
		||||
 | 
			
		||||
Called by mau_i_duplex_admin() if C<mau_type_admin> is empty.
 | 
			
		||||
Parses C<mau_index>,C<mau_autostat>,C<mau_autosent> in
 | 
			
		||||
order to find the admin duplex setting for all the interfaces.
 | 
			
		||||
 | 
			
		||||
Returns either (auto,none,full,half).
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_i_speed_admin()
 | 
			
		||||
 | 
			
		||||
Returns admin speed setting for all the interfaces.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 MAU INTERFACE TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_index() -  Returns a list of interfaces
 | 
			
		||||
and their index in the MAU IF Table.
 | 
			
		||||
 | 
			
		||||
(B<ifMauIfIndex>)
 | 
			
		||||
(C<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>)
 | 
			
		||||
(C<ifMauType>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_status() - Returns the admin link condition as 
 | 
			
		||||
 | 
			
		||||
@@ -197,16 +394,16 @@ and their index in the MAU IF Table.
 | 
			
		||||
 | 
			
		||||
Use 5 and !5 to see if the link is up or down on the admin side.
 | 
			
		||||
 | 
			
		||||
(B<ifMauStatus>)
 | 
			
		||||
(C<ifMauStatus>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_up() -  Returns the current link condition
 | 
			
		||||
 | 
			
		||||
 (B<ifMauMediaAvailable>)
 | 
			
		||||
 (C<ifMauMediaAvailable>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_type() - Returns a 32bit string reporting the capabilities
 | 
			
		||||
of the port from a MAU POV. 
 | 
			
		||||
 | 
			
		||||
  Directly from the MAU-MIB : 
 | 
			
		||||
  Directly from F<MAU-MIB> : 
 | 
			
		||||
          Bit   Capability
 | 
			
		||||
            0      other or unknown
 | 
			
		||||
            1      AUI
 | 
			
		||||
@@ -230,26 +427,33 @@ of the port from a MAU POV.
 | 
			
		||||
           19      100BASE-T2 half duplex mode
 | 
			
		||||
           20      100BASE-T2 full duplex mode
 | 
			
		||||
 | 
			
		||||
(B<ifMauTypeList>)
 | 
			
		||||
(C<ifMauTypeList>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_type_admin()
 | 
			
		||||
 | 
			
		||||
(C<ifMauDefaultType>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_auto() - Returns status of auto-negotiation mode for ports.
 | 
			
		||||
 | 
			
		||||
(B<ifMauAutoNegAdminStatus>)
 | 
			
		||||
(C<ifMauAutoNegAdminStatus>)
 | 
			
		||||
 | 
			
		||||
=item $mau->mau_autostat()
 | 
			
		||||
 | 
			
		||||
(C<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>)
 | 
			
		||||
 | 
			
		||||
(C<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>)
 | 
			
		||||
(C<ifMauAutoNegCapReceived>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -261,13 +465,13 @@ capabilities of the device on the other end.
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
    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.
 | 
			
		||||
    Boolean.  Checks to see if any of the half_duplex types from mau_type()
 | 
			
		||||
    are high.  Currently bits 10,12,15,17,19.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user