Compare commits
	
		
			612 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					7621b30bc2 | ||
| 
						 | 
					9e2e55dcb3 | ||
| 
						 | 
					f8a1d5bc7a | ||
| 
						 | 
					1a65be101e | ||
| 
						 | 
					4c5d0a5695 | ||
| 
						 | 
					f8b3381d16 | ||
| 
						 | 
					8a41e5063a | ||
| 
						 | 
					24a84cdc25 | ||
| 
						 | 
					25354e1f3e | ||
| 
						 | 
					2025044952 | ||
| 
						 | 
					d00dcdad85 | ||
| 
						 | 
					fc069c13f5 | ||
| 
						 | 
					69430f4a21 | ||
| 
						 | 
					a83855157b | ||
| 
						 | 
					5ce80ba4ee | ||
| 
						 | 
					16e96d9fcf | ||
| 
						 | 
					ac753c5970 | ||
| 
						 | 
					313e187399 | ||
| 
						 | 
					f5aaee6c89 | ||
| 
						 | 
					c8b4f8f4fd | ||
| 
						 | 
					6113dd3b98 | ||
| 
						 | 
					e21f22bb3b | ||
| 
						 | 
					bb4578dea5 | ||
| 
						 | 
					e83ca6fbe3 | ||
| 
						 | 
					ae9963cf85 | ||
| 
						 | 
					650aef9c2d | ||
| 
						 | 
					397b14da22 | ||
| 
						 | 
					0f00322e03 | ||
| 
						 | 
					e2b688077e | ||
| 
						 | 
					4afbd37cbd | ||
| 
						 | 
					40d3340ac5 | ||
| 
						 | 
					9bb71d3df7 | ||
| 
						 | 
					4860447b06 | ||
| 
						 | 
					445b3f19a3 | ||
| 
						 | 
					32efd26999 | ||
| 
						 | 
					f2f95150bd | ||
| 
						 | 
					f210bf8812 | ||
| 
						 | 
					c30e1a2446 | ||
| 
						 | 
					10392fc08e | ||
| 
						 | 
					df10473fb5 | ||
| 
						 | 
					6505e7e85f | ||
| 
						 | 
					ffd80722b8 | ||
| 
						 | 
					6bd5bb3dda | ||
| 
						 | 
					83dec3c1d6 | ||
| 
						 | 
					82f2a83eec | ||
| 
						 | 
					5194af9d91 | ||
| 
						 | 
					a4c76d2fb9 | ||
| 
						 | 
					57a35075fa | ||
| 
						 | 
					fb69a60b45 | ||
| 
						 | 
					2625381e5b | ||
| 
						 | 
					1c048320a6 | ||
| 
						 | 
					c5c25cee7f | ||
| 
						 | 
					dee8177a67 | ||
| 
						 | 
					abbe040351 | ||
| 
						 | 
					29a0f849f1 | ||
| 
						 | 
					7e524f46c6 | ||
| 
						 | 
					1146e99de2 | ||
| 
						 | 
					6740929d41 | ||
| 
						 | 
					831788c1c9 | ||
| 
						 | 
					7e9d4520af | ||
| 
						 | 
					c4317e6e6b | ||
| 
						 | 
					e4e3debce0 | ||
| 
						 | 
					a5b7431070 | ||
| 
						 | 
					054808f59d | ||
| 
						 | 
					0b313d627e | ||
| 
						 | 
					9813b9db90 | ||
| 
						 | 
					9a4e024abb | ||
| 
						 | 
					04a669157f | ||
| 
						 | 
					a364c1512d | ||
| 
						 | 
					0451e6f0a6 | ||
| 
						 | 
					b7f87d9e82 | ||
| 
						 | 
					e2713fb57a | ||
| 
						 | 
					c8eff78d34 | ||
| 
						 | 
					04ca5793fa | ||
| 
						 | 
					83d00ee9c7 | ||
| 
						 | 
					bf56ed2540 | ||
| 
						 | 
					e75aba14b4 | ||
| 
						 | 
					5d2d2d416f | ||
| 
						 | 
					62799bfc9d | ||
| 
						 | 
					df8fbc3c03 | ||
| 
						 | 
					604de81ab8 | ||
| 
						 | 
					ed14b09567 | ||
| 
						 | 
					800758815c | ||
| 
						 | 
					058b74bd63 | ||
| 
						 | 
					02a52a4e09 | ||
| 
						 | 
					74ddc93f7f | ||
| 
						 | 
					eb8af0c81b | ||
| 
						 | 
					bd49274808 | ||
| 
						 | 
					8b1547c589 | ||
| 
						 | 
					c093f83848 | ||
| 
						 | 
					c0b28c38c5 | ||
| 
						 | 
					4621a0898f | ||
| 
						 | 
					6f02e1035f | ||
| 
						 | 
					d4ae9237a6 | ||
| 
						 | 
					914eb05a60 | ||
| 
						 | 
					4da17227c1 | ||
| 
						 | 
					20014cab29 | ||
| 
						 | 
					9d62361c8a | ||
| 
						 | 
					260992b7bf | ||
| 
						 | 
					b9cd429551 | ||
| 
						 | 
					2d18a75ad7 | ||
| 
						 | 
					0cfc501f83 | ||
| 
						 | 
					44b19153f1 | ||
| 
						 | 
					433b87b9df | ||
| 
						 | 
					f9464bcd6c | ||
| 
						 | 
					f5c5ec202a | ||
| 
						 | 
					4b64a70830 | ||
| 
						 | 
					4c8f7e298e | ||
| 
						 | 
					2d539be214 | ||
| 
						 | 
					c35d5814b4 | ||
| 
						 | 
					7d19ad401b | ||
| 
						 | 
					985577ce79 | ||
| 
						 | 
					24e20101d5 | ||
| 
						 | 
					76c884eb9f | ||
| 
						 | 
					7041dbab27 | ||
| 
						 | 
					661051fde4 | ||
| 
						 | 
					36cba5ce18 | ||
| 
						 | 
					4753f30c53 | ||
| 
						 | 
					d719e240d2 | ||
| 
						 | 
					e35faee278 | ||
| 
						 | 
					fd3417a09a | ||
| 
						 | 
					1719709648 | ||
| 
						 | 
					d37aa3378e | ||
| 
						 | 
					f017d32860 | ||
| 
						 | 
					7b23edcb29 | ||
| 
						 | 
					e48c4b4e84 | ||
| 
						 | 
					aeca44c7aa | ||
| 
						 | 
					af6ae8e419 | ||
| 
						 | 
					5cf88ba3b7 | ||
| 
						 | 
					f901ba5591 | ||
| 
						 | 
					7deea96bc3 | ||
| 
						 | 
					48dfb9bd08 | ||
| 
						 | 
					85372559fa | ||
| 
						 | 
					98972b80ef | ||
| 
						 | 
					d950244232 | ||
| 
						 | 
					fd898829c3 | ||
| 
						 | 
					b0158628bb | ||
| 
						 | 
					0f69a7b391 | ||
| 
						 | 
					72773117e5 | ||
| 
						 | 
					06806f5a6e | ||
| 
						 | 
					a01c785ec8 | ||
| 
						 | 
					502e206371 | ||
| 
						 | 
					8fba1bc6a9 | ||
| 
						 | 
					f43803d6d4 | ||
| 
						 | 
					338cba6350 | ||
| 
						 | 
					2a15066062 | ||
| 
						 | 
					add86bc566 | ||
| 
						 | 
					e9b4eaaeb9 | ||
| 
						 | 
					07605051f5 | ||
| 
						 | 
					998356484b | ||
| 
						 | 
					e97617ad60 | ||
| 
						 | 
					9685c3afa8 | ||
| 
						 | 
					c209b9a72f | ||
| 
						 | 
					4999b769ba | ||
| 
						 | 
					d8b5ba2161 | ||
| 
						 | 
					6f4a4a91cf | ||
| 
						 | 
					0049f0d72e | ||
| 
						 | 
					4ea66fc0fd | ||
| 
						 | 
					8426620572 | ||
| 
						 | 
					76aece0a3f | ||
| 
						 | 
					508e7f77a0 | ||
| 
						 | 
					d250a829cb | ||
| 
						 | 
					2fada0c31c | ||
| 
						 | 
					e6ad08733d | ||
| 
						 | 
					a8d83b5e1c | ||
| 
						 | 
					9392b74cbc | ||
| 
						 | 
					e09624efd0 | ||
| 
						 | 
					d4d7429de4 | ||
| 
						 | 
					b97cef86a3 | ||
| 
						 | 
					70615a172b | ||
| 
						 | 
					d399ca90d3 | ||
| 
						 | 
					bbc9695075 | ||
| 
						 | 
					c8fceeb75b | ||
| 
						 | 
					036cb4556e | ||
| 
						 | 
					e7b06a0b06 | ||
| 
						 | 
					c0067113e9 | ||
| 
						 | 
					ce4349a188 | ||
| 
						 | 
					224085dfca | ||
| 
						 | 
					9b3262a5fe | ||
| 
						 | 
					86856b6d54 | ||
| 
						 | 
					d5bf08329e | ||
| 
						 | 
					60efce8404 | ||
| 
						 | 
					83164f456a | ||
| 
						 | 
					c0141bcfee | ||
| 
						 | 
					8dfe9ef1cf | ||
| 
						 | 
					73d713b670 | ||
| 
						 | 
					db6c3573c1 | ||
| 
						 | 
					c8cbdaef8a | ||
| 
						 | 
					2c7243b87d | ||
| 
						 | 
					46515dd5d3 | ||
| 
						 | 
					7eb799adc6 | ||
| 
						 | 
					c85b61bbd0 | ||
| 
						 | 
					045ff8b789 | ||
| 
						 | 
					7b7f197439 | ||
| 
						 | 
					9e1c462836 | ||
| 
						 | 
					e97e8309cb | ||
| 
						 | 
					8c5be1a47d | ||
| 
						 | 
					afef2e6732 | ||
| 
						 | 
					7b2051b55c | ||
| 
						 | 
					8e470a2d72 | ||
| 
						 | 
					35213d5cb2 | ||
| 
						 | 
					b24f1a8ac4 | ||
| 
						 | 
					5454ab577e | ||
| 
						 | 
					046c15a074 | ||
| 
						 | 
					ddb9dda894 | ||
| 
						 | 
					d7047bda13 | ||
| 
						 | 
					c7934f4d10 | ||
| 
						 | 
					c97dc06177 | ||
| 
						 | 
					76b1faa159 | ||
| 
						 | 
					1e0438857e | ||
| 
						 | 
					b6494effa6 | ||
| 
						 | 
					a359184b83 | ||
| 
						 | 
					ce50a3f627 | ||
| 
						 | 
					ee7d254329 | ||
| 
						 | 
					d674b22b39 | ||
| 
						 | 
					47954aba8e | ||
| 
						 | 
					09e18e9b64 | ||
| 
						 | 
					163ba86196 | ||
| 
						 | 
					e57e7d99d5 | ||
| 
						 | 
					7ad449303b | ||
| 
						 | 
					49b853de1a | ||
| 
						 | 
					03a81ad4be | ||
| 
						 | 
					eb046b6a61 | ||
| 
						 | 
					1bf62f9524 | ||
| 
						 | 
					9aca213a5f | ||
| 
						 | 
					ce8bb68200 | ||
| 
						 | 
					7ee562c5ac | ||
| 
						 | 
					bdb719004d | ||
| 
						 | 
					842ac96d48 | ||
| 
						 | 
					5bb9011fb4 | ||
| 
						 | 
					97564f50b8 | ||
| 
						 | 
					efcf6a0db3 | ||
| 
						 | 
					9e813784f7 | ||
| 
						 | 
					aaca03062b | ||
| 
						 | 
					c1242017e2 | ||
| 
						 | 
					5f1426a0a3 | ||
| 
						 | 
					e84225fb23 | ||
| 
						 | 
					32c0e64bfb | ||
| 
						 | 
					0793ff31f5 | ||
| 
						 | 
					d3c2c1b607 | ||
| 
						 | 
					893def7910 | ||
| 
						 | 
					f875639435 | ||
| 
						 | 
					70bb263d79 | ||
| 
						 | 
					536d7d6901 | ||
| 
						 | 
					6ea34316b0 | ||
| 
						 | 
					aeebe5c95c | ||
| 
						 | 
					eb62f95636 | ||
| 
						 | 
					c7ee746fe6 | ||
| 
						 | 
					9a062499b3 | ||
| 
						 | 
					0c876452d8 | ||
| 
						 | 
					3b6088f454 | ||
| 
						 | 
					719f14984b | ||
| 
						 | 
					2e480dbec5 | ||
| 
						 | 
					66910c7827 | ||
| 
						 | 
					0f5319bc52 | ||
| 
						 | 
					cd54b07e09 | ||
| 
						 | 
					b197e9739b | ||
| 
						 | 
					8dd32c0dd7 | ||
| 
						 | 
					08e049eb31 | ||
| 
						 | 
					d09e4a125c | ||
| 
						 | 
					8353db2bc4 | ||
| 
						 | 
					250d2a0c0a | ||
| 
						 | 
					46b3127bb5 | ||
| 
						 | 
					f1e9e3423d | ||
| 
						 | 
					158ee40f1b | ||
| 
						 | 
					713d052b64 | ||
| 
						 | 
					0e28436086 | ||
| 
						 | 
					3f7229f4e7 | ||
| 
						 | 
					1ae7f8c8a2 | ||
| 
						 | 
					8e63954c3f | ||
| 
						 | 
					0fbcd5f8b1 | ||
| 
						 | 
					71f84d48dc | ||
| 
						 | 
					867a635ab8 | ||
| 
						 | 
					3d2c9ceaf5 | ||
| 
						 | 
					47736b08ce | ||
| 
						 | 
					3f49e5f8ef | ||
| 
						 | 
					7c8575bfa5 | ||
| 
						 | 
					102a7e10cc | ||
| 
						 | 
					9148764d20 | ||
| 
						 | 
					ce619415de | ||
| 
						 | 
					745807007f | ||
| 
						 | 
					e85b3f70aa | ||
| 
						 | 
					edc0fe4fbe | ||
| 
						 | 
					3cceec9044 | ||
| 
						 | 
					18602855da | ||
| 
						 | 
					72c223f72e | ||
| 
						 | 
					c6b3c45412 | ||
| 
						 | 
					c60a04f530 | ||
| 
						 | 
					f7430ab1a6 | ||
| 
						 | 
					827398228c | ||
| 
						 | 
					a264bb36cb | ||
| 
						 | 
					c24e63ec4c | ||
| 
						 | 
					6519570839 | ||
| 
						 | 
					2c88544158 | ||
| 
						 | 
					d0722d3677 | ||
| 
						 | 
					d2b404763b | ||
| 
						 | 
					88fb9e4df3 | ||
| 
						 | 
					440ec276d3 | ||
| 
						 | 
					6e91b90c48 | ||
| 
						 | 
					0bfc8c5ed6 | ||
| 
						 | 
					63547c2ea1 | ||
| 
						 | 
					efecf1bbb7 | ||
| 
						 | 
					682b8c2a9c | ||
| 
						 | 
					88295e8c1e | ||
| 
						 | 
					6764f15fd0 | ||
| 
						 | 
					8b8ee8693e | ||
| 
						 | 
					fe89001166 | ||
| 
						 | 
					416a18377c | ||
| 
						 | 
					8fda38184c | ||
| 
						 | 
					280e9260f7 | ||
| 
						 | 
					22642c1095 | ||
| 
						 | 
					d68b2047b0 | ||
| 
						 | 
					7240f034e5 | ||
| 
						 | 
					97ce41e363 | ||
| 
						 | 
					31a8abc3b8 | ||
| 
						 | 
					6b49bfd4c4 | ||
| 
						 | 
					985b4aab3f | ||
| 
						 | 
					a4e7c3a61a | ||
| 
						 | 
					d82d8781c4 | ||
| 
						 | 
					b4c3f92ba3 | ||
| 
						 | 
					1c57d2eab8 | ||
| 
						 | 
					409de77b2c | ||
| 
						 | 
					3e22e24dc9 | ||
| 
						 | 
					17b1bdacfe | ||
| 
						 | 
					b570fdbc89 | ||
| 
						 | 
					cceb0f4e5e | ||
| 
						 | 
					04f8c7f7e2 | ||
| 
						 | 
					37aca89af7 | ||
| 
						 | 
					5445a496db | ||
| 
						 | 
					0ab93b142c | ||
| 
						 | 
					d39dc76949 | ||
| 
						 | 
					c6abd7b62b | ||
| 
						 | 
					0e572db832 | ||
| 
						 | 
					602bb15b47 | ||
| 
						 | 
					b4882285c4 | ||
| 
						 | 
					834b27bdad | ||
| 
						 | 
					7db148a5a1 | ||
| 
						 | 
					9e332095a2 | ||
| 
						 | 
					7bf950026b | ||
| 
						 | 
					f246444d89 | ||
| 
						 | 
					8e84aea1bf | ||
| 
						 | 
					d6a7a944cc | ||
| 
						 | 
					fb478d3c7b | ||
| 
						 | 
					24f8a8fdba | ||
| 
						 | 
					28bbe0ee19 | ||
| 
						 | 
					c21ca2062e | ||
| 
						 | 
					e3e289a27c | ||
| 
						 | 
					9540f6b9d3 | ||
| 
						 | 
					539943fb0f | ||
| 
						 | 
					7a8ebffd40 | ||
| 
						 | 
					3d48f4e210 | ||
| 
						 | 
					667cdbea13 | ||
| 
						 | 
					f5fb4dd3b0 | ||
| 
						 | 
					5a2722d049 | ||
| 
						 | 
					f3b6cfbd01 | ||
| 
						 | 
					e239a6057c | ||
| 
						 | 
					9b1c439e15 | ||
| 
						 | 
					074f2e7c8f | ||
| 
						 | 
					4b1533e925 | ||
| 
						 | 
					6812a60668 | ||
| 
						 | 
					6f0cb846f0 | ||
| 
						 | 
					c79307692b | ||
| 
						 | 
					08b2f50ac7 | ||
| 
						 | 
					3577fa1e42 | ||
| 
						 | 
					cb6630582a | ||
| 
						 | 
					ca5fff31a7 | ||
| 
						 | 
					69b1f1e29e | ||
| 
						 | 
					4e2b642ed1 | ||
| 
						 | 
					3c26ce2a55 | ||
| 
						 | 
					7d2cf97c06 | ||
| 
						 | 
					cfce6296fb | ||
| 
						 | 
					1601703ff2 | ||
| 
						 | 
					905ad3e2b7 | ||
| 
						 | 
					15b7e95545 | ||
| 
						 | 
					247f6f038d | ||
| 
						 | 
					7c6df7cce3 | ||
| 
						 | 
					1a92306d51 | ||
| 
						 | 
					59e9fae1d5 | ||
| 
						 | 
					998094241d | ||
| 
						 | 
					d6c3313138 | ||
| 
						 | 
					b7e252b91a | ||
| 
						 | 
					6071beb15d | ||
| 
						 | 
					cda830686d | ||
| 
						 | 
					a29b888620 | ||
| 
						 | 
					ae5a4d413d | ||
| 
						 | 
					03c4d1e81f | ||
| 
						 | 
					4efa0fd509 | ||
| 
						 | 
					c3a727ce10 | ||
| 
						 | 
					afa97d845b | ||
| 
						 | 
					8671f65bfd | ||
| 
						 | 
					37737a6494 | ||
| 
						 | 
					0ce8a55b88 | ||
| 
						 | 
					22dd49c1dc | ||
| 
						 | 
					fd5812aefc | ||
| 
						 | 
					f4e37cdabe | ||
| 
						 | 
					5324760463 | ||
| 
						 | 
					27120045d2 | ||
| 
						 | 
					abfd93ea1b | ||
| 
						 | 
					070d911c60 | ||
| 
						 | 
					8b14776c9a | ||
| 
						 | 
					2d62372c7f | ||
| 
						 | 
					3eae0b9d5c | ||
| 
						 | 
					9a722bb2f8 | ||
| 
						 | 
					d3e39a4132 | ||
| 
						 | 
					d82d495dcf | ||
| 
						 | 
					198df7cee4 | ||
| 
						 | 
					46cdb4c166 | ||
| 
						 | 
					62005c52d2 | ||
| 
						 | 
					ca7651628d | ||
| 
						 | 
					6358b7ad70 | ||
| 
						 | 
					8aca1d97c0 | ||
| 
						 | 
					275a533843 | ||
| 
						 | 
					21bd4c662d | ||
| 
						 | 
					47d9d091d1 | ||
| 
						 | 
					da2ea09e84 | ||
| 
						 | 
					9c71bdbcef | ||
| 
						 | 
					318f9518b1 | ||
| 
						 | 
					19e9fb5f67 | ||
| 
						 | 
					41833c1f29 | ||
| 
						 | 
					4e2f950e41 | ||
| 
						 | 
					ebe3f39ea1 | ||
| 
						 | 
					c6521d0b48 | ||
| 
						 | 
					74b5c9f0e3 | ||
| 
						 | 
					4bfebe1563 | ||
| 
						 | 
					2ac4e65827 | ||
| 
						 | 
					b7a135db10 | ||
| 
						 | 
					d4c460fd3d | ||
| 
						 | 
					8f0ac35381 | ||
| 
						 | 
					a9a3229c22 | ||
| 
						 | 
					5da622ff88 | ||
| 
						 | 
					32f33f5150 | ||
| 
						 | 
					242013f3b0 | ||
| 
						 | 
					e46deb505f | ||
| 
						 | 
					5d443fd1be | ||
| 
						 | 
					d53152858c | ||
| 
						 | 
					aefb31fb58 | ||
| 
						 | 
					0be8219b9c | ||
| 
						 | 
					cbb8bc5d77 | ||
| 
						 | 
					6969dcbfec | ||
| 
						 | 
					9e463ddddf | ||
| 
						 | 
					5ec034c475 | ||
| 
						 | 
					1694e648fc | ||
| 
						 | 
					16aa96ebf4 | ||
| 
						 | 
					43d06e184d | ||
| 
						 | 
					3ff432034a | ||
| 
						 | 
					0325bb1f25 | ||
| 
						 | 
					b9aebf7e9e | ||
| 
						 | 
					e1e693a7c8 | ||
| 
						 | 
					c8c548fe97 | ||
| 
						 | 
					ddf971ed54 | ||
| 
						 | 
					61e8f47986 | ||
| 
						 | 
					3ce9f403e6 | ||
| 
						 | 
					3741010044 | ||
| 
						 | 
					badfb12243 | ||
| 
						 | 
					0713a6457c | ||
| 
						 | 
					9abe744dac | ||
| 
						 | 
					b4974aeacd | ||
| 
						 | 
					688a0de498 | ||
| 
						 | 
					7cef8465fa | ||
| 
						 | 
					532279d2b8 | ||
| 
						 | 
					d67ffc3a6c | ||
| 
						 | 
					c6776b1755 | ||
| 
						 | 
					49566977ad | ||
| 
						 | 
					daf512e33e | ||
| 
						 | 
					74816fc043 | ||
| 
						 | 
					c88e37e9b5 | ||
| 
						 | 
					c1c448f3df | ||
| 
						 | 
					4f168a538b | ||
| 
						 | 
					d94630af35 | ||
| 
						 | 
					999dd1f468 | ||
| 
						 | 
					c3d5631c3c | ||
| 
						 | 
					9dae6b20d7 | ||
| 
						 | 
					4005640a2b | ||
| 
						 | 
					ca446faacf | ||
| 
						 | 
					240539bd24 | ||
| 
						 | 
					08e335f39c | ||
| 
						 | 
					a9cc14b265 | ||
| 
						 | 
					9505f119b3 | ||
| 
						 | 
					683edf1668 | ||
| 
						 | 
					d9c52c1a88 | ||
| 
						 | 
					0f1a76a564 | ||
| 
						 | 
					15cd354bae | ||
| 
						 | 
					91d67ed0ae | ||
| 
						 | 
					0740a7bd5e | ||
| 
						 | 
					84493a99b4 | ||
| 
						 | 
					f730fa3325 | ||
| 
						 | 
					4b1007cb66 | ||
| 
						 | 
					436f7442b6 | ||
| 
						 | 
					3af05ebba5 | ||
| 
						 | 
					c7db0371aa | ||
| 
						 | 
					53860aaa46 | ||
| 
						 | 
					829a4bf16a | ||
| 
						 | 
					a83bc1bcb2 | ||
| 
						 | 
					af65bb3a2b | ||
| 
						 | 
					f2d9f6be27 | ||
| 
						 | 
					ecea4ef4a4 | ||
| 
						 | 
					e4e099510a | ||
| 
						 | 
					de28ff96c2 | ||
| 
						 | 
					6692ddcf1f | ||
| 
						 | 
					ba7a105eb1 | ||
| 
						 | 
					b9fb232859 | ||
| 
						 | 
					6f54cb429e | ||
| 
						 | 
					ae3398b11a | ||
| 
						 | 
					e97693d12d | ||
| 
						 | 
					435bb7dbe2 | ||
| 
						 | 
					70bc5e78e9 | ||
| 
						 | 
					a163e5b82c | ||
| 
						 | 
					5eb66fe442 | ||
| 
						 | 
					b6cf462b16 | ||
| 
						 | 
					ead15a1cde | ||
| 
						 | 
					9c19c70029 | ||
| 
						 | 
					0862047241 | ||
| 
						 | 
					6cfce1916d | ||
| 
						 | 
					1e37bfa8ce | ||
| 
						 | 
					87197067a0 | ||
| 
						 | 
					8264f68f6c | ||
| 
						 | 
					3e21357e8d | ||
| 
						 | 
					ee5953d743 | ||
| 
						 | 
					46f941b416 | ||
| 
						 | 
					225e12e979 | ||
| 
						 | 
					912ba274a6 | ||
| 
						 | 
					18f59db2b9 | ||
| 
						 | 
					f0ca1a5fa3 | ||
| 
						 | 
					446e5a13f7 | ||
| 
						 | 
					e8a9d18445 | ||
| 
						 | 
					6256f33079 | ||
| 
						 | 
					b5c4bd99bf | ||
| 
						 | 
					56dae91c8a | ||
| 
						 | 
					0661b1307a | ||
| 
						 | 
					cd112f4925 | ||
| 
						 | 
					14bf6b84d3 | ||
| 
						 | 
					5c22a29e40 | ||
| 
						 | 
					f1806f227b | ||
| 
						 | 
					025e7b72b5 | ||
| 
						 | 
					97b398051f | ||
| 
						 | 
					e21d8516fb | ||
| 
						 | 
					2972c70177 | ||
| 
						 | 
					50b4274f68 | ||
| 
						 | 
					75dc93f2c0 | ||
| 
						 | 
					73fd627815 | ||
| 
						 | 
					9e84141983 | ||
| 
						 | 
					bd6591db7b | ||
| 
						 | 
					515e876491 | ||
| 
						 | 
					6105046ae9 | ||
| 
						 | 
					f0eb0a9ded | ||
| 
						 | 
					a227db586b | ||
| 
						 | 
					04eafd3e61 | ||
| 
						 | 
					3b25711e1f | ||
| 
						 | 
					63687b5f8f | ||
| 
						 | 
					cac2224fa1 | ||
| 
						 | 
					44da7544b7 | ||
| 
						 | 
					13478343cd | ||
| 
						 | 
					a7aeae0aa2 | ||
| 
						 | 
					876fb9946b | ||
| 
						 | 
					e5853962b5 | ||
| 
						 | 
					3eaa2ae230 | ||
| 
						 | 
					cd1acd023e | ||
| 
						 | 
					e2a314b553 | ||
| 
						 | 
					102a2a03e8 | ||
| 
						 | 
					8be0f9e06f | ||
| 
						 | 
					40239ea078 | ||
| 
						 | 
					47032cbb4a | ||
| 
						 | 
					11dbeb2741 | ||
| 
						 | 
					5242d16e02 | ||
| 
						 | 
					428c007543 | ||
| 
						 | 
					d0fbfdea86 | ||
| 
						 | 
					b3fb18eee6 | ||
| 
						 | 
					7d470fd0e8 | ||
| 
						 | 
					295e6fb283 | ||
| 
						 | 
					9e545e8cf8 | ||
| 
						 | 
					182589745f | ||
| 
						 | 
					bdfc430564 | ||
| 
						 | 
					2da37f06ea | ||
| 
						 | 
					eb5a492eb9 | ||
| 
						 | 
					e79f031cb7 | ||
| 
						 | 
					86909ae236 | ||
| 
						 | 
					69861e7660 | ||
| 
						 | 
					5054b1b5b5 | ||
| 
						 | 
					a2496a536d | ||
| 
						 | 
					f4ebe6a102 | ||
| 
						 | 
					b10b922aa0 | ||
| 
						 | 
					a8673cc076 | ||
| 
						 | 
					2dd1cdc281 | ||
| 
						 | 
					ccd03ae6d2 | ||
| 
						 | 
					7e0771e065 | ||
| 
						 | 
					e9fd3731a9 | ||
| 
						 | 
					a5f242c28f | ||
| 
						 | 
					43d1718618 | ||
| 
						 | 
					d64f0d4a5e | ||
| 
						 | 
					4a13ee8991 | ||
| 
						 | 
					8764916086 | ||
| 
						 | 
					78b0b77e38 | ||
| 
						 | 
					8a7376f6df | ||
| 
						 | 
					c9a36f12e6 | ||
| 
						 | 
					8199e2a973 | ||
| 
						 | 
					e1f3fb3a44 | ||
| 
						 | 
					52275e92af | ||
| 
						 | 
					5d9eec0992 | ||
| 
						 | 
					cd9c637ba5 | ||
| 
						 | 
					0bc405792a | ||
| 
						 | 
					8fb36625bc | ||
| 
						 | 
					674eca23b9 | ||
| 
						 | 
					cfc1ead848 | ||
| 
						 | 
					c41ffdfd2d | ||
| 
						 | 
					df4708383b | ||
| 
						 | 
					497c81a0c6 | ||
| 
						 | 
					2c2f4a9ea1 | ||
| 
						 | 
					feffa6d47e | ||
| 
						 | 
					3bb33fa8d4 | ||
| 
						 | 
					30a73c035a | ||
| 
						 | 
					5c44fc0b28 | ||
| 
						 | 
					a54b446dae | 
							
								
								
									
										31
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
<!--- Provide a general summary of the issue in the Title above -->
 | 
			
		||||
<!--- https://guides.github.com/features/mastering-markdown/#examples -->
 | 
			
		||||
 | 
			
		||||
## Expected Behavior
 | 
			
		||||
<!--- If you're describing a bug, tell us what should happen -->
 | 
			
		||||
<!--- If you're suggesting a change/improvement, tell us how it should work -->
 | 
			
		||||
 | 
			
		||||
## Current Behavior
 | 
			
		||||
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
 | 
			
		||||
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
 | 
			
		||||
 | 
			
		||||
## Possible Solution
 | 
			
		||||
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
 | 
			
		||||
<!--- or ideas how to implement the addition or change -->
 | 
			
		||||
 | 
			
		||||
## Steps to Reproduce (for bugs)
 | 
			
		||||
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
 | 
			
		||||
<!--- reproduce this bug. Include code to reproduce, if relevant, or attach screenshots -->
 | 
			
		||||
1. 
 | 
			
		||||
2. 
 | 
			
		||||
3. 
 | 
			
		||||
4. 
 | 
			
		||||
 | 
			
		||||
## Context
 | 
			
		||||
<!--- How has this issue affected you? What are you trying to accomplish? -->
 | 
			
		||||
<!--- Providing context helps us come up with a solution that is most useful in the real world -->
 | 
			
		||||
 | 
			
		||||
## Your Environment
 | 
			
		||||
<!--- Include as many relevant details about the environment you experienced the bug in -->
 | 
			
		||||
* SNMP::Info version used: 
 | 
			
		||||
* Netdisco version (if used): 
 | 
			
		||||
							
								
								
									
										11
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
*.swp
 | 
			
		||||
*.pid
 | 
			
		||||
test.pl
 | 
			
		||||
MYMETA.*
 | 
			
		||||
*.tar.gz
 | 
			
		||||
MANIFEST.*
 | 
			
		||||
*.komodo*
 | 
			
		||||
Makefile*
 | 
			
		||||
Build
 | 
			
		||||
_build
 | 
			
		||||
blib
 | 
			
		||||
							
								
								
									
										29
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
language: perl
 | 
			
		||||
addons:
 | 
			
		||||
  apt:
 | 
			
		||||
    packages:
 | 
			
		||||
      - jq
 | 
			
		||||
      - libsnmp-dev
 | 
			
		||||
branches:
 | 
			
		||||
  only:
 | 
			
		||||
    - /^3\.\d{2}$/
 | 
			
		||||
    - 'master'
 | 
			
		||||
before_install:
 | 
			
		||||
  - mkdir ~/netdisco-mibs
 | 
			
		||||
  - cd ~/netdisco-mibs
 | 
			
		||||
install:
 | 
			
		||||
  - curl -sL https://github.com/netdisco/netdisco-mibs/releases/download/4.004/netdisco-mibs.tar.gz | tar --strip-components=1 -zxf -
 | 
			
		||||
  - cpanm --quiet --notest PkgConfig Test::CChecker Alien::zlib::Static Alien::OpenSSL::Static Alien::SNMP::MAXTC
 | 
			
		||||
before_script:
 | 
			
		||||
  - 'cd ${TRAVIS_BUILD_DIR}'
 | 
			
		||||
script:
 | 
			
		||||
  - >
 | 
			
		||||
    perl Build.PL &&
 | 
			
		||||
    PERL_MM_USE_DEFAULT=1 ./Build installdeps --cpan_client 'cpanm --quiet --notest' &&
 | 
			
		||||
    ./Build test --test_files t/ --test_files xt/
 | 
			
		||||
notifications:
 | 
			
		||||
  irc:
 | 
			
		||||
    on_success: change
 | 
			
		||||
    on_failure: always
 | 
			
		||||
    channels:
 | 
			
		||||
      - 'chat.freenode.net#netdisco'
 | 
			
		||||
							
								
								
									
										43
									
								
								Build.PL
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								Build.PL
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Module::Build;
 | 
			
		||||
 | 
			
		||||
Module::Build->new(
 | 
			
		||||
  module_name => 'SNMP::Info',
 | 
			
		||||
  license     => 'bsd',
 | 
			
		||||
  dist_author => 'Eric A. Miller <emiller@cpan.org>',
 | 
			
		||||
  # dynamic_config => 1,
 | 
			
		||||
  create_readme => 1,
 | 
			
		||||
  configure_requires => {
 | 
			
		||||
    'Module::Build' => '0.42',
 | 
			
		||||
  },
 | 
			
		||||
  # build_requires => {
 | 
			
		||||
  # },
 | 
			
		||||
  requires => {
 | 
			
		||||
    'SNMP' => '0',
 | 
			
		||||
    'Math::BigInt' => '0',
 | 
			
		||||
  },
 | 
			
		||||
  recommends => {
 | 
			
		||||
    'PPI' => '0',
 | 
			
		||||
    'Class::ISA' => '0',
 | 
			
		||||
    'Module::Info' => '0',
 | 
			
		||||
    'Module::Load' => '0',
 | 
			
		||||
    'File::Slurp' => '0',
 | 
			
		||||
  },
 | 
			
		||||
  test_requires => {
 | 
			
		||||
    'Test::More' => '0.88',
 | 
			
		||||
    'Test::Distribution' => '0',
 | 
			
		||||
  },
 | 
			
		||||
  # script_files => [
 | 
			
		||||
  # ],
 | 
			
		||||
  # share_dir => 'share',
 | 
			
		||||
  meta_merge => {
 | 
			
		||||
    resources => {
 | 
			
		||||
      homepage => 'http://netdisco.org/',
 | 
			
		||||
      bugtracker => 'https://github.com/netdisco/snmp-info/issues',
 | 
			
		||||
      repository => 'https://github.com/netdisco/snmp-info',
 | 
			
		||||
      MailingList => 'https://lists.sourceforge.net/lists/listinfo/snmp-info-users',
 | 
			
		||||
      IRC => 'irc://irc.freenode.org/#netdisco',
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
)->create_build_script;
 | 
			
		||||
							
								
								
									
										394
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										394
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -1,394 +0,0 @@
 | 
			
		||||
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
 | 
			
		||||
ChangeLog $Id$
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
    * Globals are now cached
 | 
			
		||||
    * Added new argument 'AutoSpecify' to new() to auto-connect with subclass 
 | 
			
		||||
      detected in device_type()
 | 
			
		||||
    * New method specify() returns a new subclass object
 | 
			
		||||
    * Subclasses are automatically loaded when specify or autospecify is used!
 | 
			
		||||
    * Added methods for Interface statistics (ifInOctets ...)
 | 
			
		||||
    * Added methods for Memory and CPU statistics 
 | 
			
		||||
    * Added SNMP::Info::Entity, moved out of L2-HP
 | 
			
		||||
    * Added SNMP::Info::Layer2::Aironet
 | 
			
		||||
 | 
			
		||||
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 more debugging
 | 
			
		||||
    * Added info and munging for c_capabilities in SNMP::Info::CD
 | 
			
		||||
      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 /at- lorensen.dk>
 | 
			
		||||
    * Moved tests from test.pl to t/*
 | 
			
		||||
 | 
			
		||||
version 0.2 (02/19/03)
 | 
			
		||||
    * Added put_() methods and support for SNMP put commands
 | 
			
		||||
    * Added SNMP::Info::Layer3::C3550 class for Cisco Catalyst 3550
 | 
			
		||||
    * Fixed HP Detection in device_type()
 | 
			
		||||
    * 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
 | 
			
		||||
     
 | 
			
		||||
version 0.1 (12/30/02)
 | 
			
		||||
    * Initial Release
 | 
			
		||||
    * SubClasses Included:
 | 
			
		||||
        * SNMP::Info::Bridge
 | 
			
		||||
        * SNMP::Info::CDP
 | 
			
		||||
        * SNMP::Info::EtherLike
 | 
			
		||||
        * SNMP::Info::MAU
 | 
			
		||||
        * SNMP::Info::Layer1
 | 
			
		||||
              o SNMP::Info::Layer1::Allied
 | 
			
		||||
              o SNMP::Info::Layer1::Asante 
 | 
			
		||||
        * SNMP::Info::Layer2
 | 
			
		||||
              o SNMP::Info::Layer2::Bay
 | 
			
		||||
              o SNMP::Info::Layer2::C1900
 | 
			
		||||
              o SNMP::Info::Layer2::C2900
 | 
			
		||||
              o SNMP::Info::Layer2::Catalyst
 | 
			
		||||
              o SNMP::Info::Layer2::HP 
 | 
			
		||||
        * SNMP::Info::Layer3
 | 
			
		||||
              o SNMP::Info::Layer3::Aironet
 | 
			
		||||
              o SNMP::Info::Layer3::Foundry
 | 
			
		||||
							
								
								
									
										865
									
								
								DeviceMatrix.txt
									
									
									
									
									
								
							
							
						
						
									
										865
									
								
								DeviceMatrix.txt
									
									
									
									
									
								
							@@ -1,865 +0,0 @@
 | 
			
		||||
# SNMP Device Compatibility Matrix
 | 
			
		||||
# SNMP::Info - (C) 2004 Max Baker
 | 
			
		||||
 | 
			
		||||
# This file is meant to detail the cababilities
 | 
			
		||||
# of network devices to supply data via SNMP.  
 | 
			
		||||
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Airespace (pre-Cisco)
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Airespace
 | 
			
		||||
cdp:no
 | 
			
		||||
arpnip: no
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Airespace
 | 
			
		||||
 | 
			
		||||
device-family: Airespace Wireless Controllers
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports.
 | 
			
		||||
note: Device will only communicate with SNMP version configured in the controller.
 | 
			
		||||
 | 
			
		||||
device: 3500, 4101, 4102
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Alcatel-Lucent
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Alcatel-Lucent
 | 
			
		||||
 | 
			
		||||
device-family: L3
 | 
			
		||||
class: Layer3::AlcatelLucent
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: Timetra
 | 
			
		||||
class: Layer3::Timetra
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: AOS
 | 
			
		||||
class: Layer3::Aruba
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Allied
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Allied Telesyn
 | 
			
		||||
cdp:no
 | 
			
		||||
class: Layer1::Allied
 | 
			
		||||
ver: 1
 | 
			
		||||
arpnip: no
 | 
			
		||||
macsuck: no
 | 
			
		||||
duplex: no
 | 
			
		||||
 | 
			
		||||
device-family: Allied Hubs
 | 
			
		||||
 | 
			
		||||
device: AT-3624T
 | 
			
		||||
 | 
			
		||||
device-family: AT-8000 Switches
 | 
			
		||||
class: Layer2::Allied
 | 
			
		||||
ver: 2
 | 
			
		||||
macsuck: yes
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Altiga
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Altiga
 | 
			
		||||
class: Layer3::Altiga
 | 
			
		||||
note: See Cisco/Altiga
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Arista
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Arista
 | 
			
		||||
class: Layer3::Arista
 | 
			
		||||
device-family: All
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Aruba
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Aruba
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: no
 | 
			
		||||
class: Layer3::Aruba
 | 
			
		||||
 | 
			
		||||
device-family: Aruba Wireless Controllers
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports.
 | 
			
		||||
 | 
			
		||||
device: 5000
 | 
			
		||||
 | 
			
		||||
device: 6000
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Asante
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Asante
 | 
			
		||||
class: Layer1::Asante
 | 
			
		||||
ver: 1
 | 
			
		||||
arpnip: no
 | 
			
		||||
macsuck: no
 | 
			
		||||
duplex: no
 | 
			
		||||
 | 
			
		||||
device-family: Asante Hubs
 | 
			
		||||
 | 
			
		||||
device: 1012
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Bay
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Bay
 | 
			
		||||
note: See Nortel
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# CISCO
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Cisco
 | 
			
		||||
cdp: yes
 | 
			
		||||
ver: 2
 | 
			
		||||
modules: yes
 | 
			
		||||
 | 
			
		||||
device-family: Aironet
 | 
			
		||||
note: IOS and Aironet OS versions
 | 
			
		||||
class: Layer3::Aironet
 | 
			
		||||
 | 
			
		||||
device: AIRAP1100, AP1200, C1100, C1130, C1240
 | 
			
		||||
note: IOS based device
 | 
			
		||||
class: Layer2::Aironet
 | 
			
		||||
 | 
			
		||||
device: BR500
 | 
			
		||||
note: Aironet based device
 | 
			
		||||
 | 
			
		||||
device: AP350, AP340, CAP350, CAP340, 1200, AP4800
 | 
			
		||||
note: Aironet based device
 | 
			
		||||
 | 
			
		||||
device-family: Altiga
 | 
			
		||||
class: Layer3::Altiga
 | 
			
		||||
 | 
			
		||||
device: VPN3000
 | 
			
		||||
note: The Cisco 3000 device can return duplicate interface names, while Netdisco expects unique interface names.  To ensure unique device names I append numbers only when an interface name would not be unique without one. Interfaces with unique names keep their ifDescr name.
 | 
			
		||||
 | 
			
		||||
device-family: 1000
 | 
			
		||||
duplex: no
 | 
			
		||||
ver: 1
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
device: 1003
 | 
			
		||||
 | 
			
		||||
device-family: 1700
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
device: 1710
 | 
			
		||||
duplex: link
 | 
			
		||||
 | 
			
		||||
device-family: 2500
 | 
			
		||||
duplex: no
 | 
			
		||||
macsuck: yes
 | 
			
		||||
arpnip: yes
 | 
			
		||||
ver: 1
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
device: 2501,2503,2511,2514
 | 
			
		||||
 | 
			
		||||
device: AS2509RJ,AS2511RJ
 | 
			
		||||
 | 
			
		||||
device-family: 2600
 | 
			
		||||
duplex: link
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
device:2610, 2610XM, 2611, 2620, 2620XM, 2621, 2621XM, 2651XM, 2691
 | 
			
		||||
 | 
			
		||||
device-family: 2800
 | 
			
		||||
duplex: link
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
device: 2811,2821,2851
 | 
			
		||||
 | 
			
		||||
device-family: 3600
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
device: 3620
 | 
			
		||||
 | 
			
		||||
device: 3640
 | 
			
		||||
duplex: no
 | 
			
		||||
 | 
			
		||||
device-family:7200
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
device:all
 | 
			
		||||
#note: Unconfirmed problem : "When scanning my network with netdisco I would find that my 7200 series router running Cisco IOS Software Release 12.2(1) would reboot when scanning for CDP neighbours, to solve the issue I upgraded to Cisco IOS Software Release  Version 12.2(37)"
 | 
			
		||||
 | 
			
		||||
device-family: 7500
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
device: 7507
 | 
			
		||||
duplex: no
 | 
			
		||||
note: !Duplex settings are falsely reported in ancient IOS versions
 | 
			
		||||
 | 
			
		||||
device-family: AS5000
 | 
			
		||||
duplex: no
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
 | 
			
		||||
device: AS5300
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Cisco - Catalyst
 | 
			
		||||
#
 | 
			
		||||
device-family: Catalyst 1900
 | 
			
		||||
note: !Upgrade older (pre 9.0) versions of CatOS
 | 
			
		||||
note: !CatOS ver 9.00.03 through 9.00.06 have problems when trunking. Upgrade to 9.00.07 or higher.
 | 
			
		||||
ver: 1
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer2::C1900
 | 
			
		||||
 | 
			
		||||
device: wsc1900c,  wsc1900
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst 2900
 | 
			
		||||
note: IOS
 | 
			
		||||
macsuck: vlan
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer2::C2900
 | 
			
		||||
portmac: yes
 | 
			
		||||
note: !Pre IOS 11.2 (8) SA3 - PortMAC shows up in CAM table.
 | 
			
		||||
 | 
			
		||||
device: 2912MfXL, 2924CXL, 2924CXLv
 | 
			
		||||
 | 
			
		||||
device: 2908xl
 | 
			
		||||
note: !Pre IOS 11.2 (8.6) some features (duplex...) aren't present.
 | 
			
		||||
 | 
			
		||||
device: 2924MXL
 | 
			
		||||
ver: 1
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst 2940
 | 
			
		||||
note: IOS
 | 
			
		||||
macsuck: vlan
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer2::C2900
 | 
			
		||||
portmac: yes
 | 
			
		||||
 | 
			
		||||
device: 2940-8TT
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst 2950
 | 
			
		||||
note: IOS
 | 
			
		||||
macsuck: vlan
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer2::C2900
 | 
			
		||||
portmac: yes
 | 
			
		||||
 | 
			
		||||
device: 2950-t24
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst 2970
 | 
			
		||||
macsuck:vlan
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
note: Acts just like IOS Catalyst 6500 series
 | 
			
		||||
class: Layer3::C6500
 | 
			
		||||
 | 
			
		||||
device: 2960, 2970G-24T-E
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst 3500 XL
 | 
			
		||||
portmac: yes
 | 
			
		||||
macsuck: vlan
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
note: L2 only IOS devices - Just like Catalyst 2900 series from SNMP
 | 
			
		||||
note: IOS Version 12.0(5)XP is buggy and doesn't do VLAN Community indexing correctly.
 | 
			
		||||
class: Layer2::C2900
 | 
			
		||||
 | 
			
		||||
device: 3508GXL, 3524XL, 3548XL
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst 3550
 | 
			
		||||
macsuck: vlan
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer3::C3550
 | 
			
		||||
note: Run IOS
 | 
			
		||||
note: Has VLANs that don't accept SNMP connections.  Don't know if they are standard (by name or number).
 | 
			
		||||
note: Uses CISCO-STACK-MIB like Catalyst 5000 series for serial,duplex,type but not name
 | 
			
		||||
note: Comes in flavors that support L2, L3 or combo.
 | 
			
		||||
 | 
			
		||||
device: 3550-12T
 | 
			
		||||
 | 
			
		||||
device: 3400 w/ MetroBase Image
 | 
			
		||||
 | 
			
		||||
device: 3550, 3560, 3550-24, 3550-48
 | 
			
		||||
note: L2/L3 Switch
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: vlan
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst 3750
 | 
			
		||||
class: Layer3::C6500
 | 
			
		||||
 | 
			
		||||
device: 3750
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst Blade Switch 3xxx
 | 
			
		||||
macsuck: vlan
 | 
			
		||||
class: Layer3::C6500
 | 
			
		||||
note: Cisco Blade switches for Dell, FSC, HP and IBM blade system chassis. Limited testing done.
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst 4000
 | 
			
		||||
duplex: write
 | 
			
		||||
macsuck: vlan
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer2::Catalyst
 | 
			
		||||
note: Comes in IOS and CatOS versions like the 6k series.
 | 
			
		||||
note: !Reported problems with SNMP taking up all the CPU on older SW.  Requests take significantly longer.
 | 
			
		||||
note: !IOS Version 12.1.8a reported not to respond to BRIDGE-MIB calls.
 | 
			
		||||
 | 
			
		||||
device: wsc4003, wsc4006, wsc4503, wsc4506
 | 
			
		||||
 | 
			
		||||
device: wsc4912g
 | 
			
		||||
note: Dedicated 12 port gig-e switch
 | 
			
		||||
 | 
			
		||||
device: 4006
 | 
			
		||||
duplex: both
 | 
			
		||||
class: Layer3::C4000
 | 
			
		||||
note: !Has serious slowdown/timeout problems with SNMP
 | 
			
		||||
note: !IOS Software Release 12.2(20)EW or higher required for duplex support
 | 
			
		||||
 | 
			
		||||
device: 4503, 4506, 4507, 4510
 | 
			
		||||
duplex: both
 | 
			
		||||
class: Layer3::C4000
 | 
			
		||||
note: !Has serious slowdown/timeout problems with SNMP
 | 
			
		||||
note: !IOS Software Release 12.2(20)EW or higher required for duplex support
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst 5000
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer2::Catalyst
 | 
			
		||||
 | 
			
		||||
device: wsc2926
 | 
			
		||||
note: !Can give false information over SNMP at times.
 | 
			
		||||
 | 
			
		||||
device: wsc2948g, wsc2980g, wsc5500, wsc5505, wsc5509
 | 
			
		||||
 | 
			
		||||
device: wsc5000
 | 
			
		||||
note: !Has nasty tendency to not give you all SNMP data ,flaky for some older Catalyst versions.
 | 
			
		||||
 | 
			
		||||
device: wsx5302
 | 
			
		||||
arpnip: yes
 | 
			
		||||
class: Layer3
 | 
			
		||||
note: Router blade that runs IOS
 | 
			
		||||
 | 
			
		||||
device-family: Catalyst 6500
 | 
			
		||||
macsuck:vlan
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer3::C6500
 | 
			
		||||
note: Runs in two possible modes, native (IOS) and hybrid (IOS with CatOS on top).
 | 
			
		||||
note: Switch running Hybrid has WS-C in description field and loves L2::Catalyst class
 | 
			
		||||
note: Native Mode (IOS) versions seem to have SNMP problems with L2 data.
 | 
			
		||||
note: !Problem with IOS 12.2.17d-SXB ... upgrade to -SXB1 or higher.
 | 
			
		||||
note: !Sup720-3B and NativeIOS 12.2 (17d)SXB10 may report 127.0.0.51 as CDP neighbor address.
 | 
			
		||||
 | 
			
		||||
device: 6503, 6509, sp72033, s3223, s32p3, s222
 | 
			
		||||
note: Native mode (IOS) reports L2+L3
 | 
			
		||||
 | 
			
		||||
device: wsc6509
 | 
			
		||||
duplex: write
 | 
			
		||||
class: Layer2::Catalyst
 | 
			
		||||
note: Hybrid Mode (Catalyst) reports L2 only
 | 
			
		||||
 | 
			
		||||
device: 6kMsfc
 | 
			
		||||
class: Layer3
 | 
			
		||||
duplex: no
 | 
			
		||||
vlan: no
 | 
			
		||||
note: IOS portion of Hybrid mode.  VLAN and other L3 Services.
 | 
			
		||||
 | 
			
		||||
device: 6kMsfc2
 | 
			
		||||
class: Layer3
 | 
			
		||||
duplex: no
 | 
			
		||||
vlan: no
 | 
			
		||||
note: IOS portion of Hybrid mode.  VLAN and other L3 Services.
 | 
			
		||||
 | 
			
		||||
device-family: Voice Gateway
 | 
			
		||||
class: Layer3
 | 
			
		||||
duplex: no
 | 
			
		||||
 | 
			
		||||
device: VG200
 | 
			
		||||
 | 
			
		||||
device-family: Wireless Controllers
 | 
			
		||||
class: Layer2::Airespace
 | 
			
		||||
cdp:no
 | 
			
		||||
arpnip: no
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports.
 | 
			
		||||
note: Device will only communicate with SNMP version configured in the controller.
 | 
			
		||||
 | 
			
		||||
device: 2006, 4112, 4124, 4136, 4402, 4404
 | 
			
		||||
 | 
			
		||||
device-family: Firewall
 | 
			
		||||
class: Layer3::Cisco
 | 
			
		||||
device: PIX Security Appliance
 | 
			
		||||
device: Adaptive Security Applicance
 | 
			
		||||
 | 
			
		||||
device: Firewall Services Modules (FWSM)
 | 
			
		||||
note: !Arpnip only available for 4.x software releases.
 | 
			
		||||
class: Layer3::CiscoFWSM
 | 
			
		||||
arpnip: yes
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Cyclades
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Cyclades
 | 
			
		||||
class: Layer1::Cyclades
 | 
			
		||||
device-family: All
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Dell
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Dell
 | 
			
		||||
arpnip: no
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
cdp: no
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Dell
 | 
			
		||||
 | 
			
		||||
device-family: Dell PowerConnect 6000 Series
 | 
			
		||||
arpnip: yes
 | 
			
		||||
device: 6024F, 6224, 6248
 | 
			
		||||
 | 
			
		||||
device-family: Dell PowerConnect 5000 Series
 | 
			
		||||
device: 5324
 | 
			
		||||
 | 
			
		||||
device-family: Dell PowerConnect 3000 Series
 | 
			
		||||
device: 3348, 3448P, 3424, 3424P
 | 
			
		||||
 | 
			
		||||
device-family: IBM BladeCenter Ethernet Switch
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: Linksys 2048
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Enterasys
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Enterasys Networks
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
cdp: yes
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Enterasys
 | 
			
		||||
 | 
			
		||||
device-family: SuperStack C-Series
 | 
			
		||||
 | 
			
		||||
device: C3G124-24, C3G124-48, C2G124-24, C2G124-48
 | 
			
		||||
 | 
			
		||||
device-family: Matrix
 | 
			
		||||
 | 
			
		||||
device: Matrix N-Series DFE
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Extreme
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Extreme Networks
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
cdp: no
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Extreme
 | 
			
		||||
 | 
			
		||||
device-family: Alpine and Summit
 | 
			
		||||
 | 
			
		||||
device: Alpine 3808
 | 
			
		||||
device: Summit 7i, 48si
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# FreeBSD
 | 
			
		||||
#
 | 
			
		||||
device-vendor: FreeBSD
 | 
			
		||||
device-famly: Pf
 | 
			
		||||
class: Layer3::Pf
 | 
			
		||||
arpnip: yes
 | 
			
		||||
cdp: no
 | 
			
		||||
note: LLDP support might be available. See note in Layer3::Pf
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Foundry
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Foundry Networks
 | 
			
		||||
vlan: yes
 | 
			
		||||
modules: no
 | 
			
		||||
 | 
			
		||||
device-family: FastIron
 | 
			
		||||
class: Layer3::Foundry
 | 
			
		||||
ver: 1
 | 
			
		||||
note: Support very limited
 | 
			
		||||
 | 
			
		||||
device: FastIron 4802
 | 
			
		||||
 | 
			
		||||
device-family: EdgeIron
 | 
			
		||||
ver: 2
 | 
			
		||||
class: Layer3::Foundry
 | 
			
		||||
cdp: yes
 | 
			
		||||
duplex: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
device: EdgeIron 24G
 | 
			
		||||
note: Bug where spanning tree stuff loops forever when polled by SNMP.
 | 
			
		||||
 | 
			
		||||
device-family: IronWare
 | 
			
		||||
class: Layer3::Foundry
 | 
			
		||||
ver: 2
 | 
			
		||||
cdp: yes
 | 
			
		||||
note: FDP enabled.
 | 
			
		||||
duplex: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
arpnip: yes
 | 
			
		||||
device: FWSX424 
 | 
			
		||||
device: ServerIronGT
 | 
			
		||||
device: FLS624, FLS648
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# HP
 | 
			
		||||
#
 | 
			
		||||
device-vendor: HP
 | 
			
		||||
note: HP Devices are very widely supported.
 | 
			
		||||
ver: 2
 | 
			
		||||
modules: yes
 | 
			
		||||
 | 
			
		||||
device-family: HP ProCurve (old)
 | 
			
		||||
class:  Layer2::HP4000
 | 
			
		||||
duplex: both
 | 
			
		||||
macsuck: yes
 | 
			
		||||
arpnip: no
 | 
			
		||||
cdp: yes
 | 
			
		||||
vlan: write
 | 
			
		||||
note: devices in this class only have CDP support
 | 
			
		||||
note: VLAN info in HP-VLAN MIB
 | 
			
		||||
 | 
			
		||||
device: 1600M,2400,2424M,4000,8000
 | 
			
		||||
duplex: link
 | 
			
		||||
note: duplex issues?
 | 
			
		||||
 | 
			
		||||
device-family: HP ProCurve (recent)
 | 
			
		||||
class:  Layer2::HP
 | 
			
		||||
duplex: both
 | 
			
		||||
macsuck: yes
 | 
			
		||||
arpnip: no
 | 
			
		||||
cdp: yes
 | 
			
		||||
vlan: write
 | 
			
		||||
note: old firmware versions only have CDP support, more recent have LLDP
 | 
			
		||||
note: VLAN info in Q-BRIDGE-MIB
 | 
			
		||||
 | 
			
		||||
device: 2312,2324,2512,2524
 | 
			
		||||
ver: 1
 | 
			
		||||
 | 
			
		||||
device: 2510,2600,2610,2800,2810,2900,2910al
 | 
			
		||||
device: 3124,3324XL,3400cl,3500,3500yl
 | 
			
		||||
device: 4100GL,4200vl,5300XL,5400yy,5400zl
 | 
			
		||||
device: 6108,6200yl,6400cl,6410cl,6600,6600ml,8200zl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Juniper
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Juniper
 | 
			
		||||
arpnip: yes
 | 
			
		||||
 | 
			
		||||
device-family: M-series router
 | 
			
		||||
class: Layer3::Juniper
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
device-family: NetScreen
 | 
			
		||||
class: Layer3::Netscreen
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Linksys
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Linksys
 | 
			
		||||
device-family: Generic L2 Device
 | 
			
		||||
class: Layer2
 | 
			
		||||
device: Some
 | 
			
		||||
 | 
			
		||||
device-family: Generic L3 Device
 | 
			
		||||
class: Layer3
 | 
			
		||||
device: Some
 | 
			
		||||
 | 
			
		||||
device-family: 2048
 | 
			
		||||
class: Layer3::Dell
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Microsoft
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Microsoft
 | 
			
		||||
device-family: Windows
 | 
			
		||||
class: Layer3::Microsoft
 | 
			
		||||
device: Windows Router
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Netgear
 | 
			
		||||
#
 | 
			
		||||
device-vendor: NetGear
 | 
			
		||||
device-family: Switches
 | 
			
		||||
class: Layer2::Netgear
 | 
			
		||||
device: All
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# NetScreen
 | 
			
		||||
#
 | 
			
		||||
device-vendor: NetScreen
 | 
			
		||||
note: See Juniper
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Net-SNMP
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Net-SNMP
 | 
			
		||||
class: Layer3
 | 
			
		||||
ver: 2
 | 
			
		||||
 | 
			
		||||
device-family: Linux
 | 
			
		||||
note: net-snmp 4.x agent and 5.x agent.
 | 
			
		||||
device:  Linux routers
 | 
			
		||||
 | 
			
		||||
device-family: BSD
 | 
			
		||||
device:  BSD routers
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# NORTEL
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Nortel
 | 
			
		||||
macsuck: yes
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
note: SONMP Discovery Protocol Supported
 | 
			
		||||
 | 
			
		||||
device-family: BayStack Hub
 | 
			
		||||
duplex: both
 | 
			
		||||
ver: 1
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer1::Bayhub
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.
 | 
			
		||||
note: !Requires Advanced or Advanced Analyzer NMM
 | 
			
		||||
 | 
			
		||||
device: 102
 | 
			
		||||
 | 
			
		||||
device: System 5000
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Switch/Baystack Switch
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Baystack
 | 
			
		||||
 | 
			
		||||
device: 303, 304, 350, 380, 410, 420, 425, 460, 470
 | 
			
		||||
 | 
			
		||||
device: 450
 | 
			
		||||
note: !Some versions > 4.X in stacked configuration have SNMP timeout issues. 
 | 
			
		||||
note: Labels full duplex as 20Mbit connection.
 | 
			
		||||
 | 
			
		||||
device: Business Policy Switch (BPS)
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch/Baystack Switch
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Baystack
 | 
			
		||||
 | 
			
		||||
device: 3510
 | 
			
		||||
 | 
			
		||||
device: 2526,2550
 | 
			
		||||
 | 
			
		||||
device: 4524,4526,4548,4550
 | 
			
		||||
 | 
			
		||||
device: 5510,5520,5530
 | 
			
		||||
 | 
			
		||||
device-family: Business Ethernet Switch
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::Baystack
 | 
			
		||||
 | 
			
		||||
device: 50,110,120,210,220,1010,1020 
 | 
			
		||||
 | 
			
		||||
device-family: Centillion
 | 
			
		||||
duplex: both
 | 
			
		||||
vlan: yes
 | 
			
		||||
class: Layer2::Centillion
 | 
			
		||||
note: !Must be on version 4.x or 5.x (VLAN based) software.
 | 
			
		||||
 | 
			
		||||
device: 5000BH, 5005BH
 | 
			
		||||
device: C50,C100
 | 
			
		||||
 | 
			
		||||
device-family: AP222x
 | 
			
		||||
duplex: both
 | 
			
		||||
modules: no
 | 
			
		||||
class: Layer2::NAP222x
 | 
			
		||||
note: !Upgrade to version 1.3 or higher.
 | 
			
		||||
note: Sends out topology packets if enabled but does not build neighbor table.
 | 
			
		||||
 | 
			
		||||
device: AP-2220, AP-2221
 | 
			
		||||
 | 
			
		||||
device-family: Alteon AD
 | 
			
		||||
arpnip: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
cdp: no
 | 
			
		||||
vlan: yes
 | 
			
		||||
modules: no
 | 
			
		||||
class: Layer3::AlteonAD
 | 
			
		||||
note: !Some versions have issues with continuous SNMP polling. Upgrade to 10.0.30.7 or higher.
 | 
			
		||||
 | 
			
		||||
device: AD2,AD3,AD4
 | 
			
		||||
 | 
			
		||||
device: 180,183,184
 | 
			
		||||
 | 
			
		||||
device-family: Multiprotocol Router/BayRS
 | 
			
		||||
arpnip: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
cdp: no
 | 
			
		||||
vlan: yes
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::BayRS
 | 
			
		||||
 | 
			
		||||
device: AN,ARN,ASN,BLN,BCN
 | 
			
		||||
 | 
			
		||||
device: 2430,5430
 | 
			
		||||
 | 
			
		||||
device-family: VPN Router/Contivity
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: no
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: no
 | 
			
		||||
cdp: no
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Contivity
 | 
			
		||||
 | 
			
		||||
device: 100,400,600
 | 
			
		||||
 | 
			
		||||
device: 1000,1010,1050
 | 
			
		||||
 | 
			
		||||
device: 1500,1600,1700,1740,1750
 | 
			
		||||
 | 
			
		||||
device: 2500,2600,2700
 | 
			
		||||
 | 
			
		||||
device: 4500,4600,5000
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch/Passport/Accelar LAN
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
vlan: write
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer3::Passport
 | 
			
		||||
note: !8600 Code versions < 3.2 vlan based mac-suck and are unsupported.  Upgrade code.
 | 
			
		||||
note: !8600 3.2 code versions < 3.2.2.2 have Bridge MIB loop.  Upgrade code.
 | 
			
		||||
 | 
			
		||||
device: 8603,8606,8610, 8610co, 8106, 8110
 | 
			
		||||
 | 
			
		||||
device: 1050,1100,1150,1200
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch/Passport 1600 (Software < 2.1)
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer3::N1600
 | 
			
		||||
 | 
			
		||||
device: 1612,1624,1648
 | 
			
		||||
 | 
			
		||||
device-family: Ethernet Routing Switch/Passport 1600 (Software >= 2.1)
 | 
			
		||||
arpnip: yes
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: write
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
vlan: write
 | 
			
		||||
class: Layer3::Passport
 | 
			
		||||
 | 
			
		||||
device: 1612,1624,1648
 | 
			
		||||
 | 
			
		||||
device-family: Synoptics
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
ver: 1
 | 
			
		||||
class: Layer1::S3000
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.
 | 
			
		||||
note: !Requires Advanced or Advanced Analyzer NMM
 | 
			
		||||
 | 
			
		||||
device: 281X
 | 
			
		||||
 | 
			
		||||
device: System 3000
 | 
			
		||||
 | 
			
		||||
device-family: Wireless Switch 2270
 | 
			
		||||
arpnip: no
 | 
			
		||||
macsuck: yes
 | 
			
		||||
portmac: yes
 | 
			
		||||
duplex: both
 | 
			
		||||
cdp: proprietary
 | 
			
		||||
modules: yes
 | 
			
		||||
class: Layer2::N2270
 | 
			
		||||
note: Uses proprietary MIBs to provide MAC to port mapping.  APs appear as switch ports.
 | 
			
		||||
 | 
			
		||||
device: 2270
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Proxim
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Proxim
 | 
			
		||||
macsuck: yes
 | 
			
		||||
duplex: no
 | 
			
		||||
cdp: no
 | 
			
		||||
class: Layer2::Orinoco
 | 
			
		||||
 | 
			
		||||
device-family: Orinoco
 | 
			
		||||
 | 
			
		||||
device: AP-1000,AP-2000,AP-4000
 | 
			
		||||
 | 
			
		||||
device: WavePOINT-II
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Sun
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Sun
 | 
			
		||||
class: Layer3::Sun
 | 
			
		||||
 | 
			
		||||
device-family: Sun routers
 | 
			
		||||
 | 
			
		||||
device: Sun routers
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Synoptics
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Synoptics
 | 
			
		||||
note: See Nortel
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Zyxel
 | 
			
		||||
#
 | 
			
		||||
device-vendor: Zyxel
 | 
			
		||||
class: Layer2::ZyXEL_DSLAM
 | 
			
		||||
note: Doesn't report sysServices (layers)
 | 
			
		||||
 | 
			
		||||
device-family: Zyxel DSLAM
 | 
			
		||||
 | 
			
		||||
device:AAM10008-61, AAM1008-63
 | 
			
		||||
@@ -1,492 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer2::Bay
 | 
			
		||||
# $Id$
 | 
			
		||||
# This module depricated.  See Layer2::BayStack
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2002,2003 Regents of the University of California
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Bay;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Bay::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Bay::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    'cdp_id'  => 's5EnMsTopIpAddr',
 | 
			
		||||
    'cdp_run' => 's5EnMsTopStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    'imac2' => 'ifPhysAddress',
 | 
			
		||||
 | 
			
		||||
    # S5-ETH-MULTISEG-TOPOLOGY-MIB::s5EnMsTopNmmTable
 | 
			
		||||
    'bay_topo_slot'     => 's5EnMsTopNmmSlot',
 | 
			
		||||
    'bay_topo_port'     => 's5EnMsTopNmmPort',
 | 
			
		||||
    'bay_topo_ip'       => 's5EnMsTopNmmIpAddr',
 | 
			
		||||
    'bay_topo_seg'      => 's5EnMsTopNmmSegId',
 | 
			
		||||
    'bay_topo_mac'      => 's5EnMsTopNmmMacAddr',
 | 
			
		||||
    'bay_topo_platform' => 's5EnMsTopNmmChassisType',
 | 
			
		||||
    'bay_topo_localseg' => 's5EnMsTopNmmLocalSeg',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    'SYNOPTICS-ROOT-MIB'           => 'synoptics',
 | 
			
		||||
    'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop'
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
delete $MIBS{'CISCO-CDP-MIB'};
 | 
			
		||||
 | 
			
		||||
# 450's report full duplex as speed = 20mbps?!
 | 
			
		||||
$SNMP::Info::SPEED_MAP{20_000_000}  = '10 Mbps';
 | 
			
		||||
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, 'i_mac2' => \&SNMP::Info::munge_mac, );
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'bay';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $bay   = shift;
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # 303 / 304
 | 
			
		||||
    if ( $descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # 450
 | 
			
		||||
    if ( $descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_bin {
 | 
			
		||||
    my $bay   = shift;
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    # 303 / 304
 | 
			
		||||
    if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # 450
 | 
			
		||||
    if ( $descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
 | 
			
		||||
    # or nortel, or synopsis?
 | 
			
		||||
    return 'bay';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $bay   = shift;
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
 | 
			
		||||
    my $i_type = $bay->i_type();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$i_type ) {
 | 
			
		||||
        my $type = $i_type->{$if};
 | 
			
		||||
        $i_ignore{$if}++ if $type =~ /(loopback|propvirtual|cpu)/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $bay     = shift;
 | 
			
		||||
    my $i_index = $bay->i_index();
 | 
			
		||||
 | 
			
		||||
    return $i_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $bay   = shift;
 | 
			
		||||
    my $i_mac = $bay->i_mac2();
 | 
			
		||||
 | 
			
		||||
    # Bay 303's with a hw rev < 2.11.4.5 report the mac as all zeros
 | 
			
		||||
    foreach my $iid ( keys %$i_mac ) {
 | 
			
		||||
        my $mac = $i_mac->{$iid};
 | 
			
		||||
        delete $i_mac->{$iid} if $mac eq '00:00:00:00:00:00';
 | 
			
		||||
    }
 | 
			
		||||
    return $i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $bay = shift;
 | 
			
		||||
    my $id  = $bay->id();
 | 
			
		||||
    return unless defined $id;
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
    $model =~ s/^sreg-//i;
 | 
			
		||||
 | 
			
		||||
    my $descr = $bay->description();
 | 
			
		||||
 | 
			
		||||
    return '303' if ( $descr =~ /\D303\D/ );
 | 
			
		||||
    return '304' if ( $descr =~ /\D304\D/ );
 | 
			
		||||
    return '450' if ( $model =~ /BayStack450/ );
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Hack in some CDP type stuff
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $bay           = shift;
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $entry ( keys %$bay_topo_port ) {
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
        $c_if{"$port.1"} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $bay           = shift;
 | 
			
		||||
    my $bay_topo_ip   = $bay->bay_topo_ip();
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
    my $ip            = $bay->cdp_ip();
 | 
			
		||||
 | 
			
		||||
    # Count the number of devices seen on each port.
 | 
			
		||||
    #   more than one device seen means connected to a non-bay
 | 
			
		||||
    #   device, but other bay devices are squawking further away.
 | 
			
		||||
    my %ip_port;
 | 
			
		||||
    foreach my $entry ( keys %$bay_topo_ip ) {
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if ( $port =~ /^[\d\.]+$/ and $port == 0 );
 | 
			
		||||
        my $ip = $bay_topo_ip->{$entry};
 | 
			
		||||
        push( @{ $ip_port{$port} }, $ip );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $port ( keys %ip_port ) {
 | 
			
		||||
        my $ips = $ip_port{$port};
 | 
			
		||||
        if ( scalar @$ips == 1 ) {
 | 
			
		||||
            $c_ip{"$port.1"} = $ips->[0];
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $c_ip{"$port.1"} = $ips;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $bay           = shift;
 | 
			
		||||
    my $bay_topo_port = $bay->bay_topo_port();
 | 
			
		||||
    my $bay_topo_seg  = $bay->bay_topo_seg();
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $entry ( keys %$bay_topo_seg ) {
 | 
			
		||||
        my $port = $bay_topo_port->{$entry};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
 | 
			
		||||
        # For fake remotes (multiple IPs for a c_ip), use first found
 | 
			
		||||
        next if defined $c_port{"$port.1"};
 | 
			
		||||
 | 
			
		||||
        my $seg = $bay_topo_seg->{$entry};
 | 
			
		||||
 | 
			
		||||
        # Segment id is (256 * remote slot_num) + (remote_port)
 | 
			
		||||
        my $remote_port = $seg % 256;
 | 
			
		||||
 | 
			
		||||
        $c_port{"$port.1"} = $remote_port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $bay               = shift;
 | 
			
		||||
    my $bay_topo_port     = $bay->bay_topo_port();
 | 
			
		||||
    my $bay_topo_platform = $bay->bay_topo_platform();
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $entry ( keys %$bay_topo_platform ) {
 | 
			
		||||
        my $port = $bay_topo_port->{$entry} || 0;
 | 
			
		||||
        next if $port == 0;
 | 
			
		||||
 | 
			
		||||
        # For fake remotes (multiple IPs for a c_ip), use first found
 | 
			
		||||
        next if defined $c_platform{"$port.1"};
 | 
			
		||||
 | 
			
		||||
        my $platform = $bay_topo_platform->{$entry};
 | 
			
		||||
 | 
			
		||||
        $c_platform{"$port.1"} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Bay - SNMP Interface to old Bay Network BayStack Switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
This module is Deprecated.  Please use Layer2::BayStack instead.
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a 
 | 
			
		||||
Bay device through SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $bay = new SNMP::Info::Layer2::Bay(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<SYNOPTICS-ROOT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<S5-ETH-MULTISEG-TOPOLOGY-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited classes
 | 
			
		||||
 | 
			
		||||
MIBs required by L<SNMP::Info::Layer2/"Required MIBs"> and its superclasses.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'bay' :)
 | 
			
		||||
 | 
			
		||||
=item $bay->model()
 | 
			
		||||
 | 
			
		||||
Cross references $bay->id() to the F<SYNOPTICS-MIB> and returns
 | 
			
		||||
the results.  303s and 304s have the same ID, so we have a hack
 | 
			
		||||
to return depending on which it is. 
 | 
			
		||||
 | 
			
		||||
Removes C<sreg-> from the model name
 | 
			
		||||
 | 
			
		||||
=item $baystack->os()
 | 
			
		||||
 | 
			
		||||
Returns 'bay'.
 | 
			
		||||
 | 
			
		||||
=item $bay->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the os version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $bay->os_bin()
 | 
			
		||||
 | 
			
		||||
Returns the firmware version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $bay->cdp_id()
 | 
			
		||||
 | 
			
		||||
Returns the IP that the device is sending out for its Nmm topology info.
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $bay->cdp_run()
 | 
			
		||||
 | 
			
		||||
Returns if the F<S5-ETH-MULTISEG-TOPOLOGY> info is on for this device. 
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopStatus>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to physical ports. 
 | 
			
		||||
 | 
			
		||||
Currently simply returns the C<ifIndex>
 | 
			
		||||
 | 
			
		||||
=item $bay->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to ignore.
 | 
			
		||||
 | 
			
		||||
Simply calls the SNMP::Info::Layer2::i_ignore() for this.
 | 
			
		||||
 | 
			
		||||
=item $bay->i_mac()
 | 
			
		||||
 | 
			
		||||
Returns the C<ifPhysAddress> table entries. 
 | 
			
		||||
 | 
			
		||||
Removes all entries matching '00:00:00:00:00:00' -- Certain 
 | 
			
		||||
older revisions of Bay 303 and 304 firmware report all zeros
 | 
			
		||||
for each port mac.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Pseudo CDP information
 | 
			
		||||
 | 
			
		||||
All entries with port=0 are local and ignored.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: port.1 Value: port (iid)
 | 
			
		||||
 | 
			
		||||
=item $bay->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: port.1 
 | 
			
		||||
 | 
			
		||||
The value of each hash entry can either be a scalar or an array.
 | 
			
		||||
A scalar value is most likely a direct neighbor to that port. 
 | 
			
		||||
It is possible that there is a non-bay device in between this device and the
 | 
			
		||||
remote device.
 | 
			
		||||
 | 
			
		||||
An array value represents a list of seen devices.  The only time you will get
 | 
			
		||||
an array of neighbors, is if there is a non-bay device in between two or more
 | 
			
		||||
devices. 
 | 
			
		||||
 | 
			
		||||
Use the data from the Layer2 Topology Table below to dig deeper.
 | 
			
		||||
 | 
			
		||||
=item $bay->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: IID, Value: Remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $bay->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: IID, Value: Remote device type
 | 
			
		||||
 | 
			
		||||
=item $bay->port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: port.1 Value: port
 | 
			
		||||
 | 
			
		||||
=item $bay->platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: port.1 Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Layer2 Topology info (C<s5EnMsTopNmmTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_slot()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:slot number
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmSlot>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Port Number
 | 
			
		||||
(interface iid)
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmPort>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote IP address of entry
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmIpAddr>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_seg()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote Segment ID
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmSegId>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_mac
 | 
			
		||||
(C<s5EnMsTopNmmMacAddr>)
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote MAC address
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_platform
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Remote Device Type
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmChassisType>)
 | 
			
		||||
 | 
			
		||||
=item $bay->bay_topo_localseg
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: Table entry, Value:Boolean, if bay_topo_seg()
 | 
			
		||||
is local
 | 
			
		||||
 | 
			
		||||
(C<s5EnMsTopNmmLocalSeg>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,349 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry Switches
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Max Baker
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Foundry;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::FDP;
 | 
			
		||||
use SNMP::Info::EtherLike;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Foundry::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer2 SNMP::Info::FDP SNMP::Info::EtherLike
 | 
			
		||||
    SNMP::Info::MAU    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Foundry::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,    %SNMP::Info::FDP::MIBS,
 | 
			
		||||
    %SNMP::Info::EtherLike::MIBS, %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    'FOUNDRY-SN-ROOT-MIB' => 'foundry',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,    %SNMP::Info::FDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::EtherLike::GLOBALS, %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,    %SNMP::Info::FDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::EtherLike::FUNCS, %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    'test' => 'dot1dStpPortState',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,    %SNMP::Info::FDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::EtherLike::MUNGE, %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
 | 
			
		||||
#sub bulkwalk_no { 1;}
 | 
			
		||||
 | 
			
		||||
*SNMP::Info::Layer2::Foundry::i_duplex = \&SNMP::Info::MAU::mau_i_duplex;
 | 
			
		||||
*SNMP::Info::Layer2::Foundry::i_duplex_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_duplex_admin;
 | 
			
		||||
*SNMP::Info::Layer2::Foundry::i_vlan = \&SNMP::Info::Bridge::qb_i_vlan_t;
 | 
			
		||||
 | 
			
		||||
# todo doc these
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_name = $foundry->e_name();
 | 
			
		||||
 | 
			
		||||
    # find entity table entry for "stackmanaget.1"
 | 
			
		||||
    my $unit_iid = undef;
 | 
			
		||||
    foreach my $e ( keys %$e_name ) {
 | 
			
		||||
        my $name = $e_name->{$e} || '';
 | 
			
		||||
        $unit_iid = $e if $name eq 'stackmanaget.1';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Default to OID method if no dice.
 | 
			
		||||
    unless ( defined $unit_iid ) {
 | 
			
		||||
        return $foundry->SUPER::model();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Find Model Name
 | 
			
		||||
    my $e_fwver = $foundry->e_fwver();
 | 
			
		||||
    if ( defined $e_fwver->{$unit_iid} ) {
 | 
			
		||||
        return $e_fwver->{$unit_iid};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Not found in ENTITY-MIB, go up a level.
 | 
			
		||||
    return $foundry->SUPER::os_ver();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_name = $foundry->e_name();
 | 
			
		||||
 | 
			
		||||
    # find entity table entry for "unit.1"
 | 
			
		||||
    my $unit_iid = undef;
 | 
			
		||||
    foreach my $e ( keys %$e_name ) {
 | 
			
		||||
        my $name = $e_name->{$e} || '';
 | 
			
		||||
        $unit_iid = $e if $name eq 'unit.1';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Default to OID method if no dice.
 | 
			
		||||
    unless ( defined $unit_iid ) {
 | 
			
		||||
        return $foundry->SUPER::model();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Find Model Name
 | 
			
		||||
    my $e_model = $foundry->e_model();
 | 
			
		||||
    if ( defined $e_model->{$unit_iid} ) {
 | 
			
		||||
        return $e_model->{$unit_iid};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Not found in ENTITY-MIB, go up a level.
 | 
			
		||||
    return $foundry->SUPER::model();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    my $e_name = $foundry->e_name();
 | 
			
		||||
 | 
			
		||||
    # find entity table entry for "unit.1"
 | 
			
		||||
    my $unit_iid = undef;
 | 
			
		||||
    foreach my $e ( keys %$e_name ) {
 | 
			
		||||
        my $name = $e_name->{$e} || '';
 | 
			
		||||
        $unit_iid = $e if $name eq 'unit.1';
 | 
			
		||||
    }
 | 
			
		||||
    return unless defined $unit_iid;
 | 
			
		||||
 | 
			
		||||
    # Look up serial of found entry.
 | 
			
		||||
    my $e_serial = $foundry->e_serial();
 | 
			
		||||
    return $e_serial->{$unit_iid} if defined $e_serial->{$unit_iid};
 | 
			
		||||
 | 
			
		||||
    return $foundry->SUPER::serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $i_descr = $foundry->i_description;
 | 
			
		||||
    my $i_name  = $foundry->i_name;
 | 
			
		||||
 | 
			
		||||
    # use ifName only if it is in portn
 | 
			
		||||
    #   format.  For EdgeIrons
 | 
			
		||||
    # else use ifDescr
 | 
			
		||||
    foreach my $iid ( keys %$i_name ) {
 | 
			
		||||
        my $name = $i_name->{$iid};
 | 
			
		||||
        next unless defined $name;
 | 
			
		||||
        $i_descr->{$iid} = $name
 | 
			
		||||
            if $name =~ /^port\d+/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $i_type  = $foundry->i_type();
 | 
			
		||||
 | 
			
		||||
    my %i_ignore = ();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$i_type ) {
 | 
			
		||||
        my $type = $i_type->{$iid} || '';
 | 
			
		||||
        $i_ignore{$iid}++
 | 
			
		||||
 | 
			
		||||
            # 33 is the console port
 | 
			
		||||
            if $type =~ /(loopback|propvirtual|other|cpu|33)/i;
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'foundry';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'foundry';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# this hangs on a edgeiron24g
 | 
			
		||||
# TODO: check by devicetype and deferr to SUPER if not bad device
 | 
			
		||||
sub stp_p_state { return; }
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry FastIron Network
 | 
			
		||||
Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
This module is Deprecated.  Please use Layer3::Foundry instead.
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $foundry = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $foundry->class();
 | 
			
		||||
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This module is Deprecated.  Please use Layer3::Foundry instead.
 | 
			
		||||
 | 
			
		||||
This module provides support for Foundry EdgeIron Switches
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::FDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<FOUNDRY-SN-ROOT-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See classes listed above for their required MIBs.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.
 | 
			
		||||
 | 
			
		||||
=item $foundry->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'foundry'
 | 
			
		||||
 | 
			
		||||
=item $foundry->os()
 | 
			
		||||
 | 
			
		||||
Returns 'foundry'
 | 
			
		||||
 | 
			
		||||
=item $foundry->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version
 | 
			
		||||
 | 
			
		||||
=item $foundry->serial()
 | 
			
		||||
 | 
			
		||||
Returns the serial number
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::FDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface names to iids.
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interfaces to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores interfaces with descriptions of  tunnel,loopback,null 
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface link duplex status. 
 | 
			
		||||
 | 
			
		||||
Crosses $foundry->sw_duplex() with $foundry->sw_index()
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface administrative duplex status. 
 | 
			
		||||
 | 
			
		||||
=item $foundry->stp_p_state()
 | 
			
		||||
 | 
			
		||||
"The port's current state as defined by application of the Spanning Tree
 | 
			
		||||
Protocol.
 | 
			
		||||
 | 
			
		||||
Skipped if device is an EdgeIron 24G due to reports of hangs.
 | 
			
		||||
 | 
			
		||||
(C<dot1dStpPortState>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::FDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,648 +0,0 @@
 | 
			
		||||
# 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 = '2.05';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
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) || {};
 | 
			
		||||
 | 
			
		||||
    my %bp_index;
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
        my $index = $i_index->{$iid};
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
 | 
			
		||||
        $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 %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 %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
 | 
			
		||||
@@ -1,674 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer3::C3550
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
# Copyright (c) 2004 Regents of the University of California
 | 
			
		||||
# 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::C3550;
 | 
			
		||||
 | 
			
		||||
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/;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
# 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::LLDP::MIBS,               %SNMP::Info::CDP::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::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::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::LLDP::FUNCS,               %SNMP::Info::CDP::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::LLDP::MUNGE,               %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MUNGE,         %SNMP::Info::CiscoStpExtensions::MUNGE, 
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $c3550 = shift;
 | 
			
		||||
    my $id    = $c3550->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id) || $id;
 | 
			
		||||
    $model =~ s/^catalyst//;
 | 
			
		||||
 | 
			
		||||
    # turn 355048 into 3550-48
 | 
			
		||||
    if ( $model =~ /^(35\d\d)(\d\d(T|G)?)$/ ) {
 | 
			
		||||
        $model = "$1-$2";
 | 
			
		||||
    }
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Ports is encoded into the model number
 | 
			
		||||
sub ports {
 | 
			
		||||
    my $c3550 = shift;
 | 
			
		||||
 | 
			
		||||
    my $id    = $c3550->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    if ( $model =~ /(12|24|48)(C|T|TS|G|TS-E|TS-S|T-E)?$/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use CDP and/or LLDP
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $c3550 = shift;
 | 
			
		||||
    return $c3550->hasLLDP() || $c3550->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $c3550      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $c3550->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $c3550->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $c3550      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $c3550->SUPER::c_if($partial)  || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # We need to match the lldp key with the ifIndex
 | 
			
		||||
    # via lldpLocPortId and ifName
 | 
			
		||||
    my $i_name = $c3550->ifName($partial) || {};
 | 
			
		||||
    my $i_name_rev = {};
 | 
			
		||||
    while ( my($key,$val) = each %$i_name ){
 | 
			
		||||
	$i_name_rev->{$val} = $key;
 | 
			
		||||
    }
 | 
			
		||||
    my $loc_port_id = $c3550->lldpLocPortId($partial) || {};
 | 
			
		||||
    my $lldp = $c3550->lldp_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid} || next;
 | 
			
		||||
	my $name = $loc_port_id->{$if} || next;
 | 
			
		||||
	my $i_index = $i_name_rev->{$name} || next;
 | 
			
		||||
        $c_if{$iid} = $i_index;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $c3550   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $c3550->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $c3550->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $c3550   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $c3550->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $c3550->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
	my $id = $lldp->{$iid};
 | 
			
		||||
	next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
	$c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $c3550      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $c3550->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $c3550->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::C3550 - SNMP Interface to Cisco Catalyst 3550 Layer 2/3
 | 
			
		||||
Switches running IOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
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 to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $c3550->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Cisco Catalyst 3550 Layer 2/3 Switches.  
 | 
			
		||||
 | 
			
		||||
These devices run IOS but have some of the same characteristics as the
 | 
			
		||||
Catalyst WS-C family (5xxx,6xxx).  For example, forwarding tables are held in
 | 
			
		||||
VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $c3550 = new SNMP::Info::Layer3::C3550(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=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 Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c3550->vendor()
 | 
			
		||||
 | 
			
		||||
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 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the firmware version Cisco devices may support Link Layer Discovery 
 | 
			
		||||
Protocol (LLDP) in addition to Cisco Discovery Protocol (CDP).  These methods
 | 
			
		||||
will query both and return the combination of all information.  As a result,
 | 
			
		||||
there may be identical topology information returned from the two protocols
 | 
			
		||||
causing duplicate entries.  It is the calling program's responsibility to
 | 
			
		||||
identify any duplicate entries and remove duplicates if necessary.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c3550->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either CDP or LLDP.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
 | 
			
		||||
=over 
 | 
			
		||||
 | 
			
		||||
=item $c3550->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $c3550->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP device in between two
 | 
			
		||||
or more devices or multiple devices which are not directly connected.  
 | 
			
		||||
 | 
			
		||||
Use the data from the Layer2 Topology Table below to dig deeper.
 | 
			
		||||
 | 
			
		||||
=item $c3550->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $c3550->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $c3550->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back 
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c3550->i_duplex()
 | 
			
		||||
 | 
			
		||||
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()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to administrative duplex setting.
 | 
			
		||||
 | 
			
		||||
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().
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStack> for its i_duplex() and p_duplex() methods.
 | 
			
		||||
 | 
			
		||||
=item $c3550->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 $c3550->p_port() with $c3550->p_duplex() to utilize port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
    Example:
 | 
			
		||||
    my %if_map = reverse %{$c3550->interfaces()};
 | 
			
		||||
    $c3550->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) 
 | 
			
		||||
        or die "Couldn't change port duplex. ",$c3550->error(1);
 | 
			
		||||
 | 
			
		||||
=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::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
 | 
			
		||||
@@ -1,667 +0,0 @@
 | 
			
		||||
# SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry 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
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::Foundry;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::FDP;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Foundry::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
%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 = (
 | 
			
		||||
    %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,
 | 
			
		||||
 | 
			
		||||
    # FOUNDRY-SN-SWITCH-GROUP-MIB
 | 
			
		||||
    # snSwPortInfoTable - Switch Port Information Group
 | 
			
		||||
    'sw_index'  => 'snSwPortIfIndex',
 | 
			
		||||
    'sw_duplex' => 'snSwPortInfoChnMode',
 | 
			
		||||
    'sw_type'   => 'snSwPortInfoMediaType',
 | 
			
		||||
    'sw_speed'  => 'snSwPortInfoSpeed',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::FDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $foundry->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 $foundry = shift;
 | 
			
		||||
    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};
 | 
			
		||||
        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 $foundry = shift;
 | 
			
		||||
    my $id      = $foundry->id();
 | 
			
		||||
    my $model   = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    # 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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'foundry';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'foundry';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    return $foundry->snAgImgVer() if ( defined $foundry->snAgImgVer() );
 | 
			
		||||
 | 
			
		||||
    # 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};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Last resort
 | 
			
		||||
    return $foundry->SUPER::os_ver();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    # Return chassis serial number if available
 | 
			
		||||
    return $foundry->snChasSerNum() if ( $foundry->snChasSerNum() );
 | 
			
		||||
 | 
			
		||||
    # 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) || {};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use FDP and/or LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
 | 
			
		||||
    return $foundry->hasLLDP() || $foundry->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $foundry->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $foundry->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $foundry->lldp_if($partial)     || {};
 | 
			
		||||
    my $cdp  = $foundry->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $foundry->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $foundry->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $foundry->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $foundry->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $id = $lldp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $foundry = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $foundry->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $foundry->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::Layer3::Foundry - SNMP Interface to Foundry Network Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $foundry = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 1
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $foundry->class();
 | 
			
		||||
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Foundry Networks devices.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
 my $foundry = new SNMP::Info::Layer3::Foundry(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::FDP;
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<FOUNDRY-SN-ROOT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<FOUNDRY-SN-AGENT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<FOUNDRY-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 $foundry->model()
 | 
			
		||||
 | 
			
		||||
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'
 | 
			
		||||
 | 
			
		||||
=item $foundry->os()
 | 
			
		||||
 | 
			
		||||
Returns 'foundry'
 | 
			
		||||
 | 
			
		||||
=item $foundry->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version
 | 
			
		||||
 | 
			
		||||
=item $foundry->mac()
 | 
			
		||||
 | 
			
		||||
Returns MAC Address of root port.
 | 
			
		||||
 | 
			
		||||
(C<ifPhysAddress.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->chassis()
 | 
			
		||||
 | 
			
		||||
Returns Chassis type.
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalDescr.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number of device.
 | 
			
		||||
 | 
			
		||||
=item $foundry->temp()
 | 
			
		||||
 | 
			
		||||
Returns the chassis temperature
 | 
			
		||||
 | 
			
		||||
(C<snChasActualTemperature>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->ps1_type()
 | 
			
		||||
 | 
			
		||||
Returns the Description for the power supply
 | 
			
		||||
 | 
			
		||||
(C<snChasPwrSupplyDescription.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns the status of the power supply.
 | 
			
		||||
 | 
			
		||||
(C<snChasPwrSupplyOperStatus.1>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->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 $foundry->interfaces()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface names to iids.
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interfaces to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores interfaces with descriptions of  tunnel,loopback,null 
 | 
			
		||||
 | 
			
		||||
=item $foundry->i_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of interface link duplex status. 
 | 
			
		||||
 | 
			
		||||
Crosses $foundry->sw_duplex() with $foundry->sw_index()
 | 
			
		||||
 | 
			
		||||
=item $foundry->stp_p_state()
 | 
			
		||||
 | 
			
		||||
"The port's current state as defined by application of the Spanning Tree
 | 
			
		||||
Protocol.
 | 
			
		||||
 | 
			
		||||
Skipped if device is an EdgeIron 24G due to reports of hangs.
 | 
			
		||||
 | 
			
		||||
(C<dot1dStpPortState>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Foundry Switch Port Information Table (C<snSwPortIfTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps Table to Interface IID. 
 | 
			
		||||
 | 
			
		||||
(C<snSwPortIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_duplex()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.   Current duplex status for switch ports. 
 | 
			
		||||
 | 
			
		||||
(C<snSwPortInfoChnMode>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current Port Type .
 | 
			
		||||
 | 
			
		||||
(C<snSwPortInfoMediaType>)
 | 
			
		||||
 | 
			
		||||
=item $foundry->sw_speed()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current Port Speed. 
 | 
			
		||||
 | 
			
		||||
(C<snSwPortInfoSpeed>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the software version devices may support Foundry Discovery
 | 
			
		||||
Protocol (FDP) and Link Layer Discovery Protocol (LLDP). These
 | 
			
		||||
methods will query both and return the combination of all information. As a
 | 
			
		||||
result, there may be identical topology information returned from the two
 | 
			
		||||
protocols causing duplicate entries.  It is the calling program's
 | 
			
		||||
responsibility to identify any duplicate entries and remove duplicates if
 | 
			
		||||
necessary.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $foundry->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either FDP or LLDP.
 | 
			
		||||
 | 
			
		||||
=item $foundry->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $foundry->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-FDP/LLDP device in between two
 | 
			
		||||
or more devices or multiple devices which are not directly connected.  
 | 
			
		||||
 | 
			
		||||
Use the data from the Layer2 Topology Table below to dig deeper.
 | 
			
		||||
 | 
			
		||||
=item $foundry->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $foundry->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $foundry->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
@@ -1,341 +0,0 @@
 | 
			
		||||
# 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 %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'JUNIPER-CHASSIS-DEFINES-MIB' => 'jnxChassisDefines',
 | 
			
		||||
    'JUNIPER-MIB'                 => 'jnxBoxAnatomy',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, 
 | 
			
		||||
	     %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
	     'serial' => 'jnxBoxSerialNo.0', );
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, 
 | 
			
		||||
	   %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, 
 | 
			
		||||
	   %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'juniper';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'junos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
    my $descr   = $juniper->description();
 | 
			
		||||
    return unless defined $descr;
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ m/kernel JUNOS (\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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my ($juniper) = shift;
 | 
			
		||||
    my ($partial) = shift;
 | 
			
		||||
 | 
			
		||||
    my ($i_type)  = $juniper->i_type($partial);
 | 
			
		||||
    my ($i_descr) = $juniper->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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $juniper = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->hasLLDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->lldp_if($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $juniper  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $juniper->lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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 Generic Juniper Routers running JUNOS
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=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 value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $juniper->vendor()
 | 
			
		||||
 | 
			
		||||
Returns C<'juniper'>
 | 
			
		||||
 | 
			
		||||
=item $juniper->os()
 | 
			
		||||
 | 
			
		||||
Returns C<'junos'>
 | 
			
		||||
 | 
			
		||||
=item $juniper->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $juniper->model()
 | 
			
		||||
 | 
			
		||||
Returns the model from C<sysObjectID>, with C<jnxProductNameremoved> from the
 | 
			
		||||
beginning.
 | 
			
		||||
 | 
			
		||||
=item $juniper->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number
 | 
			
		||||
 | 
			
		||||
(C<jnxBoxSerialNo.0>)
 | 
			
		||||
 | 
			
		||||
=item $juniper->hasCDP()
 | 
			
		||||
 | 
			
		||||
    Returns whether LLDP is enabled.
 | 
			
		||||
 | 
			
		||||
=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->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns the list of interfaces whose C<ifType> is l2vlan(135), and
 | 
			
		||||
the VLAN ID extracted from the interface description.
 | 
			
		||||
 | 
			
		||||
=item $juniper->c_id()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $juniper->c_if()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $juniper->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $juniper->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $juniper->c_port()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=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 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
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
All code from version 0.7 on
 | 
			
		||||
Copyright (c) 2003-2009 Max Baker and SNMP::Info Developers
 | 
			
		||||
Copyright (c) 2003-2016 Max Baker and SNMP::Info Developers
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Original Code
 | 
			
		||||
							
								
								
									
										235
									
								
								MANIFEST
									
									
									
									
									
								
							
							
						
						
									
										235
									
								
								MANIFEST
									
									
									
									
									
								
							@@ -1,94 +1,145 @@
 | 
			
		||||
ChangeLog
 | 
			
		||||
COPYRIGHT
 | 
			
		||||
DEVELOP
 | 
			
		||||
DeviceMatrix.txt
 | 
			
		||||
Info.pm
 | 
			
		||||
Info/Airespace.pm
 | 
			
		||||
Info/Bridge.pm
 | 
			
		||||
Info/CDP.pm
 | 
			
		||||
Info/CiscoConfig.pm
 | 
			
		||||
Info/CiscoImage.pm
 | 
			
		||||
Info/CiscoPortSecurity.pm
 | 
			
		||||
Info/CiscoPower.pm
 | 
			
		||||
Info/CiscoQOS.pm
 | 
			
		||||
Info/CiscoRTT.pm
 | 
			
		||||
Info/CiscoStack.pm
 | 
			
		||||
Info/CiscoStats.pm
 | 
			
		||||
Info/CiscoStpExtensions.pm
 | 
			
		||||
Info/CiscoVTP.pm
 | 
			
		||||
Info/Entity.pm
 | 
			
		||||
Info/EtherLike.pm
 | 
			
		||||
Info/FDP.pm
 | 
			
		||||
Info/IEEE802dot11.pm
 | 
			
		||||
Info/IPv6.pm
 | 
			
		||||
Info/Layer1.pm
 | 
			
		||||
Info/Layer1/Allied.pm
 | 
			
		||||
Info/Layer1/Asante.pm
 | 
			
		||||
Info/Layer1/Bayhub.pm
 | 
			
		||||
Info/Layer1/Cyclades.pm
 | 
			
		||||
Info/Layer1/S3000.pm
 | 
			
		||||
Info/Layer2.pm
 | 
			
		||||
Info/Layer2/Airespace.pm
 | 
			
		||||
Info/Layer2/Aironet.pm
 | 
			
		||||
Info/Layer2/Allied.pm
 | 
			
		||||
Info/Layer2/Bay.pm
 | 
			
		||||
Info/Layer2/Baystack.pm
 | 
			
		||||
Info/Layer2/C1900.pm
 | 
			
		||||
Info/Layer2/C2900.pm
 | 
			
		||||
Info/Layer2/Catalyst.pm
 | 
			
		||||
Info/Layer2/Centillion.pm
 | 
			
		||||
Info/Layer2/Cisco.pm
 | 
			
		||||
Info/Layer2/Foundry.pm
 | 
			
		||||
Info/Layer2/HP.pm
 | 
			
		||||
Info/Layer2/HP4000.pm
 | 
			
		||||
Info/Layer2/N2270.pm
 | 
			
		||||
Info/Layer2/NAP222x.pm
 | 
			
		||||
Info/Layer2/Netgear.pm
 | 
			
		||||
Info/Layer2/Orinoco.pm
 | 
			
		||||
Info/Layer2/ZyXEL_DSLAM.pm
 | 
			
		||||
Info/Layer3.pm
 | 
			
		||||
Info/Layer3/Aironet.pm
 | 
			
		||||
Info/Layer3/AlcatelLucent.pm
 | 
			
		||||
Info/Layer3/AlteonAD.pm
 | 
			
		||||
Info/Layer3/Altiga.pm
 | 
			
		||||
Info/Layer3/Arista.pm
 | 
			
		||||
Info/Layer3/Aruba.pm
 | 
			
		||||
Info/Layer3/BayRS.pm
 | 
			
		||||
Info/Layer3/C3550.pm
 | 
			
		||||
Info/Layer3/C4000.pm
 | 
			
		||||
Info/Layer3/C6500.pm
 | 
			
		||||
Info/Layer3/Cisco.pm
 | 
			
		||||
Info/Layer3/CiscoFWSM.pm
 | 
			
		||||
Info/Layer3/Contivity.pm
 | 
			
		||||
Info/Layer3/Dell.pm
 | 
			
		||||
Info/Layer3/Enterasys.pm
 | 
			
		||||
Info/Layer3/Extreme.pm
 | 
			
		||||
Info/Layer3/Foundry.pm
 | 
			
		||||
Info/Layer3/HP9300.pm
 | 
			
		||||
Info/Layer3/Juniper.pm
 | 
			
		||||
Info/Layer3/Microsoft.pm
 | 
			
		||||
Info/Layer3/N1600.pm
 | 
			
		||||
Info/Layer3/Netscreen.pm
 | 
			
		||||
Info/Layer3/NetSNMP.pm
 | 
			
		||||
Info/Layer3/Passport.pm
 | 
			
		||||
Info/Layer3/Pf.pm
 | 
			
		||||
Info/Layer3/Sun.pm
 | 
			
		||||
Info/Layer3/Timetra.pm
 | 
			
		||||
Info/LLDP.pm
 | 
			
		||||
Info/MAU.pm
 | 
			
		||||
Info/NortelStack.pm
 | 
			
		||||
Info/PowerEthernet.pm
 | 
			
		||||
Info/RapidCity.pm
 | 
			
		||||
Info/SONMP.pm
 | 
			
		||||
Makefile.PL
 | 
			
		||||
Build.PL
 | 
			
		||||
Changes
 | 
			
		||||
contrib/DEVELOP
 | 
			
		||||
contrib/util/docmunge
 | 
			
		||||
contrib/util/make_dev_matrix.pl
 | 
			
		||||
contrib/util/make_snmpdata.pl
 | 
			
		||||
contrib/util/push_ver
 | 
			
		||||
contrib/util/run_test
 | 
			
		||||
contrib/util/test_class.pl
 | 
			
		||||
contrib/util/test_class_mocked.pl
 | 
			
		||||
lib/SNMP/Info.pm
 | 
			
		||||
lib/SNMP/Info/AdslLine.pm
 | 
			
		||||
lib/SNMP/Info/Aggregate.pm
 | 
			
		||||
lib/SNMP/Info/Airespace.pm
 | 
			
		||||
lib/SNMP/Info/AMAP.pm
 | 
			
		||||
lib/SNMP/Info/Bridge.pm
 | 
			
		||||
lib/SNMP/Info/CDP.pm
 | 
			
		||||
lib/SNMP/Info/CiscoAgg.pm
 | 
			
		||||
lib/SNMP/Info/CiscoConfig.pm
 | 
			
		||||
lib/SNMP/Info/CiscoPortSecurity.pm
 | 
			
		||||
lib/SNMP/Info/CiscoPower.pm
 | 
			
		||||
lib/SNMP/Info/CiscoQOS.pm
 | 
			
		||||
lib/SNMP/Info/CiscoRTT.pm
 | 
			
		||||
lib/SNMP/Info/CiscoStack.pm
 | 
			
		||||
lib/SNMP/Info/CiscoStats.pm
 | 
			
		||||
lib/SNMP/Info/CiscoStpExtensions.pm
 | 
			
		||||
lib/SNMP/Info/CiscoVTP.pm
 | 
			
		||||
lib/SNMP/Info/EDP.pm
 | 
			
		||||
lib/SNMP/Info/Entity.pm
 | 
			
		||||
lib/SNMP/Info/EtherLike.pm
 | 
			
		||||
lib/SNMP/Info/FDP.pm
 | 
			
		||||
lib/SNMP/Info/IEEE802dot11.pm
 | 
			
		||||
lib/SNMP/Info/IEEE802dot3ad.pm
 | 
			
		||||
lib/SNMP/Info/IPv6.pm
 | 
			
		||||
lib/SNMP/Info/Layer1.pm
 | 
			
		||||
lib/SNMP/Info/Layer1/Allied.pm
 | 
			
		||||
lib/SNMP/Info/Layer1/Asante.pm
 | 
			
		||||
lib/SNMP/Info/Layer1/Bayhub.pm
 | 
			
		||||
lib/SNMP/Info/Layer1/Cyclades.pm
 | 
			
		||||
lib/SNMP/Info/Layer1/S3000.pm
 | 
			
		||||
lib/SNMP/Info/Layer2.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/3Com.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Adtran.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Airespace.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Aironet.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Allied.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Baystack.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/C1900.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/C2900.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Catalyst.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Centillion.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Cisco.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/CiscoSB.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/HP.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/HP4000.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/HPVC.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Kentrox.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/N2270.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/NAP222x.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Netgear.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/NWSS2300.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Orinoco.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Trapeze.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/Ubiquiti.pm
 | 
			
		||||
lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm
 | 
			
		||||
lib/SNMP/Info/Layer3.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Aironet.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/AlcatelLucent.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/AlteonAD.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Altiga.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Arista.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Aruba.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/BayRS.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/BlueCoatSG.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/C3550.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/C4000.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/C6500.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/CheckPoint.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Cisco.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/CiscoASA.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/CiscoFWSM.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/CiscoSwitch.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Contivity.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Cumulus.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Dell.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/DLink.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Enterasys.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Extreme.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/F5.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Force10.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Fortinet.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Foundry.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/H3C.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/HP9300.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Huawei.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/IBMGbTor.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Juniper.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Lantronix.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Microsoft.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Mikrotik.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/N1600.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Netscreen.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/NetSNMP.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Nexus.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/PacketFront.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/PaloAlto.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Passport.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Pf.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Pica8.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/SonicWALL.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Steelhead.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Sun.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Tasman.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/Timetra.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/VMware.pm
 | 
			
		||||
lib/SNMP/Info/Layer3/VyOS.pm
 | 
			
		||||
lib/SNMP/Info/Layer7.pm
 | 
			
		||||
lib/SNMP/Info/Layer7/APC.pm
 | 
			
		||||
lib/SNMP/Info/Layer7/CiscoIPS.pm
 | 
			
		||||
lib/SNMP/Info/Layer7/Gigamon.pm
 | 
			
		||||
lib/SNMP/Info/Layer7/Neoteris.pm
 | 
			
		||||
lib/SNMP/Info/Layer7/Netscaler.pm
 | 
			
		||||
lib/SNMP/Info/LLDP.pm
 | 
			
		||||
lib/SNMP/Info/MAU.pm
 | 
			
		||||
lib/SNMP/Info/MRO.pm
 | 
			
		||||
lib/SNMP/Info/NortelStack.pm
 | 
			
		||||
lib/SNMP/Info/PowerEthernet.pm
 | 
			
		||||
lib/SNMP/Info/RapidCity.pm
 | 
			
		||||
lib/SNMP/Info/SONMP.pm
 | 
			
		||||
LICENSE
 | 
			
		||||
MANIFEST			This list of files
 | 
			
		||||
META.json
 | 
			
		||||
META.yml
 | 
			
		||||
README
 | 
			
		||||
t/00-load.t
 | 
			
		||||
t/docmunge
 | 
			
		||||
t/make_dev_matrix.pl
 | 
			
		||||
t/pod-coverage.t
 | 
			
		||||
t/pod.t
 | 
			
		||||
t/prereq.t
 | 
			
		||||
t/push_ver
 | 
			
		||||
t/run_test
 | 
			
		||||
t/test_class.pl
 | 
			
		||||
t/00_load.t
 | 
			
		||||
xt/.perltidyrc
 | 
			
		||||
xt/00_local_distribution.t
 | 
			
		||||
xt/00_local_docininfo.t
 | 
			
		||||
xt/00_local_perlcritic.t
 | 
			
		||||
xt/00_local_pod-coverage.t
 | 
			
		||||
xt/00_local_pod.t
 | 
			
		||||
xt/00_local_prereq.t
 | 
			
		||||
xt/00_local_spelling.t
 | 
			
		||||
xt/00_local_versionsync.t
 | 
			
		||||
xt/10_remote_snmplabs.t
 | 
			
		||||
 
 | 
			
		||||
@@ -1,25 +1,70 @@
 | 
			
		||||
# Version control files and dirs.
 | 
			
		||||
\.bak$
 | 
			
		||||
\.pid$
 | 
			
		||||
\.swp$
 | 
			
		||||
 | 
			
		||||
^SNMP-Info-
 | 
			
		||||
 | 
			
		||||
^MANIFEST\.
 | 
			
		||||
 | 
			
		||||
# Avoid version control files.
 | 
			
		||||
\bRCS\b
 | 
			
		||||
\bCVS\b
 | 
			
		||||
\bSCCS\b
 | 
			
		||||
,v$
 | 
			
		||||
\B\.svn\b
 | 
			
		||||
\B\.git\b
 | 
			
		||||
\B\.gitignore\b
 | 
			
		||||
\b_darcs\b
 | 
			
		||||
\B\.cvsignore$
 | 
			
		||||
 | 
			
		||||
# Makemaker generated files and dirs.
 | 
			
		||||
^MANIFEST\.
 | 
			
		||||
^Makefile$
 | 
			
		||||
^blib/
 | 
			
		||||
^MakeMaker-\d
 | 
			
		||||
# Avoid VMS specific MakeMaker generated files
 | 
			
		||||
\bDescrip.MMS$
 | 
			
		||||
\bDESCRIP.MMS$
 | 
			
		||||
\bdescrip.mms$
 | 
			
		||||
 | 
			
		||||
# Temp, old and emacs backup files.
 | 
			
		||||
# Avoid Makemaker generated and utility files.
 | 
			
		||||
\bMANIFEST\.bak
 | 
			
		||||
\bMakefile$
 | 
			
		||||
\bblib/
 | 
			
		||||
\bMakeMaker-\d
 | 
			
		||||
\bpm_to_blib\.ts$
 | 
			
		||||
\bpm_to_blib$
 | 
			
		||||
\bblibdirs\.ts$         # 6.18 through 6.25 generated this
 | 
			
		||||
 | 
			
		||||
# Avoid Module::Build generated and utility files.
 | 
			
		||||
\bBuild$
 | 
			
		||||
\b_build/
 | 
			
		||||
\bBuild.bat$
 | 
			
		||||
\bBuild.COM$
 | 
			
		||||
\bBUILD.COM$
 | 
			
		||||
\bbuild.com$
 | 
			
		||||
 | 
			
		||||
# Avoid temp and backup files.
 | 
			
		||||
~$
 | 
			
		||||
\.old$
 | 
			
		||||
^#.*#$
 | 
			
		||||
^\.#
 | 
			
		||||
\#$
 | 
			
		||||
\b\.#
 | 
			
		||||
\.bak$
 | 
			
		||||
\.tmp$
 | 
			
		||||
\.#
 | 
			
		||||
\.rej$
 | 
			
		||||
 | 
			
		||||
# Private Regression Tests
 | 
			
		||||
\d+_local_
 | 
			
		||||
\.?perl\w+\.?rc$
 | 
			
		||||
# Avoid OS-specific files/dirs
 | 
			
		||||
# Mac OSX metadata
 | 
			
		||||
\B\.DS_Store
 | 
			
		||||
# Mac OSX SMB mount metadata files
 | 
			
		||||
\B\._
 | 
			
		||||
 | 
			
		||||
# Komodo project file
 | 
			
		||||
\.kpf$
 | 
			
		||||
# Avoid Devel::Cover and Devel::CoverX::Covered files.
 | 
			
		||||
\bcover_db\b
 | 
			
		||||
\bcovered\b
 | 
			
		||||
 
 | 
			
		||||
# Avoid MYMETA files
 | 
			
		||||
^MYMETA\.
 | 
			
		||||
 | 
			
		||||
.github
 | 
			
		||||
.travis
 | 
			
		||||
README.md
 | 
			
		||||
 | 
			
		||||
# Avoid Komodo project file
 | 
			
		||||
\.komodoproject$
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										537
									
								
								META.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										537
									
								
								META.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,537 @@
 | 
			
		||||
{
 | 
			
		||||
   "abstract" : "OO Interface to Network devices and MIBs through SNMP",
 | 
			
		||||
   "author" : [
 | 
			
		||||
      "Eric A. Miller <emiller@cpan.org>"
 | 
			
		||||
   ],
 | 
			
		||||
   "dynamic_config" : 1,
 | 
			
		||||
   "generated_by" : "Module::Build version 0.4224",
 | 
			
		||||
   "license" : [
 | 
			
		||||
      "bsd"
 | 
			
		||||
   ],
 | 
			
		||||
   "meta-spec" : {
 | 
			
		||||
      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
 | 
			
		||||
      "version" : 2
 | 
			
		||||
   },
 | 
			
		||||
   "name" : "SNMP-Info",
 | 
			
		||||
   "prereqs" : {
 | 
			
		||||
      "configure" : {
 | 
			
		||||
         "requires" : {
 | 
			
		||||
            "Module::Build" : "0.42"
 | 
			
		||||
         }
 | 
			
		||||
      },
 | 
			
		||||
      "runtime" : {
 | 
			
		||||
         "recommends" : {
 | 
			
		||||
            "Class::ISA" : "0",
 | 
			
		||||
            "File::Slurp" : "0",
 | 
			
		||||
            "Module::Info" : "0",
 | 
			
		||||
            "Module::Load" : "0",
 | 
			
		||||
            "PPI" : "0"
 | 
			
		||||
         },
 | 
			
		||||
         "requires" : {
 | 
			
		||||
            "Math::BigInt" : "0",
 | 
			
		||||
            "SNMP" : "0"
 | 
			
		||||
         }
 | 
			
		||||
      },
 | 
			
		||||
      "test" : {
 | 
			
		||||
         "requires" : {
 | 
			
		||||
            "Test::Distribution" : "0",
 | 
			
		||||
            "Test::More" : "0.88"
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   },
 | 
			
		||||
   "provides" : {
 | 
			
		||||
      "SNMP::Info" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::AMAP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/AMAP.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::AdslLine" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/AdslLine.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Aggregate" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Aggregate.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Airespace" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Airespace.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Bridge" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Bridge.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CDP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CDP.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoAgg" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoAgg.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoConfig" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoConfig.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoPortSecurity" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoPortSecurity.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoPower" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoPower.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoQOS" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoQOS.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoRTT" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoRTT.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoStack" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoStack.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoStats" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoStats.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoStpExtensions" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoStpExtensions.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::CiscoVTP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/CiscoVTP.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::EDP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/EDP.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Entity" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Entity.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::EtherLike" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/EtherLike.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::FDP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/FDP.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::IEEE802dot11" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/IEEE802dot11.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::IEEE802dot3ad" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/IEEE802dot3ad.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::IPv6" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/IPv6.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::LLDP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/LLDP.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1::Allied" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1/Allied.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1::Asante" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1/Asante.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1::Bayhub" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1/Bayhub.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1::Cyclades" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1/Cyclades.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer1::S3000" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer1/S3000.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::3Com" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/3Com.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Adtran" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Adtran.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Airespace" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Airespace.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Aironet" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Aironet.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Allied" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Allied.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Baystack" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Baystack.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::C1900" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/C1900.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::C2900" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/C2900.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Catalyst" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Catalyst.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Centillion" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Centillion.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Cisco" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Cisco.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::CiscoSB" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/CiscoSB.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::HP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/HP.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::HP4000" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/HP4000.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::HPVC" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/HPVC.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Kentrox" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Kentrox.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::N2270" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/N2270.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::NAP222x" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/NAP222x.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::NWSS2300" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/NWSS2300.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Netgear" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Netgear.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Orinoco" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Orinoco.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Trapeze" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Trapeze.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::Ubiquiti" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/Ubiquiti.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer2::ZyXEL_DSLAM" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Aironet" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Aironet.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::AlcatelLucent" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/AlcatelLucent.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::AlteonAD" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/AlteonAD.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Altiga" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Altiga.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Arista" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Arista.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Aruba" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Aruba.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::BayRS" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/BayRS.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::BlueCoatSG" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/BlueCoatSG.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::C3550" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/C3550.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::C4000" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/C4000.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::C6500" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/C6500.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::CheckPoint" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/CheckPoint.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Cisco" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Cisco.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::CiscoASA" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/CiscoASA.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::CiscoFWSM" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/CiscoFWSM.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::CiscoSwitch" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/CiscoSwitch.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Contivity" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Contivity.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Cumulus" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Cumulus.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::DLink" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/DLink.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Dell" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Dell.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Enterasys" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Enterasys.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Extreme" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Extreme.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::F5" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/F5.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Force10" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Force10.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Fortinet" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Fortinet.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Foundry" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Foundry.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::H3C" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/H3C.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::HP9300" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/HP9300.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Huawei" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Huawei.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::IBMGbTor" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/IBMGbTor.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Juniper" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Juniper.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Lantronix" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Lantronix.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Microsoft" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Microsoft.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Mikrotik" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Mikrotik.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::N1600" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/N1600.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::NetSNMP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/NetSNMP.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Netscreen" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Netscreen.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Nexus" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Nexus.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::PacketFront" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/PacketFront.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::PaloAlto" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/PaloAlto.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Passport" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Passport.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Pf" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Pf.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Pica8" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Pica8.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::SonicWALL" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/SonicWALL.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Steelhead" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Steelhead.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Sun" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Sun.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Tasman" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Tasman.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::Timetra" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/Timetra.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::VMware" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/VMware.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer3::VyOS" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer3/VyOS.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::APC" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/APC.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::CiscoIPS" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/CiscoIPS.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::Gigamon" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/Gigamon.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::Neoteris" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/Neoteris.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::Layer7::Netscaler" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/Layer7/Netscaler.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::MAU" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/MAU.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::MRO" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/MRO.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::NortelStack" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/NortelStack.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::PowerEthernet" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/PowerEthernet.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::RapidCity" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/RapidCity.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      },
 | 
			
		||||
      "SNMP::Info::SONMP" : {
 | 
			
		||||
         "file" : "lib/SNMP/Info/SONMP.pm",
 | 
			
		||||
         "version" : "3.52"
 | 
			
		||||
      }
 | 
			
		||||
   },
 | 
			
		||||
   "release_status" : "stable",
 | 
			
		||||
   "resources" : {
 | 
			
		||||
      "bugtracker" : {
 | 
			
		||||
         "web" : "https://github.com/netdisco/snmp-info/issues"
 | 
			
		||||
      },
 | 
			
		||||
      "homepage" : "http://netdisco.org/",
 | 
			
		||||
      "license" : [
 | 
			
		||||
         "http://opensource.org/licenses/BSD-3-Clause"
 | 
			
		||||
      ],
 | 
			
		||||
      "repository" : {
 | 
			
		||||
         "url" : "https://github.com/netdisco/snmp-info"
 | 
			
		||||
      },
 | 
			
		||||
      "x_IRC" : "irc://irc.freenode.org/#netdisco",
 | 
			
		||||
      "x_MailingList" : "https://lists.sourceforge.net/lists/listinfo/snmp-info-users"
 | 
			
		||||
   },
 | 
			
		||||
   "version" : "3.52",
 | 
			
		||||
   "x_serialization_backend" : "JSON::PP version 2.94"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										392
									
								
								META.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										392
									
								
								META.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,392 @@
 | 
			
		||||
---
 | 
			
		||||
abstract: 'OO Interface to Network devices and MIBs through SNMP'
 | 
			
		||||
author:
 | 
			
		||||
  - 'Eric A. Miller <emiller@cpan.org>'
 | 
			
		||||
build_requires:
 | 
			
		||||
  Test::Distribution: '0'
 | 
			
		||||
  Test::More: '0.88'
 | 
			
		||||
configure_requires:
 | 
			
		||||
  Module::Build: '0.42'
 | 
			
		||||
dynamic_config: 1
 | 
			
		||||
generated_by: 'Module::Build version 0.4224, CPAN::Meta::Converter version 2.150010'
 | 
			
		||||
license: bsd
 | 
			
		||||
meta-spec:
 | 
			
		||||
  url: http://module-build.sourceforge.net/META-spec-v1.4.html
 | 
			
		||||
  version: '1.4'
 | 
			
		||||
name: SNMP-Info
 | 
			
		||||
provides:
 | 
			
		||||
  SNMP::Info:
 | 
			
		||||
    file: lib/SNMP/Info.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::AMAP:
 | 
			
		||||
    file: lib/SNMP/Info/AMAP.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::AdslLine:
 | 
			
		||||
    file: lib/SNMP/Info/AdslLine.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Aggregate:
 | 
			
		||||
    file: lib/SNMP/Info/Aggregate.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Airespace:
 | 
			
		||||
    file: lib/SNMP/Info/Airespace.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Bridge:
 | 
			
		||||
    file: lib/SNMP/Info/Bridge.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CDP:
 | 
			
		||||
    file: lib/SNMP/Info/CDP.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CiscoAgg:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoAgg.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CiscoConfig:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoConfig.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CiscoPortSecurity:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoPortSecurity.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CiscoPower:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoPower.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CiscoQOS:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoQOS.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CiscoRTT:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoRTT.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CiscoStack:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoStack.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CiscoStats:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoStats.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CiscoStpExtensions:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoStpExtensions.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::CiscoVTP:
 | 
			
		||||
    file: lib/SNMP/Info/CiscoVTP.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::EDP:
 | 
			
		||||
    file: lib/SNMP/Info/EDP.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Entity:
 | 
			
		||||
    file: lib/SNMP/Info/Entity.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::EtherLike:
 | 
			
		||||
    file: lib/SNMP/Info/EtherLike.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::FDP:
 | 
			
		||||
    file: lib/SNMP/Info/FDP.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::IEEE802dot11:
 | 
			
		||||
    file: lib/SNMP/Info/IEEE802dot11.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::IEEE802dot3ad:
 | 
			
		||||
    file: lib/SNMP/Info/IEEE802dot3ad.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::IPv6:
 | 
			
		||||
    file: lib/SNMP/Info/IPv6.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::LLDP:
 | 
			
		||||
    file: lib/SNMP/Info/LLDP.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer1:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer1::Allied:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1/Allied.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer1::Asante:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1/Asante.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer1::Bayhub:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1/Bayhub.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer1::Cyclades:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1/Cyclades.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer1::S3000:
 | 
			
		||||
    file: lib/SNMP/Info/Layer1/S3000.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::3Com:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/3Com.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Adtran:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Adtran.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Airespace:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Airespace.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Aironet:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Aironet.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Allied:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Allied.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Baystack:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Baystack.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::C1900:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/C1900.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::C2900:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/C2900.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Catalyst:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Catalyst.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Centillion:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Centillion.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Cisco:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Cisco.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::CiscoSB:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/CiscoSB.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::HP:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/HP.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::HP4000:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/HP4000.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::HPVC:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/HPVC.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Kentrox:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Kentrox.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::N2270:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/N2270.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::NAP222x:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/NAP222x.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::NWSS2300:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/NWSS2300.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Netgear:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Netgear.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Orinoco:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Orinoco.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Trapeze:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Trapeze.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::Ubiquiti:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/Ubiquiti.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer2::ZyXEL_DSLAM:
 | 
			
		||||
    file: lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Aironet:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Aironet.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::AlcatelLucent:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/AlcatelLucent.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::AlteonAD:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/AlteonAD.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Altiga:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Altiga.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Arista:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Arista.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Aruba:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Aruba.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::BayRS:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/BayRS.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::BlueCoatSG:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/BlueCoatSG.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::C3550:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/C3550.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::C4000:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/C4000.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::C6500:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/C6500.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::CheckPoint:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/CheckPoint.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Cisco:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Cisco.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::CiscoASA:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/CiscoASA.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::CiscoFWSM:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/CiscoFWSM.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::CiscoSwitch:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/CiscoSwitch.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Contivity:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Contivity.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Cumulus:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Cumulus.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::DLink:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/DLink.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Dell:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Dell.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Enterasys:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Enterasys.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Extreme:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Extreme.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::F5:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/F5.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Force10:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Force10.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Fortinet:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Fortinet.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Foundry:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Foundry.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::H3C:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/H3C.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::HP9300:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/HP9300.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Huawei:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Huawei.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::IBMGbTor:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/IBMGbTor.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Juniper:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Juniper.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Lantronix:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Lantronix.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Microsoft:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Microsoft.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Mikrotik:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Mikrotik.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::N1600:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/N1600.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::NetSNMP:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/NetSNMP.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Netscreen:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Netscreen.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Nexus:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Nexus.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::PacketFront:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/PacketFront.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::PaloAlto:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/PaloAlto.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Passport:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Passport.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Pf:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Pf.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Pica8:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Pica8.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::SonicWALL:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/SonicWALL.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Steelhead:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Steelhead.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Sun:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Sun.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Tasman:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Tasman.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::Timetra:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/Timetra.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::VMware:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/VMware.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer3::VyOS:
 | 
			
		||||
    file: lib/SNMP/Info/Layer3/VyOS.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer7:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer7::APC:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/APC.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer7::CiscoIPS:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/CiscoIPS.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer7::Gigamon:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/Gigamon.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer7::Neoteris:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/Neoteris.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::Layer7::Netscaler:
 | 
			
		||||
    file: lib/SNMP/Info/Layer7/Netscaler.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::MAU:
 | 
			
		||||
    file: lib/SNMP/Info/MAU.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::MRO:
 | 
			
		||||
    file: lib/SNMP/Info/MRO.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::NortelStack:
 | 
			
		||||
    file: lib/SNMP/Info/NortelStack.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::PowerEthernet:
 | 
			
		||||
    file: lib/SNMP/Info/PowerEthernet.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::RapidCity:
 | 
			
		||||
    file: lib/SNMP/Info/RapidCity.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
  SNMP::Info::SONMP:
 | 
			
		||||
    file: lib/SNMP/Info/SONMP.pm
 | 
			
		||||
    version: '3.52'
 | 
			
		||||
recommends:
 | 
			
		||||
  Class::ISA: '0'
 | 
			
		||||
  File::Slurp: '0'
 | 
			
		||||
  Module::Info: '0'
 | 
			
		||||
  Module::Load: '0'
 | 
			
		||||
  PPI: '0'
 | 
			
		||||
requires:
 | 
			
		||||
  Math::BigInt: '0'
 | 
			
		||||
  SNMP: '0'
 | 
			
		||||
resources:
 | 
			
		||||
  IRC: irc://irc.freenode.org/#netdisco
 | 
			
		||||
  MailingList: https://lists.sourceforge.net/lists/listinfo/snmp-info-users
 | 
			
		||||
  bugtracker: https://github.com/netdisco/snmp-info/issues
 | 
			
		||||
  homepage: http://netdisco.org/
 | 
			
		||||
  license: http://opensource.org/licenses/BSD-3-Clause
 | 
			
		||||
  repository: https://github.com/netdisco/snmp-info
 | 
			
		||||
version: '3.52'
 | 
			
		||||
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
 | 
			
		||||
							
								
								
									
										39
									
								
								Makefile.PL
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								Makefile.PL
									
									
									
									
									
								
							@@ -1,39 +0,0 @@
 | 
			
		||||
# Module makefile for SNMP::Info (using ExtUtils::MakeMaker)
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
require 5.006;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use ExtUtils::MakeMaker;
 | 
			
		||||
 | 
			
		||||
WriteMakefile(
 | 
			
		||||
    NAME          => 'SNMP::Info',
 | 
			
		||||
    AUTHOR        => 'Eric A. Miller <emiller@cpan.org>',
 | 
			
		||||
    VERSION_FROM  => 'Info.pm',
 | 
			
		||||
    ABSTRACT_FROM => 'Info.pm',
 | 
			
		||||
    PREREQ_PM     => {
 | 
			
		||||
        'Test::More'   => 0,
 | 
			
		||||
        'Math::BigInt' => 0,
 | 
			
		||||
        'SNMP'         => 0,
 | 
			
		||||
    },
 | 
			
		||||
    PMLIBDIRS => [ 'Info', '$(BASEEXT)' ],
 | 
			
		||||
    dist      => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
 | 
			
		||||
    clean     => { FILES    => 'SNMP-Info-*' },
 | 
			
		||||
    realclean => { FILES    => 'Makefile.old' },
 | 
			
		||||
    (     ( ExtUtils::MakeMaker->VERSION() lt '6.25' ) ? ( 'PL_FILES' => {} )
 | 
			
		||||
        : ()
 | 
			
		||||
    ),
 | 
			
		||||
    (   ( ExtUtils::MakeMaker->VERSION() gt '6.30' ) ? ( 'LICENSE' => 'bsd' )
 | 
			
		||||
        : ()
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub MY::postamble {
 | 
			
		||||
    "
 | 
			
		||||
.PHONY: readme
 | 
			
		||||
readme: README
 | 
			
		||||
README: Info.pm
 | 
			
		||||
	pod2text -l Info.pm > README";
 | 
			
		||||
}
 | 
			
		||||
@@ -4,7 +4,6 @@ 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: 
 | 
			
		||||
@@ -251,22 +251,13 @@ sub html_tail {
 | 
			
		||||
[<SPAN CLASS="family">Family Attribute</SPAN>]
 | 
			
		||||
[<SPAN CLASS="vendor">Vendor Attribute</SPAN>]
 | 
			
		||||
<h1>Attribute Key</h1>
 | 
			
		||||
A value of <B>-</B> signifies the information is not specified and can
 | 
			
		||||
A value of <B>-</B> signifies the information is not specified and can not
 | 
			
		||||
be assumed working.
 | 
			
		||||
<TABLE BORDER=1>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Arpnip</TD>
 | 
			
		||||
    <TD>Ability to collect ARP tables for MAC to IP translation.</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>CDP</TD>
 | 
			
		||||
    <TD>Cisco Discovery Protocol usable.
 | 
			
		||||
        <UL>
 | 
			
		||||
            <LI><tt>Yes</tt> - Has CDP information through CISCO-CDP-MIB
 | 
			
		||||
            <LI><tt>Proprietary</tt> means the device has its own L2 Discovery Protocol.
 | 
			
		||||
        </UL>
 | 
			
		||||
    </TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Class</TD>
 | 
			
		||||
    <TD>SNMP::Info Class the the device currently uses.  Devices using more generic
 | 
			
		||||
@@ -306,6 +297,16 @@ be assumed working.
 | 
			
		||||
        switch port when doing a Macsuck.
 | 
			
		||||
    </TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Topo</TD>
 | 
			
		||||
    <TD>Ability to get Layer 2 Topology Information from device if the
 | 
			
		||||
        protocol is enabled.  SNMP::Info supports querying Link Layer
 | 
			
		||||
        Discovery Protocol (LLDP), Cisco Discovery Protocol (CDP),
 | 
			
		||||
        SynOptics/Bay/Nortel/Avaya Network Management Protocol (SONMP),
 | 
			
		||||
        Foundry/Brocade Discovery Protocol (FDP), Extreme Discovery
 | 
			
		||||
        Protocol (EDP), and Alcatel Mapping Adjacency Protocol (AMAP). 
 | 
			
		||||
    </TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
    <TD>Ver</TD>
 | 
			
		||||
    <TD>SNMP Protocol Version the device has to use.</TD>
 | 
			
		||||
							
								
								
									
										207
									
								
								contrib/util/make_snmpdata.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										207
									
								
								contrib/util/make_snmpdata.pl
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,207 @@
 | 
			
		||||
#!/usr/bin/perl
 | 
			
		||||
#
 | 
			
		||||
# make_snmpdata.pl
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Carp;
 | 
			
		||||
use Getopt::Long;
 | 
			
		||||
use Pod::Usage;
 | 
			
		||||
use SNMP;
 | 
			
		||||
 | 
			
		||||
local $| = 1;
 | 
			
		||||
 | 
			
		||||
my $mibdirs = ['/usr/local/share/snmp/mibs'];
 | 
			
		||||
my $comm    = 'public';
 | 
			
		||||
my $ver     = '2c';
 | 
			
		||||
my $dev;
 | 
			
		||||
my $ignore = 0;
 | 
			
		||||
my $help   = 0;
 | 
			
		||||
 | 
			
		||||
GetOptions(
 | 
			
		||||
    'community=s' => \$comm,
 | 
			
		||||
    'device=s'    => \$dev,
 | 
			
		||||
    'ignore'      => \$ignore,
 | 
			
		||||
    'mibdir=s'   => \$mibdirs,
 | 
			
		||||
    'version'     => \$ver,
 | 
			
		||||
    'help|?'      => sub { pod2usage(2); },
 | 
			
		||||
) or pod2usage(2);
 | 
			
		||||
 | 
			
		||||
unless ( defined $dev && $ver =~ /[1|2c]/ ) {
 | 
			
		||||
    pod2usage(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local $ENV{'SNMPCONFPATH'} = ''        if $ignore;
 | 
			
		||||
local $ENV{'MIBDIRS'}      = "$mibdirs" if $ignore;
 | 
			
		||||
 | 
			
		||||
SNMP::addMibDirs($mibdirs);
 | 
			
		||||
 | 
			
		||||
# Connect to Device
 | 
			
		||||
my $sess = SNMP::Session->new(
 | 
			
		||||
    'UseEnums'       => 1,
 | 
			
		||||
    'RetryNoSuch'    => 1,
 | 
			
		||||
    'DestHost'       => $dev,
 | 
			
		||||
    'Community'      => $comm,
 | 
			
		||||
    'Version'        => $ver,
 | 
			
		||||
    'UseSprintValue' => 1
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
my $sysdescr = $sess->get('sysDescr.0');
 | 
			
		||||
unless ( defined $sysdescr ) {
 | 
			
		||||
    die "Couldn't connect to $dev via snmp.\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SNMP::loadModules(@ARGV);
 | 
			
		||||
 | 
			
		||||
# Create a hash of MIB Modules for which we want results 
 | 
			
		||||
my %mib_hash = map {$_ => 1} @ARGV;
 | 
			
		||||
# Add the common MIB Modules we always want
 | 
			
		||||
my @common_mibs = ('SNMPv2-MIB', 'IF-MIB');
 | 
			
		||||
foreach my $mib (@common_mibs) {
 | 
			
		||||
    $mib_hash{$mib} = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
foreach my $key ( sort( keys %SNMP::MIB ) ) {
 | 
			
		||||
    my $module = $SNMP::MIB{$key}{moduleID} || '';
 | 
			
		||||
    # IMPORTS pulls in many modules we don't want to walk
 | 
			
		||||
    # Only walk those we've specified
 | 
			
		||||
    next unless (defined $mib_hash{$module});
 | 
			
		||||
    my $access = $SNMP::MIB{$key}{'access'} || '';
 | 
			
		||||
    next unless ( $access =~ /Read|Create/x );
 | 
			
		||||
 | 
			
		||||
    my $label = SNMP::translateObj( $key, 0, 1 ) || '';
 | 
			
		||||
    snmpwalk($label);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub snmpwalk {
 | 
			
		||||
    return unless defined $sess;
 | 
			
		||||
    my $label    = shift;
 | 
			
		||||
    my $var      = SNMP::Varbind->new( [$label] );
 | 
			
		||||
    my $e        = 0;
 | 
			
		||||
    my $last_iid = '';
 | 
			
		||||
    my %seen     = ();
 | 
			
		||||
    while ( !$e ) {
 | 
			
		||||
        $sess->getnext($var);
 | 
			
		||||
        $e = $sess->{ErrorNum};
 | 
			
		||||
 | 
			
		||||
        return if $var->[0] ne $label;
 | 
			
		||||
        my $iid = $var->[1];
 | 
			
		||||
        my $val = $var->[2];
 | 
			
		||||
        return unless defined $iid;
 | 
			
		||||
 | 
			
		||||
        # Check to see if we've already seen this IID (looping)
 | 
			
		||||
        if ( defined $seen{$iid} and $seen{$iid} ) {
 | 
			
		||||
            warn "Looping on $label iid:$iid.  Skipped.\n";
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        else { $seen{$iid}++; }
 | 
			
		||||
 | 
			
		||||
        # why is it looping?
 | 
			
		||||
        return if $last_iid eq $iid;
 | 
			
		||||
        $last_iid = $iid;
 | 
			
		||||
 | 
			
		||||
        my $line = "$label.$iid = $val";
 | 
			
		||||
        print "$line\n";
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
make_snmpdata.pl - Tool to get SNMP data for the SNMP::Info testing framework
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
make_snmpdata.pl [options] MIB-MODULE-1 MIB-MODULE-2
 | 
			
		||||
 | 
			
		||||
Options:
 | 
			
		||||
 | 
			
		||||
    -community SNMP Community
 | 
			
		||||
    -device    IP Address to query
 | 
			
		||||
    -ignore    Ignore Net-SNMP configuration file
 | 
			
		||||
    -mibdir    Directory containing MIB Files
 | 
			
		||||
    -version   SNMP version to use
 | 
			
		||||
    -help      Brief help message
 | 
			
		||||
 | 
			
		||||
=head1 OPTIONS
 | 
			
		||||
 | 
			
		||||
=over 8
 | 
			
		||||
 | 
			
		||||
=item B<-community>
 | 
			
		||||
 | 
			
		||||
SNMP Community, either 1 or 2c.  Defaults to version 2c
 | 
			
		||||
 | 
			
		||||
-community 2c
 | 
			
		||||
 | 
			
		||||
=item B<-device>
 | 
			
		||||
 | 
			
		||||
IP Address to query for the SNMP data.  No default and a mandatory option.
 | 
			
		||||
 | 
			
		||||
-device 127.0.0.1
 | 
			
		||||
 | 
			
		||||
=item B<-ignore >
 | 
			
		||||
 | 
			
		||||
Ignore Net-SNMP configuration file snmp.conf.  If this used mibdirs must be
 | 
			
		||||
provided
 | 
			
		||||
 | 
			
		||||
-ignore
 | 
			
		||||
 | 
			
		||||
=item B<-mibdir>
 | 
			
		||||
 | 
			
		||||
Directory containing MIB Files.  Mutiple directories should be separated by a
 | 
			
		||||
colon ':'.  Defaults to /usr/local/share/snmp/mibs.
 | 
			
		||||
 | 
			
		||||
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
 | 
			
		||||
 | 
			
		||||
=item B<-version>
 | 
			
		||||
 | 
			
		||||
SNMP version to use.  Only version 1 and 2c are supported.  Defaults to 2c
 | 
			
		||||
 | 
			
		||||
-version 2c
 | 
			
		||||
 | 
			
		||||
=item B<-help>
 | 
			
		||||
 | 
			
		||||
Print help message and exits.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
B<make_snmpdata.pl> will gather SNMP data by walking specified MIB files and
 | 
			
		||||
output the data to a file which can be used by the SNMP::Info testing
 | 
			
		||||
framework.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -3,9 +3,9 @@
 | 
			
		||||
 | 
			
		||||
use File::Glob qw/bsd_glob/;
 | 
			
		||||
 | 
			
		||||
my @pms = glob_rec("../Info");
 | 
			
		||||
my @pms = glob_rec("./lib");
 | 
			
		||||
 | 
			
		||||
$new_version = shift @ARGV || '2.05';
 | 
			
		||||
$new_version = shift @ARGV || die "missing new version\n";
 | 
			
		||||
 | 
			
		||||
foreach my $p (@pms) {
 | 
			
		||||
    print "$p\n";
 | 
			
		||||
@@ -16,11 +16,13 @@ foreach my $p (@pms) {
 | 
			
		||||
 | 
			
		||||
    while (<O>) {
 | 
			
		||||
        s/^\s*\$VERSION\s+=\s*'[^']+'\s*;/\$VERSION = '$new_version';/;
 | 
			
		||||
        s/^SNMP::Info - Version [\d.]+$/SNMP::Info - Version $new_version/;
 | 
			
		||||
        print P;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close O;
 | 
			
		||||
    close P or die "Can't write $p. $!\n";
 | 
			
		||||
    unlink("$p.orig");
 | 
			
		||||
    #last;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										346
									
								
								contrib/util/test_class.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										346
									
								
								contrib/util/test_class.pl
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,346 @@
 | 
			
		||||
#!/usr/bin/perl
 | 
			
		||||
#
 | 
			
		||||
# test_class.pl
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2013 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Carp;
 | 
			
		||||
use Getopt::Long;
 | 
			
		||||
use Pod::Usage;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
my $EMPTY = q{};
 | 
			
		||||
 | 
			
		||||
# Default Values
 | 
			
		||||
my $class  = $EMPTY;
 | 
			
		||||
my @dump   = ();
 | 
			
		||||
my $debug  = 0;
 | 
			
		||||
my $cache  = 0;
 | 
			
		||||
my $device = '';
 | 
			
		||||
my $comm   = '';
 | 
			
		||||
my $ver    = 2;
 | 
			
		||||
my $ignore = 0;
 | 
			
		||||
my $help   = 0;
 | 
			
		||||
my $nobulk = 0;
 | 
			
		||||
my $mibdirs;
 | 
			
		||||
my %dumped;
 | 
			
		||||
 | 
			
		||||
GetOptions(
 | 
			
		||||
    'c|class=s'  => \$class,
 | 
			
		||||
    'd|dev=s'    => \$device,
 | 
			
		||||
    's|comm=s'   => \$comm,
 | 
			
		||||
    'v|ver=i'    => \$ver,
 | 
			
		||||
    'i|ignore'   => \$ignore,
 | 
			
		||||
    'p|print=s'  => \@dump,
 | 
			
		||||
    'm|mibdir=s' => \$mibdirs,
 | 
			
		||||
    'n|nobulk'   => \$nobulk,
 | 
			
		||||
    'x|debug+'   => \$debug,
 | 
			
		||||
    'k|cache'    => \$cache,
 | 
			
		||||
    'h|?|help'   => sub { pod2usage(1); },
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
unless ( $device and $comm ) {
 | 
			
		||||
    pod2usage(2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if ( $ignore && !defined $mibdirs ) {
 | 
			
		||||
    print "mibdirs must be provided if ignoring snmp.conf \n\n";
 | 
			
		||||
    pod2usage(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local $ENV{'SNMPCONFPATH'} = $EMPTY     if $ignore;
 | 
			
		||||
local $ENV{'MIBDIRS'}      = "$mibdirs" if $ignore;
 | 
			
		||||
 | 
			
		||||
if ( defined $mibdirs ) {
 | 
			
		||||
    SNMP::addMibDirs($mibdirs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$class = $class ? "SNMP::Info::$class" : 'SNMP::Info';
 | 
			
		||||
 | 
			
		||||
( my $mod = "$class.pm" )
 | 
			
		||||
    =~ s{::}{/}xg;    # SNMP::Info::Layer3 => SNMP/Info/Layer3.pm
 | 
			
		||||
if ( !eval { require $mod; 1; } ) {
 | 
			
		||||
    croak "Could not load $class. Error Message: $@\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $class_ver = $class->VERSION();
 | 
			
		||||
 | 
			
		||||
print
 | 
			
		||||
    "Class $class ($class_ver) loaded from SNMP::Info $SNMP::Info::VERSION.\n";
 | 
			
		||||
 | 
			
		||||
if ( scalar @dump ) { print 'Dumping : ', join( q{,}, @dump ), "\n" }
 | 
			
		||||
 | 
			
		||||
my %args = ();
 | 
			
		||||
if ($nobulk) {
 | 
			
		||||
    $args{BulkWalk} = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $dev = $class->new(
 | 
			
		||||
    'AutoSpecify' => 0,
 | 
			
		||||
    'AutoVerBack' => 0,
 | 
			
		||||
    'Debug'       => $debug,
 | 
			
		||||
    'Version'     => $ver,
 | 
			
		||||
    'DestHost'    => $device,
 | 
			
		||||
    'Community'   => $comm,
 | 
			
		||||
    %args
 | 
			
		||||
) or die "\n";
 | 
			
		||||
 | 
			
		||||
print "Connected to $device.\n";
 | 
			
		||||
print 'Detected Class: ', $dev->device_type(), "\n";
 | 
			
		||||
print "Using    Class: $class (-c to change)\n";
 | 
			
		||||
 | 
			
		||||
my $layers = $dev->layers();
 | 
			
		||||
my $descr  = $dev->description();
 | 
			
		||||
 | 
			
		||||
if ( !defined $layers || !defined $descr ) {
 | 
			
		||||
    die
 | 
			
		||||
	"Are you sure you got the right community string and version?\nCan't fetch layers or description.\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching base info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @base_fns = qw/vendor model os os_ver description contact location
 | 
			
		||||
    layers mac serial/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@base_fns) {
 | 
			
		||||
    test_global( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching interface info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @fns = qw/interfaces i_type i_ignore i_description i_mtu i_speed i_mac i_up
 | 
			
		||||
    i_up_admin i_name i_duplex i_duplex_admin i_stp_state
 | 
			
		||||
    i_vlan i_pvid i_lastchange/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@fns) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching VLAN info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @vlan = qw/v_index v_name/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@vlan) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching topology info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @topo = qw/c_if c_ip c_port c_id c_platform/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@topo) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching module info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @modules = qw/e_descr e_type e_parent e_name e_class e_pos e_hwver
 | 
			
		||||
    e_fwver e_swver e_model e_serial e_fru/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@modules) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@dump) {
 | 
			
		||||
    if ( !$dumped{$fn} ) { test_fn( $dev, $fn ) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if ($cache) {
 | 
			
		||||
    eval {
 | 
			
		||||
        require Data::Printer;
 | 
			
		||||
    } && eval {
 | 
			
		||||
        print "\nDumping cache...\n\n";
 | 
			
		||||
        Data::Printer::p $dev;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------
 | 
			
		||||
 | 
			
		||||
sub test_global {
 | 
			
		||||
    my $info   = shift;
 | 
			
		||||
    my $method = shift;
 | 
			
		||||
 | 
			
		||||
    my $value = $info->$method();
 | 
			
		||||
 | 
			
		||||
    if ( !defined $value ) {
 | 
			
		||||
	printf "%-20s Does not exist.\n", $method;
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
    $value =~ s/[[:cntrl:]]+/ /gx;
 | 
			
		||||
    if ( length $value > 60 ) {
 | 
			
		||||
	$value = substr $value, 0, 60;
 | 
			
		||||
	$value .= '...';
 | 
			
		||||
    }
 | 
			
		||||
    printf "%-20s %s \n", $method, $value;
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub test_fn {
 | 
			
		||||
    my $info   = shift;
 | 
			
		||||
    my $method = shift;
 | 
			
		||||
 | 
			
		||||
    my $results = $info->$method();
 | 
			
		||||
 | 
			
		||||
    # If accidentally called on a global, pass it along nicely.
 | 
			
		||||
    if ( defined $results && !ref $results ) {
 | 
			
		||||
	return test_global( $dev, $method );
 | 
			
		||||
    }
 | 
			
		||||
    if ( !defined $results && !scalar keys %{$results} ) {
 | 
			
		||||
	printf "%-20s Empty Results.\n", $method;
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf "%-20s %d rows.\n", $method, scalar keys %{$results};
 | 
			
		||||
    if ( grep {/^$method$/x} @dump ) {
 | 
			
		||||
	$dumped{$method} = 1;
 | 
			
		||||
	foreach my $iid ( keys %{$results} ) {
 | 
			
		||||
	    print "  $iid : ";
 | 
			
		||||
	    if ( ref( $results->{$iid} ) eq 'ARRAY' ) {
 | 
			
		||||
		print '[ ', join( ', ', @{ $results->{$iid} } ), ' ]';
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		print $results->{$iid};
 | 
			
		||||
	    }
 | 
			
		||||
	    print "\n";
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
test_class.pl - Test a device against an SNMP::Info class.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
test_class.pl [options]
 | 
			
		||||
 | 
			
		||||
Options:
 | 
			
		||||
 | 
			
		||||
    -c|class    SNMP::Info class to use, Layer2::Catalyst    
 | 
			
		||||
    -d|dev      Device
 | 
			
		||||
    -s|comm     SNMP community
 | 
			
		||||
    -v|ver      SNMP version
 | 
			
		||||
    -p|print    Print values 
 | 
			
		||||
    -i|ignore   Ignore Net-SNMP configuration file
 | 
			
		||||
    -m|mibdir   Directory containing MIB Files
 | 
			
		||||
    -n|nobulk   Disable bulkwalk
 | 
			
		||||
    -x|debug    Debugging flag
 | 
			
		||||
    -k|cache    Dump cache (requires Data::Printer to be installed)
 | 
			
		||||
    -h|?|help   Brief help message
 | 
			
		||||
 | 
			
		||||
=head1 OPTIONS
 | 
			
		||||
 | 
			
		||||
=over 8
 | 
			
		||||
 | 
			
		||||
=item B<-class>
 | 
			
		||||
 | 
			
		||||
Specific SNMP::Info class to use.  Defaults to SNMP::Info if no specific
 | 
			
		||||
class provided.
 | 
			
		||||
 | 
			
		||||
-class Layer2::Catalyst
 | 
			
		||||
 | 
			
		||||
=item B<-dev>
 | 
			
		||||
 | 
			
		||||
Device to test against.  No default and a mandatory option.
 | 
			
		||||
 | 
			
		||||
-dev 1.2.3.4
 | 
			
		||||
 | 
			
		||||
=item B<-comm>
 | 
			
		||||
 | 
			
		||||
SNMP community string.  No default and a mandatory option.
 | 
			
		||||
 | 
			
		||||
-comm public
 | 
			
		||||
 | 
			
		||||
=item B<-ver>
 | 
			
		||||
 | 
			
		||||
SNMP version. Default 2.
 | 
			
		||||
 | 
			
		||||
-ver 1
 | 
			
		||||
 | 
			
		||||
=item B<-print>
 | 
			
		||||
 | 
			
		||||
Print values of a class method rather than summarizing.  May be repeated
 | 
			
		||||
multiple times. 
 | 
			
		||||
 | 
			
		||||
-print i_description -print i_type
 | 
			
		||||
 | 
			
		||||
=item B<-ignore >
 | 
			
		||||
 | 
			
		||||
Ignore Net-SNMP configuration file snmp.conf.  If this used mibdirs must be
 | 
			
		||||
provided.
 | 
			
		||||
 | 
			
		||||
-ignore
 | 
			
		||||
 | 
			
		||||
=item B<-mibdir>
 | 
			
		||||
 | 
			
		||||
Directory containing MIB Files.  Multiple directories should be separated by a
 | 
			
		||||
colon ':'. 
 | 
			
		||||
 | 
			
		||||
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
 | 
			
		||||
 | 
			
		||||
=item B<-nobulk >
 | 
			
		||||
 | 
			
		||||
Disable SNMP bulkwalk. Default bulkwalk is on and utilized with version 2.
 | 
			
		||||
 | 
			
		||||
-nobulk
 | 
			
		||||
 | 
			
		||||
=item B<-debug>
 | 
			
		||||
 | 
			
		||||
Turns on SNMP::Info debug.
 | 
			
		||||
 | 
			
		||||
-debug
 | 
			
		||||
 | 
			
		||||
=item B<-cache>
 | 
			
		||||
 | 
			
		||||
Dumps the table and leaf cache at the end of running. Requires that the
 | 
			
		||||
L<Data::Printer> module be installed, otherwise does nothing.
 | 
			
		||||
 | 
			
		||||
-cache
 | 
			
		||||
 | 
			
		||||
=item B<-help>
 | 
			
		||||
 | 
			
		||||
Print help message and exits.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
B<test_class.pl> will test a device against a specfied SNMP::Info class.
 | 
			
		||||
This allows debugging and testing of live devices to include validating
 | 
			
		||||
device support with existing classes.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										454
									
								
								contrib/util/test_class_mocked.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										454
									
								
								contrib/util/test_class_mocked.pl
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,454 @@
 | 
			
		||||
#!/usr/bin/env perl
 | 
			
		||||
#
 | 
			
		||||
# test_class_mocked.pl
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2012 Eric Miller
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Carp;
 | 
			
		||||
use FindBin;
 | 
			
		||||
use lib "$FindBin::Bin/../../lib";
 | 
			
		||||
use File::Slurp qw(slurp);
 | 
			
		||||
use Getopt::Long;
 | 
			
		||||
use Pod::Usage;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
use Test::MockObject::Extends;
 | 
			
		||||
 | 
			
		||||
my $EMPTY = q{};
 | 
			
		||||
 | 
			
		||||
# Default Values
 | 
			
		||||
my $class = $EMPTY;
 | 
			
		||||
my @dump  = ();
 | 
			
		||||
my $debug = 0;
 | 
			
		||||
my $mibdirs;
 | 
			
		||||
my $ignore = 0;
 | 
			
		||||
my $help   = 0;
 | 
			
		||||
my $file;
 | 
			
		||||
my %dumped;
 | 
			
		||||
 | 
			
		||||
GetOptions(
 | 
			
		||||
    'c|class=s'  => \$class,
 | 
			
		||||
    'i|ignore'   => \$ignore,
 | 
			
		||||
    'p|print=s'  => \@dump,
 | 
			
		||||
    'x|debug+'   => \$debug,
 | 
			
		||||
    'm|mibdir=s' => \$mibdirs,
 | 
			
		||||
    'file=s'     => \$file,
 | 
			
		||||
    'h|?|help'   => sub { pod2usage(1); },
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
if ( !$file ) {
 | 
			
		||||
    pod2usage(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if ( $ignore && !defined $mibdirs ) {
 | 
			
		||||
    print "mibdirs must be provided if ignoring snmp.conf \n\n";
 | 
			
		||||
    pod2usage(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local $ENV{'SNMPCONFPATH'} = $EMPTY     if $ignore;
 | 
			
		||||
local $ENV{'MIBDIRS'}      = "$mibdirs" if $ignore;
 | 
			
		||||
 | 
			
		||||
if ( defined $mibdirs ) {
 | 
			
		||||
    SNMP::addMibDirs($mibdirs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$class = $class ? "SNMP::Info::$class" : 'SNMP::Info';
 | 
			
		||||
 | 
			
		||||
( my $mod = "$class.pm" )
 | 
			
		||||
    =~ s{::}{/}g;    # SNMP::Info::Layer3 => SNMP/Info/Layer3.pm
 | 
			
		||||
if ( !eval { require $mod; 1; } ) {
 | 
			
		||||
    croak "Could not load $class. Error Message: $@\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $class_ver = $class->VERSION();
 | 
			
		||||
 | 
			
		||||
print
 | 
			
		||||
    "Class $class ($class_ver) loaded from SNMP::Info $SNMP::Info::VERSION.\n";
 | 
			
		||||
 | 
			
		||||
if ( scalar @dump ) { print 'Dumping : ', join( q{,}, @dump ), "\n" }
 | 
			
		||||
 | 
			
		||||
my $mocked = create_mock_session();
 | 
			
		||||
 | 
			
		||||
my $dev = $class->new(
 | 
			
		||||
    'AutoSpecify' => 0,
 | 
			
		||||
    'BulkWalk'    => 0,
 | 
			
		||||
    'Debug'       => $debug,
 | 
			
		||||
    'Session'     => $mocked,
 | 
			
		||||
) or die "\n";
 | 
			
		||||
 | 
			
		||||
print 'Detected Class: ', $dev->device_type(), "\n";
 | 
			
		||||
print "Using    Class: $class (-c to change)\n";
 | 
			
		||||
 | 
			
		||||
my $layers = $dev->layers();
 | 
			
		||||
my $descr  = $dev->description();
 | 
			
		||||
 | 
			
		||||
if ( !defined $layers || !defined $descr ) {
 | 
			
		||||
    die "Are you sure you specified a file created with make_snmpdata.pl ?\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching base info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @base_fns = qw/vendor model os os_ver description contact location
 | 
			
		||||
    layers mac serial/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@base_fns) {
 | 
			
		||||
    test_global( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching interface info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @fns = qw/interfaces i_type i_ignore i_description i_mtu i_speed i_mac i_up
 | 
			
		||||
    i_up_admin i_name i_duplex i_duplex_admin i_stp_state
 | 
			
		||||
    i_vlan i_pvid i_lastchange/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@fns) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching VLAN info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @vlan = qw/v_index v_name/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@vlan) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching topology info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @topo = qw/c_if c_ip c_port c_id c_platform/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@topo) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print "\nFetching module info...\n\n";
 | 
			
		||||
 | 
			
		||||
my @modules = qw/e_descr e_type e_parent e_name e_class e_pos e_hwver
 | 
			
		||||
                e_fwver e_swver e_model e_serial e_fru/;
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@modules) {
 | 
			
		||||
    test_fn( $dev, $fn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
foreach my $fn (@dump) {
 | 
			
		||||
    if ( !$dumped{$fn} ) { test_fn( $dev, $fn ) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#--------------------------------
 | 
			
		||||
 | 
			
		||||
sub load_snmpdata {
 | 
			
		||||
    my $data_file = shift;
 | 
			
		||||
 | 
			
		||||
    my @lines = slurp($data_file);
 | 
			
		||||
 | 
			
		||||
    my $snmp_data = {};
 | 
			
		||||
    foreach my $line (@lines) {
 | 
			
		||||
	next if !$line;
 | 
			
		||||
	next if ( $line =~ /^#/ );
 | 
			
		||||
	if ( $line =~ /^(\S+::\w+)[.]?(\S+)*\s=\s(.*)$/ ) {
 | 
			
		||||
	    my ( $leaf, $iid, $val ) = ( $1, $2, $3 );
 | 
			
		||||
	    next if !$leaf;
 | 
			
		||||
	    $iid ||= 0;
 | 
			
		||||
	    $val =~ s/\"//g;
 | 
			
		||||
	    $snmp_data->{$leaf}->{$iid} = $val;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return $snmp_data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub create_mock_session {
 | 
			
		||||
 | 
			
		||||
    my $snmp_data = load_snmpdata($file);
 | 
			
		||||
 | 
			
		||||
    my $session = SNMP::Session->new(
 | 
			
		||||
	UseEnums    => 1,
 | 
			
		||||
	RetryNoSuch => 1,
 | 
			
		||||
	Data        => $snmp_data,
 | 
			
		||||
	DestHost    => '127.0.0.1',
 | 
			
		||||
	Community   => 'public',
 | 
			
		||||
	Version     => 2,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    my $mock_session = Test::MockObject::Extends->new($session);
 | 
			
		||||
 | 
			
		||||
    mock_get($mock_session);
 | 
			
		||||
    mock_getnext($mock_session);
 | 
			
		||||
 | 
			
		||||
    return $mock_session;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mock_get {
 | 
			
		||||
    my $mock_session = shift;
 | 
			
		||||
 | 
			
		||||
    $mock_session->mock(
 | 
			
		||||
	'get',
 | 
			
		||||
	sub {
 | 
			
		||||
	    my $self = shift;
 | 
			
		||||
	    my $vars = shift;
 | 
			
		||||
	    my ( $leaf, $iid, $oid, $oid_name );
 | 
			
		||||
	    my $c_data = $self->{Data};
 | 
			
		||||
 | 
			
		||||
	    # From SNMP::Info get will only be passed either an OID or
 | 
			
		||||
	    # SNMP::Varbind with a fully qualified leaf and potentially
 | 
			
		||||
	    # a partial
 | 
			
		||||
	    if ( ref($vars) =~ /SNMP::Varbind/ ) {
 | 
			
		||||
		( $leaf, $iid ) = @{$vars};
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		$oid = $vars;
 | 
			
		||||
		$oid_name = SNMP::translateObj( $oid, 0, 1 ) || $EMPTY;
 | 
			
		||||
		( $leaf, $iid ) = $oid_name =~ /^(\S+::\w+)[.]?(\S+)*$/;
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    $iid ||= 0;
 | 
			
		||||
	    my $new_iid = $iid;
 | 
			
		||||
	    my $val     = $EMPTY;
 | 
			
		||||
	    my $data    = $c_data->{$leaf} || {};
 | 
			
		||||
	    my $count   = scalar keys %{$data} || 0;
 | 
			
		||||
	    if ( $count > 1 ) {
 | 
			
		||||
		my $found = 0;
 | 
			
		||||
		foreach my $d_iid ( sort keys %{$data} ) {
 | 
			
		||||
		    if ( $d_iid eq $iid ) {
 | 
			
		||||
			$val   = $data->{$d_iid};
 | 
			
		||||
			$found = 1;
 | 
			
		||||
			next;
 | 
			
		||||
		    }
 | 
			
		||||
		    elsif ( $found == 1 ) {
 | 
			
		||||
			$new_iid = $d_iid;
 | 
			
		||||
			last;
 | 
			
		||||
		    }
 | 
			
		||||
		}
 | 
			
		||||
		if ( $found && ( $new_iid eq $iid ) ) {
 | 
			
		||||
		    $leaf = 'unknown';
 | 
			
		||||
		}
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		$val  = $data->{$iid};
 | 
			
		||||
		$leaf = 'unknown';
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    if ( ref $vars =~ /SNMP::Varbind/ ) {
 | 
			
		||||
		$vars->[0] = $leaf;
 | 
			
		||||
		$vars->[1] = $new_iid;
 | 
			
		||||
		$vars->[2] = $val;
 | 
			
		||||
	    }
 | 
			
		||||
	    return ( wantarray() ? $vars : $val );
 | 
			
		||||
	}
 | 
			
		||||
    );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub mock_getnext {
 | 
			
		||||
    my $mock_session = shift;
 | 
			
		||||
 | 
			
		||||
    $mock_session->mock(
 | 
			
		||||
	'getnext',
 | 
			
		||||
	sub {
 | 
			
		||||
	    my $self = shift;
 | 
			
		||||
	    my $vars = shift;
 | 
			
		||||
	    my ( $leaf, $iid, $oid, $oid_name );
 | 
			
		||||
	    my $c_data = $self->{Data};
 | 
			
		||||
 | 
			
		||||
	    # From SNMP::Info getnext will only be passed a SNMP::Varbind
 | 
			
		||||
	    # with a fully qualified leaf and potentially a partial
 | 
			
		||||
	    ( $leaf, $iid ) = @{$vars};
 | 
			
		||||
 | 
			
		||||
	    unless (defined $iid) {
 | 
			
		||||
		$iid = -1;
 | 
			
		||||
	    }
 | 
			
		||||
	    my $new_iid = $iid;
 | 
			
		||||
	    my $val     = $EMPTY;
 | 
			
		||||
	    my $data    = $c_data->{$leaf};
 | 
			
		||||
	    my $count   = scalar keys %{$data} || 0;
 | 
			
		||||
	    if ( $count ) {
 | 
			
		||||
		my $found = 0;
 | 
			
		||||
		foreach my $d_iid ( sort keys %{$data} ) {
 | 
			
		||||
		    if ( $d_iid gt $iid && !$found ) {
 | 
			
		||||
			$val     = $data->{$d_iid};
 | 
			
		||||
			$new_iid = $d_iid;
 | 
			
		||||
			$found   = 1;
 | 
			
		||||
			next;
 | 
			
		||||
		    }
 | 
			
		||||
		    elsif ( $found == 1 ) {
 | 
			
		||||
			last;
 | 
			
		||||
		    }
 | 
			
		||||
		}
 | 
			
		||||
		if ( $found && ( $new_iid eq $iid ) ) {
 | 
			
		||||
		    $leaf = 'unknown';
 | 
			
		||||
		}
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		$val  = $data->{$iid};
 | 
			
		||||
		$leaf = 'unknown';
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    $vars->[0] = $leaf;
 | 
			
		||||
	    $vars->[1] = $new_iid;
 | 
			
		||||
	    $vars->[2] = $val;
 | 
			
		||||
	    return ( wantarray() ? $vars : $val );
 | 
			
		||||
	}
 | 
			
		||||
    );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub test_global {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $method = shift;
 | 
			
		||||
 | 
			
		||||
    my $value = $device->$method();
 | 
			
		||||
 | 
			
		||||
    if ( !defined $value ) {
 | 
			
		||||
	printf "%-20s Does not exist.\n", $method;
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
    $value =~ s/[[:cntrl:]]+/ /g;
 | 
			
		||||
    if ( length $value > 60 ) {
 | 
			
		||||
	$value = substr $value, 0, 60;
 | 
			
		||||
	$value .= '...';
 | 
			
		||||
    }
 | 
			
		||||
    printf "%-20s %s \n", $method, $value;
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub test_fn {
 | 
			
		||||
    my $device = shift;
 | 
			
		||||
    my $method = shift;
 | 
			
		||||
 | 
			
		||||
    my $results = $device->$method();
 | 
			
		||||
 | 
			
		||||
    # If accidentally called on a global, pass it along nicely.
 | 
			
		||||
    if ( defined $results && !ref $results ) {
 | 
			
		||||
	return test_global( $dev, $method );
 | 
			
		||||
    }
 | 
			
		||||
    if ( !defined $results && !scalar keys %{$results} ) {
 | 
			
		||||
	printf "%-20s Empty Results.\n", $method;
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf "%-20s %d rows.\n", $method, scalar keys %{$results};
 | 
			
		||||
    if ( grep {/^$method$/} @dump ) {
 | 
			
		||||
	$dumped{$method} = 1;
 | 
			
		||||
	foreach my $iid ( keys %{$results} ) {
 | 
			
		||||
	    print "  $iid : ";
 | 
			
		||||
	    if ( ref( $results->{$iid} ) eq 'ARRAY' ) {
 | 
			
		||||
		print '[ ', join( ', ', @{ $results->{$iid} } ), ' ]';
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		print $results->{$iid};
 | 
			
		||||
	    }
 | 
			
		||||
	    print "\n";
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
test_class_mocked.pl - Test a device against an SNMP::Info class using
 | 
			
		||||
output from make_snmpdata.pl stored in a text file.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
test_class_mocked.pl [options]
 | 
			
		||||
 | 
			
		||||
Options:
 | 
			
		||||
 | 
			
		||||
    -class    SNMP::Info class to use, Layer2::Catalyst    
 | 
			
		||||
    -file     File containing data gathered using make_snmpdata.pl
 | 
			
		||||
    -print    Print values 
 | 
			
		||||
    -debug    Debugging flag
 | 
			
		||||
    -ignore   Ignore Net-SNMP configuration file
 | 
			
		||||
    -mibdir   Directory containing MIB Files
 | 
			
		||||
    -help     Brief help message
 | 
			
		||||
 | 
			
		||||
=head1 OPTIONS
 | 
			
		||||
 | 
			
		||||
=over 8
 | 
			
		||||
 | 
			
		||||
=item B<-class>
 | 
			
		||||
 | 
			
		||||
Specific SNMP::Info class to use.  Defaults to SNMP::Info if no specific
 | 
			
		||||
class provided.
 | 
			
		||||
 | 
			
		||||
-class Layer2::Catalyst
 | 
			
		||||
 | 
			
		||||
=item B<-file>
 | 
			
		||||
 | 
			
		||||
File containing data gathered using make_snmpdata.pl.  No default and a
 | 
			
		||||
mandatory option.
 | 
			
		||||
 | 
			
		||||
-file /data/mydevice.txt
 | 
			
		||||
 | 
			
		||||
=item B<-print>
 | 
			
		||||
 | 
			
		||||
Print values of a class method rather than summarizing.  May be repeated
 | 
			
		||||
multiple times. 
 | 
			
		||||
 | 
			
		||||
-print i_description -print i_type
 | 
			
		||||
 | 
			
		||||
=item B<-debug>
 | 
			
		||||
 | 
			
		||||
Turns on SNMP::Info debug.
 | 
			
		||||
 | 
			
		||||
-debug
 | 
			
		||||
 | 
			
		||||
=item B<-ignore >
 | 
			
		||||
 | 
			
		||||
Ignore Net-SNMP configuration file snmp.conf.  If this used mibdirs must be
 | 
			
		||||
provided.
 | 
			
		||||
 | 
			
		||||
-ignore
 | 
			
		||||
 | 
			
		||||
=item B<-mibdir>
 | 
			
		||||
 | 
			
		||||
Directory containing MIB Files.  Multiple directories should be separated by a
 | 
			
		||||
colon ':'. 
 | 
			
		||||
 | 
			
		||||
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
 | 
			
		||||
 | 
			
		||||
=item B<-help>
 | 
			
		||||
 | 
			
		||||
Print help message and exits.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
B<test_class_mocked.pl> will test a device against an SNMP::Info class using
 | 
			
		||||
snmpwalk output from the utility B<make_snmpdata.pl> stored in a text file.
 | 
			
		||||
This allows debugging and testing without requiring network access to the
 | 
			
		||||
device being tested.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										341
									
								
								lib/SNMP/Info/AMAP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										341
									
								
								lib/SNMP/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.52';
 | 
			
		||||
 | 
			
		||||
%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
									
								
								lib/SNMP/Info/AdslLine.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								lib/SNMP/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.52';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
# $Id$
 | 
			
		||||
# SNMP::Info::Aggregate
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2005 Matt Tuttle
 | 
			
		||||
# Copyright (c) 2014 SNMP::Info Developers
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
@@ -27,88 +27,103 @@
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CiscoImage;
 | 
			
		||||
package SNMP::Info::Aggregate;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoImage::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoImage::EXPORT_OK = qw//;
 | 
			
		||||
@SNMP::Info::Aggregate::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Aggregate::EXPORT_OK = qw/agg_ports_ifstack/;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-IMAGE-MIB' => 'ciscoImageString', );
 | 
			
		||||
%MIBS = (); # IF-MIB
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( 'ci_images' => 'ciscoImageString', );
 | 
			
		||||
%FUNCS = ();
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
 | 
			
		||||
sub agg_ports_ifstack {
 | 
			
		||||
  my $dev = shift;
 | 
			
		||||
  my $partial = shift;
 | 
			
		||||
 | 
			
		||||
  my $ifStack = $dev->ifStackStatus();
 | 
			
		||||
  # TODO: if we want to do partial, we need to use inverse status
 | 
			
		||||
  my $ifType = $dev->ifType();
 | 
			
		||||
 | 
			
		||||
  my $ret = {};
 | 
			
		||||
 | 
			
		||||
  foreach my $idx ( keys %$ifStack ) {
 | 
			
		||||
      my ( $higher, $lower ) = split /\./, $idx;
 | 
			
		||||
      next if ( $higher == 0 or $lower == 0 );
 | 
			
		||||
      if ( $ifType->{ $higher } eq 'ieee8023adLag'  or $ifType->{ $higher } eq 'propMultiplexor') {
 | 
			
		||||
          $ret->{ $lower } = $higher;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoImage - SNMP Interface to image strings for Cisco Devices
 | 
			
		||||
SNMP::Info::Aggregate - SNMP Interface to ifStackTable Aggregated Links
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Matt Tuttle (C<mtuttle@americanhebrewacademy.org>)
 | 
			
		||||
SNMP::Info Developers
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
                )
 | 
			
		||||
 # 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 = $ci->class();
 | 
			
		||||
 my $class = $info->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.
 | 
			
		||||
This class provides access to Aggregated Links configuration on devices
 | 
			
		||||
supporting C<ifStackTable>.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
L<SNMP::Info>
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-IMAGE-MIB>
 | 
			
		||||
=item F<IF-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
=head1 METHODS
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
=over 4
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
=item C<agg_ports_ifstack>
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ci->ci_images()
 | 
			
		||||
 | 
			
		||||
Returns the table of image strings.
 | 
			
		||||
 | 
			
		||||
C<ciscoImageString>
 | 
			
		||||
Returns a HASH reference mapping from slave to master port for each member of
 | 
			
		||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
 | 
			
		||||
ifIndex of the corresponding master ports.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
@@ -83,7 +83,8 @@ $VERSION = '2.05';
 | 
			
		||||
    'airespace_ess_qos'       => 'bsnDot11EssQualityOfService',
 | 
			
		||||
    'airespace_ess_ifname'    => 'bsnDot11EssInterfaceName',
 | 
			
		||||
    'airespace_ess_aclname'   => 'bsnDot11EssAclName',
 | 
			
		||||
 | 
			
		||||
    'airespace_ess_bcast'     => 'bsnDot11EssBroadcastSsid',
 | 
			
		||||
    
 | 
			
		||||
    # AIRESPACE-WIRELESS-MIB::bsnAPTable
 | 
			
		||||
    'airespace_ap_mac'      => 'bsnAPDot3MacAddress',
 | 
			
		||||
    'airespace_ap_name'     => 'bsnAPName',
 | 
			
		||||
@@ -105,6 +106,7 @@ $VERSION = '2.05';
 | 
			
		||||
    'airespace_apif'        => 'bsnAPIfOperStatus',
 | 
			
		||||
    'airespace_apif_oride'  => 'bsnAPIfWlanOverride',
 | 
			
		||||
    'airespace_apif_admin'  => 'bsnAPIfAdminStatus',
 | 
			
		||||
    'airespace_apif_a_pwr'  => 'bsnAPIfAbsolutePowerList',
 | 
			
		||||
 | 
			
		||||
    # AIRESPACE-WIRELESS-MIB::bsnMobileStationTable
 | 
			
		||||
    'airespace_sta_mac'     => 'bsnMobileStationAPMacAddr',
 | 
			
		||||
@@ -146,6 +148,16 @@ $VERSION = '2.05';
 | 
			
		||||
    # AIRESPACE-SWITCHING-MIB::agentPortConfigTable
 | 
			
		||||
    'airespace_duplex_admin' => 'agentPortPhysicalMode',
 | 
			
		||||
    'airespace_duplex'       => 'agentPortPhysicalStatus',
 | 
			
		||||
 | 
			
		||||
    # This needs to be cleaned up, but for now we pretend to
 | 
			
		||||
    # have the CISCO-DOT11-MIB for signal strengths, etc.
 | 
			
		||||
    'cd11_sigstrength' => 'bsnMobileStationRSSI', # kinda
 | 
			
		||||
    'cd11_sigqual'     => 'bsnMobileStationSnr',  # kinda
 | 
			
		||||
    'cd11_rxbyte'      => 'bsnMobileStationBytesReceived',
 | 
			
		||||
    'cd11_txbyte'      => 'bsnMobileStationBytesSent',
 | 
			
		||||
    'cd11_rxpkt'       => 'bsnMobileStationPacketsReceived',
 | 
			
		||||
    'cd11_txpkt'       => 'bsnMobileStationPacketsSent',
 | 
			
		||||
    'cd11_ssid'        => 'bsnMobileStationSsid',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
@@ -156,6 +168,8 @@ $VERSION = '2.05';
 | 
			
		||||
    'airespace_bl_mac'      => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'airespace_if_mac'      => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'airespace_sta_mac'     => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'cd11_rxpkt'            => \&munge_64bits,
 | 
			
		||||
    'cd11_txpkt'            => \&munge_64bits,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
@@ -419,11 +433,12 @@ sub i_mac {
 | 
			
		||||
            next unless defined $mac;
 | 
			
		||||
            $i_mac{$iid} = $mac;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Don't grab AP MACs - we want the AP to show up on edge switch
 | 
			
		||||
        # ports
 | 
			
		||||
        elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
 | 
			
		||||
            $index =~ s/\.\d+$//;
 | 
			
		||||
            next unless defined $index;
 | 
			
		||||
            $i_mac{$iid} = $index;
 | 
			
		||||
        }
 | 
			
		||||
        # Some switch interfaces have MACs, virtuals report 00:00:00:00:00:00
 | 
			
		||||
 | 
			
		||||
        else {
 | 
			
		||||
            my $mac = $if_mac->{$iid};
 | 
			
		||||
            next unless defined $mac;
 | 
			
		||||
@@ -562,6 +577,13 @@ sub bp_index {
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $airespace->SUPER::fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
@@ -631,20 +653,96 @@ sub i_ssidbcast {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $ssidlist = $airespace->i_ssidlist($partial)   || {};
 | 
			
		||||
    my $bc_mode  = $airespace->airespace_bssid_mode() || 'enable';
 | 
			
		||||
    my $ssidlist    = $airespace->i_ssidlist($partial)   || {};
 | 
			
		||||
    my $bc_mode     = $airespace->airespace_bssid_mode() || 'enable';
 | 
			
		||||
    my $ess_bc_mode = $airespace->airespace_ess_bcast()  || {};
 | 
			
		||||
    my $ssids       = $airespace->airespace_ess_ssid()   || {};
 | 
			
		||||
    my %ssid_index  = reverse %$ssids;
 | 
			
		||||
 | 
			
		||||
    my %bcmap     = qw/enable 1 disable 0/;
 | 
			
		||||
    my $broadcast = $bcmap{$bc_mode};
 | 
			
		||||
 | 
			
		||||
    my %i_ssidbcast;
 | 
			
		||||
    foreach my $iid ( keys %$ssidlist ) {
 | 
			
		||||
        $i_ssidbcast{$iid} = $broadcast;
 | 
			
		||||
        if (!$broadcast) {
 | 
			
		||||
            $i_ssidbcast{$iid} = $broadcast;
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            my $ssid     = $ssidlist->{$iid};
 | 
			
		||||
            my $ssid_idx = $ssid_index{$ssid};
 | 
			
		||||
            my $bc       = $ess_bc_mode->{$ssid_idx};
 | 
			
		||||
            $i_ssidbcast{$iid} = $bcmap{$bc};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_ssidbcast;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Secret decoder ring for BSSID: https://supportforums.cisco.com/docs/DOC-2935
 | 
			
		||||
# We need radio base MAC, SSID index, radio band, and whether AP is
 | 
			
		||||
# VxWorks or IOS based then we can do the arithmetic
 | 
			
		||||
 | 
			
		||||
sub i_ssidmac {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $ssidlist  = $airespace->i_ssidlist($partial)  || {};
 | 
			
		||||
    my $apif_type = $airespace->airespace_apif_type() || {};
 | 
			
		||||
    my $ap_ios    = $airespace->bsnAPIOSVersion()     || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ssidmac;
 | 
			
		||||
    foreach my $oid ( keys %$ssidlist ) {
 | 
			
		||||
 | 
			
		||||
        my @parts    = split( /\./, $oid );
 | 
			
		||||
        my $ssid_idx = pop(@parts);
 | 
			
		||||
        my $slot     = pop(@parts);
 | 
			
		||||
        my $last     = pop(@parts);
 | 
			
		||||
 | 
			
		||||
        my $iid = $oid;
 | 
			
		||||
 | 
			
		||||
        # Get radio band
 | 
			
		||||
        $iid =~ s/\.\d+$//;
 | 
			
		||||
        my $ap_type = $apif_type->{$iid};
 | 
			
		||||
 | 
			
		||||
        # Determine if IOS based
 | 
			
		||||
        $iid =~ s/\.\d+$//;
 | 
			
		||||
        my $ios = $ap_ios->{$iid} || '';
 | 
			
		||||
 | 
			
		||||
        # 17 can be used as index for 3rd Party AP's.  We only have one
 | 
			
		||||
        # hexadecimal digit to work with so skip if outside the range
 | 
			
		||||
        if ( $ssid_idx > 0 and $ssid_idx < 17 ) {
 | 
			
		||||
 | 
			
		||||
            # Four cases:
 | 
			
		||||
            # IOS and 2.4Ghz count up, starts at zero
 | 
			
		||||
            if ( $ios and $ap_type =~ /b$/ ) {
 | 
			
		||||
                $last = $last + ( $ssid_idx - 1 );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            # IOS and 5Ghz - count down from maximum of 16
 | 
			
		||||
            elsif ( $ios and $ap_type =~ /a$/ ) {
 | 
			
		||||
                $last = $last + ( 16 - $ssid_idx );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            # VxWorks and 5Ghz - count up, starts at zero
 | 
			
		||||
            elsif ( $ios and $ap_type =~ /a$/ ) {
 | 
			
		||||
                $last = $last + ( $ssid_idx - 1 );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            # VxWorks and 2.4Ghz - count down from maximum of 16
 | 
			
		||||
            else {
 | 
			
		||||
                $last = $last + ( 16 - $ssid_idx );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        push( @parts, $last );
 | 
			
		||||
        my $bssid = join( ':', map { sprintf( "%02x", $_ ) } @parts );
 | 
			
		||||
        $i_ssidmac{$oid} = $bssid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_ssidmac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_80211channel {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
@@ -661,6 +759,28 @@ sub i_80211channel {
 | 
			
		||||
    return \%i_80211channel;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub dot11_cur_tx_pwr_mw {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
    my $cur       = $airespace->airespace_apif_power($partial);
 | 
			
		||||
    my $pwr_abs   = $airespace->airespace_apif_a_pwr($partial);
 | 
			
		||||
    
 | 
			
		||||
    my $dot11_cur_tx_pwr_mw = {};
 | 
			
		||||
    foreach my $idx ( keys %$cur ) {
 | 
			
		||||
        my $pwr = $cur->{$idx};
 | 
			
		||||
        if ( $pwr >= 1 && $pwr <= 8 ) {
 | 
			
		||||
 | 
			
		||||
            my @pwr_list = split(/,/, $pwr_abs->{$idx} ); 
 | 
			
		||||
            $dot11_cur_tx_pwr_mw->{$idx} = $pwr_list[$pwr-1]; 
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $dot11_cur_tx_pwr_mw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Pseudo ENTITY-MIB methods
 | 
			
		||||
 | 
			
		||||
sub e_index {
 | 
			
		||||
@@ -940,6 +1060,13 @@ sub at_netaddr {
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_64bits {
 | 
			
		||||
    # The controller sometimes hands off a ridiculous value for packets.
 | 
			
		||||
    # Just truncate it to 32 bits.
 | 
			
		||||
    my $value = shift;
 | 
			
		||||
    return $value & 0xffffffff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -989,7 +1116,7 @@ Do not use directly.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
=item None.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -1115,12 +1242,9 @@ switch.
 | 
			
		||||
 | 
			
		||||
=item $airespace->layers()
 | 
			
		||||
 | 
			
		||||
Returns 00000011.  Class emulates Layer 2 functionality for Thin APs through
 | 
			
		||||
Returns 00000111.  Class emulates Layer 2 functionality for Thin APs through
 | 
			
		||||
proprietary MIBs.
 | 
			
		||||
 | 
			
		||||
=item $airespace->at_netaddr()
 | 
			
		||||
=item $airespace->at_paddr()
 | 
			
		||||
 | 
			
		||||
=item $airespace->serial()
 | 
			
		||||
 | 
			
		||||
(C<agentInventorySerialNumber>)
 | 
			
		||||
@@ -1147,6 +1271,16 @@ Returns reference to hash.  Indicates whether the SSID is broadcast.
 | 
			
		||||
Returns reference to hash.  Current operating frequency channel of the radio
 | 
			
		||||
interface.
 | 
			
		||||
 | 
			
		||||
=item $airespace->dot11_cur_tx_pwr_mw()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Current transmit power, in milliwatts, of the
 | 
			
		||||
radio interface.
 | 
			
		||||
 | 
			
		||||
=item $airespace->i_ssidmac()
 | 
			
		||||
 | 
			
		||||
With the same keys as i_ssidlist, returns the Basic service set
 | 
			
		||||
identification (BSSID), MAC address, the AP is using for the SSID. 
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Dot11 Ess Table  (C<bsnDot11EssTable>)
 | 
			
		||||
@@ -1214,6 +1348,12 @@ enabled.
 | 
			
		||||
 | 
			
		||||
(C<bsnDot11EssAclName>)           
 | 
			
		||||
 | 
			
		||||
=item $airespace->airespace_ess_bcast()
 | 
			
		||||
 | 
			
		||||
This attribute when enabled allows the switch to broadcast this SSID.
 | 
			
		||||
 | 
			
		||||
(C<bsnDot11EssBroadcastSsid>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 AP Table (C<bsnAPTable>)
 | 
			
		||||
@@ -1317,6 +1457,12 @@ However, if this is enabled, then only those WLANs that appear in the
 | 
			
		||||
 | 
			
		||||
(C<bsnAPIfAdminStatus>)
 | 
			
		||||
 | 
			
		||||
=item $airespace->airespace_apif_a_pwr()
 | 
			
		||||
 | 
			
		||||
List of comma separated absolute power levels supported by the radio.
 | 
			
		||||
 | 
			
		||||
(C<bsnAPIfAbsolutePowerList>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Mobile Station Table (C<bsnMobileStationTable>)
 | 
			
		||||
@@ -1546,15 +1692,15 @@ airespace_if_name() for virtual interfaces.
 | 
			
		||||
 | 
			
		||||
=item $airespace->i_description()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to interface types.  Returns C<ifDescr>
 | 
			
		||||
for Ethernet interfaces, airespace_ap_loc() for thin AP interfaces, and
 | 
			
		||||
airespace_if_name() for virtual interfaces.
 | 
			
		||||
Returns reference to map of IIDs to interface descriptions.  Returns
 | 
			
		||||
C<ifDescr> for Ethernet interfaces, airespace_ap_loc() for thin AP
 | 
			
		||||
interfaces, and airespace_if_name() for virtual interfaces.
 | 
			
		||||
 | 
			
		||||
=item $airespace->i_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to map of IIDs to interface descriptions.  Returns
 | 
			
		||||
C<ifType> for Ethernet interfaces, airespace_apif_type() for thin AP
 | 
			
		||||
interfaces, and airespace_if_type() for virtual interfaces.
 | 
			
		||||
Returns reference to map of IIDs to interface types.  Returns C<ifType>
 | 
			
		||||
for Ethernet interfaces, airespace_apif_type() for thin AP interfaces, and
 | 
			
		||||
airespace_if_type() for virtual interfaces.
 | 
			
		||||
 | 
			
		||||
=item $airespace->i_up()
 | 
			
		||||
 | 
			
		||||
@@ -1677,4 +1823,32 @@ entity which 'contains' this entity.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Arp Cache Table Augmentation
 | 
			
		||||
 | 
			
		||||
The controller has knowledge of MAC->IP mappings for wireless clients.
 | 
			
		||||
Augmenting the arp cache data with these MAC->IP mappings enables visibility
 | 
			
		||||
for stations that only communicate locally.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $airespace->at_paddr()
 | 
			
		||||
 | 
			
		||||
Adds MAC addresses extracted from the index of C<bsnMobileStationIpAddress>.
 | 
			
		||||
 | 
			
		||||
=item $airespace->at_netaddr()
 | 
			
		||||
 | 
			
		||||
Adds IP addresses from C<bsnMobileStationIpAddress>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item munge_64bits()
 | 
			
		||||
 | 
			
		||||
Truncate packet values to 32 bits.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -42,7 +42,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'BRIDGE-MIB'   => 'dot1dBaseBridgeAddress',
 | 
			
		||||
@@ -84,6 +84,17 @@ $VERSION = '2.05';
 | 
			
		||||
    'bs_to'     => 'dot1dStaticAllowedToGoTo',
 | 
			
		||||
    'bs_status' => 'dot1dStaticStatus',
 | 
			
		||||
 | 
			
		||||
    # These leafs are not part of a table, but placed here
 | 
			
		||||
    # to return a hash reference to ease API compatibility with
 | 
			
		||||
    # MST and PVST implementations indexed by a spanning tree
 | 
			
		||||
    # instance id
 | 
			
		||||
    'stp_i_mac'       => 'dot1dBaseBridgeAddress',
 | 
			
		||||
    'stp_i_time'      => 'dot1dStpTimeSinceTopologyChange',
 | 
			
		||||
    'stp_i_ntop'      => 'dot1dStpTopChanges',
 | 
			
		||||
    'stp_i_root'      => 'dot1dStpDesignatedRoot',
 | 
			
		||||
    'stp_i_root_port' => 'dot1dStpRootPort',
 | 
			
		||||
    'stp_i_priority'  => 'dot1dStpPriority',
 | 
			
		||||
 | 
			
		||||
    # Spanning Tree Protocol Table : dot1dStpPortTable
 | 
			
		||||
    'stp_p_id'       => 'dot1dStpPort',
 | 
			
		||||
    'stp_p_priority' => 'dot1dStpPortPriority',
 | 
			
		||||
@@ -125,15 +136,18 @@ $VERSION = '2.05';
 | 
			
		||||
    'b_mac'            => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'fw_mac'           => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'bs_mac'           => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'stp_root'         => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'stp_root'         => \&SNMP::Info::munge_prio_mac,
 | 
			
		||||
    'stp_i_mac'        => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'stp_i_root'       => \&SNMP::Info::munge_prio_mac,
 | 
			
		||||
    'stp_p_root'       => \&SNMP::Info::munge_prio_mac,
 | 
			
		||||
    'stp_p_bridge'     => \&SNMP::Info::munge_prio_mac,
 | 
			
		||||
    'stp_p_port'       => \&SNMP::Info::munge_prio_mac,
 | 
			
		||||
    'stp_p_port'       => \&SNMP::Info::munge_prio_port,
 | 
			
		||||
    'qb_cv_egress'     => \&SNMP::Info::munge_port_list,
 | 
			
		||||
    'qb_cv_untagged'   => \&SNMP::Info::munge_port_list,
 | 
			
		||||
    'qb_v_egress'      => \&SNMP::Info::munge_port_list,
 | 
			
		||||
    'qb_v_fbdn_egress' => \&SNMP::Info::munge_port_list,
 | 
			
		||||
    'qb_v_untagged'    => \&SNMP::Info::munge_port_list,
 | 
			
		||||
    'qb_cv_untagged'   => \&SNMP::Info::munge_port_list,
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@@ -158,6 +172,29 @@ sub qb_fw_mac {
 | 
			
		||||
    return $qb_fw_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub qb_fw_vlan {
 | 
			
		||||
    my $bridge  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb_fw_port = $bridge->qb_fw_port($partial);
 | 
			
		||||
    my $qb_fdb_ids = $bridge->qb_fdb_index() || {};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    my $qb_fw_vlan = {};
 | 
			
		||||
    foreach my $idx ( keys %$qb_fw_port ) {
 | 
			
		||||
        my ( $fdb_id, $mac ) = _qb_fdbtable_index($idx);
 | 
			
		||||
        # Many devices do not populate the dot1qVlanCurrentTable, so default
 | 
			
		||||
        # to FDB ID = VID, but if we have a mapping use it.  
 | 
			
		||||
        my $vlan = $fdb_id;
 | 
			
		||||
        # defined as test since some devices have a vlan 0
 | 
			
		||||
        if (defined $qb_fdb_ids->{$fdb_id}) {
 | 
			
		||||
            $vlan = $qb_fdb_ids->{$fdb_id};
 | 
			
		||||
        }
 | 
			
		||||
        $qb_fw_vlan->{$idx} = $vlan;
 | 
			
		||||
    }
 | 
			
		||||
    return $qb_fw_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub qb_i_vlan_t {
 | 
			
		||||
    my $bridge  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
@@ -176,6 +213,54 @@ sub qb_i_vlan_t {
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub qb_fdb_index {
 | 
			
		||||
    my $bridge  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Some devices may not implement TimeFilter in a standard manner
 | 
			
		||||
    # appearing to loop on this request.  Override in the device class,
 | 
			
		||||
    # see Enterasys for example.
 | 
			
		||||
    my $qb_fdb_ids = $bridge->dot1qVlanFdbId() || {};
 | 
			
		||||
 | 
			
		||||
    # Strip the TimeFilter
 | 
			
		||||
    my $vl_fdb_index = {};
 | 
			
		||||
    for my $fdb_entry (keys(%$qb_fdb_ids)) {
 | 
			
		||||
        (my $vlan = $fdb_entry) =~ s/^\d+\.//;
 | 
			
		||||
        $vl_fdb_index->{$qb_fdb_ids->{$fdb_entry}} = $vlan;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $vl_fdb_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Most devices now support Q-BRIDGE-MIB, fall back to 
 | 
			
		||||
# BRIDGE-MIB for those that don't.
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $bridge = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $bridge->qb_fw_mac();
 | 
			
		||||
    return $qb if (ref {} eq ref $qb and scalar keys %$qb);
 | 
			
		||||
 | 
			
		||||
    return $bridge->SUPER::fw_mac();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $bridge = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $bridge->qb_fw_port();
 | 
			
		||||
    return $qb if (ref {} eq ref $qb and scalar keys %$qb);
 | 
			
		||||
 | 
			
		||||
    return $bridge->SUPER::fw_port();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_status {
 | 
			
		||||
    my $bridge = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $bridge->qb_fw_status();
 | 
			
		||||
    return $qb if (ref {} eq ref $qb and scalar keys %$qb);
 | 
			
		||||
    
 | 
			
		||||
    return $bridge->SUPER::fw_status();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_stp_state {
 | 
			
		||||
    my $bridge  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
@@ -295,24 +380,37 @@ sub i_vlan {
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_untagged { goto &i_vlan }
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $bridge  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $bridge->bp_index();
 | 
			
		||||
    # Use VlanCurrentTable if available since it will include dynamic
 | 
			
		||||
    # VLANs.  However, some devices do not populate the table.
 | 
			
		||||
    my $v_ports = $bridge->qb_cv_egress() || $bridge->qb_v_egress();
 | 
			
		||||
 | 
			
		||||
    return $bridge->_vlan_hoa($v_ports, $partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership_untagged {
 | 
			
		||||
    my $bridge  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Use VlanCurrentTable if available since it will include dynamic
 | 
			
		||||
    # VLANs.  However, some devices do not populate the table.
 | 
			
		||||
    my $v_ports = $bridge->qb_cv_untagged() || $bridge->qb_v_untagged();
 | 
			
		||||
 | 
			
		||||
    # 11/07 - Todo: Issue with some devices trying to query VlanCurrentTable
 | 
			
		||||
    # as table may grow very large with frequent VLAN changes.
 | 
			
		||||
    # 06/08 - VlanCurrentTable may be due to timefilter, should query with
 | 
			
		||||
    # zero partial for no time filter.
 | 
			
		||||
    # my $v_ports = $bridge->qb_cv_egress() || $bridge->qb_v_egress();
 | 
			
		||||
    return $bridge->_vlan_hoa($v_ports, $partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    my $v_ports = $bridge->qb_v_egress() || {};
 | 
			
		||||
sub _vlan_hoa {
 | 
			
		||||
    my $bridge = shift;
 | 
			
		||||
    my ( $v_ports, $partial ) = @_;
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    my $index = $bridge->bp_index();
 | 
			
		||||
 | 
			
		||||
    my $vlan_hoa = {};
 | 
			
		||||
    foreach my $idx ( keys %$v_ports ) {
 | 
			
		||||
        next unless ( defined $v_ports->{$idx} );
 | 
			
		||||
        my $portlist = $v_ports->{$idx};
 | 
			
		||||
@@ -332,10 +430,10 @@ sub i_vlan_membership {
 | 
			
		||||
            my $ifindex = $index->{$port};
 | 
			
		||||
            next unless ( defined($ifindex) );    # shouldn't happen
 | 
			
		||||
            next if ( defined $partial and $ifindex !~ /^$partial$/ );
 | 
			
		||||
            push( @{ $i_vlan_membership->{$ifindex} }, $vlan );
 | 
			
		||||
            push( @{ $vlan_hoa->{$ifindex} }, $vlan );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
    return $vlan_hoa;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_pvid {
 | 
			
		||||
@@ -352,6 +450,8 @@ sub set_i_vlan {
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_untagged { goto &set_i_vlan }
 | 
			
		||||
 | 
			
		||||
sub set_add_i_vlan_tagged {
 | 
			
		||||
    my $bridge = shift;
 | 
			
		||||
 | 
			
		||||
@@ -584,6 +684,10 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_untagged()
 | 
			
		||||
 | 
			
		||||
An alias for C<i_vlan>.
 | 
			
		||||
 | 
			
		||||
=item $bridge->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
@@ -599,11 +703,21 @@ IDs.  These are the VLANs which are members of the egress list for the port.
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $bridge->i_vlan_membership_untagged()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.  These are the VLANs which are members of the untagged egress list for
 | 
			
		||||
the port.
 | 
			
		||||
 | 
			
		||||
=item $bridge->qb_i_vlan_t()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash: key = C<dot1dBasePort>, value = either 'trunk' for
 | 
			
		||||
tagged ports or the VLAN ID.
 | 
			
		||||
 | 
			
		||||
=item $bridge->qb_fdb_index()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash: key = VLAN ID, value = FDB ID.
 | 
			
		||||
 | 
			
		||||
=item $bridge->v_index()
 | 
			
		||||
 | 
			
		||||
Returns VLAN IDs
 | 
			
		||||
@@ -631,7 +745,7 @@ identifier (iid)
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries status
 | 
			
		||||
 | 
			
		||||
(C<dot2dTpFdbStatus>)
 | 
			
		||||
(C<dot1dTpFdbStatus>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -657,6 +771,48 @@ to this port.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Spanning Tree Instance Globals
 | 
			
		||||
 | 
			
		||||
These are not part of a table, but return a hash reference to ease API
 | 
			
		||||
compatibility with MST and PVST implementations indexed by a spanning tree
 | 
			
		||||
instance id.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $bridge->stp_i_time()
 | 
			
		||||
 | 
			
		||||
Returns time since last topology change detected. (100ths/second)
 | 
			
		||||
 | 
			
		||||
(C<dot1dStpTimeSinceTopologyChange>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->stp_i_time()
 | 
			
		||||
 | 
			
		||||
Returns the total number of topology changes detected.
 | 
			
		||||
 | 
			
		||||
(C<dot1dStpTopChanges>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->stp_i_root()
 | 
			
		||||
 | 
			
		||||
Returns root of STP.
 | 
			
		||||
 | 
			
		||||
(C<dot1dStpDesignatedRoot>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->stp_i_root_port()
 | 
			
		||||
 | 
			
		||||
Returns the port number of the port that offers the lowest cost path
 | 
			
		||||
to the root bridge.
 | 
			
		||||
 | 
			
		||||
(C<dot1dStpRootPort>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->stp_i_priority()
 | 
			
		||||
 | 
			
		||||
Returns the port number of the port that offers the lowest cost path
 | 
			
		||||
to the root bridge.
 | 
			
		||||
 | 
			
		||||
(C<dot1dStpPriority>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Spanning Tree Protocol Table (C<dot1dStpPortTable>)
 | 
			
		||||
 | 
			
		||||
Descriptions are straight from F<BRIDGE-MIB.my>
 | 
			
		||||
@@ -855,6 +1011,10 @@ identifier (iid)
 | 
			
		||||
 | 
			
		||||
(C<dot1qTpFdbPort>)
 | 
			
		||||
 | 
			
		||||
=item $bridge->qb_fw_vlan()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries VLAN ID
 | 
			
		||||
 | 
			
		||||
=item $bridge->qb_fw_status()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of forwarding table entries status
 | 
			
		||||
@@ -876,6 +1036,10 @@ operations.
 | 
			
		||||
 | 
			
		||||
Currently unsupported.  Throws an error and returns.
 | 
			
		||||
 | 
			
		||||
=item $bridge->set_i_untagged(vlan, ifIndex)
 | 
			
		||||
 | 
			
		||||
An alias for C<set_i_vlan>.
 | 
			
		||||
 | 
			
		||||
=item $bridge->set_i_pvid(pvid, ifIndex)
 | 
			
		||||
 | 
			
		||||
Currently unsupported.  Throws an error and returns.
 | 
			
		||||
@@ -888,4 +1052,6 @@ Currently unsupported.  Throws an error and returns.
 | 
			
		||||
 | 
			
		||||
Currently unsupported.  Throws an error and returns.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -40,9 +40,10 @@ use SNMP::Info;
 | 
			
		||||
@SNMP::Info::CDP::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CDP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
 | 
			
		||||
use vars
 | 
			
		||||
    qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT %CDP_CAPABILITIES/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
# Five data structures required by SNMP::Info
 | 
			
		||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
 | 
			
		||||
@@ -53,40 +54,53 @@ $VERSION = '2.05';
 | 
			
		||||
    'cdp_run'      => 'cdpGlobalRun',
 | 
			
		||||
    'cdp_interval' => 'cdpGlobalMessageInterval',
 | 
			
		||||
    'cdp_holdtime' => 'cdpGlobalHoldTime',
 | 
			
		||||
    'cdp_id'       => 'cdpGlobalDeviceId',
 | 
			
		||||
    'cdp_gid'       => 'cdpGlobalDeviceId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'c_index'        => 'cdpCacheIfIndex',
 | 
			
		||||
    'c_proto'        => 'cdpCacheAddressType',
 | 
			
		||||
    'c_addr'         => 'cdpCacheAddress',
 | 
			
		||||
    'c_ver'          => 'cdpCacheVersion',
 | 
			
		||||
    'c_id'           => 'cdpCacheDeviceId',
 | 
			
		||||
    'c_port'         => 'cdpCacheDevicePort',
 | 
			
		||||
    'c_platform'     => 'cdpCachePlatform',
 | 
			
		||||
    'c_capabilities' => 'cdpCacheCapabilities',
 | 
			
		||||
    'c_domain'       => 'cdpCacheVTPMgmtDomain',
 | 
			
		||||
    'c_vlan'         => 'cdpCacheNativeVLAN',
 | 
			
		||||
    'c_duplex'       => 'cdpCacheDuplex',
 | 
			
		||||
    'c_power'        => 'cdpCachePowerConsumption',
 | 
			
		||||
    'c_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
 | 
			
		||||
    'c_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
 | 
			
		||||
    'c_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
 | 
			
		||||
    'c_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
 | 
			
		||||
    'cdp_index'        => 'cdpCacheIfIndex',
 | 
			
		||||
    'cdp_proto'        => 'cdpCacheAddressType',
 | 
			
		||||
    'cdp_addr'         => 'cdpCacheAddress',
 | 
			
		||||
    'cdp_ver'          => 'cdpCacheVersion',
 | 
			
		||||
    'cdp_dev_id'       => 'cdpCacheDeviceId',
 | 
			
		||||
    'cdp_port'         => 'cdpCacheDevicePort',
 | 
			
		||||
    'cdp_platform'     => 'cdpCachePlatform',
 | 
			
		||||
    'cdp_capabilities' => 'cdpCacheCapabilities',
 | 
			
		||||
    'cdp_domain'       => 'cdpCacheVTPMgmtDomain',
 | 
			
		||||
    'cdp_vlan'         => 'cdpCacheNativeVLAN',
 | 
			
		||||
    'cdp_duplex'       => 'cdpCacheDuplex',
 | 
			
		||||
    'cdp_power'        => 'cdpCachePowerConsumption',
 | 
			
		||||
    'cdp_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
 | 
			
		||||
    'cdp_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
 | 
			
		||||
    'cdp_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
 | 
			
		||||
    'cdp_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'c_capabilities' => \&SNMP::Info::munge_caps,
 | 
			
		||||
    'c_platform'     => \&SNMP::Info::munge_null,
 | 
			
		||||
    'c_domain'       => \&SNMP::Info::munge_null,
 | 
			
		||||
    'c_port'         => \&SNMP::Info::munge_null,
 | 
			
		||||
    'c_id'           => \&SNMP::Info::munge_null,
 | 
			
		||||
    'c_ver'          => \&SNMP::Info::munge_null,
 | 
			
		||||
    'c_ip'           => \&SNMP::Info::munge_ip,
 | 
			
		||||
    'c_power'        => \&munge_power,
 | 
			
		||||
    'cdp_capabilities' => \&SNMP::Info::munge_bits,
 | 
			
		||||
    'cdp_platform'     => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_domain'       => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_port'         => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_ver'          => \&SNMP::Info::munge_null,
 | 
			
		||||
    'cdp_ip'           => \&SNMP::Info::munge_ip,
 | 
			
		||||
    'cdp_power'        => \&munge_power,
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%CDP_CAPABILITIES = (
 | 
			
		||||
    'Router'                  => 0x001,
 | 
			
		||||
    'Trans-Bridge'            => 0x002,
 | 
			
		||||
    'Source-Route-Bridge'     => 0x004,
 | 
			
		||||
    'Switch'                  => 0x008,
 | 
			
		||||
    'Host'                    => 0x010,
 | 
			
		||||
    'IGMP'                    => 0x020,
 | 
			
		||||
    'Repeater'                => 0x040,
 | 
			
		||||
    'VoIP-Phone'              => 0x080,
 | 
			
		||||
    'Remotely-Managed-Device' => 0x100,
 | 
			
		||||
    'Supports-STP-Dispute'    => 0x200,
 | 
			
		||||
    'Two-port Mac Relay'      => 0x400,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub munge_power {
 | 
			
		||||
    my $power = shift;
 | 
			
		||||
    my $decimal = substr( $power, -3 );
 | 
			
		||||
@@ -101,63 +115,114 @@ sub hasCDP {
 | 
			
		||||
 | 
			
		||||
    # SNMP v1 clients dont have the globals
 | 
			
		||||
    if ( defined $ver and $ver == 1 ) {
 | 
			
		||||
        my $c_ip = $cdp->c_ip();
 | 
			
		||||
        my $cdp_ip = $cdp->cdp_ip();
 | 
			
		||||
 | 
			
		||||
        # See if anything in cdp cache, if so we have cdp
 | 
			
		||||
        return 1 if ( defined $c_ip and scalar( keys %$c_ip ) );
 | 
			
		||||
        return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $cdp->cdp_run();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
sub cdp_if {
 | 
			
		||||
    my $cdp = shift;
 | 
			
		||||
 | 
			
		||||
    # See if by some miracle Cisco implemented the cdpCacheIfIndex entry
 | 
			
		||||
    my $c_index = $cdp->c_index();
 | 
			
		||||
    return $c_index if defined $c_index;
 | 
			
		||||
    my $cdp_index = $cdp->cdp_index();
 | 
			
		||||
    return $cdp_index if defined $cdp_index;
 | 
			
		||||
 | 
			
		||||
    # Nope, didn't think so. Now we fake it.
 | 
			
		||||
    my $c_ip = $cdp->c_ip();
 | 
			
		||||
    unless ( defined $c_ip ) {
 | 
			
		||||
    my $cdp_ip = $cdp->cdp_ip();
 | 
			
		||||
    unless ( defined $cdp_ip ) {
 | 
			
		||||
        $cdp->error_throw(
 | 
			
		||||
            "SNMP::Info::CDP:c_if() - Device doesn't have cdp_ip() data.  Can't fake cdp_index()"
 | 
			
		||||
            "SNMP::Info::CDP:cdp_if() - Device doesn't have cdp_ip() data.  Can't fake cdp_index()"
 | 
			
		||||
        );
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $key ( keys %$c_ip ) {
 | 
			
		||||
    my %cdp_if;
 | 
			
		||||
    foreach my $key ( keys %$cdp_ip ) {
 | 
			
		||||
        next unless defined $key;
 | 
			
		||||
        my $iid = $key;
 | 
			
		||||
 | 
			
		||||
        # Truncate .1 from cdp cache entry
 | 
			
		||||
        $iid =~ s/\.\d+$//;
 | 
			
		||||
        $c_if{$key} = $iid;
 | 
			
		||||
        $cdp_if{$key} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
    return \%cdp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
sub cdp_ip {
 | 
			
		||||
    my $cdp     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $c_addr  = $cdp->c_addr($partial)  || {};
 | 
			
		||||
    my $c_proto = $cdp->c_proto($partial) || {};
 | 
			
		||||
    my $cdp_addr  = $cdp->cdp_addr($partial)  || {};
 | 
			
		||||
    my $cdp_proto = $cdp->cdp_proto($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $key ( keys %$c_addr ) {
 | 
			
		||||
        my $addr  = $c_addr->{$key};
 | 
			
		||||
        my $proto = $c_proto->{$key};
 | 
			
		||||
    my %cdp_ip;
 | 
			
		||||
    foreach my $key ( keys %$cdp_addr ) {
 | 
			
		||||
        my $addr  = $cdp_addr->{$key};
 | 
			
		||||
        my $proto = $cdp_proto->{$key};
 | 
			
		||||
        next unless defined $addr;
 | 
			
		||||
        next if ( defined $proto and $proto ne 'ip' );
 | 
			
		||||
 | 
			
		||||
        my $ip = join( '.', unpack( 'C4', $addr ) );
 | 
			
		||||
        $c_ip{$key} = $ip;
 | 
			
		||||
        $cdp_ip{$key} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
    return \%cdp_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cdp_cap {
 | 
			
		||||
    my $cdp     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Some devices return a hex-string, others return a space separated
 | 
			
		||||
    # string, we need the raw data to determine return value and
 | 
			
		||||
    # take appropriate action
 | 
			
		||||
    my $cdp_caps = $cdp->cdp_capabilities_raw($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %cdp_cap;
 | 
			
		||||
    foreach my $key ( keys %$cdp_caps ) {
 | 
			
		||||
        my $cap_raw = $cdp_caps->{$key};
 | 
			
		||||
        next unless $cap_raw;
 | 
			
		||||
 | 
			
		||||
        # Simple check, smallest single string is either Host or IGMP with a
 | 
			
		||||
        # space added on the end for a length of 5, hex string is normally
 | 
			
		||||
        # 4 bytes, but since only one byte was traditionally needed process
 | 
			
		||||
        # as hex for a length of 4 or less
 | 
			
		||||
        if ( length $cap_raw < 5 ) {
 | 
			
		||||
            my $cap_hex = join( '',
 | 
			
		||||
                map { sprintf "%x", $_ } unpack( 'C*', $cap_raw ) );
 | 
			
		||||
            foreach my $capability ( keys %CDP_CAPABILITIES ) {
 | 
			
		||||
                if ( ( hex $cap_hex ) & $CDP_CAPABILITIES{$capability} ) {
 | 
			
		||||
                    push( @{ $cdp_cap{$key} }, $capability );
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            my @caps = split /\s/, $cap_raw;
 | 
			
		||||
            push( @{ $cdp_cap{$key} }, @caps );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%cdp_cap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cdp_id {
 | 
			
		||||
    my $cdp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $ch = $cdp->cdp_dev_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %cdp_id;
 | 
			
		||||
    foreach my $key ( sort keys %$ch ) {
 | 
			
		||||
        my $id = $ch->{$key};
 | 
			
		||||
        next unless $id;
 | 
			
		||||
        $id = SNMP::Info::munge_mac($id) || SNMP::Info::munge_null($id);
 | 
			
		||||
        $cdp_id{$key} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%cdp_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -188,15 +253,15 @@ Max Baker
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with CDP neighbors:
 | 
			
		||||
 my $interfaces = $cdp->interfaces();
 | 
			
		||||
 my $c_if       = $cdp->c_if();
 | 
			
		||||
 my $c_ip       = $cdp->c_ip();
 | 
			
		||||
 my $c_port     = $cdp->c_port();
 | 
			
		||||
 my $cdp_if       = $cdp->cdp_if();
 | 
			
		||||
 my $cdp_ip       = $cdp->cdp_ip();
 | 
			
		||||
 my $cdp_port     = $cdp->cdp_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $cdp_key (keys %$c_ip){
 | 
			
		||||
    my $iid           = $c_if->{$cdp_key};
 | 
			
		||||
 foreach my $cdp_key (keys %$cdp_ip){
 | 
			
		||||
    my $iid           = $cdp_if->{$cdp_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $c_ip->{$cdp_key};
 | 
			
		||||
    my $neighbor_port = $c_port->{$cdp_key};
 | 
			
		||||
    my $neighbor      = $cdp_ip->{$cdp_key};
 | 
			
		||||
    my $neighbor_port = $cdp_port->{$cdp_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
@@ -260,7 +325,7 @@ Time in seconds that CDP messages are kept.
 | 
			
		||||
 | 
			
		||||
(C<cdpGlobalHoldTime>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->cdp_id() 
 | 
			
		||||
=item  $cdp->cdp_gid() 
 | 
			
		||||
 | 
			
		||||
Returns CDP device ID.  
 | 
			
		||||
 | 
			
		||||
@@ -280,153 +345,170 @@ 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
 | 
			
		||||
table below.
 | 
			
		||||
 | 
			
		||||
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
 | 
			
		||||
binary string, MSB.  Each digit represents a bit from the table below from 
 | 
			
		||||
the CDP Capabilities Mapping to Smartport Type table within the
 | 
			
		||||
Cisco Small Business 200 Series Smart Switch Administration Guide, 
 | 
			
		||||
L<http://www.cisco.com/c/en/us/support/switches/small-business-200-series-smart-switches/products-maintenance-guides-list.html>:
 | 
			
		||||
 | 
			
		||||
(Bit) - Description
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item (0x40) - Provides level 1 functionality.
 | 
			
		||||
=item (0x400) - Two-Port MAC Relay.
 | 
			
		||||
 | 
			
		||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
 | 
			
		||||
=item (0x200) - CAST Phone Port / CVTA / Supports-STP-Dispute depending
 | 
			
		||||
                upon platform.
 | 
			
		||||
 | 
			
		||||
=item (0x100) - Remotely-Managed Device.
 | 
			
		||||
 | 
			
		||||
=item (0x80)  - VoIP Phone.
 | 
			
		||||
 | 
			
		||||
=item (0x40)  - Provides level 1 functionality.
 | 
			
		||||
 | 
			
		||||
=item (0x20)  - The bridge or switch does not forward IGMP Report packets on
 | 
			
		||||
non router ports.
 | 
			
		||||
 | 
			
		||||
=item (0x10) - Sends and receives packets for at least one network layer
 | 
			
		||||
=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
 | 
			
		||||
=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
 | 
			
		||||
=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 (0x02)  - Performs level 2 transparent bridging.
 | 
			
		||||
 | 
			
		||||
=item (0x01) - Performs level 3 routing for at least one network layer
 | 
			
		||||
=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 for a pointer to the original information and
 | 
			
		||||
CPAN user Alex for updates.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheCapabilities>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_domain()
 | 
			
		||||
=item $cdp->cdp_domain()
 | 
			
		||||
 | 
			
		||||
Returns remote VTP Management Domain as defined in
 | 
			
		||||
C<CISCO-VTP-MIB::managementDomainName>
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheVTPMgmtDomain>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_duplex() 
 | 
			
		||||
=item $cdp->cdp_duplex() 
 | 
			
		||||
 | 
			
		||||
Returns the port duplex status from remote devices.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_id()
 | 
			
		||||
=item $cdp->cdp_id()
 | 
			
		||||
 | 
			
		||||
Returns remote device id string
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_if()
 | 
			
		||||
=item $cdp->cdp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
Note that a lot devices don't implement $cdp->c_index(),  So if it isn't
 | 
			
		||||
Note that a lot devices don't implement $cdp->cdp_index(),  So if it isn't
 | 
			
		||||
around, we fake it. 
 | 
			
		||||
 | 
			
		||||
In order to map the cdp table entry back to the interfaces() entry, we
 | 
			
		||||
truncate the last number off of it :
 | 
			
		||||
 | 
			
		||||
  # it exists, yay.
 | 
			
		||||
  my $c_index     = $device->c_index();
 | 
			
		||||
  return $c_index if defined $c_index;
 | 
			
		||||
  my $cdp_index     = $device->cdp_index();
 | 
			
		||||
  return $cdp_index if defined $cdp_index;
 | 
			
		||||
 | 
			
		||||
  # if not, let's fake it
 | 
			
		||||
  my $c_ip       = $device->c_ip();
 | 
			
		||||
  my $cdp_ip       = $device->cdp_ip();
 | 
			
		||||
    
 | 
			
		||||
  my %c_if
 | 
			
		||||
  foreach my $key (keys %$c_ip){
 | 
			
		||||
  my %cdp_if
 | 
			
		||||
  foreach my $key (keys %$cdp_ip){
 | 
			
		||||
      $iid = $key;
 | 
			
		||||
      ## Truncate off .1 from cdp response
 | 
			
		||||
      $iid =~ s/\.\d+$//;
 | 
			
		||||
      $c_if{$key} = $iid;
 | 
			
		||||
      $cdp_if{$key} = $iid;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  return \%c_if;
 | 
			
		||||
  return \%cdp_if;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_index()
 | 
			
		||||
=item $cdp->cdp_index()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP2 Interface table for CDP Cache Entries. 
 | 
			
		||||
 | 
			
		||||
Most devices don't implement this, so you probably want to use $cdp->c_if()
 | 
			
		||||
Most devices don't implement this, so you probably want to use $cdp->cdp_if()
 | 
			
		||||
instead.
 | 
			
		||||
 | 
			
		||||
See c_if() entry.
 | 
			
		||||
See cdp_if() entry.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->c_ip()
 | 
			
		||||
=item  $cdp->cdp_ip()
 | 
			
		||||
 | 
			
		||||
If $cdp->c_proto() is supported, returns remote IPV4 address only.  Otherwise
 | 
			
		||||
If $cdp->cdp_proto() is supported, returns remote IPV4 address only.  Otherwise
 | 
			
		||||
it will return all addresses.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->c_addr()
 | 
			
		||||
=item  $cdp->cdp_addr()
 | 
			
		||||
 | 
			
		||||
Returns remote address
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_platform() 
 | 
			
		||||
=item $cdp->cdp_platform() 
 | 
			
		||||
 | 
			
		||||
Returns remote platform id 
 | 
			
		||||
 | 
			
		||||
(C<cdpCachePlatform>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_port()
 | 
			
		||||
=item $cdp->cdp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
(C<cdpDevicePort>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->c_proto()
 | 
			
		||||
=item  $cdp->cdp_proto()
 | 
			
		||||
 | 
			
		||||
Returns remote address type received.  Usually IP.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheAddressType>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_ver() 
 | 
			
		||||
=item $cdp->cdp_ver() 
 | 
			
		||||
 | 
			
		||||
Returns remote hardware version
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheVersion>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_vlan()
 | 
			
		||||
=item $cdp->cdp_vlan()
 | 
			
		||||
 | 
			
		||||
Returns the remote interface native VLAN.
 | 
			
		||||
 | 
			
		||||
(C<cdpCacheNativeVLAN>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->c_power()
 | 
			
		||||
=item $cdp->cdp_power()
 | 
			
		||||
 | 
			
		||||
Returns the amount of power consumed by remote device in milliwatts munged
 | 
			
		||||
for decimal placement.
 | 
			
		||||
 | 
			
		||||
(C<cdpCachePowerConsumption>)
 | 
			
		||||
 | 
			
		||||
=item  $cdp->cdp_cap() 
 | 
			
		||||
 | 
			
		||||
Returns hash of arrays with each array containing the system capabilities
 | 
			
		||||
supported by the remote system.  Possible elements in the array are
 | 
			
		||||
C<Router>, C<Trans-Bridge>, C<Source-Route-Bridge>, C<Switch>, C<Host>,
 | 
			
		||||
C<IGMP>, C<Repeater>, C<VoIP-Phone>, C<Remotely-Managed-Device>,
 | 
			
		||||
C<Supports-STP-Dispute>, and C<Two-port Mac Relay>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
							
								
								
									
										158
									
								
								lib/SNMP/Info/CiscoAgg.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								lib/SNMP/Info/CiscoAgg.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
			
		||||
# SNMP::Info::CiscoAgg
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2018 SNMP::Info Developers
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::CiscoAgg;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoAgg::ISA = qw/
 | 
			
		||||
  SNMP::Info::IEEE802dot3ad
 | 
			
		||||
  Exporter
 | 
			
		||||
/;
 | 
			
		||||
@SNMP::Info::CiscoAgg::EXPORT_OK = qw/
 | 
			
		||||
  agg_ports
 | 
			
		||||
/;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
  %SNMP::Info::IEEE802dot3ad::MIBS,
 | 
			
		||||
  'CISCO-PAGP-MIB'   => 'pagpGroupIfIndex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
  %SNMP::Info::IEEE802dot3ad::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
  %SNMP::Info::IEEE802dot3ad::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub agg_ports_pagp {
 | 
			
		||||
  my $dev = shift;
 | 
			
		||||
 | 
			
		||||
  # Note that this mapping will miss any interfaces that are down during
 | 
			
		||||
  # polling. If one of the members is up, we could use
 | 
			
		||||
  # pagpAdminGroupCapability to figure things out, but if they're all
 | 
			
		||||
  # down, we're hosed. Since we could be hosed anyway, we skip the fancy
 | 
			
		||||
  # stuff.
 | 
			
		||||
  my $mapping = {};
 | 
			
		||||
  my $group = $dev->pagpGroupIfIndex;
 | 
			
		||||
  for my $slave (keys %$group) {
 | 
			
		||||
    my $master = $group->{$slave};
 | 
			
		||||
    next if($master == 0 || $slave == $master);
 | 
			
		||||
 | 
			
		||||
    $mapping->{$slave} = $master;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $mapping;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# until we have PAgP data and need to combine with LAG data
 | 
			
		||||
sub agg_ports {
 | 
			
		||||
  my $ret = {%{agg_ports_pagp(@_)}, %{agg_ports_lag(@_)}};
 | 
			
		||||
  return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoAgg - SNMP Interface to Cisco Aggregated Links
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
SNMP::Info Developers
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $info = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $info->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This class provides access to Aggregated Links configuration on Cisco devices.
 | 
			
		||||
It combines Cisco PAgP and IEEE 802.3ad information.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
L<SNMP::Info::IEEE802dot3ad>
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-PAGP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
 | 
			
		||||
=head1 METHODS
 | 
			
		||||
 | 
			
		||||
=over 4
 | 
			
		||||
 | 
			
		||||
=item C<agg_ports>
 | 
			
		||||
 | 
			
		||||
Returns a HASH reference mapping from slave to master port for each member of
 | 
			
		||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
 | 
			
		||||
ifIndex of the corresponding master ports.
 | 
			
		||||
 | 
			
		||||
=item C<agg_ports_pagp>
 | 
			
		||||
 | 
			
		||||
Implements the PAgP LAG info retrieval. Merged into C<agg_ports> data
 | 
			
		||||
automatically.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot3ad
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::IEEE802dot3ad> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
 | 
			
		||||
@@ -97,6 +97,10 @@ sub copy_run_tftp {
 | 
			
		||||
        print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
 | 
			
		||||
 | 
			
		||||
        #Check each set, delete created row if any fail
 | 
			
		||||
        unless ( $ciscoconfig->set_config_row_status( 5, $rand ) ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Initializing config copy instruction failed");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        unless ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
 | 
			
		||||
            $ciscoconfig->error_throw("Setting source type failed");
 | 
			
		||||
            unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
 | 
			
		||||
@@ -449,7 +453,7 @@ devices running older code revisions.
 | 
			
		||||
 | 
			
		||||
 Example:
 | 
			
		||||
 $ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig') 
 | 
			
		||||
    or die Couldn't save config. ",$ciscoconfig->error(1);
 | 
			
		||||
    or die "Couldn't save config. ",$ciscoconfig->error(1);
 | 
			
		||||
 | 
			
		||||
=item $ciscoconfig->copy_run_start()
 | 
			
		||||
 | 
			
		||||
@@ -38,12 +38,13 @@ use Exporter;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',
 | 
			
		||||
    'CISCO-PAE-MIB'           => 'ciscoPaeMIB',
 | 
			
		||||
    'IEEE8021-PAE-MIB'        => 'dot1xAuthLastEapolFrameSource',
 | 
			
		||||
    'CISCO-ERR-DISABLE-MIB'   => 'ciscoErrDisableMIB',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
@@ -99,6 +100,9 @@ $VERSION = '2.05';
 | 
			
		||||
    # IEEE8021-PAE-MIB::dot1xPaePortEntry
 | 
			
		||||
    'pae_i_capabilities'            => 'dot1xPaePortCapabilities',
 | 
			
		||||
    'pae_i_last_eapol_frame_source' => 'dot1xAuthLastEapolFrameSource',
 | 
			
		||||
 | 
			
		||||
    # CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusEntry
 | 
			
		||||
    'cerr_i_cause' => 'cErrDisableIfStatusCause',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
@@ -123,13 +127,29 @@ sub munge_pae_capabilities {
 | 
			
		||||
    return join( ' ', @vals );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Define a generic method to show the cause for a port to be err-disabled.
 | 
			
		||||
# Cisco indexes cErrDisableIfStatusCause by {ifindex,vlan}, but for a more
 | 
			
		||||
# generic method, using ifIndex only makes it easier to implement across
 | 
			
		||||
# device classes. Besides, several (most?) err-disable features will disable
 | 
			
		||||
# the whole interface anyway, and not just a vlan on the interface.
 | 
			
		||||
sub i_err_disable_cause {
 | 
			
		||||
    my $cps = shift;
 | 
			
		||||
    my $ret;
 | 
			
		||||
    my $causes = $cps->cerr_i_cause() || {};
 | 
			
		||||
    foreach my $interfacevlan (keys %$causes) {
 | 
			
		||||
        my ($iid, $vid) = split(/\./, $interfacevlan);
 | 
			
		||||
        $ret->{$iid} = $causes->{$interfacevlan};
 | 
			
		||||
    }
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoPortSecurity - SNMP Interface to data from
 | 
			
		||||
F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB>
 | 
			
		||||
F<CISCO-PORT-SECURITY-MIB>, F<CISCO-PAE-MIB> and F<CISCO-ERR-DISABLE-MIB>.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -153,8 +173,9 @@ Eric Miller
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::CiscoPortSecurity is a subclass of SNMP::Info that provides
 | 
			
		||||
an interface to the F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB>.  These
 | 
			
		||||
MIBs are used across the Catalyst family under CatOS and IOS.
 | 
			
		||||
an interface to the F<CISCO-PORT-SECURITY-MIB>, F<CISCO-PAE-MIB> and
 | 
			
		||||
F<CISCO-ERR-DISABLE-MIB>. These MIBs are used across the Catalyst
 | 
			
		||||
family under CatOS and IOS.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
@@ -172,6 +193,8 @@ None.
 | 
			
		||||
 | 
			
		||||
=item F<IEEE8021-PAE-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-ERR-DISABLE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
@@ -374,6 +397,31 @@ The source MAC address carried in the most recently received EAPOL frame.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 C<CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusEntry>
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cps->cerr_i_cause()
 | 
			
		||||
 | 
			
		||||
C<cErrDisableIfStatusCause>
 | 
			
		||||
 | 
			
		||||
Indicates the feature/event that caused the {interface, vlan} (or the entire
 | 
			
		||||
interface) to be error-disabled.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 METHODS
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item C<i_err_disable_cause>
 | 
			
		||||
 | 
			
		||||
Returns a HASH reference mapping ifIndex to err-disabled cause. The returned
 | 
			
		||||
data is sparse, so if the ifIndex is not present in the return value, the port
 | 
			
		||||
is not err-disabled.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
 | 
			
		||||
          'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' );
 | 
			
		||||
@@ -175,7 +175,7 @@ Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
 | 
			
		||||
=item $poe->peth_port_power()
 | 
			
		||||
 | 
			
		||||
Power supplied by PoE ports, in milliwatts
 | 
			
		||||
("cpeExtPsePortPwrConsumption")
 | 
			
		||||
(C<cpeExtPsePortPwrConsumption>)
 | 
			
		||||
 
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -185,8 +185,8 @@ Power supplied by PoE ports, in milliwatts
 | 
			
		||||
 | 
			
		||||
=item $poe->peth_port_neg_power()
 | 
			
		||||
 | 
			
		||||
Power negotiated using CDP, in milliwats
 | 
			
		||||
("cdpCachePowerConsumption")
 | 
			
		||||
Power negotiated using CDP, in milliwatts
 | 
			
		||||
(C<cdpCachePowerConsumption>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', );
 | 
			
		||||
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );
 | 
			
		||||
 | 
			
		||||
@@ -32,14 +32,13 @@ package SNMP::Info::CiscoStack;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoStack::ISA       = qw/SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoStack::ISA       = qw/Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoStack::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );
 | 
			
		||||
 | 
			
		||||
@@ -65,6 +64,7 @@ $VERSION = '2.05';
 | 
			
		||||
    'm_type'         => 'moduleType',
 | 
			
		||||
    'm_model'        => 'moduleModel',
 | 
			
		||||
    'm_serial'       => 'moduleSerialNumber',
 | 
			
		||||
    'm_serial_string' => 'moduleSerialNumberString',
 | 
			
		||||
    'm_status'       => 'moduleStatus',
 | 
			
		||||
    'm_name'         => 'moduleName',
 | 
			
		||||
    'm_ports'        => 'moduleNumPorts',
 | 
			
		||||
@@ -159,7 +159,7 @@ sub i_duplex {
 | 
			
		||||
        next if ( defined $partial and $iid !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        # Test for gigabit
 | 
			
		||||
        if ( $p_duplex_cap->{$port} == 0 ) {
 | 
			
		||||
        if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) {
 | 
			
		||||
            $i_duplex->{$iid} = 'full';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -194,7 +194,7 @@ sub i_duplex_admin {
 | 
			
		||||
        next if ( defined $partial and $iid !~ /^$partial$/ );
 | 
			
		||||
 | 
			
		||||
        # Test for gigabit
 | 
			
		||||
        if ( $p_duplex_cap->{$port} == 0 ) {
 | 
			
		||||
        if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 1 ) {
 | 
			
		||||
            $i_duplex_admin->{$iid} = 'full';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -214,9 +214,8 @@ sub i_speed_admin {
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my %i_speed_admin;
 | 
			
		||||
    my $p_port  = $stack->p_port() || {};
 | 
			
		||||
    my %mapping = reverse %$p_port;
 | 
			
		||||
    my $p_speed = $stack->p_speed( $mapping{$partial} );
 | 
			
		||||
    my $p_port  = $stack->p_port()  || {};
 | 
			
		||||
    my $p_speed = $stack->p_speed() || {};
 | 
			
		||||
 | 
			
		||||
    my %speeds = (
 | 
			
		||||
        'autoDetect'      => 'auto',
 | 
			
		||||
@@ -42,7 +42,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'SNMPv2-MIB'            => 'sysDescr',
 | 
			
		||||
@@ -51,6 +51,7 @@ $VERSION = '2.05';
 | 
			
		||||
    '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',
 | 
			
		||||
@@ -87,6 +88,9 @@ $VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
    # CISCO-FLASH-MIB::ciscoFlashDeviceTable
 | 
			
		||||
    'cisco_flash_size' => 'ciscoFlashDeviceSize',
 | 
			
		||||
    
 | 
			
		||||
    # CISCO-IMAGE-MIB
 | 
			
		||||
    'ci_images' => 'ciscoImageString',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ();
 | 
			
		||||
@@ -100,13 +104,16 @@ sub os {
 | 
			
		||||
    my $descr = $l2->description() || '';
 | 
			
		||||
 | 
			
		||||
    # order here matters - there are Catalysts that run IOS and have catalyst
 | 
			
		||||
    # in their description field.
 | 
			
		||||
    # in their description field, as well as Catalysts that run IOS-XE.
 | 
			
		||||
    return 'ios-xe'   if ( $descr =~ /IOS-XE/ );
 | 
			
		||||
    return 'ios-xr'   if ( $descr =~ /IOS XR/ );
 | 
			
		||||
    return 'ios'      if ( $descr =~ /IOS/ );
 | 
			
		||||
    return 'catalyst' if ( $descr =~ /catalyst/i );
 | 
			
		||||
    return 'css'      if ( $descr =~ /Content Switch SW/ );
 | 
			
		||||
    return 'css-sca'  if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
 | 
			
		||||
    return 'pix'      if ( $descr =~ /Cisco PIX Security Appliance/ );
 | 
			
		||||
    return 'asa'      if ( $descr =~ /Cisco Adaptive Security Appliance/ );
 | 
			
		||||
    return 'san-os'   if ( $descr =~ /Cisco SAN-OS/ );
 | 
			
		||||
 | 
			
		||||
    if ( $descr =~ /Application Control Engine Service Module/ ) {
 | 
			
		||||
        # Only the admin context implements the entity MIB
 | 
			
		||||
@@ -195,6 +202,13 @@ sub os_ver {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( defined $os
 | 
			
		||||
        and $os eq 'ios-xr'
 | 
			
		||||
        and defined $descr
 | 
			
		||||
        and $descr =~ m/Version (\d+[\.\d]+)/ )
 | 
			
		||||
    {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Newer Catalysts and IOS devices
 | 
			
		||||
    if ( defined $descr
 | 
			
		||||
@@ -203,6 +217,15 @@ sub os_ver {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Generic fallback: try to determine running image from CISCO-IMAGE-MIB
 | 
			
		||||
    my $image_info = $l2->ciscoImageString() || {};
 | 
			
		||||
    foreach my $row (keys %$image_info) {
 | 
			
		||||
        my $info_string = $image_info->{$row};
 | 
			
		||||
        if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
 | 
			
		||||
            return $1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -358,6 +381,8 @@ None.
 | 
			
		||||
 | 
			
		||||
=item F<ENTITY-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-IMAGE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
 | 
			
		||||
@@ -382,64 +407,41 @@ Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
 | 
			
		||||
 | 
			
		||||
Returns mem_free() + mem_used()
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os()
 | 
			
		||||
 | 
			
		||||
Tries to parse if device is running IOS or CatOS from description()
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->vendor()
 | 
			
		||||
 | 
			
		||||
 'cisco'
 | 
			
		||||
 | 
			
		||||
Available values :
 | 
			
		||||
=item $ciscostats->os()
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
 | 
			
		||||
from description()
 | 
			
		||||
 | 
			
		||||
=item pix
 | 
			
		||||
Available values:
 | 
			
		||||
 | 
			
		||||
Cisco PIX
 | 
			
		||||
 | 
			
		||||
=item asa
 | 
			
		||||
 | 
			
		||||
Cisco ASA
 | 
			
		||||
 | 
			
		||||
=item fwsm
 | 
			
		||||
 | 
			
		||||
Single-mode FWSM
 | 
			
		||||
 | 
			
		||||
=item fwsm-admin
 | 
			
		||||
 | 
			
		||||
Admin context of multi-context FWSM
 | 
			
		||||
 | 
			
		||||
=item fwsm-context
 | 
			
		||||
 | 
			
		||||
Standard context of multi-context FWSM
 | 
			
		||||
 | 
			
		||||
=item ace-admin
 | 
			
		||||
 | 
			
		||||
Admin context of ACE module
 | 
			
		||||
 | 
			
		||||
=item ace-context
 | 
			
		||||
 | 
			
		||||
Standard context of ACE module (NB: No OS version detection
 | 
			
		||||
is available, but will be the same as it's 'ace admin')
 | 
			
		||||
 | 
			
		||||
=item css
 | 
			
		||||
 | 
			
		||||
Cisco Content Switch
 | 
			
		||||
 | 
			
		||||
=item css-sca
 | 
			
		||||
 | 
			
		||||
Cisco Content Switch Secure Content Acceleration
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 'ios'          for Cisco IOS
 | 
			
		||||
 'ios-xe'       for Cisco IOS XE
 | 
			
		||||
 'ios-xr'       for Cisco IOS XR
 | 
			
		||||
 'pix'          for Cisco PIX
 | 
			
		||||
 'asa'          for Cisco ASA
 | 
			
		||||
 'fwsm'         for Single-mode FWSM
 | 
			
		||||
 'fwsm-admin'   for Admin context of multi-context FWSM
 | 
			
		||||
 'fwsm-context' for Standard context of multi-context FWSM
 | 
			
		||||
 'ace-admin'    for Admin context of ACE module
 | 
			
		||||
 'ace-context'  for Standard context of ACE module (NB: No OS version
 | 
			
		||||
                     detection is available, but will be the same as it's
 | 
			
		||||
                     'ace admin')
 | 
			
		||||
 'css'          for Cisco Content Switch
 | 
			
		||||
 'css-sca'      for Cisco Content Switch Secure Content Acceleration
 | 
			
		||||
 'san-os'       for Cisco SAN-OS
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os_ver()
 | 
			
		||||
 | 
			
		||||
Tries to parse device operating system version from description()
 | 
			
		||||
Tries to parse device operating system version from description(), falls back
 | 
			
		||||
to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->os_bin()
 | 
			
		||||
 | 
			
		||||
Tries to parse ROMMON version from rom_id() string
 | 
			
		||||
Tries to parse C<ROMMON> version from rom_id() string
 | 
			
		||||
 | 
			
		||||
=item $ciscostats->ios_cpu()
 | 
			
		||||
 | 
			
		||||
@@ -540,4 +542,16 @@ zero if the device has been removed.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Cisco Image Table (C<ciscoImageTable>)
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ci->ci_images()
 | 
			
		||||
 | 
			
		||||
Returns the table of image strings.
 | 
			
		||||
 | 
			
		||||
C<ciscoImageString>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -35,7 +35,9 @@ use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
@@ -75,7 +77,7 @@ $VERSION = '2.05';
 | 
			
		||||
sub stp_ver {
 | 
			
		||||
     my $self = shift;
 | 
			
		||||
     my $stp_ver = $self->SUPER::stp_ver();
 | 
			
		||||
     if ( $stp_ver eq 'unknown' ){
 | 
			
		||||
     if ( !defined($stp_ver) || $stp_ver eq 'unknown' ){
 | 
			
		||||
         if ( defined $self->stpx_stp_type() ){
 | 
			
		||||
             $stp_ver = $self->stpx_stp_type();
 | 
			
		||||
         }
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'CISCO-VTP-MIB'                       => 'vtpVlanName',
 | 
			
		||||
@@ -149,6 +149,7 @@ sub i_vlan {
 | 
			
		||||
 | 
			
		||||
    my $port_vlan      = $vtp->vtp_trunk_native($partial)   || {};
 | 
			
		||||
    my $i_vlan         = $vtp->i_vlan2($partial)            || {};
 | 
			
		||||
    my $trunk_dyn      = $vtp->vtp_trunk_dyn($partial)      || {};
 | 
			
		||||
    my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_vlans;
 | 
			
		||||
@@ -165,15 +166,23 @@ sub i_vlan {
 | 
			
		||||
    foreach my $port ( keys %$port_vlan ) {
 | 
			
		||||
        my $vlan = $port_vlan->{$port};
 | 
			
		||||
        next unless defined $vlan;
 | 
			
		||||
 | 
			
		||||
        # ports up and trunking should have a trunking status
 | 
			
		||||
        my $stat = $trunk_dyn_stat->{$port};
 | 
			
		||||
        if ( defined $stat and $stat =~ /^trunking/ ) {
 | 
			
		||||
 | 
			
		||||
        # vtp_trunk_dyn_stat is not useful for down ports
 | 
			
		||||
        # so we use vtp_trunk_dyn to see if trunking is set
 | 
			
		||||
        my $dyn = $trunk_dyn->{$port};
 | 
			
		||||
        
 | 
			
		||||
        if (($stat and $stat =~ /^trunking/ )
 | 
			
		||||
            or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))))
 | 
			
		||||
        {
 | 
			
		||||
            $i_vlans{$port} = $vlan;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Check in CISCO-VLAN-IFTABLE-RELATION-MIB
 | 
			
		||||
    # Is this only for Aironet???  If so, it needs
 | 
			
		||||
    # to be removed from this class
 | 
			
		||||
    # Used for traditional Cisco Routers and Aironet
 | 
			
		||||
 | 
			
		||||
    my $v_cvi_if = $vtp->v_cvi_if();
 | 
			
		||||
    if ( defined $v_cvi_if ) {
 | 
			
		||||
@@ -191,6 +200,22 @@ sub i_vlan {
 | 
			
		||||
    return \%i_vlans;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_untagged {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $ifindex ) = @_;
 | 
			
		||||
 | 
			
		||||
    # cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
 | 
			
		||||
    # so we use vtp_trunk_dyn as a hint to use i_pvid
 | 
			
		||||
 | 
			
		||||
    my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
 | 
			
		||||
    if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
 | 
			
		||||
        return $vtp->i_pvid(@_);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return $vtp->i_vlan(@_);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership {
 | 
			
		||||
    my $vtp     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
@@ -202,6 +227,8 @@ sub i_vlan_membership {
 | 
			
		||||
    my $vtp_vlans      = $vtp->v_state();
 | 
			
		||||
    my $i_vlan         = $vtp->i_vlan2($partial)            || {};
 | 
			
		||||
    my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
 | 
			
		||||
    my $trunk_dyn      = $vtp->vtp_trunk_dyn($partial)      || {};
 | 
			
		||||
    my $i_voice_vlan   = $vtp->i_voice_vlan($partial)       || {};
 | 
			
		||||
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
 | 
			
		||||
@@ -209,14 +236,24 @@ sub i_vlan_membership {
 | 
			
		||||
    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/ ) {
 | 
			
		||||
        my $dyn = $trunk_dyn->{$port};
 | 
			
		||||
        unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
 | 
			
		||||
            push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Get voice VLANs
 | 
			
		||||
    foreach my $port ( keys %$i_voice_vlan ) {
 | 
			
		||||
        my $vlan = $i_voice_vlan->{$port};
 | 
			
		||||
        next unless defined $vlan;
 | 
			
		||||
        next unless ($vlan =~ m/[[:digit:]]+/ and $vlan < 4095);
 | 
			
		||||
        my $dyn = $trunk_dyn->{$port};
 | 
			
		||||
        unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
 | 
			
		||||
            push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Get trunk ports
 | 
			
		||||
 | 
			
		||||
    my %oper_vlans;
 | 
			
		||||
    foreach my $iid ( keys %$vtp_vlans ) {
 | 
			
		||||
        my $vlan    = 0;
 | 
			
		||||
@@ -233,7 +270,9 @@ sub i_vlan_membership {
 | 
			
		||||
 | 
			
		||||
    foreach my $port ( keys %$ports_vlans ) {
 | 
			
		||||
        my $stat = $trunk_dyn_stat->{$port};
 | 
			
		||||
        if ( defined $stat and $stat =~ /^trunking/ ) {
 | 
			
		||||
        my $dyn = $trunk_dyn->{$port};
 | 
			
		||||
        if (($stat and $stat =~ /^trunking/ )
 | 
			
		||||
            or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate')))) {
 | 
			
		||||
            my $k     = 0;
 | 
			
		||||
            my $list1 = $ports_vlans->{$port} || '0';
 | 
			
		||||
            my $list2 = $ports_vlans_2k->{$port} || '0';
 | 
			
		||||
@@ -244,6 +283,7 @@ sub i_vlan_membership {
 | 
			
		||||
                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 ] );
 | 
			
		||||
                }
 | 
			
		||||
@@ -254,6 +294,20 @@ sub i_vlan_membership {
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership_untagged {
 | 
			
		||||
    my $vtp  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $vlans = $vtp->i_vlan($partial);
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    foreach my $port (keys %$vlans) {
 | 
			
		||||
        my $vlan = $vlans->{$port};
 | 
			
		||||
        push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_pvid {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $vlan_id, $ifindex ) = @_;
 | 
			
		||||
@@ -305,6 +359,22 @@ sub set_i_vlan {
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_untagged {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $vlan_id, $ifindex ) = @_;
 | 
			
		||||
 | 
			
		||||
    # cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
 | 
			
		||||
    # so we use vtp_trunk_dyn as a hint to use i_pvid
 | 
			
		||||
 | 
			
		||||
    my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
 | 
			
		||||
    if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
 | 
			
		||||
        return $vtp->set_i_pvid(@_);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return $vtp->set_i_vlan(@_);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_add_i_vlan_tagged {
 | 
			
		||||
    my $vtp = shift;
 | 
			
		||||
    my ( $vlan_id, $ifindex ) = @_;
 | 
			
		||||
@@ -539,6 +609,10 @@ Your device will only implement a subset of these methods.
 | 
			
		||||
Returns a mapping between C<ifIndex> and assigned VLAN ID for access ports
 | 
			
		||||
and the default VLAN ID for trunk ports.
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_untagged()
 | 
			
		||||
 | 
			
		||||
An alias for C<i_vlan>.
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
@@ -554,6 +628,12 @@ IDs.  These are the VLANs which are members of enabled VLAN list for the port.
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $vtp->i_vlan_membership_untagged()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.  These are the VLANs which are members of the untagged egress list for
 | 
			
		||||
the port.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 VLAN Table (C<CISCO-VTP-MIB::vtpVlanTable>)
 | 
			
		||||
@@ -834,6 +914,12 @@ port C<ifIndex>.  This method should only be used on trunk ports.
 | 
			
		||||
  $vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'}) 
 | 
			
		||||
    or die "Couldn't change port default VLAN. ",$vtp->error(1);
 | 
			
		||||
 | 
			
		||||
=item $vtp->set_i_untagged ( vlan, ifIndex )
 | 
			
		||||
 | 
			
		||||
This method attempts to work out whether the port referenced by ifIndex is
 | 
			
		||||
trunking, and if so will return the value of C<set_i_pvid>. Otherwise, the
 | 
			
		||||
value of C<set_i_vlan> is returned.
 | 
			
		||||
 | 
			
		||||
=item $vtp->set_add_i_vlan_tagged ( vlan, ifIndex )
 | 
			
		||||
 | 
			
		||||
Adds the VLAN to the enabled VLANs list of the port, must be supplied with the
 | 
			
		||||
							
								
								
									
										295
									
								
								lib/SNMP/Info/EDP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								lib/SNMP/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.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'EXTREME-EDP-MIB'   => 'extremeEdpPortIfIndex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    # EXTREME-EDP-MIB::extremeEdpTable
 | 
			
		||||
    'edp_rem_sysname'  => 'extremeEdpNeighborName',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'edp_rem_sysname'   => \&SNMP::Info::munge_null,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub hasEDP {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
 | 
			
		||||
 | 
			
		||||
    return 1 if ( scalar( keys %$edp_ip ) );
 | 
			
		||||
    
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Since we need to get IP Addresses from the extremeEdpNeighborTable which has
 | 
			
		||||
# a different index (adds VLAN name) than the extremeEdpTable which holds
 | 
			
		||||
# the remote device details use the index from extremeEdpNeighborTable but skip
 | 
			
		||||
# indexes which have an address of 0.0.0.0.  Would like to include only one
 | 
			
		||||
# address since they should all originate from the same device, but we don't
 | 
			
		||||
# know if they would all be reachable from the network management application.
 | 
			
		||||
#
 | 
			
		||||
# We don't inplement partials since this is private index function
 | 
			
		||||
sub _edp_index {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $edp_ip  = $edp->extremeEdpNeighborVlanIpAddress() || {};
 | 
			
		||||
    
 | 
			
		||||
    my %edp_index;
 | 
			
		||||
    foreach my $key ( keys %$edp_ip ) {
 | 
			
		||||
        my $ip = $edp_ip->{$key};
 | 
			
		||||
        next if ($ip eq '0.0.0.0');
 | 
			
		||||
        next unless $ip;
 | 
			
		||||
        $edp_index{$key} = $key;
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_if {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index = $edp->_edp_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_if;
 | 
			
		||||
    foreach my $key (keys %$index) {
 | 
			
		||||
        my $iid = $key;
 | 
			
		||||
        # ifIndex is first part of the iid
 | 
			
		||||
        $iid = $1 if $iid =~ /^(\d+)\./;
 | 
			
		||||
        $edp_if{$key} = $iid;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
  return \%edp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_ip {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index  = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_ip;
 | 
			
		||||
    foreach my $key ( keys %$index ) {
 | 
			
		||||
        my $ip = $edp_ip->{$key};
 | 
			
		||||
        # MIB says should only be IPv4
 | 
			
		||||
        next unless ($ip =~ /\d+(\.\d+){3}/);
 | 
			
		||||
        $edp_ip{$key} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_port {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index    = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_rport = $edp->extremeEdpNeighborPort() || {};
 | 
			
		||||
    my $edp_rslot = $edp->extremeEdpNeighborSlot() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_port;
 | 
			
		||||
    foreach my $key ( sort keys %$edp_rport ) {
 | 
			
		||||
        my $port = $edp_rport->{$key};
 | 
			
		||||
        my $slot = $edp_rslot->{$key} || 0;
 | 
			
		||||
        next unless $port;
 | 
			
		||||
        my $slotport = defined $slot ?  "$slot\/$port" : $port;
 | 
			
		||||
 | 
			
		||||
        foreach my $iid ( sort keys %$index ) {
 | 
			
		||||
            $edp_port{$iid} = $slotport if ($iid =~ /^$key/);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_id {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index    = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_name = $edp->edp_rem_sysname() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_name;
 | 
			
		||||
    foreach my $key ( sort keys %$edp_name ) {
 | 
			
		||||
        my $name = $edp_name->{$key} || 0;
 | 
			
		||||
        next unless $name;
 | 
			
		||||
 | 
			
		||||
        foreach my $iid ( sort keys %$index ) {
 | 
			
		||||
            $edp_name{$iid} = $name if ($iid =~ /^$key/);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub edp_ver {
 | 
			
		||||
    my $edp = shift;
 | 
			
		||||
 | 
			
		||||
    my $index   = $edp->_edp_index() || {};
 | 
			
		||||
    my $edp_ver = $edp->extremeEdpNeighborSoftwareVersion() || {};
 | 
			
		||||
 | 
			
		||||
    my %edp_ver;
 | 
			
		||||
    foreach my $key ( sort keys %$edp_ver ) {
 | 
			
		||||
        my $ver = $edp_ver->{$key} || 0;
 | 
			
		||||
        next unless $ver;
 | 
			
		||||
 | 
			
		||||
        foreach my $iid ( sort keys %$index ) {
 | 
			
		||||
            $edp_ver{$iid} = $ver if ($iid =~ /^$key/);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%edp_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::EDP - SNMP Interface to the Extreme Discovery Protocol (EDP)
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 my $edp = new SNMP::Info ( 
 | 
			
		||||
                             AutoSpecify => 1,
 | 
			
		||||
                             Debug       => 1,
 | 
			
		||||
                             DestHost    => 'router', 
 | 
			
		||||
                             Community   => 'public',
 | 
			
		||||
                             Version     => 2
 | 
			
		||||
                           );
 | 
			
		||||
 | 
			
		||||
 my $class = $edp->class();
 | 
			
		||||
 print " Using device sub class : $class\n";
 | 
			
		||||
 | 
			
		||||
 $haslldp   = $edp->hasLLDP() ? 'yes' : 'no';
 | 
			
		||||
 | 
			
		||||
 # Print out a map of device ports with LLDP neighbors:
 | 
			
		||||
 my $interfaces    = $edp->interfaces();
 | 
			
		||||
 my $edp_if       = $edp->edp_if();
 | 
			
		||||
 my $edp_ip       = $edp->edp_ip();
 | 
			
		||||
 my $edp_port     = $edp->edp_port();
 | 
			
		||||
 | 
			
		||||
 foreach my $edp_key (keys %$edp_ip){
 | 
			
		||||
    my $iid           = $edp_if->{$edp_key};
 | 
			
		||||
    my $port          = $interfaces->{$iid};
 | 
			
		||||
    my $neighbor      = $edp_ip->{$edp_key};
 | 
			
		||||
    my $neighbor_port = $edp_port->{$edp_key};
 | 
			
		||||
    print "Port : $port connected to $neighbor / $neighbor_port\n";
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented 
 | 
			
		||||
interface to EDP information through SNMP.
 | 
			
		||||
 | 
			
		||||
EDP is a Layer 2 protocol that allows a network device to advertise its
 | 
			
		||||
identity and capabilities on the local network providing topology information.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherits this class.  Do not use
 | 
			
		||||
directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<EXTREME-EDP-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBAL METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $edp->hasEDP()
 | 
			
		||||
 | 
			
		||||
Is EDP is active in this device?  
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_id()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the chassis component associated
 | 
			
		||||
with the remote system.
 | 
			
		||||
 | 
			
		||||
(C<extremeEdpNeighborName>)
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
=item  $edp->edp_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IPv4 address.
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
=item $edp->edp_ver()
 | 
			
		||||
 | 
			
		||||
Returns the operating system version of the remote system.
 | 
			
		||||
 | 
			
		||||
Nulls are removed before the value is returned. 
 | 
			
		||||
 | 
			
		||||
(C<extremeEdpNeighborSoftwareVersion>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
 | 
			
		||||
 | 
			
		||||
@@ -138,7 +138,7 @@ Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
F<ENTITY-MIB> is used by Layer 2 devices from HP, Aironet, Foundry, Cisco,
 | 
			
		||||
F<ENTITY-MIB> is used by Layer 2 devices from Brocade, Cisco, HP,
 | 
			
		||||
and more.
 | 
			
		||||
 | 
			
		||||
See RFC 2737 for full details.
 | 
			
		||||
@@ -207,7 +207,7 @@ Human Friendly
 | 
			
		||||
 | 
			
		||||
=item $entity->e_fru()
 | 
			
		||||
 | 
			
		||||
BOOLEAN. Field Replaceable unit?
 | 
			
		||||
BOOLEAN. Is a Field Replaceable unit?
 | 
			
		||||
 | 
			
		||||
(C<entPhysicalFRU>)
 | 
			
		||||
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
 | 
			
		||||
 | 
			
		||||
@@ -42,46 +42,39 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
 | 
			
		||||
    # CDP-Compatibility
 | 
			
		||||
    'cdp_interval' => 'snFdpGlobalMessageInterval',
 | 
			
		||||
    'cdp_holdtime' => 'snFdpGlobalHoldTime',
 | 
			
		||||
    'cdp_id'       => 'snFdpGlobalDeviceId',
 | 
			
		||||
 | 
			
		||||
    #
 | 
			
		||||
    'fdp_run'      => 'snFdpGlobalRun',
 | 
			
		||||
    'fdp_interval' => 'snFdpGlobalMessageInterval',
 | 
			
		||||
    'fdp_holdtime' => 'snFdpGlobalHoldTime',
 | 
			
		||||
    'fdp_id'       => 'snFdpGlobalDeviceId',
 | 
			
		||||
    'fdp_gid'      => 'snFdpGlobalDeviceId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    'c_index'        => 'snFdpCacheIfIndex',
 | 
			
		||||
    'c_proto'        => 'snFdpCacheAddressType',
 | 
			
		||||
    'c_ip'           => 'snFdpCacheAddress',
 | 
			
		||||
    'c_ver'          => 'snFdpCacheVersion',
 | 
			
		||||
    'c_id'           => 'snFdpCacheDeviceId',
 | 
			
		||||
    'c_port'         => 'snFdpCacheDevicePort',
 | 
			
		||||
    'c_platform'     => 'snFdpCachePlatform',
 | 
			
		||||
    'c_capabilities' => 'snFdpCacheCapabilities',
 | 
			
		||||
    'c_domain'       => 'snFdpCacheVTPMgmtDomain',
 | 
			
		||||
    'c_vlan'         => 'snFdpCacheNativeVLAN',
 | 
			
		||||
    'c_duplex'       => 'snFdpCacheDuplex',
 | 
			
		||||
    'fdp_index'        => 'snFdpCacheIfIndex',
 | 
			
		||||
    'fdp_proto'        => 'snFdpCacheAddressType',
 | 
			
		||||
    'fdp_ip'           => 'snFdpCacheAddress',
 | 
			
		||||
    'fdp_ver'          => 'snFdpCacheVersion',
 | 
			
		||||
    'fdp_id'           => 'snFdpCacheDeviceId',
 | 
			
		||||
    'fdp_port'         => 'snFdpCacheDevicePort',
 | 
			
		||||
    'fdp_platform'     => 'snFdpCachePlatform',
 | 
			
		||||
    'fdp_capabilities' => 'snFdpCacheCapabilities',
 | 
			
		||||
    'fdp_domain'       => 'snFdpCacheVTPMgmtDomain',
 | 
			
		||||
    'fdp_vlan'         => 'snFdpCacheNativeVLAN',
 | 
			
		||||
    'fdp_duplex'       => 'snFdpCacheDuplex',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    'c_capabilities' => \&SNMP::Info::munge_caps,
 | 
			
		||||
    'c_ip'           => \&SNMP::Info::munge_ip
 | 
			
		||||
    'fdp_capabilities' => \&SNMP::Info::munge_bits,
 | 
			
		||||
    'fdp_ip'           => \&SNMP::Info::munge_ip
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub cdp_run {
 | 
			
		||||
sub fdp_run {
 | 
			
		||||
    my $fdp     = shift;
 | 
			
		||||
    my $fdp_run = $fdp->fdp_run();
 | 
			
		||||
    my $fdp_run = $fdp->orig_fdp_run();
 | 
			
		||||
 | 
			
		||||
    # if fdp_run isn't implemented on device, assume FDP is on
 | 
			
		||||
    return $fdp_run if defined $fdp_run;
 | 
			
		||||
@@ -107,7 +100,7 @@ sub hasFDP {
 | 
			
		||||
    return $fdp->fdp_run();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
sub fdp_if {
 | 
			
		||||
    my $fdp = shift;
 | 
			
		||||
 | 
			
		||||
    # See if by some miracle Cisco implemented the fdpCacheIfIndex entry
 | 
			
		||||
@@ -115,7 +108,7 @@ sub c_if {
 | 
			
		||||
    return $fdp_index if defined $fdp_index;
 | 
			
		||||
 | 
			
		||||
    # Nope, didn't think so. Now we fake it.
 | 
			
		||||
    my $fdp_ip = $fdp->c_ip();
 | 
			
		||||
    my $fdp_ip = $fdp->fdp_ip();
 | 
			
		||||
    unless ( defined $fdp_ip ) {
 | 
			
		||||
        $fdp->error_throw(
 | 
			
		||||
            "SNMP::Info::FDP:fdp_if() - Device doesn't have fdp_ip() data.  Can't fake fdp_index()"
 | 
			
		||||
@@ -185,8 +178,7 @@ interface to FDP information through SNMP.
 | 
			
		||||
FDP is a Layer 2 protocol that supplies topology information of
 | 
			
		||||
devices that also speak FDP, mostly switches and routers.  It has
 | 
			
		||||
similar functionality to Cisco's CDP, and the SNMP interface is
 | 
			
		||||
virtually identical.  FDP is implemented in Foundry devices, including
 | 
			
		||||
the Bigiron and Fastiron range.
 | 
			
		||||
virtually identical.  FDP is implemented in Brocade (Foundry) devices.
 | 
			
		||||
 | 
			
		||||
Create or use a device subclass that inherits this class.  Do not use
 | 
			
		||||
directly.
 | 
			
		||||
@@ -239,7 +231,7 @@ Time in seconds that FDP messages are kept.
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalHoldTime>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->fdp_id() 
 | 
			
		||||
=item  $fdp->fdp_gid()
 | 
			
		||||
 | 
			
		||||
Returns FDP device ID.  
 | 
			
		||||
 | 
			
		||||
@@ -256,19 +248,19 @@ CDP compatibility
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_interval()
 | 
			
		||||
=item $fdp->fdp_interval()
 | 
			
		||||
 | 
			
		||||
Interval in seconds at which FDP messages are generated.
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalMessageInterval>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_holdtime()
 | 
			
		||||
=item $fdp->fdp_holdtime()
 | 
			
		||||
 | 
			
		||||
Time in seconds that FDP messages are kept. 
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalHoldTime>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->c_id() 
 | 
			
		||||
=item  $fdp->fdp_id() 
 | 
			
		||||
 | 
			
		||||
Returns FDP device ID.  
 | 
			
		||||
 | 
			
		||||
@@ -277,7 +269,7 @@ retrieved from remote devices with $fdp->id().
 | 
			
		||||
 | 
			
		||||
(C<fdpGlobalDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $cdp->cdp_run()
 | 
			
		||||
=item $fdp->fdp_run()
 | 
			
		||||
 | 
			
		||||
Is FDP enabled on this device?
 | 
			
		||||
 | 
			
		||||
@@ -294,11 +286,10 @@ CDP compatibility
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_capabilities()
 | 
			
		||||
=item $fdp->fdp_capabilities()
 | 
			
		||||
 | 
			
		||||
Returns Device Functional Capabilities.  Results are munged into an ascii
 | 
			
		||||
binary string, 7 digits long, MSB.  Each digit represents a bit from the
 | 
			
		||||
table below.
 | 
			
		||||
binary string, MSB.  Each digit represents a bit from the table below.
 | 
			
		||||
 | 
			
		||||
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
 | 
			
		||||
 | 
			
		||||
@@ -328,31 +319,30 @@ protocol.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to
 | 
			
		||||
this information.
 | 
			
		||||
Thanks to Martin Lorensen for a pointer to this information.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheCapabilities>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_domain()
 | 
			
		||||
=item $fdp->fdp_domain()
 | 
			
		||||
 | 
			
		||||
The CDP version of this returns remote VTP Management Domain as defined
 | 
			
		||||
in C<CISCO-VTP-MIB::managementDomainName>
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheVTPMgmtDomain>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_duplex() 
 | 
			
		||||
=item $fdp->fdp_duplex() 
 | 
			
		||||
 | 
			
		||||
Returns the port duplex status from remote devices.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheDuplex>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_id()
 | 
			
		||||
=item $fdp->fdp_id()
 | 
			
		||||
 | 
			
		||||
Returns remote device id string
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheDeviceId>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_if()
 | 
			
		||||
=item $fdp->fdp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
@@ -380,7 +370,7 @@ truncate the last number off of it :
 | 
			
		||||
  return \%fdp_if;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_index()
 | 
			
		||||
=item $fdp->fdp_index()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP2 Interface table for FDP Cache Entries. 
 | 
			
		||||
 | 
			
		||||
@@ -391,37 +381,37 @@ See fdp_if() entry.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheIfIndex>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->c_ip()
 | 
			
		||||
=item  $fdp->fdp_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IP address
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheAddress>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_platform() 
 | 
			
		||||
=item $fdp->fdp_platform() 
 | 
			
		||||
 | 
			
		||||
Returns remote platform id 
 | 
			
		||||
 | 
			
		||||
(C<fdpCachePlatform>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_port()
 | 
			
		||||
=item $fdp->fdp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
(C<fdpDevicePort>)
 | 
			
		||||
 | 
			
		||||
=item  $fdp->c_proto()
 | 
			
		||||
=item  $fdp->fdp_proto()
 | 
			
		||||
 | 
			
		||||
Returns remote address type received.  Usually IP.
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheAddressType>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_ver() 
 | 
			
		||||
=item $fdp->fdp_ver() 
 | 
			
		||||
 | 
			
		||||
Returns remote hardware version
 | 
			
		||||
 | 
			
		||||
(C<fdpCacheVersion>)
 | 
			
		||||
 | 
			
		||||
=item $fdp->c_vlan()
 | 
			
		||||
=item $fdp->fdp_vlan()
 | 
			
		||||
 | 
			
		||||
Returns the remote interface native VLAN.
 | 
			
		||||
 | 
			
		||||
@@ -38,7 +38,7 @@ use Exporter;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										142
									
								
								lib/SNMP/Info/IEEE802dot3ad.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								lib/SNMP/Info/IEEE802dot3ad.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
# SNMP::Info::IEEE802dot3ad
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2018 SNMP::Info Developers
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::IEEE802dot3ad;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Aggregate;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::IEEE802dot3ad::ISA = qw/
 | 
			
		||||
  SNMP::Info::Aggregate
 | 
			
		||||
  Exporter
 | 
			
		||||
/;
 | 
			
		||||
@SNMP::Info::IEEE802dot3ad::EXPORT_OK = qw/
 | 
			
		||||
  agg_ports_lag
 | 
			
		||||
/;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
  %SNMP::Info::Aggregate::MIBS,
 | 
			
		||||
  'IEEE8023-LAG-MIB' => 'dot3adAggPortSelectedAggID',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ();
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
  'ad_lag_ports'    => 'dot3adAggPortListPorts',
 | 
			
		||||
 );
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
  'ad_lag_ports' => \&SNMP::Info::munge_port_list,
 | 
			
		||||
 );
 | 
			
		||||
 | 
			
		||||
sub agg_ports_lag {
 | 
			
		||||
  my $dev = shift;
 | 
			
		||||
 | 
			
		||||
  # TODO: implement partial
 | 
			
		||||
  my $ports  = $dev->ad_lag_ports;
 | 
			
		||||
 | 
			
		||||
  return {} unless ref {} eq ref $ports and scalar keys %$ports;
 | 
			
		||||
 | 
			
		||||
  my $ret = {};
 | 
			
		||||
  foreach my $m ( keys %$ports ) {
 | 
			
		||||
    my $idx = $m;
 | 
			
		||||
    my $portlist = $ports->{$m};
 | 
			
		||||
    next unless $portlist;
 | 
			
		||||
    for ( my $i = 0; $i <= scalar(@$portlist); $i++ ) {
 | 
			
		||||
      $ret->{$i+1} = $idx if ( @$portlist[$i] );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::IEEE802dot3ad - SNMP Interface to IEEE Aggregated Links
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
SNMP::Info Developers
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $info = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $info->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
This class provides access to Aggregated Links configuration on devices
 | 
			
		||||
implementing C<IEEE8023-LAG-MIB>.
 | 
			
		||||
 | 
			
		||||
Use or create in a subclass of SNMP::Info.  Do not use directly.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
L<SNMP::Info::Aggregate>
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<IEEE8023-LAG-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 METHODS
 | 
			
		||||
 | 
			
		||||
=over 4
 | 
			
		||||
 | 
			
		||||
=item C<agg_ports_lag>
 | 
			
		||||
 | 
			
		||||
Returns a HASH reference mapping from slave to master port for each member of
 | 
			
		||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
 | 
			
		||||
ifIndex of the corresponding master ports.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -44,7 +44,7 @@ use constant {
 | 
			
		||||
    IPV6MIB => 3,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -59,7 +59,7 @@ $VERSION = '2.05';
 | 
			
		||||
%FUNCS = ( 
 | 
			
		||||
    'ip_n2p_phys_addr'  => 'ipNetToPhysicalPhysAddress',    # IP-MIB
 | 
			
		||||
    'c_inet_phys_addr'  => 'cInetNetToMediaPhysAddress',    # CISCO-IETF-IP-MIB
 | 
			
		||||
    'i6_n2p_phys_addr'  => 'ipv6NetToMediaNetAddress',      # IPV6-MIB
 | 
			
		||||
    'i6_n2p_phys_addr'  => 'ipv6NetToMediaPhysAddress',     # IPV6-MIB
 | 
			
		||||
 | 
			
		||||
    'ip_n2p_phys_type'  => 'ipNetToPhysicalType',           # IP-MIB
 | 
			
		||||
    'c_inet_phys_type'  => 'cInetNetToMediaType',           # CISCO-IETF-IP-MIB
 | 
			
		||||
@@ -72,15 +72,18 @@ $VERSION = '2.05';
 | 
			
		||||
    'ip_pfx_origin'     => 'ipAddressPrefixOrigin',         # IP-MIB
 | 
			
		||||
    'c_pfx_origin'      => 'cIpAddressPfxOrigin',           # CISCO-IETF-IP-MIB 
 | 
			
		||||
 | 
			
		||||
    'ip_addr6_pfx'      => 'ipAddressPrefix',              # IP-MIB 
 | 
			
		||||
    'ip_addr6_pfx'      => 'ipAddressPrefix',               # IP-MIB
 | 
			
		||||
    'c_addr6_pfx'       => 'cIpAddressPrefix',              # CISCO-IETF-IP-MIB 
 | 
			
		||||
 | 
			
		||||
    'ip_addr6_index'    => 'ipAddressIfIndex',              # IP-MIBw
 | 
			
		||||
    'ip_addr6_pfxlen'   => 'ipAddressPrefixLength',         # IP-MIB
 | 
			
		||||
    'c_addr6_pfxlen'    => 'cIpAddressPfxLength',           # CISCO-IETF-IP-MIB
 | 
			
		||||
    'i6_addr_pfxlen'    => 'ipv6AddrPfxLength',             # IPV6-MIB
 | 
			
		||||
 | 
			
		||||
    'ip_addr6_index'    => 'ipAddressIfIndex',              # IP-MIB
 | 
			
		||||
    'c_addr6_index'     => 'cIpAddressIfIndex',             # CISCO-IETF-IP-MIB 
 | 
			
		||||
 | 
			
		||||
    'ip_addr6_type'     => 'ipAddressType',                 # IP-MIB
 | 
			
		||||
    'c_addr6_type'      => 'cIpAddressType',                # CISCO-IETF-IP-MIB
 | 
			
		||||
    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
@@ -108,7 +111,7 @@ sub ipv6_n2p_mac {
 | 
			
		||||
                $v6addr = join('.', $addrtype, $addrsize, $v6addr);
 | 
			
		||||
                $addrtype = 2;
 | 
			
		||||
            }
 | 
			
		||||
            if ($addrtype == 2) { # IPv6
 | 
			
		||||
            if (($addrtype == 2) && (defined $phys_addr->{$row})) { # IPv6
 | 
			
		||||
                $return->{$row} = substr($phys_addr->{$row}, 0, 17);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -137,8 +140,23 @@ sub ipv6_n2p_addr {
 | 
			
		||||
            }
 | 
			
		||||
            if ($addrtype == 2) { # IPv6
 | 
			
		||||
                my $v6_packed = pack("C*", split(/\./, $v6addr));
 | 
			
		||||
                $v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
 | 
			
		||||
                $return->{$row} = $v6addr;
 | 
			
		||||
                if (length($v6_packed) == 15) {
 | 
			
		||||
                    # Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize, 
 | 
			
		||||
                    # so what we've collected in that variable is actually the first byte of the address.
 | 
			
		||||
                    $v6_packed = pack('C', $addrsize) . $v6_packed;
 | 
			
		||||
                }
 | 
			
		||||
                if (length($v6_packed) == 17) {
 | 
			
		||||
                    # Workaround for IPV6-MIB on Windows 2012: if the address is one byte too long, the SNMP agent probably has an incorrect
 | 
			
		||||
                    # implementation where a length field precedes the actual IPv6 address.
 | 
			
		||||
                    # In that case, the first character should be chr(16), ie 0x10; strip it if that's the case.
 | 
			
		||||
                    $v6_packed =~ s/^\x10//;
 | 
			
		||||
                }
 | 
			
		||||
                if (length($v6_packed) == 16) {
 | 
			
		||||
                    $v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
 | 
			
		||||
                    $return->{$row} = $v6addr;
 | 
			
		||||
                } else {
 | 
			
		||||
                    printf("Invalid size for IPv6 address: expected 16 bytes, got %d (%s = %s)\n", length($v6_packed), $row, $net_addr->{$row});
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -298,7 +316,9 @@ sub ipv6_addr_prefix {
 | 
			
		||||
    foreach my $row (keys %$ipv6_addr_prefix){
 | 
			
		||||
        if ($row =~ /^(\d+)\.[\d\.]+$/) {
 | 
			
		||||
            my $type = $1;
 | 
			
		||||
            if ($type == 2) { # IPv6
 | 
			
		||||
	    if (($type == 2) or ($type == 4)) { # IPv6
 | 
			
		||||
		# Remove interface specific part from vrf interfaces
 | 
			
		||||
		if ($row =~ /^((\d+\.){17}\d+)/) { $row = $1 }
 | 
			
		||||
		# Remove the OID part from the value
 | 
			
		||||
		my $val = $ipv6_addr_prefix->{$row};
 | 
			
		||||
		if ( $val =~ /^.+?((?:\d+\.){19}\d+)$/ ){
 | 
			
		||||
@@ -312,9 +332,60 @@ sub ipv6_addr_prefix {
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_addr_prefixlength {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $ipv6_addr_prefix = &_test_methods( $info, {
 | 
			
		||||
        ip_addr6_pfx  => IPMIB,
 | 
			
		||||
        c_addr6_pfx   => CISCO,
 | 
			
		||||
    });
 | 
			
		||||
    return unless defined $ipv6_addr_prefix;
 | 
			
		||||
    foreach my $row (keys %$ipv6_addr_prefix) {
 | 
			
		||||
        if ($row =~ /^(\d+)\.[\d\.]+$/) {
 | 
			
		||||
            my $type = $1;
 | 
			
		||||
            if (($type == 2) or ($type == 4)) { # IPv6
 | 
			
		||||
                # Remove interface specific part from vrf interfaces
 | 
			
		||||
                if ($row =~ /^((\d+\.){17}\d+)/) { $row = $1 }
 | 
			
		||||
                # Remove the OID part from the value
 | 
			
		||||
                my $val = $ipv6_addr_prefix->{$row};
 | 
			
		||||
                if ( $val =~ /^.+?((?:\d+\.){19}(\d+))$/ ) {
 | 
			
		||||
                    $val = $2;
 | 
			
		||||
                    $return->{$row} = $val;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ipv6_addr {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return;
 | 
			
		||||
    my $indexes = $info->ipv6_index();
 | 
			
		||||
    foreach my $row (keys %$indexes) {
 | 
			
		||||
        my @parts = split(/\./, $row);
 | 
			
		||||
        my $is_valid = 0;
 | 
			
		||||
        if (scalar @parts == 18) {
 | 
			
		||||
            my $addrtype = shift @parts;
 | 
			
		||||
            $is_valid = 1;
 | 
			
		||||
        } elsif (scalar @parts == 17) {
 | 
			
		||||
            $is_valid = 1;
 | 
			
		||||
        }
 | 
			
		||||
        my $addrsize = shift @parts; # First element now is addrsize, should be 16
 | 
			
		||||
        if ($is_valid && $addrsize == 16) {
 | 
			
		||||
            $return->{$row} = join(':', unpack('(H4)*', pack('C*', @parts)));
 | 
			
		||||
        } else {
 | 
			
		||||
            warn sprintf("%s: unable to decode table index to IPv6 address. Raw data is [%s].\n", &_my_sub_name, $row);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub _method_used {
 | 
			
		||||
    my $info = shift;
 | 
			
		||||
    my $return = 'none of the MIBs';
 | 
			
		||||
    # FIXME ugh! a global. makes order of calls important for debug.
 | 
			
		||||
    if (defined $info::METHOD) {
 | 
			
		||||
        if ($info::METHOD eq IPMIB) {
 | 
			
		||||
            $return = 'IP-MIB';
 | 
			
		||||
@@ -334,6 +405,7 @@ sub _test_methods {
 | 
			
		||||
    foreach my $method (sort {$test->{$a} <=> $test->{$b}} keys %$test) {
 | 
			
		||||
        $return = $info->$method || {};
 | 
			
		||||
        if (scalar keys %$return) {
 | 
			
		||||
            # FIXME ugh! a global. makes order of calls important for debug.
 | 
			
		||||
            $info::METHOD = $test->{$method};
 | 
			
		||||
            last;
 | 
			
		||||
        }
 | 
			
		||||
@@ -385,8 +457,9 @@ Jeroen van Ingen and Carlos Vicente
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses 
 | 
			
		||||
to MAC addresses, interfaces and more. It will use data from the IP-MIB, IPV6-MIB 
 | 
			
		||||
or the CISCO-IETF-IP-MIB, whichever is supported by the device.
 | 
			
		||||
to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>,
 | 
			
		||||
F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the
 | 
			
		||||
device.
 | 
			
		||||
 | 
			
		||||
This class is inherited by Info::Layer3 to provide IPv6 node tracking across  
 | 
			
		||||
device classes.
 | 
			
		||||
@@ -449,6 +522,14 @@ Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.)
 | 
			
		||||
 | 
			
		||||
Maps IPv6 addresses with their prefixes
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_addr_prefixlength()
 | 
			
		||||
 | 
			
		||||
Maps IPv6 addresses with their prefix length
 | 
			
		||||
 | 
			
		||||
=item $info->ipv6_addr()
 | 
			
		||||
 | 
			
		||||
Maps a table instance to an IPv6 address
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2  Internet Address Translation Table
 | 
			
		||||
@@ -39,10 +39,11 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    'LLDP-MIB'          => 'lldpLocSysCapEnabled',
 | 
			
		||||
    'LLDP-EXT-MED-MIB'  => 'lldpXMedMIB',
 | 
			
		||||
    'LLDP-EXT-DOT1-MIB' => 'lldpXdot1MIB',
 | 
			
		||||
    'LLDP-EXT-DOT3-MIB' => 'lldpXdot3MIB',
 | 
			
		||||
);
 | 
			
		||||
@@ -67,6 +68,19 @@ $VERSION = '2.05';
 | 
			
		||||
    'lldp_rem_sysname'  => 'lldpRemSysName',
 | 
			
		||||
    'lldp_rem_sysdesc'  => 'lldpRemSysDesc',
 | 
			
		||||
    'lldp_rem_sys_cap'  => 'lldpRemSysCapEnabled',
 | 
			
		||||
    'lldp_rem_cap_spt'  => 'lldpRemSysCapSupported',
 | 
			
		||||
 | 
			
		||||
    # LLDP-MIB::lldpXMedRemInventoryTable
 | 
			
		||||
    'lldp_rem_hw_rev' => 'lldpXMedRemHardwareRev',
 | 
			
		||||
    'lldp_rem_fw_rev' => 'lldpXMedRemFirmwareRev',
 | 
			
		||||
    'lldp_rem_sw_rev' => 'lldpXMedRemSoftwareRev',
 | 
			
		||||
    'lldp_rem_serial' => 'lldpXMedRemSerialNum',
 | 
			
		||||
    'lldp_rem_vendor' => 'lldpXMedRemMfgName',
 | 
			
		||||
    'lldp_rem_model'  => 'lldpXMedRemModelName',
 | 
			
		||||
    'lldp_rem_asset'  => 'lldpXMedRemAssetID',
 | 
			
		||||
 | 
			
		||||
    'lldp_rem_media_cap'     => 'lldpXMedRemCapCurrent',
 | 
			
		||||
    'lldp_rem_media_cap_spt' => 'lldpXMedRemCapSupported',
 | 
			
		||||
 | 
			
		||||
    # LLDP-MIB::lldpRemManAddrTable
 | 
			
		||||
    'lldp_rman_addr' => 'lldpRemManAddrIfSubtype',
 | 
			
		||||
@@ -80,6 +94,18 @@ $VERSION = '2.05';
 | 
			
		||||
    'lldp_rem_port_desc' => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_sys_cap'       => \&SNMP::Info::munge_bits,
 | 
			
		||||
    'lldp_rem_sys_cap'   => \&SNMP::Info::munge_bits,
 | 
			
		||||
    'lldp_rem_cap_spt'   => \&SNMP::Info::munge_bits,
 | 
			
		||||
 | 
			
		||||
    'lldp_rem_hw_rev' => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_rem_fw_rev' => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_rem_sw_rev' => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_rem_serial' => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_rem_vendor' => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_rem_model'  => \&SNMP::Info::munge_null,
 | 
			
		||||
    'lldp_rem_asset'  => \&SNMP::Info::munge_null,
 | 
			
		||||
 | 
			
		||||
    'lldp_rem_media_cap'     => \&SNMP::Info::munge_bits,
 | 
			
		||||
    'lldp_rem_media_cap_spt' => \&SNMP::Info::munge_bits,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub hasLLDP {
 | 
			
		||||
@@ -88,8 +114,12 @@ sub hasLLDP {
 | 
			
		||||
    # We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
 | 
			
		||||
    # so we could be running LLDP but not return any useful information
 | 
			
		||||
    my $lldp_cap = $lldp->lldp_sys_cap();
 | 
			
		||||
 | 
			
		||||
    return 1 if defined $lldp_cap;
 | 
			
		||||
 | 
			
		||||
    # If the device doesn't return local system capabilities, fallback by checking if it would report neighbors
 | 
			
		||||
    my $lldp_rem = $lldp->lldp_rem_id() || {};
 | 
			
		||||
    return 1 if scalar keys %$lldp_rem;
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -97,12 +127,31 @@ sub lldp_if {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $addr = $lldp->lldp_rem_pid($partial) || {};
 | 
			
		||||
    my $addr    = $lldp->lldp_rem_pid($partial) || {};
 | 
			
		||||
    my $i_descr = $lldp->i_description()        || {};
 | 
			
		||||
    my $i_alias = $lldp->i_alias()              || {};
 | 
			
		||||
    my %r_i_descr = reverse %$i_descr;
 | 
			
		||||
    my %r_i_alias = reverse %$i_alias;
 | 
			
		||||
 | 
			
		||||
    my %lldp_if;
 | 
			
		||||
    foreach my $key ( keys %$addr ) {
 | 
			
		||||
        my @aOID = split( '\.', $key );
 | 
			
		||||
        my $port = $aOID[1];
 | 
			
		||||
        next unless $port;
 | 
			
		||||
        # Local LLDP port may not equate to ifIndex, see LldpPortNumber TEXTUAL-CONVENTION in LLDP-MIB.
 | 
			
		||||
        # Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex,
 | 
			
		||||
        # prefer ifDescr over ifAlias because using cross ref with description is correct behavior 
 | 
			
		||||
        # according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though.
 | 
			
		||||
        my $lldp_desc = $lldp->lldpLocPortDesc($port);
 | 
			
		||||
        my $desc      = $lldp_desc->{$port};
 | 
			
		||||
        # If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
 | 
			
		||||
        if ( $desc && exists $r_i_descr{$desc} ) {
 | 
			
		||||
            $port = $r_i_descr{$desc};
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $desc && exists $r_i_alias{$desc} ) {
 | 
			
		||||
            $port = $r_i_alias{$desc};
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $lldp_if{$key} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_if;
 | 
			
		||||
@@ -124,6 +173,38 @@ sub lldp_ip {
 | 
			
		||||
    return \%lldp_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_ipv6 {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_ipv6;
 | 
			
		||||
    foreach my $key ( keys %$rman_addr ) {
 | 
			
		||||
        my ( $index, $proto, $addr ) = _lldp_addr_index($key);
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next unless $proto == 2;
 | 
			
		||||
        $lldp_ipv6{$index} = $addr;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_ipv6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_mac {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_ipv6;
 | 
			
		||||
    foreach my $key ( keys %$rman_addr ) {
 | 
			
		||||
        my ( $index, $proto, $addr ) = _lldp_addr_index($key);
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
        next unless $proto == 6;
 | 
			
		||||
        $lldp_ipv6{$index} = $addr;
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_ipv6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_addr {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
@@ -146,14 +227,21 @@ sub lldp_port {
 | 
			
		||||
    my $pdesc = $lldp->lldp_rem_desc($partial)     || {};
 | 
			
		||||
    my $pid   = $lldp->lldp_rem_pid($partial)      || {};
 | 
			
		||||
    my $ptype = $lldp->lldp_rem_pid_type($partial) || {};
 | 
			
		||||
    my $desc  = $lldp->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_port;
 | 
			
		||||
    foreach my $key ( sort keys %$pid ) {
 | 
			
		||||
        my $port = $pdesc->{$key};
 | 
			
		||||
        my $type = $ptype->{$key};
 | 
			
		||||
        if ( $type and $type eq 'interfaceName' ) {
 | 
			
		||||
 | 
			
		||||
            # If the pid claims to be an interface name,
 | 
			
		||||
            # believe it.
 | 
			
		||||
            $port = $pid->{$key};
 | 
			
		||||
        }
 | 
			
		||||
        unless ($port) {
 | 
			
		||||
            $port = $pid->{$key};
 | 
			
		||||
            next unless $port;
 | 
			
		||||
            my $type = $ptype->{$key};
 | 
			
		||||
            next unless $type;
 | 
			
		||||
 | 
			
		||||
          # May need to format other types in the future, i.e. Network address
 | 
			
		||||
@@ -163,10 +251,14 @@ sub lldp_port {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        # Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
 | 
			
		||||
        # Avaya/Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
 | 
			
		||||
        # figure out slot.port based upon lldpRemPortDesc
 | 
			
		||||
        if ( $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ ) {
 | 
			
		||||
            $port = defined $1 ? "$2.$3" : "$3";
 | 
			
		||||
        if ( defined $desc->{$key}
 | 
			
		||||
            && $desc->{$key}
 | 
			
		||||
            =~ /^Ethernet\s(?:Routing\s)?Switch\s\d|^Virtual\sServices\sPlatform\s\d/
 | 
			
		||||
            && $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ )
 | 
			
		||||
        {
 | 
			
		||||
            $port = defined $1 ? "$2.$3" : "1.$3";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $lldp_port{$key} = $port;
 | 
			
		||||
@@ -191,18 +283,103 @@ sub lldp_id {
 | 
			
		||||
        # 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;
 | 
			
		||||
 	    }
 | 
			
		||||
	}
 | 
			
		||||
        }
 | 
			
		||||
        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 lldp_platform {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $rid  = $lldp->lldp_rem_id($partial)      || {};
 | 
			
		||||
    my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
 | 
			
		||||
    my $name = $lldp->lldp_rem_sysname($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %lldp_platform;
 | 
			
		||||
    foreach my $key ( keys %$rid ) {
 | 
			
		||||
        $lldp_platform{$key} = $desc->{$key} || $name->{$key};
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_cap {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp_caps = $lldp->lldp_rem_cap_spt($partial) || {};
 | 
			
		||||
 | 
			
		||||
    # Encoded as BITS which Perl Net-SNMP implementation doesn't seem to
 | 
			
		||||
    # be able to enumerate for us, so we have to get it from the MIB
 | 
			
		||||
    # and enumerate ourselves
 | 
			
		||||
    my $oid = SNMP::translateObj( 'lldpRemSysCapEnabled', 0, 1 ) || '';
 | 
			
		||||
    my $enums = (
 | 
			
		||||
        ( ref {} eq ref $SNMP::MIB{$oid}{'enums'} )
 | 
			
		||||
        ? $SNMP::MIB{$oid}{'enums'}
 | 
			
		||||
        : {}
 | 
			
		||||
    );
 | 
			
		||||
    my %r_enums = reverse %$enums;
 | 
			
		||||
 | 
			
		||||
    my %lldp_cap;
 | 
			
		||||
    foreach my $key ( keys %$lldp_caps ) {
 | 
			
		||||
        my $cap_bits = $lldp_caps->{$key};
 | 
			
		||||
        next unless $cap_bits;
 | 
			
		||||
 | 
			
		||||
        my $count = 0;
 | 
			
		||||
        foreach my $bit ( split //, $cap_bits ) {
 | 
			
		||||
            if ($bit) {
 | 
			
		||||
                push( @{ $lldp_cap{$key} }, $r_enums{$count} );
 | 
			
		||||
            }
 | 
			
		||||
            $count++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_cap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub lldp_media_cap {
 | 
			
		||||
    my $lldp    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp_caps = $lldp->lldp_rem_media_cap_spt($partial) || {};
 | 
			
		||||
 | 
			
		||||
    # Encoded as BITS which Perl Net-SNMP implementation doesn't seem to
 | 
			
		||||
    # be able to enumerate for us, so we have to get it from the MIB
 | 
			
		||||
    # and enumerate ourselves
 | 
			
		||||
    my $oid = SNMP::translateObj( 'lldpXMedRemCapCurrent', 0, 1 ) || '';
 | 
			
		||||
    my $enums = (
 | 
			
		||||
        ( ref {} eq ref $SNMP::MIB{$oid}{'enums'} )
 | 
			
		||||
        ? $SNMP::MIB{$oid}{'enums'}
 | 
			
		||||
        : {}
 | 
			
		||||
    );
 | 
			
		||||
    my %r_enums = reverse %$enums;
 | 
			
		||||
 | 
			
		||||
    my %lldp_cap;
 | 
			
		||||
    foreach my $key ( keys %$lldp_caps ) {
 | 
			
		||||
        my $cap_bits = $lldp_caps->{$key};
 | 
			
		||||
        next unless $cap_bits;
 | 
			
		||||
 | 
			
		||||
        my $count = 0;
 | 
			
		||||
        foreach my $bit ( split //, $cap_bits ) {
 | 
			
		||||
            if ($bit) {
 | 
			
		||||
                push( @{ $lldp_cap{$key} }, $r_enums{$count} );
 | 
			
		||||
            }
 | 
			
		||||
            $count++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%lldp_cap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#sub root_ip {
 | 
			
		||||
#    my $lldp = shift;
 | 
			
		||||
#
 | 
			
		||||
@@ -228,20 +405,26 @@ sub _lldp_addr_index {
 | 
			
		||||
    my @oids   = split( /\./, $idx );
 | 
			
		||||
    my $index  = join( '.', splice( @oids, 0, 3 ) );
 | 
			
		||||
    my $proto  = shift(@oids);
 | 
			
		||||
    my $length = shift(@oids);
 | 
			
		||||
    shift(@oids) if scalar @oids > 4; # $length
 | 
			
		||||
 | 
			
		||||
    # IPv4
 | 
			
		||||
    if ( $proto == 1 ) {
 | 
			
		||||
        return ( $index, $proto, join( '.', @oids ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # IPv6
 | 
			
		||||
    elsif ( $proto == 2 ) {
 | 
			
		||||
        return ( $index, $proto,
 | 
			
		||||
            join(':', unpack('(H4)*', pack('C*', @oids)) ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # MAC
 | 
			
		||||
    elsif ( $proto == 6 ) {
 | 
			
		||||
        return ( $index, $proto,
 | 
			
		||||
            join( ':', map { sprintf "%02x", $_ } @oids ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # TODO - Need to handle other protocols, i.e. IPv6
 | 
			
		||||
    # TODO - Other protocols may be used as well; implement when needed?
 | 
			
		||||
    else {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
@@ -309,6 +492,8 @@ None.
 | 
			
		||||
 | 
			
		||||
=item F<LLDP-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<LLDP-EXT-MED-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<LLDP-EXT-DOT1-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<LLDP-EXT-DOT3-MIB>
 | 
			
		||||
@@ -343,7 +528,7 @@ Nulls are removed before the value is returned.
 | 
			
		||||
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>)
 | 
			
		||||
@@ -391,29 +576,62 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_id()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the chassis component	associated
 | 
			
		||||
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.
 | 
			
		||||
Returns the mapping to the SNMP Interface Table. Tries to cross reference 
 | 
			
		||||
(C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>), 
 | 
			
		||||
if unable defaults to (C<lldpRemLocalPortNum>).
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_ip()
 | 
			
		||||
 | 
			
		||||
Returns remote IPv4 address.  Returns for all other address types, use
 | 
			
		||||
lldp_addr if you want any return address type.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_ipv6()
 | 
			
		||||
 | 
			
		||||
Returns remote IPv6 address, if known.  Returns for all other address types,
 | 
			
		||||
use lldp_addr if you don't care about return address type.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_mac()
 | 
			
		||||
 | 
			
		||||
Returns remote (management) MAC address, if known.  Returns for all other 
 | 
			
		||||
address types, use lldp_addr if you don't care about return address type.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_addr()
 | 
			
		||||
 | 
			
		||||
Returns remote address.  Type may be any IANA Address Family Number.
 | 
			
		||||
Currently only returns IPv4 or MAC addresses.
 | 
			
		||||
Currently only returns IPv4, IPv6 or MAC addresses. If the remote device
 | 
			
		||||
returns more than one address type, this method will give only one. Which one
 | 
			
		||||
is returned is decided by chance, phase of the moon and Perl hash ordering.
 | 
			
		||||
 | 
			
		||||
Use lldp_mac, lldp_ip or lldp_ipv6 if you want a specific address type.
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_port()
 | 
			
		||||
 | 
			
		||||
Returns remote port ID
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_platform()
 | 
			
		||||
 | 
			
		||||
Tries to return something useful from C<lldp_rem_sysdesc()> or
 | 
			
		||||
C<lldp_rem_sysname()>.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_cap() 
 | 
			
		||||
 | 
			
		||||
Returns hash of arrays with each array containing the system capabilities
 | 
			
		||||
supported by the remote system.  Possible elements in the array are
 | 
			
		||||
enumerated from C<LldpSystemCapabilitiesMap>.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_media_cap() 
 | 
			
		||||
 | 
			
		||||
Returns hash of arrays with each array containing the media capabilities
 | 
			
		||||
supported by the remote system.  Possible elements in the array are
 | 
			
		||||
enumerated from C<LldpXMedCapabilities>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 LLDP Remote Table (C<lldpRemTable>)
 | 
			
		||||
@@ -429,7 +647,7 @@ the remote system.
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_id()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the chassis component	associated
 | 
			
		||||
Returns the string value used to identify the chassis component associated
 | 
			
		||||
with the remote system.
 | 
			
		||||
 | 
			
		||||
(C<lldpRemChassisId>)
 | 
			
		||||
@@ -475,11 +693,70 @@ Nulls are removed before the value is returned.
 | 
			
		||||
 | 
			
		||||
(C<lldpRemSysDesc>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_hw_rev()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the hardware revision of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned. 
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemHardwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_fw_rev()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the firmware revision of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned. 
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemHardwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_sw_rev()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the software revision of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned. 
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemSoftwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_serial()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the serial number of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned. 
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemSerialNum>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_vendor()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the manufacturer of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned. 
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemMfgName>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_asset()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the asset number of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned. 
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemAssetID>)
 | 
			
		||||
 | 
			
		||||
=item $lldp->lldp_rem_model()
 | 
			
		||||
 | 
			
		||||
Returns the string value used to identify the model of the
 | 
			
		||||
remote system. Nulls are removed before the value is returned. 
 | 
			
		||||
 | 
			
		||||
(C<lldpXMedRemModelName>)
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_rem_media_cap_spt() 
 | 
			
		||||
 | 
			
		||||
Returns which media capabilities are supported on the remote system. Results
 | 
			
		||||
are munged into an ascii binary string, LSB.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_rem_media_cap() 
 | 
			
		||||
 | 
			
		||||
Returns which media capabilities are enabled on the remote system. Results
 | 
			
		||||
are munged into an ascii binary string, LSB.
 | 
			
		||||
 | 
			
		||||
=item  $lldp->lldp_rem_sys_cap() 
 | 
			
		||||
 | 
			
		||||
Returns which system capabilities are enabled on the local system.  Results
 | 
			
		||||
are munged into an ascii binary string, LSB.  Each digit
 | 
			
		||||
represents a bit from the table below:
 | 
			
		||||
Returns which system capabilities are enabled on the remote system.  Results
 | 
			
		||||
are munged into an ascii binary string, LSB.  Each digit represents a bit
 | 
			
		||||
from the table below:
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
 | 
			
		||||
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
 | 
			
		||||
@@ -78,7 +78,7 @@ sub model {
 | 
			
		||||
 | 
			
		||||
    my $desc = $allied->description();
 | 
			
		||||
 | 
			
		||||
    if ( $desc =~ /(AT-\d{4}\S{1}?)/ ) {
 | 
			
		||||
    if ( $desc =~ /(AT-\d{4}\S{1})/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
 | 
			
		||||
@@ -50,11 +50,11 @@ $VERSION = '2.05';
 | 
			
		||||
    %SNMP::Info::Layer1::FUNCS,
 | 
			
		||||
    'asante_port'  => 'ePortIndex',
 | 
			
		||||
    'asante_group' => 'ePortGrpIndex',
 | 
			
		||||
    'i_type'       => 'ePortStateType',
 | 
			
		||||
    'i_type'       => 'ePortGrpIndex',
 | 
			
		||||
    'asante_up'    => 'ePortStateLinkStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-HUB1012-MIB' => 'asante' );
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-AH1012-MIB' => 'asante' );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
 | 
			
		||||
 | 
			
		||||
@@ -202,7 +202,7 @@ Asante device through SNMP.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<ASANTE-HUB1012-MIB>
 | 
			
		||||
=item F<ASANTE-AH1012-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -230,7 +230,7 @@ Returns 'asante' :)
 | 
			
		||||
 | 
			
		||||
=item $asante->model()
 | 
			
		||||
 | 
			
		||||
Cross references $asante->id() to the F<ASANTE-HUB1012-MIB> and returns
 | 
			
		||||
Cross references $asante->id() to the F<ASANTE-AH1012-MIB> and returns
 | 
			
		||||
the results.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
@@ -93,7 +93,7 @@ sub os {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
@@ -334,6 +334,13 @@ sub bp_index {
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $bayhub = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $bayhub->SUPER::fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $bayhub  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
@@ -469,7 +476,7 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay / Nortel Hubs
 | 
			
		||||
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay/Nortel/Avaya Hubs
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -541,7 +548,7 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $bayhub->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $bayhub->os()
 | 
			
		||||
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer1::MIBS,
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
@@ -324,6 +324,13 @@ sub bp_index {
 | 
			
		||||
    return \%bp_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $s3000 = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $s3000->SUPER::fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $s3000   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
@@ -38,18 +38,20 @@ use SNMP::Info;
 | 
			
		||||
use SNMP::Info::Bridge;
 | 
			
		||||
use SNMP::Info::Entity;
 | 
			
		||||
use SNMP::Info::PowerEthernet;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::ISA
 | 
			
		||||
    = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet Exporter/;
 | 
			
		||||
    = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet SNMP::Info::LLDP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,         %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
    %SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
@@ -57,6 +59,7 @@ $VERSION = '2.05';
 | 
			
		||||
    %SNMP::Info::Bridge::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Entity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::PowerEthernet::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    'serial1' =>
 | 
			
		||||
        '.1.3.6.1.4.1.9.3.6.3.0',    # OLD-CISCO-CHASSIS-MIB::chassisId.0
 | 
			
		||||
);
 | 
			
		||||
@@ -64,6 +67,7 @@ $VERSION = '2.05';
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,         %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
    %SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
@@ -73,6 +77,7 @@ $VERSION = '2.05';
 | 
			
		||||
    %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
    %SNMP::Info::Entity::MUNGE,
 | 
			
		||||
    %SNMP::Info::PowerEthernet::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
@@ -123,30 +128,16 @@ sub serial {
 | 
			
		||||
    # precedence
 | 
			
		||||
    #   serial2,chassis parse,serial1
 | 
			
		||||
    return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
 | 
			
		||||
    return $1
 | 
			
		||||
        if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
 | 
			
		||||
 | 
			
		||||
    if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 ) {
 | 
			
		||||
        my $type = $i_type->{$if};
 | 
			
		||||
        $i_ignore{$if}++
 | 
			
		||||
            if $type =~ /(loopback|other|cpu)/i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $l2      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
@@ -155,10 +146,18 @@ sub interfaces {
 | 
			
		||||
    my $i_descr    = $l2->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    # Replace the Index with the ifDescr field.
 | 
			
		||||
    # Check for duplicates in ifDescr, if so uniquely identify by adding
 | 
			
		||||
    # ifIndex to repeated values
 | 
			
		||||
    my %seen;
 | 
			
		||||
    foreach my $iid ( keys %$i_descr ) {
 | 
			
		||||
        my $port = $i_descr->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        $interfaces->{$iid} = $port;
 | 
			
		||||
        if ( $seen{$port}++ ) {
 | 
			
		||||
            $interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $interfaces->{$iid} = $port;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $interfaces;
 | 
			
		||||
}
 | 
			
		||||
@@ -224,6 +223,8 @@ after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
@@ -277,6 +278,10 @@ See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
@@ -293,12 +298,6 @@ name.
 | 
			
		||||
 | 
			
		||||
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 C<ifType> of loopback, propvirtual, other, and cpu
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info
 | 
			
		||||
@@ -313,4 +312,8 @@ See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
							
								
								
									
										175
									
								
								lib/SNMP/Info/Layer2/3Com.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								lib/SNMP/Info/Layer2/3Com.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,175 @@
 | 
			
		||||
package SNMP::Info::Layer2::3Com;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::3Com::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::3Com::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    'A3Com-products-MIB' => 'wlanAP7760',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return '3Com';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $dev  = shift;
 | 
			
		||||
    my $e_serial = $dev->e_serial();
 | 
			
		||||
 | 
			
		||||
    # Find entity table entry for this unit
 | 
			
		||||
    foreach my $e ( sort keys %$e_serial ) {
 | 
			
		||||
        if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_serial->{$e};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
 | 
			
		||||
    my $dev = shift;
 | 
			
		||||
    my $e_swver  = $dev->e_swver();
 | 
			
		||||
    # Find entity table entry for this unit
 | 
			
		||||
    foreach my $e ( sort keys %$e_swver ) {
 | 
			
		||||
        if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_swver->{$e};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return '3Com';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
 | 
			
		||||
    my $dsmodel = shift;
 | 
			
		||||
    my $descr = $dsmodel->description();
 | 
			
		||||
    if ( $descr =~ /^([\S ]+) Software.*/){
 | 
			
		||||
        return $1;
 | 
			
		||||
    } else {
 | 
			
		||||
        return $descr;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::3Com - SNMP Interface to L2 3Com Switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Kosmach
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $router = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 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 3Com L2 devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<A3Com-products-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $device->vendor()
 | 
			
		||||
 | 
			
		||||
Returns '3Com'
 | 
			
		||||
 | 
			
		||||
=item $device->os()
 | 
			
		||||
 | 
			
		||||
Returns '3Com'
 | 
			
		||||
 | 
			
		||||
=item $device->os_ver()
 | 
			
		||||
 | 
			
		||||
Return os version
 | 
			
		||||
 | 
			
		||||
=item $device->model()
 | 
			
		||||
 | 
			
		||||
Returns device model extracted from description
 | 
			
		||||
 | 
			
		||||
=item $device->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										286
									
								
								lib/SNMP/Info/Layer2/Adtran.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										286
									
								
								lib/SNMP/Info/Layer2/Adtran.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,286 @@
 | 
			
		||||
package SNMP::Info::Layer2::Adtran;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Adtran::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Adtran::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
# This will be filled in with the device's index into the EntPhysicalEntry
 | 
			
		||||
# table by the serial() function.
 | 
			
		||||
our $index = undef;
 | 
			
		||||
 | 
			
		||||
%MIBS = ( 
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    'ADTRAN-GENEVC-MIB'     => 'adGenEVCMIB',
 | 
			
		||||
    'ADTRAN-GENMEF-MIB'     => 'adGenMEFMIB',
 | 
			
		||||
    'ADTRAN-GENPORT-MIB'    => 'adGenPort',
 | 
			
		||||
    'ADTRAN-MIB'            => 'adtran',
 | 
			
		||||
    'ADTRAN-AOSUNIT'     => 'adGenAOSUnitMib',
 | 
			
		||||
 );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS, 
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS, 
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    'serial'    => 'adProdSerialNumber',
 | 
			
		||||
    'ad_mgmtevcvid' => 'adGenEVCSysMgmtEVCSTagVID',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
           %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
           %SNMP::Info::LLDP::FUNCS, 
 | 
			
		||||
           'ad_evcstag' => 'adGenEVCLookupName',
 | 
			
		||||
           'ad_menport' => 'adGenMenPortRowStatus',
 | 
			
		||||
           'ad_evcnamevid' => 'adGenEVCSTagVID',
 | 
			
		||||
           'ad_mgmtevcports' => 'adGenSysMgmtEVCInterfaceConnectionType',
 | 
			
		||||
           'ad_evcmapuniport' => 'adGenMEFMapUNIPort',
 | 
			
		||||
           'ad_evcmapevc' => 'adGenMEFMapAssociatedEVCAlias',
 | 
			
		||||
           'ad_genportcustuse' => 'adGenPortCustomerUse',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, %SNMP::Info::Layer3::MUNGE );
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'adtran';
 | 
			
		||||
}
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'aos';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $layers = $adtran->SUPER::layers();
 | 
			
		||||
    # Some netvantas don't report L2 properly 
 | 
			
		||||
    my $macs   = $adtran->fw_mac();
 | 
			
		||||
    
 | 
			
		||||
    if (keys %$macs) {
 | 
			
		||||
        my $l = substr $layers, 6, 1, "1";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $layers;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $ver = $adtran->adProdSwVersion() || undef;
 | 
			
		||||
    return $ver if (defined $ver);
 | 
			
		||||
    my $aos_ver = $adtran->adAOSDeviceVersion();
 | 
			
		||||
    return $aos_ver;
 | 
			
		||||
}
 | 
			
		||||
sub model { 
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $id = $adtran->id();
 | 
			
		||||
    my $mod = $adtran->adProdName() || undef;
 | 
			
		||||
    return $mod if (defined $mod);
 | 
			
		||||
    my $model = $adtran->adAOSDeviceProductName() || undef;
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
sub serial { 
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $e_serial = $adtran->e_serial() || {};
 | 
			
		||||
    my $serial2 = $e_serial->{1} || undef;
 | 
			
		||||
    return $serial2 if ( defined $serial2 );
 | 
			
		||||
    return $adtran->orig_serial();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_name {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    my $i_name = $adtran->SUPER::i_alias() || undef; 
 | 
			
		||||
    return $i_name if (defined $i_name);
 | 
			
		||||
    $i_name = {};
 | 
			
		||||
    my $adname = $adtran->ad_genportcustuse() || undef;
 | 
			
		||||
    if (defined $adname) {  
 | 
			
		||||
        foreach my $port (keys %$adname) { 
 | 
			
		||||
            my @split = split(/\./,$port);
 | 
			
		||||
            $i_name->{@split[1]} = $adname->{$port};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $i_name;
 | 
			
		||||
}
 | 
			
		||||
sub i_vlan { 
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    my $uniports = $adtran->ad_evcmapuniport() || undef;
 | 
			
		||||
    my $evcmaps = $adtran->ad_evcmapevc() || undef;
 | 
			
		||||
    my $v_names = $adtran->ad_evcnamevid() || undef;
 | 
			
		||||
    if (defined $uniports) {
 | 
			
		||||
        my $vlans = {};
 | 
			
		||||
        foreach my $oid (keys %$v_names) {
 | 
			
		||||
            my $name = pack("C*", split(/\./,$oid));
 | 
			
		||||
            $vlans->{$name} = $v_names->{$oid};
 | 
			
		||||
        }
 | 
			
		||||
        my $i_vlan = {};
 | 
			
		||||
        foreach my $evcmap (keys %$evcmaps) {
 | 
			
		||||
            $i_vlan->{$uniports->{$evcmap}} = $vlans->{$evcmaps->{$evcmap}};
 | 
			
		||||
        }
 | 
			
		||||
        return $i_vlan;
 | 
			
		||||
    }
 | 
			
		||||
    return {};
 | 
			
		||||
        
 | 
			
		||||
}
 | 
			
		||||
        
 | 
			
		||||
sub i_vlan_membership {         
 | 
			
		||||
    my $adtran  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    my $i_vlan = $adtran->ad_menport();
 | 
			
		||||
    if (defined $i_vlan) { 
 | 
			
		||||
        my $vlans = {};
 | 
			
		||||
        my $v_name = $adtran->v_name();
 | 
			
		||||
        foreach my $vid (keys %$v_name) {
 | 
			
		||||
            $vlans->{$v_name->{$vid}} = $vid;
 | 
			
		||||
        }
 | 
			
		||||
        my $if_vlans = {};
 | 
			
		||||
        foreach my $entry (keys %$i_vlan) {
 | 
			
		||||
            my @split = split(/(\.0)+\./,$entry);
 | 
			
		||||
            my $name = pack("C*", split(/\./,@split[0]));
 | 
			
		||||
            push @{$if_vlans->{@split[2]}}, $vlans->{$name};
 | 
			
		||||
        }
 | 
			
		||||
        my $mgmtevcports = $adtran->ad_mgmtevcports();
 | 
			
		||||
        my $mgmtevcid = $adtran->ad_mgmtevcvid();
 | 
			
		||||
        foreach my $port (keys %$mgmtevcports) {
 | 
			
		||||
           push @{$if_vlans->{$port}}, $mgmtevcid;
 | 
			
		||||
        }
 | 
			
		||||
        return $if_vlans;
 | 
			
		||||
    }
 | 
			
		||||
    return {};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub v_name {
 | 
			
		||||
    my $adtran = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
    my $v_index = $adtran->ad_evcstag();
 | 
			
		||||
    return {} unless defined $v_index;
 | 
			
		||||
    $v_index->{$adtran->ad_mgmtevcvid()} = 'system-management-evc';
 | 
			
		||||
    return $v_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Adtran - SNMP Interface to Adtran Devices
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $adtran = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $adtran->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for adtran Devices running JUNOS
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $adtran->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'adtran'
 | 
			
		||||
 | 
			
		||||
=item $adtran->os()
 | 
			
		||||
 | 
			
		||||
Returns 'aos'
 | 
			
		||||
 | 
			
		||||
=item $adtran->layers()
 | 
			
		||||
 | 
			
		||||
Ensures that layer two is reported, at least.
 | 
			
		||||
 | 
			
		||||
=item $adtran->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted first from C<adProdSwVersion> or
 | 
			
		||||
C<adAOSDeviceVersion>.
 | 
			
		||||
 | 
			
		||||
=item $adtran->model()
 | 
			
		||||
 | 
			
		||||
Returns the model extracted first from C<adProdName> or
 | 
			
		||||
C<adAOSDeviceProductName>.
 | 
			
		||||
 | 
			
		||||
=item $adtran->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $adtran->v_name()
 | 
			
		||||
 | 
			
		||||
VLAN names table.
 | 
			
		||||
 | 
			
		||||
=item $adtran->i_name()
 | 
			
		||||
 | 
			
		||||
Interface names table.
 | 
			
		||||
 | 
			
		||||
=item $adtran->i_vlan()
 | 
			
		||||
 | 
			
		||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
 | 
			
		||||
 | 
			
		||||
=item $adtran->i_vlan_membership()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.  These are the VLANs which are members of the egress list for the port.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
# SNMP::Info::Layer2::Airespace
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Eric Miller
 | 
			
		||||
#
 | 
			
		||||
@@ -41,13 +40,14 @@ use SNMP::Info::Airespace;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,      %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS, %SNMP::Info::Airespace::MIBS,
 | 
			
		||||
    'AIRESPACE-SWITCHING-MIB' => 'agentInterfaceVlanId',
 | 
			
		||||
    'CISCO-LWAPP-DOT11-CLIENT-MIB' => 'cldcClientCurrentTxRateSet',
 | 
			
		||||
    'CISCO-LWAPP-DOT11-MIB'        => 'cldHtDot11nChannelBandwidth',
 | 
			
		||||
    'CISCO-LWAPP-AP-MIB'           => 'cLApIfMacAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
@@ -58,28 +58,84 @@ $VERSION = '2.05';
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::FUNCS,      %SNMP::Info::Bridge::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS, %SNMP::Info::Airespace::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # This needs to be cleaned up, but for now we pretend to
 | 
			
		||||
    # have the CISCO-DOT11-MIB for signal strengths, etc.
 | 
			
		||||
    'cd11_sigstrength' => 'bsnMobileStationRSSI',	# kinda
 | 
			
		||||
    'cd11_sigqual'     => 'bsnMobileStationSnr',	# kinda
 | 
			
		||||
    'cd11_rxbyte'      => 'bsnMobileStationBytesReceived',
 | 
			
		||||
    'cd11_txbyte'      => 'bsnMobileStationBytesSent',
 | 
			
		||||
    'cd11_rxpkt'       => 'bsnMobileStationPacketsReceived',
 | 
			
		||||
    'cd11_txpkt'       => 'bsnMobileStationPacketsSent',
 | 
			
		||||
    'cd11_txrate'      => 'cldcClientCurrentTxRateSet',
 | 
			
		||||
    # CISCO-LWAPP-AP-MIB::cLApTable
 | 
			
		||||
    'ap_if_mac'        => 'cLApIfMacAddress',
 | 
			
		||||
    # CISCO-LWAPP-DOT11-CLIENT-MIB::cldcClientTable
 | 
			
		||||
    'client_txrate'    => 'cldcClientCurrentTxRateSet',
 | 
			
		||||
    'cd11_proto'       => 'cldcClientProtocol',
 | 
			
		||||
    'cd11_rateset'     => 'cldcClientDataRateSet',
 | 
			
		||||
    # CISCO-LWAPP-DOT11-MIB::cldHtMacOperationsTable
 | 
			
		||||
    'cd11n_ch_bw'      => 'cldHtDot11nChannelBandwidth',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::MUNGE,      %SNMP::Info::Bridge::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE, %SNMP::Info::Airespace::MUNGE,
 | 
			
		||||
    'cd11_rxpkt'	=> \&munge_64bits,
 | 
			
		||||
    'cd11_txpkt'	=> \&munge_64bits,
 | 
			
		||||
    'cd11_txrate'       => \&munge_cd11_txrate,
 | 
			
		||||
    'ap_if_mac'         => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'cd11n_ch_bw'       => \&munge_cd11n_ch_bw,
 | 
			
		||||
    'cd11_rateset'      => \&munge_cd11_rateset,
 | 
			
		||||
    'cd11_proto'        => \&munge_cd11_proto,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# 802.11n Modulation and Coding Scheme (MCS)
 | 
			
		||||
my $mcs_index = {
 | 
			
		||||
    20 => {
 | 
			
		||||
	m0  => '6.5',
 | 
			
		||||
	m1  => '13',
 | 
			
		||||
	m2  => '19.5',
 | 
			
		||||
	m3  => '26',
 | 
			
		||||
	m4  => '39',
 | 
			
		||||
	m5  => '52',
 | 
			
		||||
	m6  => '58.5',
 | 
			
		||||
	m7  => '65',
 | 
			
		||||
	m8  => '13',
 | 
			
		||||
	m9  => '26',
 | 
			
		||||
	m10 => '39',
 | 
			
		||||
	m11 => '52',
 | 
			
		||||
	m12 => '78',
 | 
			
		||||
	m13 => '104',
 | 
			
		||||
	m14 => '117',
 | 
			
		||||
	m15 => '130',
 | 
			
		||||
	m16 => '19.5',
 | 
			
		||||
	m17 => '39',
 | 
			
		||||
	m18 => '58.5',
 | 
			
		||||
	m19 => '78',
 | 
			
		||||
	m20 => '117',
 | 
			
		||||
	m21 => '156',
 | 
			
		||||
	m22 => '175.5',
 | 
			
		||||
	m23 => '195',
 | 
			
		||||
	# This is a cheat for 802.11a bonded
 | 
			
		||||
	m108 => '108',
 | 
			
		||||
    },
 | 
			
		||||
    40 => {
 | 
			
		||||
	m0  => '15',
 | 
			
		||||
	m1  => '30',
 | 
			
		||||
	m2  => '45',
 | 
			
		||||
	m3  => '60',
 | 
			
		||||
	m4  => '90',
 | 
			
		||||
	m5  => '120',
 | 
			
		||||
	m6  => '135',
 | 
			
		||||
	m7  => '157.5',
 | 
			
		||||
	m8  => '30',
 | 
			
		||||
	m9  => '60',
 | 
			
		||||
	m10 => '90',
 | 
			
		||||
	m11 => '120',
 | 
			
		||||
	m12 => '180',
 | 
			
		||||
	m13 => '240',
 | 
			
		||||
	m14 => '270',
 | 
			
		||||
	m15 => '300',
 | 
			
		||||
	m16 => '45',
 | 
			
		||||
	m17 => '90',
 | 
			
		||||
	m18 => '135',
 | 
			
		||||
	m19 => '180',
 | 
			
		||||
	m20 => '270',
 | 
			
		||||
	m21 => '360',
 | 
			
		||||
	m22 => '405',
 | 
			
		||||
	m23 => '450',
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
@@ -96,9 +152,6 @@ sub model {
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# vlan:
 | 
			
		||||
# AIRESPACE-SWITCHING-MIB::agentInterfaceVlanId
 | 
			
		||||
 | 
			
		||||
sub cd11_mac {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $cd11_sigstrength = $airespace->cd11_sigstrength();
 | 
			
		||||
@@ -111,13 +164,48 @@ sub cd11_mac {
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11_txrate {
 | 
			
		||||
    my $rate = shift;
 | 
			
		||||
    if ( $rate ) {
 | 
			
		||||
        return [ $rate * 1.0 ];
 | 
			
		||||
    } else {
 | 
			
		||||
        return [ 0.0 ];
 | 
			
		||||
sub cd11_txrate {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    
 | 
			
		||||
    my $rates  = $airespace->client_txrate() || {};
 | 
			
		||||
    my $protos = $airespace->cd11_proto()    || {};
 | 
			
		||||
    my $bws    = $airespace->cd11n_ch_bw()   || {};
 | 
			
		||||
    
 | 
			
		||||
    my $cd11_txrate = {};
 | 
			
		||||
    foreach my $idx ( keys %$rates ) {
 | 
			
		||||
	my $rate = $rates->{$idx} || '0.0';
 | 
			
		||||
	
 | 
			
		||||
	if ( $rate =~ /^\d+/ ) {
 | 
			
		||||
            $cd11_txrate->{$idx} = [ $rate * 1.0 ];
 | 
			
		||||
	}
 | 
			
		||||
	elsif ( $rate =~ /^m/ ) {
 | 
			
		||||
	    my $band = $protos->{$idx};
 | 
			
		||||
	    my $bw   = $bws->{$band};
 | 
			
		||||
	    # FIXME throw some kind of error if we get an index/rate that we haven't implemented yet? Now we simply return "0.0"...
 | 
			
		||||
	    $cd11_txrate->{$idx} = [ $mcs_index->{$bw}->{$rate} || '0.0' ];
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
	    $cd11_txrate->{$idx} = [ $rate ];
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return $cd11_txrate;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11n_ch_bw {
 | 
			
		||||
    my $bw = shift;
 | 
			
		||||
    
 | 
			
		||||
    if ( $bw =~ /forty/ ) {
 | 
			
		||||
	return 40;
 | 
			
		||||
    }
 | 
			
		||||
    return 20;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11_proto {
 | 
			
		||||
    my $bw = shift;
 | 
			
		||||
    
 | 
			
		||||
    return 2 if ( $bw eq 'dot11n5' );
 | 
			
		||||
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_cd11_rateset {
 | 
			
		||||
@@ -125,11 +213,29 @@ sub munge_cd11_rateset {
 | 
			
		||||
    return [ map { $_ * 1.0 } split /,/, $rates ];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_64bits {
 | 
			
		||||
    # The controller sometimes hands off a ridiculous value for packets.
 | 
			
		||||
    # Just truncate it to 32 bits.
 | 
			
		||||
    my $value = shift;
 | 
			
		||||
    return $value & 0xffffffff;
 | 
			
		||||
# Cisco provides the AP's Ethernet MAC via
 | 
			
		||||
# CISCO-LWAPP-AP-MIB::cLApIfMacAddress this was not available pre-Cisco
 | 
			
		||||
sub i_mac {
 | 
			
		||||
    my $airespace = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_index = $airespace->i_index($partial)  || {};
 | 
			
		||||
    my $ap_mac  = $airespace->ap_if_mac()        || {};
 | 
			
		||||
 | 
			
		||||
    my $i_mac = $airespace->SUPER::i_mac() || {};
 | 
			
		||||
    foreach my $iid ( keys %$i_index ) {
 | 
			
		||||
	my $index = $i_index->{$iid};
 | 
			
		||||
	next unless defined $index;
 | 
			
		||||
 | 
			
		||||
	if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
 | 
			
		||||
	    $index =~ s/\.\d+$//;
 | 
			
		||||
	    next unless defined $index;
 | 
			
		||||
	    my $sys_mac = join( '.', map { hex($_) } split( ':', $index ) );
 | 
			
		||||
	    my $mac = $ap_mac->{$sys_mac};
 | 
			
		||||
	    $i_mac->{$iid} = $mac;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    return $i_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -187,6 +293,12 @@ my $airespace = new SNMP::Info::Layer2::Airespace(...);
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-LWAPP-DOT11-CLIENT-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-LWAPP-DOT11-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<CISCO-LWAPP-AP-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
@@ -238,10 +350,24 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=item cd11_mac()
 | 
			
		||||
 | 
			
		||||
Returns client radio interface MAC addresses.
 | 
			
		||||
 | 
			
		||||
=item cd11_txrate()
 | 
			
		||||
 | 
			
		||||
Returns client transmission speed in Mbs.
 | 
			
		||||
 | 
			
		||||
=back 
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item i_mac()
 | 
			
		||||
 | 
			
		||||
Adds AP Ethernet MAC as port mac on radio ports from C<CISCO-LWAPP-AP-MIB>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Airespace
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
 | 
			
		||||
@@ -254,15 +380,22 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 MUNGES
 | 
			
		||||
=head1 Data Munging Callback Subroutines
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item munge_64bits()
 | 
			
		||||
=item munge_cd11n_ch_bw()
 | 
			
		||||
 | 
			
		||||
Converts 802.11n channel bandwidth to either 20 or 40.
 | 
			
		||||
 | 
			
		||||
=item munge_cd11_proto()
 | 
			
		||||
 | 
			
		||||
Converts 802.11n 2.4Ghz to 1 and 5Ghz to 2 to correspond to the
 | 
			
		||||
(C<cldHtMacOperationsTable>) index.
 | 
			
		||||
 | 
			
		||||
=item munge_cd11_rateset()
 | 
			
		||||
 | 
			
		||||
=item munge_cd11_txrate()
 | 
			
		||||
Converts rate set to array.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -49,7 +49,7 @@ use SNMP::Info::IEEE802dot11;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::GLOBALS,
 | 
			
		||||
@@ -60,7 +60,8 @@ $VERSION = '2.05';
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    'serial' => 'entPhysicalSerialNum.1',
 | 
			
		||||
    'descr'  => 'sysDescr'
 | 
			
		||||
    'descr'  => 'sysDescr',
 | 
			
		||||
    'ps1_type' => 'cpoePdCurrentPowerSource'
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
@@ -97,6 +98,7 @@ $VERSION = '2.05';
 | 
			
		||||
    'CISCO-DOT11-ASSOCIATION-MIB'         => 'cDot11ClientSubIfIndex',
 | 
			
		||||
    'CISCO-DOT11-SSID-SECURITY-MIB'       => 'cdot11SecVlanNameId',
 | 
			
		||||
    'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
 | 
			
		||||
    'CISCO-POE-PD-MIB'                    => 'cpoePdCurrentPowerSource',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
@@ -437,6 +439,38 @@ sub i_ssidbcast {
 | 
			
		||||
    return $i_ssidbcast;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ssidmac {
 | 
			
		||||
    my $aironet    = shift;
 | 
			
		||||
    my $partial    = shift;
 | 
			
		||||
    my $mbss_mac_addr = $aironet->mbss_mac_addr();
 | 
			
		||||
 | 
			
		||||
    # Same logic as i_ssidbcast to return same indexes as i_ssidlist 
 | 
			
		||||
    my $map = {};
 | 
			
		||||
    foreach my $key ( keys %$mbss_mac_addr ) {
 | 
			
		||||
        my ( $interface, @idx ) = split( /\./, $key );
 | 
			
		||||
        $map->{ pack( "C*", @idx ) } = $mbss_mac_addr->{$key};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $i_ssidlist  = $aironet->i_ssidlist();
 | 
			
		||||
    my $i_ssidmac = {};
 | 
			
		||||
    foreach my $key ( keys %$i_ssidlist ) {
 | 
			
		||||
        $i_ssidmac->{$key} = $map->{ $i_ssidlist->{$key} };
 | 
			
		||||
    }
 | 
			
		||||
    return $i_ssidmac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
###
 | 
			
		||||
# PoE status.  The ps1_type is the PoE injector type, which is just
 | 
			
		||||
# a scalar; the status is a little more complex.
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $aironet = shift;
 | 
			
		||||
    my $idx = $aironet->cpoePdCurrentPowerLevel();
 | 
			
		||||
    my $mw = $aironet->cpoePdSupportedPower( $idx );
 | 
			
		||||
    my $descr = $aironet->cpoePdSupportedPowerMode( $idx );
 | 
			
		||||
 | 
			
		||||
    return sprintf( "%.2fW (%s)", $mw->{$idx} * 0.001, $descr->{$idx} );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -520,17 +554,13 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $aironet->discription()
 | 
			
		||||
 | 
			
		||||
Adds info from method e_descr() from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=item $aironet->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $aironet->description()
 | 
			
		||||
 | 
			
		||||
System description
 | 
			
		||||
System description. Adds info from method e_descr() from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -556,7 +586,7 @@ Returns radio interfaces.
 | 
			
		||||
 | 
			
		||||
=item $aironet->cd11_mac()
 | 
			
		||||
 | 
			
		||||
Returns radio interface MAC addresses.
 | 
			
		||||
Returns client radio interface MAC addresses.
 | 
			
		||||
 | 
			
		||||
=item $aironet->cd11_ssid()
 | 
			
		||||
 | 
			
		||||
@@ -623,6 +653,16 @@ to which they belong.
 | 
			
		||||
With the same keys as i_ssidlist, returns whether the given SSID is
 | 
			
		||||
being broadcast.
 | 
			
		||||
 | 
			
		||||
=item $aironet->i_ssidmac()
 | 
			
		||||
 | 
			
		||||
With the same keys as i_ssidlist, returns the Basic service set
 | 
			
		||||
identification (BSSID), MAC address, the AP is using for the SSID. 
 | 
			
		||||
 | 
			
		||||
=item $aironet ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns the PoE injector status based on C<cpoePdSupportedPower> and 
 | 
			
		||||
C<cpoePdSupportedPowerMode>.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer1;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
 | 
			
		||||
 | 
			
		||||
@@ -129,7 +129,7 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesyn switches
 | 
			
		||||
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesis switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -46,12 +46,13 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS,
 | 
			
		||||
    %SNMP::Info::SONMP::MIBS,
 | 
			
		||||
    'BAY-STACK-PETH-EXT-MIB' => 'bspePethPsePortExtMeasuredPower',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
@@ -64,6 +65,7 @@ $VERSION = '2.05';
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS,
 | 
			
		||||
    %SNMP::Info::SONMP::FUNCS,
 | 
			
		||||
    'peth_port_power' => 'bspePethPsePortExtMeasuredPower',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# 450's report full duplex as speed = 20mbps?!
 | 
			
		||||
@@ -79,27 +81,20 @@ $SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps';
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $descr    = $baystack->description();
 | 
			
		||||
    my $model    = $baystack->model();
 | 
			
		||||
    my $descr    = $baystack->description() || "";
 | 
			
		||||
    my $model    = $baystack->model() || "";
 | 
			
		||||
 | 
			
		||||
    if ( ( defined $descr and $descr =~ /Business Ethernet Switch.*SW:v/i ) )
 | 
			
		||||
    {
 | 
			
		||||
    if ( $descr =~ /Business Ethernet Switch.*SW:v/i ) {
 | 
			
		||||
        return 'bes';
 | 
			
		||||
    }
 | 
			
		||||
    if (
 | 
			
		||||
        (
 | 
			
		||||
           (defined $model and $model =~ /(420|425|BPS)/ )
 | 
			
		||||
        and
 | 
			
		||||
           (defined $descr and $descr =~ m/SW:v[1-2]/i )
 | 
			
		||||
        )
 | 
			
		||||
        or
 | 
			
		||||
        (
 | 
			
		||||
            (defined $model and $model =~ /(410|450|380)/ )
 | 
			
		||||
        )
 | 
			
		||||
       )
 | 
			
		||||
    if (   ( ( $model =~ /(420|425|BPS)/ ) and ( $descr =~ m/SW:v[1-2]/i ) )
 | 
			
		||||
        or ( ( $model =~ /(410|450|380)/ ) ) )
 | 
			
		||||
    {
 | 
			
		||||
        return 'baystack';
 | 
			
		||||
    }
 | 
			
		||||
    if ( $model =~ /VSP/ ) {
 | 
			
		||||
        return 'vsp';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 'boss';
 | 
			
		||||
}
 | 
			
		||||
@@ -126,7 +121,7 @@ sub os_bin {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
@@ -141,9 +136,12 @@ sub model {
 | 
			
		||||
    return '303' if ( defined $descr and $descr =~ /\D303\D/ );
 | 
			
		||||
    return '304' if ( defined $descr and $descr =~ /\D304\D/ );
 | 
			
		||||
    return 'BPS' if ( $model =~ /BPS2000/i );
 | 
			
		||||
    return $2
 | 
			
		||||
        if ( $model
 | 
			
		||||
        =~ /(ES|ERS|BayStack|EthernetRoutingSwitch|EthernetSwitch)-?(\d+)/ );
 | 
			
		||||
    
 | 
			
		||||
    # Pull sreg- from all
 | 
			
		||||
    $model =~ s/^sreg-//;
 | 
			
		||||
    # Strip ES/ERS/BayStack etc. from those families
 | 
			
		||||
    $model =~ s/^(E(R)?S|BayStack|Ethernet(Routing)?Switch)-?//;
 | 
			
		||||
    $model =~ s/-ethSwitchNMM//;
 | 
			
		||||
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
@@ -162,7 +160,7 @@ sub interfaces {
 | 
			
		||||
        next unless defined $index;
 | 
			
		||||
 | 
			
		||||
        # Ignore cascade ports
 | 
			
		||||
        next if $index > 513;
 | 
			
		||||
        next if $index > $index_factor * 8;
 | 
			
		||||
 | 
			
		||||
        my $port = ( $index % $index_factor );
 | 
			
		||||
        my $slot = ( int( $index / $index_factor ) ) + $slot_offset;
 | 
			
		||||
@@ -214,7 +212,7 @@ sub i_name {
 | 
			
		||||
 | 
			
		||||
sub index_factor {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $model    = $baystack->model();
 | 
			
		||||
    my $model    = $baystack->model() || "";
 | 
			
		||||
    my $os       = $baystack->os();
 | 
			
		||||
    my $os_ver   = $baystack->os_ver();
 | 
			
		||||
    my $op_mode  = $baystack->ns_op_mode();
 | 
			
		||||
@@ -228,142 +226,16 @@ sub index_factor {
 | 
			
		||||
 | 
			
		||||
    my $index_factor = 32;
 | 
			
		||||
    $index_factor = 64
 | 
			
		||||
        if ( ( defined $model and $model =~ /(470)/ )
 | 
			
		||||
        if ( ( $model =~ /(470)/ )
 | 
			
		||||
        or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) );
 | 
			
		||||
    $index_factor = 128
 | 
			
		||||
        if ( ( defined $model and $model =~ /(5[56]\d\d)/ )
 | 
			
		||||
        if ( ( $model =~ /(5[56]\d\d)|VSP|4950|59100/ )
 | 
			
		||||
        and ( $os_ver >= 6 ) );
 | 
			
		||||
 | 
			
		||||
    return $index_factor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use SONMP and/or LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
 | 
			
		||||
    return $baystack->hasLLDP() || $baystack->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $baystack->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $baystack->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $baystack->lldp_if($partial)     || {};
 | 
			
		||||
    my $cdp  = $baystack->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $baystack->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $baystack->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $baystack->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $baystack->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $id = $lldp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $baystack = shift;
 | 
			
		||||
    my $partial  = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $baystack->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $baystack->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Newer devices support ENTITY-MIB, use if available otherwise use proprietary
 | 
			
		||||
# methods.
 | 
			
		||||
@@ -452,14 +324,85 @@ sub e_vendor {
 | 
			
		||||
    return $stack->SUPER::e_vendor($partial) || $stack->ns_e_vendor($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# fix for stack of switches without POE on module 1
 | 
			
		||||
# https://sourceforge.net/tracker/?func=detail&aid=3317739&group_id=70362&atid=527529
 | 
			
		||||
sub peth_port_ifindex {
 | 
			
		||||
    my $stack = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my %peth_port_ifindex = ();
 | 
			
		||||
    my $poe_port_st = $stack->peth_port_status($partial);
 | 
			
		||||
    my $if_index = $stack->interfaces($partial);
 | 
			
		||||
 | 
			
		||||
    foreach my $i (keys %$if_index) {
 | 
			
		||||
        next unless defined $poe_port_st->{$if_index->{$i}};
 | 
			
		||||
        $peth_port_ifindex{$if_index->{$i}} = $i;
 | 
			
		||||
    }
 | 
			
		||||
    return \%peth_port_ifindex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Currently only ERS 4800 v5.8+ support the rcBridgeSpbmMacTable 
 | 
			
		||||
# which holds the FDB for a SPBM edge deployment.
 | 
			
		||||
#
 | 
			
		||||
# Q-BRIDGE still holds some entries when the rcBridgeSpbmMacTable is in use
 | 
			
		||||
# so we merge hash entries.
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $rapidcity = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $rapidcity->SUPER::fw_mac() || {};
 | 
			
		||||
    my $spbm = $rapidcity->rc_spbm_fw_mac() || {};
 | 
			
		||||
    my $fw_mac = { %$qb, %$spbm };
 | 
			
		||||
    
 | 
			
		||||
    return $fw_mac;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $rapidcity = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $rapidcity->SUPER::fw_port() || {};
 | 
			
		||||
    my $spbm = $rapidcity->rc_spbm_fw_port() || {};
 | 
			
		||||
    my $fw_port = { %$qb, %$spbm };
 | 
			
		||||
    
 | 
			
		||||
    return $fw_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_status {
 | 
			
		||||
    my $rapidcity = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $rapidcity->SUPER::fw_status() || {};    
 | 
			
		||||
    my $spbm = $rapidcity->rc_spbm_fw_status() || {};
 | 
			
		||||
    my $fw_status = { %$qb, %$spbm };
 | 
			
		||||
    
 | 
			
		||||
    return $fw_status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub qb_fw_vlan {
 | 
			
		||||
    my $rapidcity = shift;
 | 
			
		||||
 | 
			
		||||
    my $qb = $rapidcity->SUPER::qb_fw_vlan() || {};
 | 
			
		||||
    my $spbm = $rapidcity->rc_spbm_fw_vlan() || {};
 | 
			
		||||
    my $qb_fw_vlan = { %$qb, %$spbm };
 | 
			
		||||
    
 | 
			
		||||
    return $qb_fw_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Baystack uses S5-AGENT-MIB (loaded in NortelStack) versus RAPID-CITY
 | 
			
		||||
sub stp_ver {
 | 
			
		||||
    my $rapidcity = shift;
 | 
			
		||||
 | 
			
		||||
    return $rapidcity->s5AgSysSpanningTreeOperMode()
 | 
			
		||||
      || $rapidcity->SUPER::stp_ver();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Baystack - SNMP Interface to Nortel Ethernet (Baystack)
 | 
			
		||||
Switches
 | 
			
		||||
SNMP::Info::Layer2::Baystack - SNMP Interface to Avaya Ethernet Switch
 | 
			
		||||
(Baystack) and VSP 7000 series switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -482,8 +425,9 @@ Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from a Nortel 
 | 
			
		||||
Ethernet Switch (Baystack) through SNMP. 
 | 
			
		||||
Provides abstraction to the configuration information obtainable from an
 | 
			
		||||
Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series
 | 
			
		||||
through SNMP. 
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
@@ -510,6 +454,8 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...);
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<BAY-STACK-PETH-EXT-MIBB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Inherited MIBs
 | 
			
		||||
@@ -532,7 +478,7 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=item $baystack->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $baystack->model()
 | 
			
		||||
 | 
			
		||||
@@ -552,6 +498,14 @@ Returns 'baystack' or 'boss' depending on software version.
 | 
			
		||||
 | 
			
		||||
Returns the firmware version extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $baystack->stp_ver()
 | 
			
		||||
 | 
			
		||||
Returns the particular STP version running on this device.  
 | 
			
		||||
 | 
			
		||||
Values: C<nortelStpg>, C<pvst>, C<rstp>, C<mstp>, C<ieee8021d>
 | 
			
		||||
 | 
			
		||||
(C<s5AgSysSpanningTreeOperMode>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
@@ -628,6 +582,16 @@ revisions of Baystack firmware report all zeros for each port mac.
 | 
			
		||||
Crosses C<ifName> with C<ifAlias> and returns the human set port name if
 | 
			
		||||
exists.
 | 
			
		||||
 | 
			
		||||
=item $baystack->peth_port_ifindex()
 | 
			
		||||
 | 
			
		||||
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
 | 
			
		||||
 | 
			
		||||
=item $baystack->peth_port_power()
 | 
			
		||||
 | 
			
		||||
Power supplied by PoE ports, in milliwatts
 | 
			
		||||
 | 
			
		||||
(C<bspePethPsePortExtMeasuredPower>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 F<ENTITY-MIB> Information
 | 
			
		||||
@@ -698,51 +662,29 @@ ns_e_vendor().
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
=head2 Layer 2 Forwarding Database
 | 
			
		||||
 | 
			
		||||
Based upon the software version devices may support SynOptics Network
 | 
			
		||||
Management Protocol (SONMP) and Link Layer Discovery Protocol (LLDP). These
 | 
			
		||||
methods will query both and return the combination of all information. As a
 | 
			
		||||
result, there may be identical topology information returned from the two
 | 
			
		||||
protocols causing duplicate entries.  It is the calling program's
 | 
			
		||||
responsibility to identify any duplicate entries and remove duplicates if
 | 
			
		||||
necessary.
 | 
			
		||||
These methods try to obtain the layer 2 forwarding database entries via the
 | 
			
		||||
normal bridge methods as well as SPBM entries via rapid city methods.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $baystack->hasCDP()
 | 
			
		||||
=item $baystack->fw_mac()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either SONMP or LLDP.
 | 
			
		||||
Returns reference to hash of forwarding table MAC Addresses
 | 
			
		||||
 | 
			
		||||
=item $baystack->c_if()
 | 
			
		||||
=item $baystack->fw_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
Returns reference to hash of forwarding table entries port interface
 | 
			
		||||
identifier (iid)
 | 
			
		||||
 | 
			
		||||
=item $baystack->c_ip()
 | 
			
		||||
=item $baystack->qb_fw_vlan()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
Returns reference to hash of forwarding table entries VLAN ID
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
=item $baystack->fw_status()
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-SONMP/LLDP device in between two or
 | 
			
		||||
more devices or multiple devices which are not directly connected.  
 | 
			
		||||
 | 
			
		||||
Use the data from the Layer2 Topology Table below to dig deeper.
 | 
			
		||||
 | 
			
		||||
=item $baystack->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $baystack->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $baystack->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
Returns reference to hash of forwarding table entries status
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -37,19 +37,23 @@ use Exporter;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CiscoStpExtensions;
 | 
			
		||||
use SNMP::Info::CiscoAgg;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::CDP SNMP::Info::CiscoStats
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::Layer2
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg SNMP::Info::Layer2
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
@@ -58,6 +62,8 @@ $VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
@@ -75,6 +81,8 @@ $VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
@@ -84,8 +92,9 @@ $VERSION = '2.05';
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,     %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,             %SNMP::Info::CiscoAgg::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE,         %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub bulkwalk_no         { return 1; }
 | 
			
		||||
@@ -203,7 +212,8 @@ sub i_vlan {
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    # Overlap allows more than one VLAN per port.  Unable to determine default
 | 
			
		||||
    my $overlap = $c1900->bridgeGroupAllowMembershipOverlap()
 | 
			
		||||
    my $overlap 
 | 
			
		||||
        = $c1900->bridgeGroupAllowMembershipOverlap()
 | 
			
		||||
        || $c1900->vlanAllowMembershipOverlap()
 | 
			
		||||
        || 'disabled';
 | 
			
		||||
 | 
			
		||||
@@ -251,6 +261,8 @@ sub i_vlan_membership {
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership_untagged { return; }
 | 
			
		||||
 | 
			
		||||
sub bp_index {
 | 
			
		||||
    my $c1900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
@@ -258,7 +270,7 @@ sub bp_index {
 | 
			
		||||
    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});
 | 
			
		||||
        $index->{$iid} = $iid if ( !defined $index->{$iid} );
 | 
			
		||||
    }
 | 
			
		||||
    return $index;
 | 
			
		||||
}
 | 
			
		||||
@@ -312,6 +324,10 @@ after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoAgg
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
@@ -336,6 +352,10 @@ See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
@@ -394,6 +414,14 @@ See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoAgg
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoAgg/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
@@ -444,6 +472,9 @@ bridge group IDs.
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $c1900->i_vlan_membership_untagged()
 | 
			
		||||
 | 
			
		||||
Unsupported, returns nothing.
 | 
			
		||||
 | 
			
		||||
=item $c1900->bp_index()
 | 
			
		||||
 | 
			
		||||
@@ -513,6 +544,14 @@ See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
@@ -34,33 +34,21 @@ package SNMP::Info::Layer2::C2900;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::Layer2::Cisco;
 | 
			
		||||
 | 
			
		||||
@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::ISA = qw/SNMP::Info::Layer2::Cisco Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,     %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::FUNCS,
 | 
			
		||||
    'i_name' => 'ifAlias',
 | 
			
		||||
 | 
			
		||||
    # C2900PortEntry
 | 
			
		||||
@@ -71,15 +59,12 @@ $VERSION = '2.05';
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%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',
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::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,
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
@@ -139,6 +124,32 @@ sub i_duplex_admin {
 | 
			
		||||
    return \%i_duplex_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_speed_admin {
 | 
			
		||||
    my $c2900   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my %i_speed_admin;
 | 
			
		||||
    my $p_port        = $c2900->p_port() || {};
 | 
			
		||||
    my $interfaces    = $c2900->interfaces($partial);
 | 
			
		||||
    my $c2900_p_index = $c2900->c2900_p_index() || {};
 | 
			
		||||
 | 
			
		||||
    my %reverse_2900 = reverse %$c2900_p_index;
 | 
			
		||||
    my $c2900_p_speed
 | 
			
		||||
        = $c2900->c2900_p_speed_admin( $reverse_2900{$partial} );
 | 
			
		||||
 | 
			
		||||
    my %speeds = (
 | 
			
		||||
        'autoDetect' => 'auto',
 | 
			
		||||
        's10000000'  => '10 Mbps',
 | 
			
		||||
        's100000000' => '100 Mbps',
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    %i_speed_admin
 | 
			
		||||
        = map { $c2900_p_index->{$_} => $speeds{ $c2900_p_speed->{$_} } }
 | 
			
		||||
        keys %$c2900_p_index;
 | 
			
		||||
 | 
			
		||||
    return \%i_speed_admin;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_speed_admin {
 | 
			
		||||
    my $c2900 = shift;
 | 
			
		||||
    my ( $speed, $iid ) = @_;
 | 
			
		||||
@@ -243,15 +254,7 @@ after determining 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
 | 
			
		||||
=item SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -267,15 +270,7 @@ Part of the v2 MIBs from Cisco.
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
@@ -295,25 +290,9 @@ Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoVTP
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
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 L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
See L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
@@ -349,6 +328,10 @@ Returns reference to hash of IIDs to admin duplex setting
 | 
			
		||||
 | 
			
		||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin()
 | 
			
		||||
 | 
			
		||||
=item $c2900->i_speed_admin()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to admin speed setting.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 F<C2900-MIB> Port Entry Table 
 | 
			
		||||
@@ -381,25 +364,9 @@ Gives Admin speed of port
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
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 L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
See L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 SET METHODS
 | 
			
		||||
 | 
			
		||||
@@ -34,48 +34,34 @@ package SNMP::Info::Layer2::Catalyst;
 | 
			
		||||
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 SNMP::Info::Layer2::Cisco;
 | 
			
		||||
 | 
			
		||||
@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/;
 | 
			
		||||
    = qw/SNMP::Info::CiscoStack SNMP::Info::Layer2::Cisco Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%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,
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%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,
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%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,
 | 
			
		||||
    %SNMP::Info::Layer2::Cisco::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Overidden Methods
 | 
			
		||||
@@ -148,7 +134,9 @@ sub 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;
 | 
			
		||||
@@ -226,18 +214,10 @@ after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
@@ -246,19 +226,10 @@ after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
These MIBs are found in the standard v2 MIBs from Cisco.
 | 
			
		||||
@@ -288,30 +259,14 @@ Returns 1.  Use vlan indexing.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=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 L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
@@ -346,29 +301,12 @@ have problems with F<BRIDGE-MIB>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=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::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
 | 
			
		||||
details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -43,7 +43,7 @@ use SNMP::Info::SONMP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
@@ -246,6 +246,20 @@ sub slot_offset {
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $centillion->SUPER::fw_mac($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $centillion = shift;
 | 
			
		||||
    my $partial   = shift;
 | 
			
		||||
 | 
			
		||||
    return $centillion->SUPER::fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -371,11 +385,6 @@ Returns 'Centillion'
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
@@ -35,49 +35,71 @@ 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::CiscoPortSecurity;
 | 
			
		||||
use SNMP::Info::CiscoStpExtensions;
 | 
			
		||||
use SNMP::Info::CiscoAgg;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoImage
 | 
			
		||||
    SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::Layer2
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoRTT
 | 
			
		||||
    SNMP::Info::CiscoConfig SNMP::Info::CiscoPortSecurity
 | 
			
		||||
    SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg
 | 
			
		||||
    SNMP::Info::Layer2
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%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,
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MIBS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,     %SNMP::Info::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,
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,     %SNMP::Info::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,
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,     %SNMP::Info::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,
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoAgg::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoPortSecurity::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -85,8 +107,9 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
 | 
			
		||||
that are not covered in other classes.
 | 
			
		||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L2 Cisco devices that are
 | 
			
		||||
not covered in other classes and the base L2 Cisco class for other device
 | 
			
		||||
specific L2 Cisco classes.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -110,7 +133,8 @@ Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Generic Cisco Routers running IOS
 | 
			
		||||
Subclass for Generic Layer 2 Cisco devices and the base L2 Cisco class for
 | 
			
		||||
other device specific L2 Cisco classes.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
@@ -122,14 +146,16 @@ Subclass for Generic Cisco Routers running IOS
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoQOS
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoConfig
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoAgg
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
@@ -142,18 +168,20 @@ Subclass for Generic Cisco Routers running IOS
 | 
			
		||||
 | 
			
		||||
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::CiscoStats/"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::CiscoPortSecurity/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
@@ -182,22 +210,26 @@ See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
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::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoAgg
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoAgg/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
@@ -219,22 +251,26 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
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::CiscoPortSecurity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
							
								
								
									
										275
									
								
								lib/SNMP/Info/Layer2/CiscoSB.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										275
									
								
								lib/SNMP/Info/Layer2/CiscoSB.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,275 @@
 | 
			
		||||
# 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.52';
 | 
			
		||||
 | 
			
		||||
%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';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'ros';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Walk the entPhysicalSerialNum table and return the first serial found
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $ciscosb  = shift;
 | 
			
		||||
    my $e_serial = $ciscosb->e_serial();
 | 
			
		||||
 | 
			
		||||
    # Find entity table entry for this unit
 | 
			
		||||
    foreach my $e ( sort keys %$e_serial ) {
 | 
			
		||||
        if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_serial->{$e};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $ciscosb = shift;
 | 
			
		||||
    my $e_swver  = $ciscosb->e_swver();
 | 
			
		||||
 | 
			
		||||
    foreach my $e ( sort keys %$e_swver ) {
 | 
			
		||||
        if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_swver->{$e};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Grab e_model from Entity and tag on e_hwver
 | 
			
		||||
sub model {
 | 
			
		||||
    my $ciscosb = shift;
 | 
			
		||||
    my $e_model = $ciscosb->e_model();
 | 
			
		||||
    my $e_hwver = $ciscosb->e_hwver();
 | 
			
		||||
 | 
			
		||||
    foreach my $e ( sort keys %$e_model ) {
 | 
			
		||||
        if (defined $e_model->{$e} and $e_model->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_model->{$e};
 | 
			
		||||
            #my $model = "$e_model->{$e} $e_hwver->{$e}";
 | 
			
		||||
            #return $model;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return $ciscosb->description();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 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()
 | 
			
		||||
 | 
			
		||||
Returns 'ros'
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns software version (C<entPhysicalSoftwareRev>)
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number of unit (C<entPhysicalSerialNum>)
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->model()
 | 
			
		||||
 | 
			
		||||
Returns model and hardware revision of unit
 | 
			
		||||
(C<entPhysicalModelName+entPhysicalHardwareRev>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ciscosb->interfaces()
 | 
			
		||||
 | 
			
		||||
Uses the i_name() field.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Entity
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::EtherLike
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -36,23 +36,27 @@ use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::Aggregate 'agg_ports_ifstack';
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::HP::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer3 SNMP::Info::MAU SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::CDP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::HP::ISA = qw/
 | 
			
		||||
    SNMP::Info::Aggregate
 | 
			
		||||
    SNMP::Info::Layer3 
 | 
			
		||||
    SNMP::Info::MAU 
 | 
			
		||||
    SNMP::Info::CDP 
 | 
			
		||||
    Exporter
 | 
			
		||||
/;
 | 
			
		||||
@SNMP::Info::Layer2::HP::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::CDP::MIBS,
 | 
			
		||||
    %SNMP::Info::Aggregate::MIBS,
 | 
			
		||||
    'RFC1271-MIB'    => 'logDescription',
 | 
			
		||||
    'HP-ICF-OID'     => 'hpSwitch4000',
 | 
			
		||||
    'STATISTICS-MIB' => 'hpSwitchCpuStat',
 | 
			
		||||
@@ -61,19 +65,22 @@ $VERSION = '2.05';
 | 
			
		||||
    'HP-ICF-CHASSIS' => 'hpicfSensorObjectId',
 | 
			
		||||
    'HP-ICF-BRIDGE'  => 'hpicfBridgeRstpForceVersion',
 | 
			
		||||
    'HP-ICF-POE-MIB' => 'hpicfPoePethPsePortCurrent',
 | 
			
		||||
    'SEMI-MIB'       => 'hpHttpMgSerialNumber',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Aggregate::GLOBALS,
 | 
			
		||||
    'serial1'      => 'entPhysicalSerialNum.1',
 | 
			
		||||
    'serial2'      => 'hpHttpMgSerialNumber.0',
 | 
			
		||||
    'hp_cpu'       => 'hpSwitchCpuStat.0',
 | 
			
		||||
    'hp_mem_total' => 'hpGlobalMemTotalBytes.1',
 | 
			
		||||
    'mem_free'     => 'hpGlobalMemFreeBytes.1',
 | 
			
		||||
    'mem_used'     => 'hpGlobalMemAllocBytes.1',
 | 
			
		||||
    'os_version'   => 'hpSwitchOsVersion.0',
 | 
			
		||||
    'os_version2'  => 'hpHttpMgVersion.0',
 | 
			
		||||
    'os_bin'       => 'hpSwitchRomVersion.0',
 | 
			
		||||
    'mac'          => 'hpSwitchBaseMACAddress.0',
 | 
			
		||||
    'rstp_ver'     => 'hpicfBridgeRstpForceVersion',
 | 
			
		||||
@@ -82,8 +89,8 @@ $VERSION = '2.05';
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::Aggregate::FUNCS,
 | 
			
		||||
    'i_type2'   => 'ifType',
 | 
			
		||||
 | 
			
		||||
    # RFC1271
 | 
			
		||||
@@ -107,8 +114,8 @@ $VERSION = '2.05';
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::Aggregate::MUNGE,
 | 
			
		||||
    'c_id'   => \&munge_hp_c_id,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@@ -118,6 +125,8 @@ $VERSION = '2.05';
 | 
			
		||||
%MODEL_MAP = (
 | 
			
		||||
    'J8131A' => 'WAP-420-WW',
 | 
			
		||||
    'J8130A' => 'WAP-420-NA',
 | 
			
		||||
    'J9833A' => 'PS1810-8G',
 | 
			
		||||
    'J9834A' => 'PS1810-24G',
 | 
			
		||||
    'J8133A' => 'AP520WL',
 | 
			
		||||
    'J8680A' => '9408sl',
 | 
			
		||||
    'J9091A' => '8212zl',
 | 
			
		||||
@@ -132,8 +141,10 @@ $VERSION = '2.05';
 | 
			
		||||
    'J8992A' => '6200yl-24G',
 | 
			
		||||
    'J4902A' => '6108',
 | 
			
		||||
    'J8698A' => '5412zl',
 | 
			
		||||
    'J9851A' => '5412R-zl2',
 | 
			
		||||
    'J8719A' => '5408yl',
 | 
			
		||||
    'J8697A' => '5406zl',
 | 
			
		||||
    'J9850A' => '5406R-zl2',
 | 
			
		||||
    'J8718A' => '5404yl',
 | 
			
		||||
    'J4819A' => '5308XL',
 | 
			
		||||
    'J4850A' => '5304XL',
 | 
			
		||||
@@ -145,6 +156,15 @@ $VERSION = '2.05';
 | 
			
		||||
    'J8771A' => '4202vl-48G',
 | 
			
		||||
    'J4865A' => '4108GL',
 | 
			
		||||
    'J4887A' => '4104GL',
 | 
			
		||||
    'J9588A' => '3800-48G-PoE+-4XG',
 | 
			
		||||
    'J9574A' => '3800-48G-PoE+-4SFP+',
 | 
			
		||||
    'J9586A' => '3800-48G-4XG',
 | 
			
		||||
    'J9576A' => '3800-48G-4SFP+',
 | 
			
		||||
    'J9584A' => '3800-24SFP-2SFP+',
 | 
			
		||||
    'J9587A' => '3800-24G-PoE+-2XG',
 | 
			
		||||
    'J9573A' => '3800-24G-PoE+-2SFP+',
 | 
			
		||||
    'J9585A' => '3800-24G-2XG',
 | 
			
		||||
    'J9575A' => '3800-24G-2SFP+',
 | 
			
		||||
    'J8693A' => '3500yl-48G-PWR',
 | 
			
		||||
    'J8692A' => '3500yl-24G-PWR',
 | 
			
		||||
    'J9473A' => '3500-48-PoE',
 | 
			
		||||
@@ -155,6 +175,14 @@ $VERSION = '2.05';
 | 
			
		||||
    'J4905A' => '3400cl-24G',
 | 
			
		||||
    'J4815A' => '3324XL',
 | 
			
		||||
    'J4851A' => '3124',
 | 
			
		||||
    'J9729A' => '2920-48G-PoE+',
 | 
			
		||||
    'J9729A' => '2920-48G-PoE+',
 | 
			
		||||
    'J9728A' => '2920-48G',
 | 
			
		||||
    'J9728A' => '2920-48G',
 | 
			
		||||
    'J9727A' => '2920-24G-PoE+',
 | 
			
		||||
    'J9727A' => '2920-24G-PoE+',
 | 
			
		||||
    'J9726A' => '2920-24G',
 | 
			
		||||
    'J9726A' => '2920-24G',
 | 
			
		||||
    'J9562A' => '2915-8G-PoE',
 | 
			
		||||
    'J9148A' => '2910al-48G-PoE+',
 | 
			
		||||
    'J9147A' => '2910al-48G',
 | 
			
		||||
@@ -174,6 +202,11 @@ $VERSION = '2.05';
 | 
			
		||||
    'J4900B' => '2626-CR',
 | 
			
		||||
    'J4900C' => '2626C',
 | 
			
		||||
    'J4900A' => '2626',
 | 
			
		||||
    'J9627A' => '2620-48-PoE+',
 | 
			
		||||
    'J9626A' => '2620-48',
 | 
			
		||||
    'J9624A' => '2620-24-PPoE+',
 | 
			
		||||
    'J9625A' => '2620-24-PoE+',
 | 
			
		||||
    'J9623A' => '2620-24',
 | 
			
		||||
    'J9565A' => '2615-8-PoE',
 | 
			
		||||
    'J9089A' => '2610-48-PWR',
 | 
			
		||||
    'J9088A' => '2610-48',
 | 
			
		||||
@@ -181,11 +214,27 @@ $VERSION = '2.05';
 | 
			
		||||
    'J9086A' => '2610-24/12PWR',
 | 
			
		||||
    'J9085A' => '2610-24',
 | 
			
		||||
    'J8762A' => '2600-8-PWR',
 | 
			
		||||
    'J9780A' => '2530-8-PoE+',
 | 
			
		||||
    'J9774A' => '2530-8G-PoEP',
 | 
			
		||||
    'J9777A' => '2530-8G',
 | 
			
		||||
    'J9783A' => '2530-8',
 | 
			
		||||
    'J9778A' => '2530-48-PoE+',
 | 
			
		||||
    'J9853A' => '2530-48G-PoE+-2SFP+',
 | 
			
		||||
    'J9772A' => '2530-48G-PoE+',
 | 
			
		||||
    'J9855A' => '2530-48G-2SFP+',
 | 
			
		||||
    'J9775A' => '2530-48G',
 | 
			
		||||
    'J9781A' => '2530-48',
 | 
			
		||||
    'J9779A' => '2530-24-PoE+',
 | 
			
		||||
    'J9854A' => '2530-24G-PoE+-2SFP+',
 | 
			
		||||
    'J9773A' => '2530-24G-PoE+',
 | 
			
		||||
    'J9856A' => '2530-24G-2SFP+',
 | 
			
		||||
    'J9776A' => '2530-24G',
 | 
			
		||||
    'J9782A' => '2530-24',
 | 
			
		||||
    'J4813A' => '2524',
 | 
			
		||||
    'J9137A' => '2520-8-PoE',
 | 
			
		||||
    'J9138A' => '2520-24-PoE',
 | 
			
		||||
    'J9298A' => '2520G-8-PoE',
 | 
			
		||||
    'J9299A' => '2520G-24-PoE',
 | 
			
		||||
    'J9137A' => '2520-8-PoE',
 | 
			
		||||
    'J9138A' => '2520-24-PoE',
 | 
			
		||||
    'J4812A' => '2512',
 | 
			
		||||
    'J9280A' => '2510G-48',
 | 
			
		||||
    'J9279A' => '2510G-24',
 | 
			
		||||
@@ -196,6 +245,8 @@ $VERSION = '2.05';
 | 
			
		||||
    'J4817A' => '2312',
 | 
			
		||||
    'J9449A' => '1810G-8',
 | 
			
		||||
    'J9450A' => '1810G-24',
 | 
			
		||||
    'J9802A' => '1810-8G',
 | 
			
		||||
    'J9803A' => '1810-24G',
 | 
			
		||||
    'J9029A' => '1800-8G',
 | 
			
		||||
    'J9028A' => '1800-24G',
 | 
			
		||||
);
 | 
			
		||||
@@ -223,7 +274,7 @@ sub os {
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $hp         = shift;
 | 
			
		||||
    my $os_version = $hp->os_version();
 | 
			
		||||
    my $os_version = $hp->os_version() || $hp->os_version2();
 | 
			
		||||
    return $os_version if defined $os_version;
 | 
			
		||||
 | 
			
		||||
    # Some older ones don't have this value,so we cull it from the description
 | 
			
		||||
@@ -234,6 +285,16 @@ sub os_ver {
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Regular managed ProCurve switches have the serial num in entity mib, 
 | 
			
		||||
# the web-managed models in the semi mib (hphttpmanageable).
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    my $serial = $hp->serial1() || $hp->serial2() || undef;;
 | 
			
		||||
 | 
			
		||||
    return $serial;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Lookup model number, and translate the part number to the common number
 | 
			
		||||
sub model {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
@@ -386,108 +447,6 @@ sub _sensor {
 | 
			
		||||
    return $result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Use CDP and/or LLDP
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
 | 
			
		||||
    return $hp->hasLLDP() || $hp->SUPER::hasCDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $cdp  = $hp->SUPER::c_ip($partial) || {};
 | 
			
		||||
    my $lldp = $hp->lldp_ip($partial)     || {};
 | 
			
		||||
 | 
			
		||||
    my %c_ip;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $ip = $cdp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $ip = $lldp->{$iid};
 | 
			
		||||
        next unless defined $ip;
 | 
			
		||||
 | 
			
		||||
        $c_ip{$iid} = $ip;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_ip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp->lldp_if($partial)     || {};
 | 
			
		||||
    my $cdp  = $hp->SUPER::c_if($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_if;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $if = $cdp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $if = $lldp->{$iid};
 | 
			
		||||
        next unless defined $if;
 | 
			
		||||
 | 
			
		||||
        $c_if{$iid} = $if;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp->lldp_port($partial)     || {};
 | 
			
		||||
    my $cdp  = $hp->SUPER::c_port($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_port;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $port = $cdp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $port = $lldp->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        $c_port{$iid} = $port;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_port;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp->lldp_id($partial)     || {};
 | 
			
		||||
    my $cdp  = $hp->SUPER::c_id($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_id;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $id = $cdp->{$iid};
 | 
			
		||||
        next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
        $c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
	my $id = $lldp->{$iid};
 | 
			
		||||
	next unless defined $id;
 | 
			
		||||
	
 | 
			
		||||
	$c_id{$iid} = $id;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub munge_hp_c_id {
 | 
			
		||||
    my ($v) = @_;
 | 
			
		||||
    if ( length(unpack('H*', $v)) == 12 ){
 | 
			
		||||
@@ -501,30 +460,6 @@ sub munge_hp_c_id {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $hp      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $lldp = $hp->lldp_rem_sysdesc($partial)  || {};
 | 
			
		||||
    my $cdp  = $hp->SUPER::c_platform($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %c_platform;
 | 
			
		||||
    foreach my $iid ( keys %$cdp ) {
 | 
			
		||||
        my $platform = $cdp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$lldp ) {
 | 
			
		||||
        my $platform = $lldp->{$iid};
 | 
			
		||||
        next unless defined $platform;
 | 
			
		||||
 | 
			
		||||
        $c_platform{$iid} = $platform;
 | 
			
		||||
    }
 | 
			
		||||
    return \%c_platform;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# POWER-ETHERNET-MIB doesn't define a mapping of its
 | 
			
		||||
# "module"/"port" index to ifIndex.  Different vendors
 | 
			
		||||
# do this in different ways.
 | 
			
		||||
@@ -612,8 +547,11 @@ sub set_i_vlan_tagged {
 | 
			
		||||
            $hp->error_throw(sprintf("Requested VLAN %s doesn't seem to exist on device...", $vlan));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub agg_ports { return agg_ports_ifstack(@_) }
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -660,8 +598,6 @@ after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
@@ -731,7 +667,7 @@ Returns bytes of used memory
 | 
			
		||||
Returns the model number of the HP Switch.  Will translate between the HP Part
 | 
			
		||||
number and the common model number with this map :
 | 
			
		||||
 | 
			
		||||
%MODEL_MAP = (
 | 
			
		||||
 %MODEL_MAP = (
 | 
			
		||||
    'J8131A' => 'WAP-420-WW',
 | 
			
		||||
    'J8130A' => 'WAP-420-NA',
 | 
			
		||||
    'J8133A' => 'AP520WL',
 | 
			
		||||
@@ -761,6 +697,15 @@ number and the common model number with this map :
 | 
			
		||||
    'J8771A' => '4202vl-48G',
 | 
			
		||||
    'J4865A' => '4108GL',
 | 
			
		||||
    'J4887A' => '4104GL',
 | 
			
		||||
    'J9588A' => '3800-48G-PoE+-4XG',
 | 
			
		||||
    'J9574A' => '3800-48G-PoE+-4SFP+',
 | 
			
		||||
    'J9586A' => '3800-48G-4XG',
 | 
			
		||||
    'J9576A' => '3800-48G-4SFP+',
 | 
			
		||||
    'J9584A' => '3800-24SFP-2SFP+',
 | 
			
		||||
    'J9587A' => '3800-24G-PoE+-2XG',
 | 
			
		||||
    'J9573A' => '3800-24G-PoE+-2SFP+',
 | 
			
		||||
    'J9585A' => '3800-24G-2XG',
 | 
			
		||||
    'J9575A' => '3800-24G-2SFP+',
 | 
			
		||||
    'J8693A' => '3500yl-48G-PWR',
 | 
			
		||||
    'J8692A' => '3500yl-24G-PWR',
 | 
			
		||||
    'J9473A' => '3500-48-PoE',
 | 
			
		||||
@@ -771,6 +716,7 @@ number and the common model number with this map :
 | 
			
		||||
    'J4905A' => '3400cl-24G',
 | 
			
		||||
    'J4815A' => '3324XL',
 | 
			
		||||
    'J4851A' => '3124',
 | 
			
		||||
    'J9562A' => '2915-8G-PoE',
 | 
			
		||||
    'J9148A' => '2910al-48G-PoE+',
 | 
			
		||||
    'J9147A' => '2910al-48G',
 | 
			
		||||
    'J9146A' => '2910al-24G-PoE+',
 | 
			
		||||
@@ -789,6 +735,12 @@ number and the common model number with this map :
 | 
			
		||||
    'J4900B' => '2626-CR',
 | 
			
		||||
    'J4900C' => '2626C',
 | 
			
		||||
    'J4900A' => '2626',
 | 
			
		||||
    'J9627A' => '2620-48-PoE+',
 | 
			
		||||
    'J9626A' => '2620-48',
 | 
			
		||||
    'J9624A' => '2620-24-PPoE+',
 | 
			
		||||
    'J9625A' => '2620-24-PoE+',
 | 
			
		||||
    'J9623A' => '2620-24',
 | 
			
		||||
    'J9565A' => '2615-8-PoE',
 | 
			
		||||
    'J9089A' => '2610-48-PWR',
 | 
			
		||||
    'J9088A' => '2610-48',
 | 
			
		||||
    'J9087A' => '2610-24-PWR',
 | 
			
		||||
@@ -796,6 +748,8 @@ number and the common model number with this map :
 | 
			
		||||
    'J9085A' => '2610-24',
 | 
			
		||||
    'J8762A' => '2600-8-PWR',
 | 
			
		||||
    'J4813A' => '2524',
 | 
			
		||||
    'J9298A' => '2520G-8-PoE',
 | 
			
		||||
    'J9299A' => '2520G-24-PoE',
 | 
			
		||||
    'J9137A' => '2520-8-PoE',
 | 
			
		||||
    'J9138A' => '2520-24-PoE',
 | 
			
		||||
    'J4812A' => '2512',
 | 
			
		||||
@@ -806,9 +760,11 @@ number and the common model number with this map :
 | 
			
		||||
    'J9019A' => '2510-24A',
 | 
			
		||||
    'J4818A' => '2324',
 | 
			
		||||
    'J4817A' => '2312',
 | 
			
		||||
    'J9449A' => '1810G-8',
 | 
			
		||||
    'J9450A' => '1810G-24',
 | 
			
		||||
    'J9029A' => '1800-8G',
 | 
			
		||||
    'J9028A' => '1800-24G',
 | 
			
		||||
);
 | 
			
		||||
 );
 | 
			
		||||
 | 
			
		||||
=item $hp->os()
 | 
			
		||||
 | 
			
		||||
@@ -827,6 +783,10 @@ the description field.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
@@ -850,12 +810,12 @@ Power supply 2 status
 | 
			
		||||
=item $hp->peth_port_power()
 | 
			
		||||
 | 
			
		||||
Power supplied by PoE ports, in milliwatts
 | 
			
		||||
("hpicfPoePethPsePortPower")
 | 
			
		||||
(C<hpicfPoePethPsePortPower>)
 | 
			
		||||
 | 
			
		||||
=item $hp->stp_ver()
 | 
			
		||||
 | 
			
		||||
Returns what version of STP the device is running.
 | 
			
		||||
("hpicfBridgeRstpForceVersion" with fallback to inherited stp_ver())
 | 
			
		||||
(C<hpicfBridgeRstpForceVersion> with fallback to inherited stp_ver())
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -863,10 +823,6 @@ Returns what version of STP the device is running.
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"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::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
@@ -878,7 +834,7 @@ to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
=over 4
 | 
			
		||||
 | 
			
		||||
=item $hp->interfaces() 
 | 
			
		||||
 | 
			
		||||
@@ -894,7 +850,8 @@ Returns reference to hash of IIDs to admin duplex setting.
 | 
			
		||||
 | 
			
		||||
=item $hp->vendor_i_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to HP specific port type (hpSwitchPortType).
 | 
			
		||||
Returns reference to hash of IIDs to HP specific port type
 | 
			
		||||
(C<hpSwitchPortType>).
 | 
			
		||||
 | 
			
		||||
=item $hp->i_name()
 | 
			
		||||
 | 
			
		||||
@@ -905,52 +862,11 @@ Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias()
 | 
			
		||||
Returns reference to hash of power Ethernet port table entries map back to
 | 
			
		||||
interface index (c<ifIndex>)
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
=item C<agg_ports>
 | 
			
		||||
 | 
			
		||||
=head2 Topology information
 | 
			
		||||
 | 
			
		||||
Based upon the firmware version HP devices may support Cisco Discovery
 | 
			
		||||
Protocol (CDP), Link Layer Discovery Protocol (LLDP), or both.  These methods
 | 
			
		||||
will query both and return the combination of all information.  As a result,
 | 
			
		||||
there may be identical topology information returned from the two protocols
 | 
			
		||||
causing duplicate entries.  It is the calling program's responsibility to
 | 
			
		||||
identify any duplicate entries and remove duplicates if necessary.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $hp->hasCDP()
 | 
			
		||||
 | 
			
		||||
Returns true if the device is running either CDP or LLDP.
 | 
			
		||||
 | 
			
		||||
=item $hp->c_if()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: local device port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $hp->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: remote IPv4 address
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with the same IPv4
 | 
			
		||||
address, c_ip(), it may be a duplicate entry.
 | 
			
		||||
 | 
			
		||||
If multiple entries exist with the same local port, c_if(), with different
 | 
			
		||||
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP device in between two
 | 
			
		||||
or more devices or multiple devices which are not directly connected.  
 | 
			
		||||
 | 
			
		||||
Use the data from the Layer2 Topology Table below to dig deeper.
 | 
			
		||||
 | 
			
		||||
=item $hp->c_port()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: remote port (interfaces)
 | 
			
		||||
 | 
			
		||||
=item $hp->c_id()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash. Key: iid Value: string value used to identify the
 | 
			
		||||
chassis component associated with the remote system.
 | 
			
		||||
 | 
			
		||||
=item $hp->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
Returns a HASH reference mapping from slave to master port for each member of
 | 
			
		||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
 | 
			
		||||
ifIndex of the corresponding master ports.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -958,10 +874,6 @@ Returns reference to hash.  Key: iid Value: Remote Device Type
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
@@ -989,4 +901,6 @@ operations.
 | 
			
		||||
 | 
			
		||||
=item set_i_vlan_tagged()
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -44,7 +44,7 @@ use SNMP::Info::CDP;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -376,6 +376,20 @@ sub i_vlan_membership {
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership_untagged {
 | 
			
		||||
    my $hp  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $vlans = $hp->i_vlan($partial);
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    foreach my $port (keys %$vlans) {
 | 
			
		||||
        my $vlan = $vlans->{$port};
 | 
			
		||||
        push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_vlan {
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    my $rv;
 | 
			
		||||
@@ -652,7 +666,8 @@ Returns reference to hash of IIDs to admin duplex setting.
 | 
			
		||||
 | 
			
		||||
=item $hp->vendor_i_type()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of IIDs to HP specific port type (hpSwitchPortType).
 | 
			
		||||
Returns reference to hash of IIDs to HP specific port type
 | 
			
		||||
(C<hpSwitchPortType>).
 | 
			
		||||
 | 
			
		||||
=item $hp->i_name()
 | 
			
		||||
 | 
			
		||||
@@ -679,6 +694,12 @@ It is the union of tagged, untagged, and auto ports.
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $hp->i_vlan_membership_untagged()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.  These are the VLANs which are members of the untagged egress list for
 | 
			
		||||
the port.
 | 
			
		||||
 | 
			
		||||
=item $hp->v_index()
 | 
			
		||||
 | 
			
		||||
Returns VLAN IDs
 | 
			
		||||
@@ -718,4 +739,6 @@ operations.
 | 
			
		||||
 | 
			
		||||
=item set_i_vlan_tagged()
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
# SNMP::Info::Layer2::Netgear
 | 
			
		||||
# $Id$
 | 
			
		||||
# SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2011 Jeroen van Ingen
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
@@ -28,80 +28,82 @@
 | 
			
		||||
# 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;
 | 
			
		||||
package SNMP::Info::Layer2::HPVC;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Netgear::ISA       = qw/SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
 | 
			
		||||
@SNMP::Info::Layer2::HPVC::ISA
 | 
			
		||||
    = qw/SNMP::Info::Layer2 SNMP::Info::LLDP Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, );
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'HPVC-MIB'       => 'vcDomainName',
 | 
			
		||||
    'CPQSINFO-MIB'   => 'cpqSiSysSerialNum',
 | 
			
		||||
    'HPVCMODULE-MIB' => 'vcModuleDomainName',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS, );
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    'serial1'      => 'cpqSiSysSerialNum.0',
 | 
			
		||||
    'os_ver'       => 'cpqHoSWRunningVersion.1',
 | 
			
		||||
    'os_bin'       => 'cpqHoFwVerVersion.1',
 | 
			
		||||
    'productname'  => 'cpqSiProductName.0',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, );
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    # Inherit all the built in munging
 | 
			
		||||
    %SNMP::Info::Layer2::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'netgear';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Method Overrides
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'netgear';
 | 
			
		||||
    return 'hpvc';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'hp';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Wish the OID-based method worked, but netgear scatters
 | 
			
		||||
# the sysObjectID values across all the device MIBs, and
 | 
			
		||||
# makes the device MIBs state secrets.
 | 
			
		||||
# They seem to set sysDescr to the model number, though,
 | 
			
		||||
# so we'll use that.
 | 
			
		||||
sub model {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    return $netgear->description();
 | 
			
		||||
    my $hp = shift;
 | 
			
		||||
    return $hp->productname();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# 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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches
 | 
			
		||||
SNMP::Info::Layer2::HPVC - SNMP Interface to HP Virtual Connect Switches
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Bill Fenner and Zoltan Erszenyi
 | 
			
		||||
Jeroen van Ingen
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $netgear = new SNMP::Info(
 | 
			
		||||
 my $hp = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
@@ -110,14 +112,18 @@ Bill Fenner and Zoltan Erszenyi
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $netgear->class();
 | 
			
		||||
 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 
 | 
			
		||||
Netgear device through SNMP. See inherited classes' documentation for 
 | 
			
		||||
inherited methods.
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
@@ -131,69 +137,78 @@ inherited methods.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
=item F<HPVC-MIB>
 | 
			
		||||
 | 
			
		||||
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
 | 
			
		||||
classes.
 | 
			
		||||
=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
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $netgear->vendor()
 | 
			
		||||
=item $hp->os()
 | 
			
		||||
 | 
			
		||||
Returns 'netgear'
 | 
			
		||||
Returns C<'hpvc'>
 | 
			
		||||
 | 
			
		||||
=item $netgear->os()
 | 
			
		||||
=item $hp->os_bin()
 | 
			
		||||
 | 
			
		||||
Returns 'netgear' 
 | 
			
		||||
C<cpqHoFwVerVersion.1>
 | 
			
		||||
 | 
			
		||||
=item $netgear->model()
 | 
			
		||||
=item $hp->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns description()
 | 
			
		||||
C<cpqHoSWRunningVersion.1>
 | 
			
		||||
 | 
			
		||||
=item $hp->serial()
 | 
			
		||||
 | 
			
		||||
C<cpqSiSysSerialNum.0>
 | 
			
		||||
 | 
			
		||||
=item $hp->vendor()
 | 
			
		||||
 | 
			
		||||
hp
 | 
			
		||||
 | 
			
		||||
=item $hp->model()
 | 
			
		||||
 | 
			
		||||
C<cpqSiProductName.0>
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::Layer2
 | 
			
		||||
=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.
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=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
									
								
								lib/SNMP/Info/Layer2/Kentrox.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								lib/SNMP/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.52';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
 | 
			
		||||
@@ -43,7 +43,7 @@ use SNMP::Info::Airespace;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,        %SNMP::Info::Bridge::MIBS,
 | 
			
		||||
@@ -42,7 +42,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,
 | 
			
		||||
							
								
								
									
										1299
									
								
								lib/SNMP/Info/Layer2/NWSS2300.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1299
									
								
								lib/SNMP/Info/Layer2/NWSS2300.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										286
									
								
								lib/SNMP/Info/Layer2/Netgear.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										286
									
								
								lib/SNMP/Info/Layer2/Netgear.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,286 @@
 | 
			
		||||
# 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::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Netgear::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
# This will be filled in with the device's index into the EntPhysicalEntry
 | 
			
		||||
# table by the serial() function.
 | 
			
		||||
our $index = undef;
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::LLDP::MIBS, );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    ng_fsosver   => '.1.3.6.1.4.1.4526.11.11.1.0',
 | 
			
		||||
    ng_gsmserial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
 | 
			
		||||
    ng_gsmosver  => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::LLDP::FUNCS, );
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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->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::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
							
								
								
									
										1303
									
								
								lib/SNMP/Info/Layer2/Trapeze.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1303
									
								
								lib/SNMP/Info/Layer2/Trapeze.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										377
									
								
								lib/SNMP/Info/Layer2/Ubiquiti.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										377
									
								
								lib/SNMP/Info/Layer2/Ubiquiti.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,377 @@
 | 
			
		||||
# SNMP::Info::Layer2::Ubiquiti
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer2::Ubiquiti;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::IEEE802dot11;
 | 
			
		||||
use SNMP::Info::Layer2;
 | 
			
		||||
use SNMP::Info::Layer3;  # only used in sub mac()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer2::Ubiquiti::ISA
 | 
			
		||||
    = qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer2::Ubiquiti::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer2::MIBS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::MIBS,
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS
 | 
			
		||||
    = ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer2::FUNCS,
 | 
			
		||||
    %SNMP::Info::IEEE802dot11::FUNCS,
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, );
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    my $ubnt = shift;
 | 
			
		||||
 | 
			
		||||
    my $names = $ubnt->dot11_prod_name();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$names ) {
 | 
			
		||||
        my $prod = $names->{$iid};
 | 
			
		||||
        next unless defined $prod;
 | 
			
		||||
        # Product names that match AirOS products
 | 
			
		||||
                if((lc $prod) =~ /station/ or (lc $prod) =~ /beam/ or (lc $prod) =~ /grid/){
 | 
			
		||||
                        return 'AirOS';
 | 
			
		||||
                # Product names that match UAP
 | 
			
		||||
                }elsif((lc $prod) =~ /uap/){
 | 
			
		||||
                        return 'UniFi';
 | 
			
		||||
                }else{
 | 
			
		||||
                    # Continue below to find OS name
 | 
			
		||||
                }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ## EdgeMAX OS (EdgeSwitch and EdgeRouter) name is first field split by space
 | 
			
		||||
    my $ver = $ubnt->description() || '';
 | 
			
		||||
 | 
			
		||||
    my @myver = split(/ /, $ver);
 | 
			
		||||
 | 
			
		||||
    return $myver[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $dot11 = shift;
 | 
			
		||||
 | 
			
		||||
    my $versions = $dot11->dot11_prod_ver();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$versions ) {
 | 
			
		||||
        my $ver = $versions->{$iid};
 | 
			
		||||
        next unless defined $ver;
 | 
			
		||||
        return $ver;
 | 
			
		||||
        ## Not sure what this function does, it seems to be extraneous being in the same code block after a return statement?
 | 
			
		||||
        if ( $ver =~ /([\d\.]+)/ ) {
 | 
			
		||||
            return $1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    my $ver = $dot11->description() || '';
 | 
			
		||||
    if($ver =~ /^edgeswitch/){
 | 
			
		||||
        ## EdgeSwitch OS version is second field split by comma
 | 
			
		||||
        my @myver = split(/, /, $ver);
 | 
			
		||||
 | 
			
		||||
        return $myver[1];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ## EdgeRouter OS version is second field split by space
 | 
			
		||||
    my @myver = split(/ /, $ver);
 | 
			
		||||
 | 
			
		||||
    return $myver[1];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'Ubiquiti Networks, Inc.';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $ubnt = shift;
 | 
			
		||||
 | 
			
		||||
    my $names = $ubnt->dot11_prod_name();
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$names ) {
 | 
			
		||||
        my $prod = $names->{$iid};
 | 
			
		||||
        next unless defined $prod;
 | 
			
		||||
        return $prod;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    my $desc = $ubnt->description() || '';
 | 
			
		||||
    
 | 
			
		||||
    ## Pull Model from beginning of description, separated by comma (EdgeSwitch)
 | 
			
		||||
    if((lc $desc) =~ /^edgeswitch/){    
 | 
			
		||||
        my @mydesc = split(/, /, $desc);
 | 
			
		||||
        return $mydesc[0];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(!((lc $desc) =~ /edgeos/)){
 | 
			
		||||
        # Not sure what type of device this is to get Model
 | 
			
		||||
        # Wireless devices report dot11_prod_name
 | 
			
		||||
        # EdgeSwitch includes mode directly and edgeos logic is in else statement
 | 
			
		||||
        return ;
 | 
			
		||||
    }else{
 | 
			
		||||
        ## do some logic to determine ER model based on tech specs from ubnt:
 | 
			
		||||
        ## https://help.ubnt.com/hc/en-us/articles/219652227--EdgeRouter-Which-EdgeRouter-Should-I-Use-#tech%20specs
 | 
			
		||||
        ## Would be nice if UBNT simply adds the model string to their SNMP daemon directly
 | 
			
		||||
        my $ethCount = 0;
 | 
			
		||||
        my $switchCount = 0;
 | 
			
		||||
        #my $sfpCount = 0;
 | 
			
		||||
        #my $poeCount = 0;  
 | 
			
		||||
        my $memTotalReal = $ubnt->memTotalReal;   
 | 
			
		||||
        my $cpuLoad = $ubnt->hrProcessorLoad;
 | 
			
		||||
        my $cpuCount = 0;
 | 
			
		||||
        ## My perl is lacking. Not sure if there's a more efficient way to find the cpu count
 | 
			
		||||
        foreach my $iid ( keys %$cpuLoad ) {
 | 
			
		||||
            $cpuCount++;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        my $ifDescs = $ubnt->ifDescr;
 | 
			
		||||
        foreach my $iid ( keys %$ifDescs ) {
 | 
			
		||||
            my $ifDesc = $ifDescs->{$iid};
 | 
			
		||||
            next unless defined $ifDesc;
 | 
			
		||||
 | 
			
		||||
            if((lc $ifDesc) =~ /^eth\d+$/){ # exclude vlan interfaces. Ex: eth1.5
 | 
			
		||||
                $ethCount++;
 | 
			
		||||
            }elsif((lc $ifDesc) =~ /^switch/){
 | 
			
		||||
                $switchCount++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ## If people have other models to further fine-tune this logic that would be great. 
 | 
			
		||||
        if($ethCount eq 9){
 | 
			
		||||
            ## Should be ER Infinity
 | 
			
		||||
            return "EdgeRouter Infinity"
 | 
			
		||||
        }if($ethCount eq 8){
 | 
			
		||||
            ## Could be ER-8 Pro, ER-8, or EP-R8
 | 
			
		||||
            return "EdgeRouter 8-Port"
 | 
			
		||||
        }elsif($ethCount eq 5 and $cpuCount eq 4){
 | 
			
		||||
            ## Could be ER-X or ER-X-SFP
 | 
			
		||||
            return "EdgeRouter X 5-Port"
 | 
			
		||||
        }elsif($ethCount eq 5){
 | 
			
		||||
            return "EdgeRouter PoE 5-Port"
 | 
			
		||||
        }elsif($ethCount eq 3 and $cpuCount eq 2){
 | 
			
		||||
            return "EdgeRouter LITE 3-Port"
 | 
			
		||||
        }else{
 | 
			
		||||
            ## failback string
 | 
			
		||||
            return "EdgeRouter eth-$ethCount switch-$switchCount mem-$memTotalReal cpuNum-$cpuCount";
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
## simply take the MAC and clean it up
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $ubnt = shift;
 | 
			
		||||
 | 
			
		||||
    my $serial = $ubnt->mac();
 | 
			
		||||
    if($serial){
 | 
			
		||||
        $serial =~ s/://g;
 | 
			
		||||
        return uc $serial;
 | 
			
		||||
    }
 | 
			
		||||
    return ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
## UBNT doesn't put the primary-mac interface at index 1
 | 
			
		||||
sub mac {
 | 
			
		||||
    my $ubnt = shift;
 | 
			
		||||
    my $ifDescs = $ubnt->ifDescr;
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$ifDescs ) {
 | 
			
		||||
        my $ifDesc = $ifDescs->{$iid};
 | 
			
		||||
        next unless defined $ifDesc;
 | 
			
		||||
        ## CPU Interface will have the primary MAC for EdgeSwitch
 | 
			
		||||
        ## eth0 will have primary MAC for linux-based UBNT devices
 | 
			
		||||
        if($ifDesc =~ /CPU/ or $ifDesc eq 'eth0'){
 | 
			
		||||
            my $mac = $ubnt->ifPhysAddress->{$iid};
 | 
			
		||||
 | 
			
		||||
            # syntax stolen from sub munge_mac in SNMP::Info
 | 
			
		||||
            $mac = lc join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $mac ) );
 | 
			
		||||
            return $mac if $mac =~ /^([0-9A-F][0-9A-F]:){5}[0-9A-F][0-9A-F]$/i;  
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    # MAC malformed or missing
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $netgear = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $netgear->i_index($partial)       || {};
 | 
			
		||||
    my $i_descr    = $netgear->i_description($partial) || {};
 | 
			
		||||
    my $return = {};
 | 
			
		||||
 | 
			
		||||
    foreach my $iid ( keys %$i_descr ) {
 | 
			
		||||
        # Slot: 0 Port: 4 Gigabit - Level
 | 
			
		||||
        if ($i_descr->{$iid} =~ m/([0-9]+)[^0-9]+([0-9]+)/) {
 | 
			
		||||
            $return->{$iid} = $1 .'/'. $2;
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
        # Link Aggregate 4
 | 
			
		||||
        if ($i_descr->{$iid} =~ m/Link Aggregate (\d+)/) {
 | 
			
		||||
            $return->{$iid} = '3/'. $1;
 | 
			
		||||
            next;
 | 
			
		||||
        }
 | 
			
		||||
        # else
 | 
			
		||||
        $return->{$iid} = $i_descr->{$iid};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l2      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l2->interfaces($partial) || {};
 | 
			
		||||
    my $i_descr    = $l2->i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
 | 
			
		||||
        # CPU Interface
 | 
			
		||||
        if ( $i_descr->{$if} =~ /CPU Interface/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer2::Ubiquiti - SNMP Interface to Ubiquiti Access Points
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Max Kosmach
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $ubnt = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myswitch',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class = $ubnt->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Provides abstraction to the configuration information obtainable from
 | 
			
		||||
Ubiquiti Access Point through SNMP.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $ubnt = new SNMP::Info::Layer2::Ubiquiti(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
None.
 | 
			
		||||
 | 
			
		||||
=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 $ubnt->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'Ubiquiti Networks, Inc.'
 | 
			
		||||
 | 
			
		||||
=item $ubnt->model()
 | 
			
		||||
 | 
			
		||||
Returns the model extracted from C<dot11manufacturerProductName>, with failback to some complex logic for EdgeMax devices
 | 
			
		||||
 | 
			
		||||
=item $ubnt->serial()
 | 
			
		||||
 | 
			
		||||
Serial Number.
 | 
			
		||||
 | 
			
		||||
=item $ubnt->mac()
 | 
			
		||||
 | 
			
		||||
Bridge MAC address.
 | 
			
		||||
 | 
			
		||||
=item $ubnt->os()
 | 
			
		||||
 | 
			
		||||
Returns 'Ubiquiti Networks, Inc.'
 | 
			
		||||
 | 
			
		||||
=item $ubnt->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted from C<dot11manufacturerProductVersion>, with failback to description splitting for EdgeMax devices
 | 
			
		||||
 | 
			
		||||
=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 $ubiquiti->interfaces()
 | 
			
		||||
 | 
			
		||||
Uses the i_name() field.
 | 
			
		||||
 | 
			
		||||
=item $ubiquiti->i_ignore()
 | 
			
		||||
 | 
			
		||||
Ignores interfaces with "CPU Interface" in them.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer2
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer2;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
# Set for No CDP
 | 
			
		||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
 | 
			
		||||
@@ -40,24 +40,30 @@ use SNMP::Info::EtherLike;
 | 
			
		||||
use SNMP::Info::Entity;
 | 
			
		||||
use SNMP::Info::PowerEthernet;
 | 
			
		||||
use SNMP::Info::IPv6;
 | 
			
		||||
use SNMP::Info::AdslLine;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::ISA = qw/
 | 
			
		||||
    SNMP::Info::PowerEthernet SNMP::Info::IPv6
 | 
			
		||||
    SNMP::Info::Entity SNMP::Info::EtherLike
 | 
			
		||||
    SNMP::Info::Bridge SNMP::Info Exporter/;
 | 
			
		||||
    SNMP::Info::Bridge SNMP::Info::AdslLine
 | 
			
		||||
    SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%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,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'IP-MIB'   => 'ipNetToMediaIfIndex',
 | 
			
		||||
    'OSPF-MIB' => 'ospfRouterId',
 | 
			
		||||
    'BGP4-MIB' => 'bgpIdentifier',
 | 
			
		||||
@@ -67,11 +73,13 @@ $VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
    # 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,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    'mac' => 'ifPhysAddress.1',
 | 
			
		||||
    'serial1' =>
 | 
			
		||||
        '.1.3.6.1.4.1.9.3.6.3.0',    # OLD-CISCO-CHASSIS-MIB::chassisId.0
 | 
			
		||||
@@ -82,11 +90,13 @@ $VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
%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,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # Obsolete Address Translation Table (ARP Cache)
 | 
			
		||||
    'old_at_index'   => 'atIfIndex',
 | 
			
		||||
@@ -127,11 +137,11 @@ $VERSION = '2.05';
 | 
			
		||||
    'bgp_peer_out_upd'        => 'bgpPeerOutUpdates',
 | 
			
		||||
 | 
			
		||||
    # IP-MIB Net to Physical Table (ARP Cache)
 | 
			
		||||
    'n2p_paddr' => 'ipNetToPhysicalPhysAddress',
 | 
			
		||||
    'n2p_paddr'      => 'ipNetToPhysicalPhysAddress',
 | 
			
		||||
    'n2p_lastupdate' => 'ipNetToPhysicalLastUpdated',
 | 
			
		||||
    'n2p_ptype' => 'ipNetToPhysicalType',
 | 
			
		||||
    'n2p_pstate' => 'ipNetToPhysicalState',
 | 
			
		||||
    'n2p_pstatus' => 'ipNetToPhysicalRowStatus',
 | 
			
		||||
    'n2p_ptype'      => 'ipNetToPhysicalType',
 | 
			
		||||
    'n2p_pstate'     => 'ipNetToPhysicalState',
 | 
			
		||||
    'n2p_pstatus'    => 'ipNetToPhysicalRowStatus',
 | 
			
		||||
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@@ -139,14 +149,16 @@ $VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
    # 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,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    'old_at_paddr' => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'at_paddr'     => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'n2p_paddr' => \&SNMP::Info::munge_mac,
 | 
			
		||||
    'n2p_paddr'    => \&SNMP::Info::munge_mac,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# Method OverRides
 | 
			
		||||
@@ -157,6 +169,14 @@ sub root_ip {
 | 
			
		||||
    my $router_ip = $l3->router_ip();
 | 
			
		||||
    my $ospf_ip   = $l3->ospf_ip();
 | 
			
		||||
 | 
			
		||||
   # if the router ip exists and is a route advertised by the device we prefer
 | 
			
		||||
   # it over the others
 | 
			
		||||
    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 ) {
 | 
			
		||||
@@ -168,45 +188,35 @@ sub root_ip {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $router_ip
 | 
			
		||||
        if (( defined $router_ip )
 | 
			
		||||
        and ( $router_ip ne '0.0.0.0' )
 | 
			
		||||
        and ( $l3->snmp_connect_ip($router_ip) ) );
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l3->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
 | 
			
		||||
        # lo -> cisco aironet 350 loopback
 | 
			
		||||
        if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|null)/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
 | 
			
		||||
    my $serial1  = $l3->serial1();
 | 
			
		||||
    my $e_descr  = $l3->e_descr() || {};
 | 
			
		||||
    my $e_serial = $l3->e_serial() || {};
 | 
			
		||||
    my $serial1 = $l3->serial1();
 | 
			
		||||
    my $e_parent = $l3->e_parent() || {};
 | 
			
		||||
    my $e_class  = $l3->e_class() || {};
 | 
			
		||||
 | 
			
		||||
    my $serial2 = $e_serial->{1} || undef;
 | 
			
		||||
    my $chassis = $e_descr->{1}  || undef;
 | 
			
		||||
    foreach my $iid ( keys %$e_parent ) {
 | 
			
		||||
        my $parent = $e_parent->{$iid};
 | 
			
		||||
        my $class = $e_class->{$iid} || '';
 | 
			
		||||
        # Only consider serial numbers for entries without a parent, or if they are of type "chassis"
 | 
			
		||||
        if ( $parent eq '0' or $class eq 'chassis') {
 | 
			
		||||
            my $serial = $l3->e_serial($iid);
 | 
			
		||||
            if ( $serial && $serial->{$iid} ) {
 | 
			
		||||
                return $serial->{$iid};
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                my $descr = $l3->e_descr($iid);
 | 
			
		||||
                if ( $descr and $descr =~ /serial#?:\s*([a-z0-9]+)/i )
 | 
			
		||||
                {
 | 
			
		||||
                    return $1;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # 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;
 | 
			
		||||
@@ -283,32 +293,37 @@ sub interfaces {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces   = $l3->i_index($partial);
 | 
			
		||||
    my $descriptions = $l3->i_description($partial);
 | 
			
		||||
    my $interfaces = $l3->i_index($partial);
 | 
			
		||||
    my $i_descr    = $l3->i_description($partial);
 | 
			
		||||
 | 
			
		||||
    my %interfaces = ();
 | 
			
		||||
    foreach my $iid ( keys %$interfaces ) {
 | 
			
		||||
        my $desc = $descriptions->{$iid};
 | 
			
		||||
        next unless defined $desc;
 | 
			
		||||
 | 
			
		||||
        $interfaces{$iid} = $desc;
 | 
			
		||||
    # Check for duplicates in ifDescr, if so uniquely identify by adding
 | 
			
		||||
    # ifIndex to repeated values
 | 
			
		||||
    my %seen;
 | 
			
		||||
    foreach my $iid ( keys %$i_descr ) {
 | 
			
		||||
        my $port = $i_descr->{$iid};
 | 
			
		||||
        next unless defined $port;
 | 
			
		||||
        if ( $seen{$port}++ ) {
 | 
			
		||||
            $interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $interfaces->{$iid} = $port;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return \%interfaces;
 | 
			
		||||
    return $interfaces;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    my $l3 = shift;
 | 
			
		||||
 | 
			
		||||
    my $descr = $l3->description();
 | 
			
		||||
    my $id = $l3->id();
 | 
			
		||||
    my $id    = $l3->id();
 | 
			
		||||
 | 
			
		||||
    # .1.3.6.1.4.1.9.1 is the CISCO-PRODUCTS-MIB
 | 
			
		||||
    # .1.3.6.1.4.1.9.9.368.4 is an old tree that Cisco CSSs were numbered from
 | 
			
		||||
    return 'cisco'   if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/;
 | 
			
		||||
    return 'cisco'   if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/;
 | 
			
		||||
    return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/;
 | 
			
		||||
    return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/;
 | 
			
		||||
    return 'cisco'   if ( $descr =~ /(cisco|\bios\b)/i );
 | 
			
		||||
    return 'foundry' if ( $descr =~ /foundry/i );
 | 
			
		||||
    return 'brocade' if ( $descr =~ /foundry/i );
 | 
			
		||||
 | 
			
		||||
    return 'unknown';
 | 
			
		||||
 | 
			
		||||
@@ -404,6 +419,8 @@ after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::IPv6
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
@@ -432,6 +449,8 @@ See L<SNMP::Info::PowerEthernet/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IPv6/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
@@ -505,6 +524,18 @@ See L<SNMP::Info::EtherLike/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Entity/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info:PowerEthernet
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::PowerEthernet/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::IPv6
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IPv6/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Global Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
@@ -521,12 +552,6 @@ name.
 | 
			
		||||
 | 
			
		||||
Only returns those iids that have a description listed in $l3->i_description()
 | 
			
		||||
 | 
			
		||||
=item $l3->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Creates a key for each IID that should be ignored.
 | 
			
		||||
 | 
			
		||||
Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
 | 
			
		||||
 | 
			
		||||
=item $l3->i_name()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to human set name. 
 | 
			
		||||
@@ -780,4 +805,8 @@ See L<SNMP::Info::PowerEthernet/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::IPv6/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -41,7 +41,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -34,20 +34,28 @@ use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::AMAP;
 | 
			
		||||
# Use LLDP
 | 
			
		||||
# (or at least try.  The versions I've seen have two problems:
 | 
			
		||||
# 1. they report ifIndex values as 'local'; we don't support ifIndex
 | 
			
		||||
#    but *could*
 | 
			
		||||
# 2. They report 0.0.0.0 as the management address
 | 
			
		||||
# )
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::AMAP SNMP::Info::LLDP
 | 
			
		||||
    SNMP::Info::MAU SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::AlcatelLucent::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::AMAP::MIBS,
 | 
			
		||||
    'ALCATEL-IND1-DEVICES'     => 'familyOmniSwitch7000',
 | 
			
		||||
    'ALCATEL-IND1-CHASSIS-MIB' => 'chasEntPhysOperStatus',
 | 
			
		||||
    'ALU-POWER-ETHERNET-MIB'   => 'pethPsePortDetectionStatus',
 | 
			
		||||
@@ -64,17 +72,17 @@ delete $MIBS{'POWER-ETHERNET-MIB'};
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS, %SNMP::Info::AMAP::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS, %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS, %SNMP::Info::AMAP::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE, %SNMP::Info::AMAP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
# use MAU-MIB for admin. duplex and admin. speed
 | 
			
		||||
@@ -190,21 +198,6 @@ sub interfaces {
 | 
			
		||||
    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;
 | 
			
		||||
@@ -285,53 +278,6 @@ sub bp_index {
 | 
			
		||||
#    return $i_vlan;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
# Use LLDP
 | 
			
		||||
# (or at least try.  The versions I've seen have two problems:
 | 
			
		||||
# 1. they report ifIndex values as 'local'; we don't support ifIndex
 | 
			
		||||
#    but *could*
 | 
			
		||||
# 2. They report 0.0.0.0 as the management address
 | 
			
		||||
# )
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $alu = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->hasLLDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->lldp_if($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $alu     = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $alu->lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Power-Ethernet ifIndex mapping.  I've only seen this from a
 | 
			
		||||
# fixed-config single-module system, so this is only a plausible
 | 
			
		||||
# guess as to the mapping on a stack or modular system.
 | 
			
		||||
@@ -428,10 +374,6 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
    Returns 'alcatel-lucent'
 | 
			
		||||
 | 
			
		||||
=item $alu->hasCDP()
 | 
			
		||||
 | 
			
		||||
    Returns whether LLDP is enabled.
 | 
			
		||||
 | 
			
		||||
=item $alu->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $alu->id() to one of the product MIBs listed above
 | 
			
		||||
@@ -488,40 +430,12 @@ to a hash.
 | 
			
		||||
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->c_id()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $alu->c_if()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $alu->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $alu->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $alu->c_port()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $alu->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
@@ -39,7 +39,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -66,6 +66,10 @@ $VERSION = '2.05';
 | 
			
		||||
    'new_tftp_result' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpLastActionStatus',
 | 
			
		||||
    'old_ip_max'      => 'ALTEON_TS_NETWORK_MIB__ipInterfaceTableMax',
 | 
			
		||||
    'new_ip_max'      => 'ALTEON_CHEETAH_NETWORK_MIB__ipInterfaceTableMax',
 | 
			
		||||
    'fan'             => 'ALTEON_CHEETAH_SWITCH_MIB__hwFanStatus',
 | 
			
		||||
    'old_ps1_stat'    => 'ALTEON_TIGON_SWITCH_MIB__hwPowerSupplyStatus',
 | 
			
		||||
    'old_ps2_stat'    => 'ALTEON_TIGON_SWITCH_MIB__hwRedundantPSStatus',
 | 
			
		||||
    'new_ps_stat'     => 'ALTEON_CHEETAH_SWITCH_MIB__hwPowerSupplyStatus',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
@@ -132,7 +136,7 @@ sub model {
 | 
			
		||||
 | 
			
		||||
    return $id unless defined $model;
 | 
			
		||||
 | 
			
		||||
    $model =~ s/^aceswitch//;
 | 
			
		||||
    $model =~ s/^(aceswitch|aws|ods)//;
 | 
			
		||||
    $model =~ s/^acedirector/AD/;
 | 
			
		||||
    $model =~ s/^(copper|fiber)Module/BladeCenter GbESM/;
 | 
			
		||||
 | 
			
		||||
@@ -140,7 +144,7 @@ sub model {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'radware';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
@@ -155,6 +159,36 @@ sub os_ver {
 | 
			
		||||
    return $version;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps1_status {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
    my $old_ps = $alteon->old_ps1_stat();
 | 
			
		||||
    my $new_ps = $alteon->new_ps_stat();
 | 
			
		||||
    
 | 
			
		||||
    return $old_ps if $old_ps;
 | 
			
		||||
    
 | 
			
		||||
    if ($new_ps) {
 | 
			
		||||
        return 'ok' if ($new_ps eq 'singlePowerSupplyOk');
 | 
			
		||||
        return 'failed' if ($new_ps eq 'firstPowerSupplyFailed');
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub ps2_status {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
    my $old_ps = $alteon->old_ps2_stat();
 | 
			
		||||
    my $new_ps = $alteon->new_ps_stat();
 | 
			
		||||
    
 | 
			
		||||
    return $old_ps if $old_ps;
 | 
			
		||||
    
 | 
			
		||||
    if ($new_ps) {
 | 
			
		||||
        return 'ok' if ($new_ps eq 'doublePowerSupplyOk');
 | 
			
		||||
        return 'failed' if ($new_ps eq 'secondPowerSupplyFailed');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub interfaces {
 | 
			
		||||
    my $alteon       = shift;
 | 
			
		||||
    my $interfaces   = $alteon->i_index();
 | 
			
		||||
@@ -174,6 +208,7 @@ sub interfaces {
 | 
			
		||||
        # varies by switch model
 | 
			
		||||
        elsif ( defined $ip_max and $iid > $ip_max ) {
 | 
			
		||||
            $desc = ( $iid % $ip_max );
 | 
			
		||||
            $desc = 'mgmt' if $desc == 231;
 | 
			
		||||
        }
 | 
			
		||||
        $interfaces{$iid} = $desc;
 | 
			
		||||
    }
 | 
			
		||||
@@ -207,39 +242,48 @@ sub i_duplex {
 | 
			
		||||
sub i_duplex_admin {
 | 
			
		||||
    my $alteon = shift;
 | 
			
		||||
 | 
			
		||||
    my $ag_pref = $alteon->new_ag_p_cfg_pref()
 | 
			
		||||
    my $ag_pref 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_pref()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_pref()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ag_fe_auto = $alteon->new_ag_p_cfg_fe_auto()
 | 
			
		||||
    my $ag_fe_auto 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_fe_auto()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_fe_auto()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ag_fe_mode = $alteon->new_ag_p_cfg_fe_mode()
 | 
			
		||||
    my $ag_fe_mode 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_fe_mode()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_fe_mode()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ag_ge_auto = $alteon->new_ag_p_cfg_ge_auto()
 | 
			
		||||
    my $ag_ge_auto 
 | 
			
		||||
        = $alteon->new_ag_p_cfg_ge_auto()
 | 
			
		||||
        || $alteon->old_ag_p_cfg_ge_auto()
 | 
			
		||||
        || {};
 | 
			
		||||
    my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
    my $ip_max  = $alteon->new_ip_max() || $alteon->old_ip_max();
 | 
			
		||||
    my $i_speed = $alteon->i_speed()    || {};
 | 
			
		||||
 | 
			
		||||
    my %i_duplex_admin;
 | 
			
		||||
    foreach my $if ( keys %$ag_pref ) {
 | 
			
		||||
        my $pref = $ag_pref->{$if};
 | 
			
		||||
        next unless defined $pref;
 | 
			
		||||
    foreach my $if ( keys %$ag_ge_auto ) {
 | 
			
		||||
        my $pref    = $ag_pref->{$if}    || '';
 | 
			
		||||
        my $speed   = $i_speed->{$if}    || '';
 | 
			
		||||
        my $ge_auto = $ag_ge_auto->{$if} || '';
 | 
			
		||||
        my $fe_auto = $ag_fe_auto->{$if} || '';
 | 
			
		||||
        my $fe_mode = $ag_fe_mode->{$if} || '';
 | 
			
		||||
 | 
			
		||||
        my $string = 'other';
 | 
			
		||||
        if ( $pref =~ /gigabit/i ) {
 | 
			
		||||
            my $ge_auto = $ag_ge_auto->{$if};
 | 
			
		||||
            $string = 'full' if ( $ge_auto =~ /off/i );
 | 
			
		||||
            $string = 'auto' if ( $ge_auto =~ /on/i );
 | 
			
		||||
        # Default to auto
 | 
			
		||||
        my $string = 'auto';
 | 
			
		||||
 | 
			
		||||
        if ( $ge_auto =~ /off/i
 | 
			
		||||
            && ( $pref =~ /gigabit/i || $speed eq '1.0 Gbps' ) )
 | 
			
		||||
        {
 | 
			
		||||
            $string = 'full';
 | 
			
		||||
        }
 | 
			
		||||
        elsif ( $pref =~ /fast/i ) {
 | 
			
		||||
            my $fe_auto = $ag_fe_auto->{$if};
 | 
			
		||||
            my $fe_mode = $ag_fe_mode->{$if};
 | 
			
		||||
        if ( $fe_auto =~ /off/i
 | 
			
		||||
            && ( $pref =~ /fast/i || $speed =~ /100?\sMbps/ ) )
 | 
			
		||||
        {
 | 
			
		||||
            $string = 'half'
 | 
			
		||||
                if ( $fe_mode =~ /half/i and $fe_auto =~ /off/i );
 | 
			
		||||
                if ( $fe_mode =~ /half/i );
 | 
			
		||||
            $string = 'full'
 | 
			
		||||
                if ( $fe_mode =~ /full/i and $fe_auto =~ /off/i );
 | 
			
		||||
            $string = 'auto' if $fe_auto =~ /on/i;
 | 
			
		||||
                if ( $fe_mode =~ /full/i );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        my $idx;
 | 
			
		||||
@@ -341,6 +385,20 @@ sub i_vlan_membership {
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_vlan_membership_untagged {
 | 
			
		||||
    my $alteon  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $vlans = $alteon->i_vlan($partial);
 | 
			
		||||
    my $i_vlan_membership = {};
 | 
			
		||||
    foreach my $port (keys %$vlans) {
 | 
			
		||||
        my $vlan = $vlans->{$port};
 | 
			
		||||
        push( @{ $i_vlan_membership->{$port} }, $vlan );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return $i_vlan_membership;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Bridge MIB does not map Bridge Port to ifIndex correctly on some code
 | 
			
		||||
# versions
 | 
			
		||||
sub bp_index {
 | 
			
		||||
@@ -365,7 +423,7 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Nortel Alteon Layer 2-7
 | 
			
		||||
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Radware Alteon ADC
 | 
			
		||||
Switches.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
@@ -389,8 +447,8 @@ Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Nortel Alteon Series Layer 2-7 load balancing
 | 
			
		||||
switches and Nortel BladeCenter Layer2-3 GbE Switch Modules.
 | 
			
		||||
Abstraction subclass for Radware Alteon Series ADC switches and
 | 
			
		||||
Nortel BladeCenter Layer2-3 GbE Switch Modules.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
@@ -438,12 +496,12 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
=item $alteon->model()
 | 
			
		||||
 | 
			
		||||
Returns model type.  Checks $alteon->id() against the F<ALTEON-ROOT-MIB> and
 | 
			
		||||
then parses out C<aceswitch>, replaces C<acedirector> with AD, and replaces
 | 
			
		||||
copperModule/fiberModule with BladeCenter GbESM.
 | 
			
		||||
then parses out C<aceswitch>, C<aws>, and C<ods> replaces C<acedirector>
 | 
			
		||||
with AD, and replaces copperModule/fiberModule with BladeCenter GbESM.
 | 
			
		||||
 | 
			
		||||
=item $alteon->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
Returns 'radware'
 | 
			
		||||
 | 
			
		||||
=item $alteon->os()
 | 
			
		||||
 | 
			
		||||
@@ -469,6 +527,18 @@ Returns the software version reported by C<agSoftwareVersion>
 | 
			
		||||
 | 
			
		||||
(C<agTftpLastActionStatus>)
 | 
			
		||||
 | 
			
		||||
=item $alteon->fan()
 | 
			
		||||
 | 
			
		||||
(C<hwFanStatus>)
 | 
			
		||||
 | 
			
		||||
=item $alteon->ps1_status()
 | 
			
		||||
 | 
			
		||||
Returns status of primary power supply
 | 
			
		||||
 | 
			
		||||
=item $alteon->ps2_status()
 | 
			
		||||
 | 
			
		||||
Returns status of redundant power supply
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
@@ -477,8 +547,8 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
These are methods that return tables of information in the form of a
 | 
			
		||||
reference to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
@@ -518,6 +588,12 @@ IDs.  These are the VLANs which are members of the egress list for the port.
 | 
			
		||||
    print "Port: $port VLAN: $vlan\n";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
=item $alteon->i_vlan_membership_untagged()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
 | 
			
		||||
IDs.  These are the VLANs which are members of the untagged egress list for
 | 
			
		||||
the port.
 | 
			
		||||
 | 
			
		||||
=item $alteon->v_index()
 | 
			
		||||
 | 
			
		||||
Returns VLAN IDs
 | 
			
		||||
@@ -40,7 +40,7 @@ use SNMP::Info::Layer3;
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE 
 | 
			
		||||
            $int_include_vpn $fake_idx $type_class/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
            %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
@@ -152,10 +152,6 @@ sub os {
 | 
			
		||||
    return 'altiga';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $altiga->interfaces() - Map the Interfaces to their physical names
 | 
			
		||||
# Add interface number to interface name to prevent duplicate ifDescr
 | 
			
		||||
# Included statically configured VPN tunnels if ($int_include_vpn)
 | 
			
		||||
@@ -350,10 +346,6 @@ Tries to determine OS version from the C<sysDescr.0> field. Returns version or C
 | 
			
		||||
 | 
			
		||||
Combines results from C<fan1_alarm>, C<fan2_alarm>, and C<fam3_alarm> methods.
 | 
			
		||||
 | 
			
		||||
=item $altiga->hasCDP()
 | 
			
		||||
 | 
			
		||||
No.
 | 
			
		||||
 | 
			
		||||
=item $altiga->ps1_status()
 | 
			
		||||
 | 
			
		||||
Combines C<ps1_3v_alarm> and C<ps1_5v_alarm> methods.
 | 
			
		||||
@@ -36,19 +36,25 @@ use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
use SNMP::Info::Aggregate 'agg_ports_ifstack';
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::Arista::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
 | 
			
		||||
    SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Arista::ISA = qw/
 | 
			
		||||
    SNMP::Info::Aggregate
 | 
			
		||||
    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 = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    %SNMP::Info::Aggregate::MIBS,
 | 
			
		||||
    'ARISTA-PRODUCTS-MIB' => 'aristaProducts',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@@ -104,64 +110,28 @@ sub model {
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use Q-BRIDGE-MIB
 | 
			
		||||
 | 
			
		||||
sub fw_mac {
 | 
			
		||||
# The LLDP MIB leaves it up in the air what the index means.
 | 
			
		||||
# On EOS, it's a dot1d port.
 | 
			
		||||
sub lldp_if {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->qb_fw_mac($partial);
 | 
			
		||||
    # We pick a column that someone else is likely to want,
 | 
			
		||||
    # so that the cache means that hopefully this doesn't
 | 
			
		||||
    # cause any more SNMP transactions in total.
 | 
			
		||||
    my $desc     = $arista->lldp_rem_desc($partial) || {};
 | 
			
		||||
    my $bp_index = $arista->bp_index() || {};
 | 
			
		||||
 | 
			
		||||
    my $lldp_if = {};
 | 
			
		||||
    foreach my $key ( keys %$desc ) {
 | 
			
		||||
        my @aOID = split( '\.', $key );
 | 
			
		||||
        my $port = $aOID[1];
 | 
			
		||||
        $lldp_if->{$key} = $bp_index->{$port};
 | 
			
		||||
    }
 | 
			
		||||
    return $lldp_if;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub fw_port {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->qb_fw_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use LLDP
 | 
			
		||||
 | 
			
		||||
sub hasCDP {
 | 
			
		||||
    my $arista = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->hasLLDP();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_ip {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->lldp_ip($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_if {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->lldp_if($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_port {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->lldp_port($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_id {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->lldp_id($partial);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub c_platform {
 | 
			
		||||
    my $arista  = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    return $arista->lldp_rem_sysdesc($partial);
 | 
			
		||||
}
 | 
			
		||||
sub agg_ports { return agg_ports_ifstack(@_) }
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
@@ -198,6 +168,8 @@ Subclass for Arista Networks EOS-based devices
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Aggregate
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
@@ -216,6 +188,8 @@ Subclass for Arista Networks EOS-based devices
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Aggregate/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
@@ -232,10 +206,6 @@ These are methods that return scalar values from SNMP
 | 
			
		||||
 | 
			
		||||
    Returns 'Arista Networks, Inc.'
 | 
			
		||||
 | 
			
		||||
=item $arista->hasCDP()
 | 
			
		||||
 | 
			
		||||
    Returns whether LLDP is enabled.
 | 
			
		||||
 | 
			
		||||
=item $arista->model()
 | 
			
		||||
 | 
			
		||||
Tries to reference $arista->id() to one of the product MIBs listed above
 | 
			
		||||
@@ -271,34 +241,6 @@ 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->c_id()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $arista->c_if()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $arista->c_ip()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $arista->c_platform()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $arista->c_port()
 | 
			
		||||
 | 
			
		||||
Returns LLDP information.
 | 
			
		||||
 | 
			
		||||
=item $arista->i_duplex_admin()
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
@@ -307,6 +249,16 @@ Returns info from F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
Returns info from F<MAU-MIB>
 | 
			
		||||
 | 
			
		||||
=item $arista->lldp_if()
 | 
			
		||||
 | 
			
		||||
Returns the mapping to the SNMP Interface Table.
 | 
			
		||||
 | 
			
		||||
=item C<agg_ports>
 | 
			
		||||
 | 
			
		||||
Returns a HASH reference mapping from slave to master port for each member of
 | 
			
		||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
 | 
			
		||||
ifIndex of the corresponding master ports.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
							
								
								
									
										1838
									
								
								lib/SNMP/Info/Layer3/Aruba.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1838
									
								
								lib/SNMP/Info/Layer3/Aruba.pm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -43,7 +43,7 @@ use SNMP::Info::Bridge;
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE %MODEL_MAP
 | 
			
		||||
    %MODID_MAP %PROCID_MAP/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::MIBS,
 | 
			
		||||
@@ -545,7 +545,7 @@ sub model {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'nortel';
 | 
			
		||||
    return 'avaya';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
@@ -732,6 +732,8 @@ sub i_vlan {
 | 
			
		||||
    return \%i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_pvid { goto &i_vlan }
 | 
			
		||||
 | 
			
		||||
sub root_ip {
 | 
			
		||||
    my $bayrs = shift;
 | 
			
		||||
 | 
			
		||||
@@ -1191,7 +1193,7 @@ sub e_vendor {
 | 
			
		||||
 | 
			
		||||
    my %wf_e_vendor;
 | 
			
		||||
    foreach my $iid ( keys %$wf_e_idx ) {
 | 
			
		||||
        $wf_e_vendor{$iid} = 'nortel';
 | 
			
		||||
        $wf_e_vendor{$iid} = 'avaya';
 | 
			
		||||
    }
 | 
			
		||||
    return \%wf_e_vendor;
 | 
			
		||||
}
 | 
			
		||||
@@ -1378,7 +1380,8 @@ __END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::BayRS - SNMP Interface to Nortel routers running BayRS.
 | 
			
		||||
SNMP::Info::Layer3::BayRS - SNMP Interface to Avaya/Nortel routers running
 | 
			
		||||
BayRS.
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -1401,7 +1404,7 @@ Eric Miller
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for routers running Nortel BayRS.  
 | 
			
		||||
Abstraction subclass for routers running Avaya/Nortel BayRS.  
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
@@ -1474,7 +1477,7 @@ and the common model with this map :
 | 
			
		||||
 | 
			
		||||
=item $bayrs->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'nortel'
 | 
			
		||||
Returns 'avaya'
 | 
			
		||||
 | 
			
		||||
=item $bayrs->os()
 | 
			
		||||
 | 
			
		||||
@@ -1548,6 +1551,10 @@ interfaces.
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps port VLAN ID to IIDs.
 | 
			
		||||
 | 
			
		||||
=item $bayrs->i_pvid()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Maps port VLAN ID to IIDs.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Pseudo F<ENTITY-MIB> information
 | 
			
		||||
@@ -1583,7 +1590,7 @@ Returns reference to hash.  Key: IID, Value: Hardware version.
 | 
			
		||||
 | 
			
		||||
=item $bayrs->e_vendor()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: nortel.
 | 
			
		||||
Returns reference to hash.  Key: IID, Value: avaya.
 | 
			
		||||
 | 
			
		||||
=item $bayrs->e_serial()
 | 
			
		||||
 | 
			
		||||
@@ -1634,11 +1641,11 @@ See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $extreme->munge_hw_rev()
 | 
			
		||||
=item $bayrs->munge_hw_rev()
 | 
			
		||||
 | 
			
		||||
Converts octets to a decimal major.minor string.
 | 
			
		||||
 | 
			
		||||
=item $extreme->munge_wf_serial()
 | 
			
		||||
=item $bayrs->munge_wf_serial()
 | 
			
		||||
 | 
			
		||||
Coverts octets to a decimal string.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										168
									
								
								lib/SNMP/Info/Layer3/BlueCoatSG.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								lib/SNMP/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.52';
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										344
									
								
								lib/SNMP/Info/Layer3/C3550.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								lib/SNMP/Info/Layer3/C3550.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,344 @@
 | 
			
		||||
# SNMP::Info::Layer3::C3550
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
 | 
			
		||||
# Copyright (c) 2004 Regents of the University of California
 | 
			
		||||
# 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::C3550;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoStack;
 | 
			
		||||
use SNMP::Info::Layer3::CiscoSwitch;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
# NOTE : Top-most items gets precedence for @ISA
 | 
			
		||||
@SNMP::Info::Layer3::C3550::ISA = qw/
 | 
			
		||||
    SNMP::Info::CiscoStack
 | 
			
		||||
    SNMP::Info::Layer3::CiscoSwitch
 | 
			
		||||
    Exporter/;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
# 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::CiscoSwitch::MIBS, %SNMP::Info::CiscoStack::MIBS,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::CiscoSwitch::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::GLOBALS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::CiscoSwitch::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::CiscoSwitch::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $c3550 = shift;
 | 
			
		||||
    my $id    = $c3550->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id) || $id;
 | 
			
		||||
    $model =~ s/^catalyst//;
 | 
			
		||||
 | 
			
		||||
    # turn 355048 into 3550-48
 | 
			
		||||
    if ( $model =~ /^(35\d\d)(\d\d(T|G)?)$/ ) {
 | 
			
		||||
        $model = "$1-$2";
 | 
			
		||||
    }
 | 
			
		||||
    return $model;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Ports is encoded into the model number
 | 
			
		||||
sub ports {
 | 
			
		||||
    my $c3550 = shift;
 | 
			
		||||
 | 
			
		||||
    my $id    = $c3550->id();
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
    if ( $model =~ /(12|24|48)(C|T|TS|G|TS-E|TS-S|T-E)?$/ ) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::C3550 - SNMP Interface to Cisco Catalyst 3550 Layer 2/3
 | 
			
		||||
Switches running IOS
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
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 to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $c3550->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Abstraction subclass for Cisco Catalyst 3550 Layer 2/3 Switches.  
 | 
			
		||||
 | 
			
		||||
These devices run IOS but have some of the same characteristics as the
 | 
			
		||||
Catalyst WS-C family (5xxx,6xxx).  For example, forwarding tables are held in
 | 
			
		||||
VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>.
 | 
			
		||||
 | 
			
		||||
For speed or debugging purposes you can call the subclass directly, but not
 | 
			
		||||
after determining a more specific class using the method above. 
 | 
			
		||||
 | 
			
		||||
 my $c3550 = new SNMP::Info::Layer3::C3550(...);
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3::CiscoSwitch
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3::CiscoSwitch/"Required MIBs"> for its own MIB
 | 
			
		||||
requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $c3550->vendor()
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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 $c3550->i_duplex()
 | 
			
		||||
 | 
			
		||||
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()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash of iid to administrative duplex setting.
 | 
			
		||||
 | 
			
		||||
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().
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStack> for its i_duplex() and p_duplex() methods.
 | 
			
		||||
 | 
			
		||||
=item $c3550->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 $c3550->p_port() with $c3550->p_duplex() to utilize port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
    Example:
 | 
			
		||||
    my %if_map = reverse %{$c3550->interfaces()};
 | 
			
		||||
    $c3550->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) 
 | 
			
		||||
        or die "Couldn't change port duplex. ",$c3550->error(1);
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=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::Layer3::CiscoSwitch
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"TABLE METHODS"> for
 | 
			
		||||
details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -31,48 +31,30 @@
 | 
			
		||||
package SNMP::Info::Layer3::C4000;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
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::Layer3::CiscoSwitch;
 | 
			
		||||
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::ISA = qw/
 | 
			
		||||
    SNMP::Info::Layer3::CiscoSwitch
 | 
			
		||||
    SNMP::Info::MAU
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::C4000::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%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,
 | 
			
		||||
    %SNMP::Info::Layer3::CiscoSwitch::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,
 | 
			
		||||
    %SNMP::Info::Layer3::CiscoSwitch::GLOBALS,
 | 
			
		||||
    'ps1_type'   => 'ciscoEnvMonSupplyStatusDescr.1',
 | 
			
		||||
    'ps1_status' => 'ciscoEnvMonSupplyState.1',
 | 
			
		||||
    'ps2_type'   => 'ciscoEnvMonSupplyStatusDescr.2',
 | 
			
		||||
@@ -80,24 +62,14 @@ $VERSION = '2.05';
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%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,
 | 
			
		||||
    %SNMP::Info::Layer3::CiscoSwitch::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,
 | 
			
		||||
);
 | 
			
		||||
%MUNGE
 | 
			
		||||
    = ( %SNMP::Info::MAU::MUNGE, %SNMP::Info::Layer3::CiscoSwitch::MUNGE, );
 | 
			
		||||
 | 
			
		||||
# Override Inheritance for these specific methods
 | 
			
		||||
# use MAU-MIB for admin. duplex and admin. speed
 | 
			
		||||
@@ -106,6 +78,11 @@ $VERSION = '2.05';
 | 
			
		||||
*SNMP::Info::Layer3::C4000::i_speed_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_i_speed_admin;
 | 
			
		||||
 | 
			
		||||
*SNMP::Info::Layer3::C4000::set_i_duplex_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_set_i_duplex_admin;
 | 
			
		||||
*SNMP::Info::Layer3::C4000::set_i_speed_admin
 | 
			
		||||
    = \&SNMP::Info::MAU::mau_set_i_speed_admin;
 | 
			
		||||
 | 
			
		||||
sub fan {
 | 
			
		||||
    my $c4000     = shift;
 | 
			
		||||
    my $fan_state = $c4000->fan_state();
 | 
			
		||||
@@ -120,8 +97,6 @@ sub fan {
 | 
			
		||||
    return $ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cisco_comm_indexing { return 1; }
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
@@ -163,22 +138,10 @@ after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=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::Layer3::CiscoSwitch
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
@@ -187,23 +150,11 @@ after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
See L<SNMP::Info::Layer3::CiscoSwitch/"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
 | 
			
		||||
@@ -214,48 +165,20 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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
 | 
			
		||||
@@ -281,39 +204,27 @@ Returns either (auto,full,half).
 | 
			
		||||
 | 
			
		||||
Returns administrative speed for interfaces.
 | 
			
		||||
 | 
			
		||||
=item $c4000->set_i_speed_admin(speed, ifIndex)
 | 
			
		||||
 | 
			
		||||
Sets port speed, must be supplied with speed and port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
Speed choices are '10', '100', '1000', 'auto'.
 | 
			
		||||
 | 
			
		||||
=item $c4000->set_i_duplex_admin(duplex, ifIndex)
 | 
			
		||||
 | 
			
		||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
Duplex choices are 'auto', 'half', 'full'.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3::CiscoSwitch
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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
 | 
			
		||||
@@ -31,32 +31,19 @@
 | 
			
		||||
package SNMP::Info::Layer3::C6500;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoStack;
 | 
			
		||||
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 SNMP::Info::Layer3::CiscoSwitch;
 | 
			
		||||
use SNMP::Info::MAU;
 | 
			
		||||
 | 
			
		||||
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::CDP 
 | 
			
		||||
    SNMP::Info::CiscoImage
 | 
			
		||||
    SNMP::Info::CiscoStats
 | 
			
		||||
    SNMP::Info::CiscoPortSecurity
 | 
			
		||||
    SNMP::Info::CiscoConfig
 | 
			
		||||
    SNMP::Info::CiscoPower
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    SNMP::Info::Layer3::CiscoSwitch
 | 
			
		||||
    SNMP::Info::MAU
 | 
			
		||||
    Exporter
 | 
			
		||||
/;
 | 
			
		||||
 | 
			
		||||
@@ -64,7 +51,7 @@ use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
# NOTE: Order creates precedence
 | 
			
		||||
#       Example: v_name exists in Bridge.pm and CiscoVTP.pm
 | 
			
		||||
@@ -73,48 +60,50 @@ $VERSION = '2.05';
 | 
			
		||||
# 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::CiscoStack::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MIBS, %SNMP::Info::CiscoVTP::MIBS,    
 | 
			
		||||
    %SNMP::Info::MAU::MIBS,
 | 
			
		||||
    %SNMP::Info::Layer3::CiscoSwitch::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MIBS,
 | 
			
		||||
    'CISCO-VIRTUAL-SWITCH-MIB' => 'cvsSwitchMode',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%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::MAU::GLOBALS,
 | 
			
		||||
    %SNMP::Info::Layer3::CiscoSwitch::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::CiscoStack::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::FUNCS, %SNMP::Info::CiscoVTP::FUNCS,    
 | 
			
		||||
    %SNMP::Info::MAU::FUNCS,
 | 
			
		||||
    %SNMP::Info::Layer3::CiscoSwitch::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStack::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::CiscoStack::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,    
 | 
			
		||||
    %SNMP::Info::MAU::MUNGE,
 | 
			
		||||
    %SNMP::Info::Layer3::CiscoSwitch::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStack::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'cisco';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cisco_comm_indexing { return 1; }
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $c6500 = shift;
 | 
			
		||||
 | 
			
		||||
    my $serial = $c6500->SUPER::serial();
 | 
			
		||||
    return $serial if defined $serial and $serial;
 | 
			
		||||
 | 
			
		||||
    # now grab the table only if SUPER cannot find it
 | 
			
		||||
    my $e_serial = $c6500->e_serial();
 | 
			
		||||
 | 
			
		||||
    # Find entity table entry for this unit
 | 
			
		||||
    foreach my $e ( sort keys %$e_serial ) {
 | 
			
		||||
        if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
 | 
			
		||||
            return $e_serial->{$e};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#  Newer versions use the ETHERLIKE-MIB to report operational duplex.
 | 
			
		||||
 | 
			
		||||
@@ -173,6 +162,16 @@ sub i_duplex_admin {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub is_virtual_switch {
 | 
			
		||||
    my $cvs = shift;
 | 
			
		||||
    my $cvsSwM = $cvs->cvsSwitchMode() || '';
 | 
			
		||||
 | 
			
		||||
    if ( $cvsSwM eq 'multiNode' ) {
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_duplex_admin {
 | 
			
		||||
 | 
			
		||||
    # map a textual duplex to an integer one the switch understands
 | 
			
		||||
@@ -180,6 +179,20 @@ sub set_i_duplex_admin {
 | 
			
		||||
 | 
			
		||||
    my $c6500 = shift;
 | 
			
		||||
    my ( $duplex, $iid ) = @_;
 | 
			
		||||
 
 | 
			
		||||
    if ( $c6500->is_virtual_switch() ) {
 | 
			
		||||
 | 
			
		||||
        # VSS -> MAU
 | 
			
		||||
        # Due to VSS bug
 | 
			
		||||
        # 1. Set the ifMauDefaultType
 | 
			
		||||
        # 2. Disable ifMauAutoNegAdminStatus
 | 
			
		||||
        # If the second set is not done, this is not going to be
 | 
			
		||||
        # working... Cisco Bug id CSCty97033.
 | 
			
		||||
        # SXI is not working (up to at least relase SXI9).
 | 
			
		||||
        # SXJ is working at SXJ3 (not before).
 | 
			
		||||
 | 
			
		||||
        return $c6500->mau_set_i_duplex_admin( $duplex, $iid );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my $el_duplex = $c6500->el_duplex($iid);
 | 
			
		||||
 | 
			
		||||
@@ -197,10 +210,33 @@ sub set_i_duplex_admin {
 | 
			
		||||
        return $c6500->set_p_duplex( $duplexes{$duplex}, $iid );
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return $c6500->SUPER::set_i_duplex_admin;
 | 
			
		||||
        return $c6500->SUPER::set_i_duplex_admin( $duplex, $iid );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub set_i_speed_admin {
 | 
			
		||||
    my $c6500   = shift;
 | 
			
		||||
    my ( $speed, $iid ) = @_;
 | 
			
		||||
 | 
			
		||||
    if ( $c6500->is_virtual_switch() ) {
 | 
			
		||||
 | 
			
		||||
        # VSS -> MAU
 | 
			
		||||
        # Due to VSS bug
 | 
			
		||||
        # 1. Set the ifMauDefaultType
 | 
			
		||||
        # 2. Disable ifMauAutoNegAdminStatus
 | 
			
		||||
        # If the second set is not done, this is not going to be working...
 | 
			
		||||
        # Cisco Bug id CSCty97033.
 | 
			
		||||
        # SXI is not working (at least up to relase SXI9).
 | 
			
		||||
        # SXJ is working at SXJ3 (not before).
 | 
			
		||||
 | 
			
		||||
        return $c6500->mau_set_i_speed_admin( $speed, $iid );
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
 | 
			
		||||
        # normal behavior using the CiscoStack method
 | 
			
		||||
        return $c6500->SUPER::set_i_speed_admin( $speed, $iid );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
@@ -247,25 +283,11 @@ after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
=item SNMP::Info::Layer3::CiscoSwitch
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
=item SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -275,26 +297,12 @@ after determining a more specific class using the method above.
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
See L<SNMP::Info::Layer3::CiscoSwitch/"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.
 | 
			
		||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
@@ -308,51 +316,31 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
    Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $c6500->cisco_comm_indexing()
 | 
			
		||||
=item $c6500->cvsSwitchMode()
 | 
			
		||||
 | 
			
		||||
Returns 1.  Use vlan indexing.
 | 
			
		||||
Returns the Switch status: multiNode or standalone.
 | 
			
		||||
 | 
			
		||||
=item $c6500->is_virtual_switch()
 | 
			
		||||
 | 
			
		||||
Return 1 if the switch (C<cvsSwitchMode>) is in multimode (VSS).
 | 
			
		||||
 | 
			
		||||
=item $c6500->serial()
 | 
			
		||||
 | 
			
		||||
Returns serial number of unit (falls back to C<entPhysicalSerialNum>).
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStack
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CDP
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3::CiscoSwitch
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
=head2 Globals imported from SNMP::Info::MAU
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE METHODS
 | 
			
		||||
 | 
			
		||||
@@ -397,48 +385,29 @@ Crosses $c6500->p_port() with $c6500->p_duplex() to utilize port C<ifIndex>.
 | 
			
		||||
    $c6500->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) 
 | 
			
		||||
        or die "Couldn't change port duplex. ",$c6500->error(1);
 | 
			
		||||
 | 
			
		||||
=item $c6500->set_i_speed_admin(speed, ifIndex)
 | 
			
		||||
 | 
			
		||||
Sets port speed, must be supplied with speed and port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
Speed choices are '10', '100', '1000'.
 | 
			
		||||
 | 
			
		||||
Crosses $c6500->p_port() with $c6500->p_speed() to utilize port C<ifIndex>.
 | 
			
		||||
 | 
			
		||||
=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::Layer3::CiscoSwitch
 | 
			
		||||
 | 
			
		||||
=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
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3::CiscoSwitch/"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
 | 
			
		||||
 | 
			
		||||
=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.
 | 
			
		||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										330
									
								
								lib/SNMP/Info/Layer3/CheckPoint.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										330
									
								
								lib/SNMP/Info/Layer3/CheckPoint.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,330 @@
 | 
			
		||||
# SNMP::Info::Layer3::CheckPoint
 | 
			
		||||
# $Id$
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2008 Bill Fenner
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
# Redistribution and use in source and binary forms, with or without
 | 
			
		||||
# modification, are permitted provided that the following conditions are met:
 | 
			
		||||
#
 | 
			
		||||
#     * Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
#       this list of conditions and the following disclaimer.
 | 
			
		||||
#     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
#       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
#       documentation and/or other materials provided with the distribution.
 | 
			
		||||
#     * Neither the name of the University of California, Santa Cruz nor the
 | 
			
		||||
#       names of its contributors may be used to endorse or promote products
 | 
			
		||||
#       derived from this software without specific prior written permission.
 | 
			
		||||
#
 | 
			
		||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
			
		||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
			
		||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
			
		||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
			
		||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
# POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package SNMP::Info::Layer3::CheckPoint;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::CheckPoint::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::CheckPoint::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::LLDP::MIBS,
 | 
			
		||||
    'CHECKPOINT-MIB'      => 'fwProduct',
 | 
			
		||||
    'UCD-SNMP-MIB'        => 'versionTag',
 | 
			
		||||
    'NET-SNMP-TC'         => 'netSnmpAgentOIDs',
 | 
			
		||||
    'NET-SNMP-EXTEND-MIB' => 'nsExtendNumEntries',
 | 
			
		||||
    'HOST-RESOURCES-MIB'  => 'hrSystem',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%GLOBALS = (
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    'netsnmp_vers'   => 'versionTag',
 | 
			
		||||
    'hrSystemUptime' => 'hrSystemUptime',
 | 
			
		||||
    
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::LLDP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # Net-SNMP Extend table that could but customize to add a the CheckPoint version
 | 
			
		||||
    'extend_output_table' => 'nsExtendOutputFull',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub vendor {
 | 
			
		||||
    return 'checkpoint';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub model {
 | 
			
		||||
    my $ckp = shift;
 | 
			
		||||
    my $id = $ckp->id;
 | 
			
		||||
 | 
			
		||||
    my $model = &SNMP::translateObj($id);
 | 
			
		||||
 | 
			
		||||
    if (defined $model) {
 | 
			
		||||
        $model =~ s/^checkPoint//;
 | 
			
		||||
        return $model;
 | 
			
		||||
    } else {
 | 
			
		||||
        return $id;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os {
 | 
			
		||||
    return 'checkpoint';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub os_ver {
 | 
			
		||||
    my $ckp = shift;
 | 
			
		||||
    my $extend_table = $ckp->extend_output_table() || {};
 | 
			
		||||
 | 
			
		||||
    my $descr   = $ckp->description();
 | 
			
		||||
    my $vers    = $ckp->netsnmp_vers();
 | 
			
		||||
    my $os_ver  = undef;
 | 
			
		||||
 | 
			
		||||
    foreach my $ex (keys %$extend_table) {
 | 
			
		||||
        (my $name = pack('C*',split(/\./,$ex))) =~ s/[^[:print:]]//g;
 | 
			
		||||
        if ($name eq 'ckpVersion') {
 | 
			
		||||
            return $1 if ($extend_table->{$ex} =~ /^This is Check Point's software version (.*)$/);
 | 
			
		||||
            last;
 | 
			
		||||
        }
 | 
			
		||||
    } 
 | 
			
		||||
 | 
			
		||||
    $os_ver = $1 if ( $descr =~ /^\S+\s+\S+\s+(\S+)\s+/ );
 | 
			
		||||
    if ($vers) {
 | 
			
		||||
        $os_ver = "???" unless defined($os_ver);
 | 
			
		||||
        $os_ver .= " / Net-SNMP " . $vers;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $os_ver;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub serial {
 | 
			
		||||
    my $ckp = shift;
 | 
			
		||||
    my $extend_table = $ckp->extend_output_table() || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $ex (keys %$extend_table) {
 | 
			
		||||
        (my $name = pack('C*',split(/\./,$ex))) =~ s/[^[:print:]]//g;
 | 
			
		||||
        if ($name eq 'ckpAsset') {
 | 
			
		||||
            return $1 if ($extend_table->{$ex} =~ /Serial Number: (\S+)/);
 | 
			
		||||
            last;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return '';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub layers {
 | 
			
		||||
    return '01001100';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# sysUptime gives us the time since the SNMP daemon has restarted,
 | 
			
		||||
# so return the system uptime since that's probably what the user
 | 
			
		||||
# wants.  (Caution: this could cause trouble if using
 | 
			
		||||
# sysUptime-based discontinuity timers or other TimeStamp
 | 
			
		||||
# objects.
 | 
			
		||||
sub uptime {
 | 
			
		||||
    my $ckp = shift;
 | 
			
		||||
    my $uptime;
 | 
			
		||||
 | 
			
		||||
    $uptime = $ckp->hrSystemUptime();
 | 
			
		||||
    return $uptime if defined $uptime;
 | 
			
		||||
 | 
			
		||||
    return $ckp->SUPER::uptime();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_ignore {
 | 
			
		||||
    my $l3      = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $interfaces = $l3->interfaces($partial) || {};
 | 
			
		||||
 | 
			
		||||
    my %i_ignore;
 | 
			
		||||
    foreach my $if ( keys %$interfaces ) {
 | 
			
		||||
 | 
			
		||||
        # lo0 etc
 | 
			
		||||
        if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
 | 
			
		||||
            $i_ignore{$if}++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_ignore;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::CheckPoint - SNMP Interface to CheckPoint Devices
 | 
			
		||||
 | 
			
		||||
=head1 AUTHORS
 | 
			
		||||
 | 
			
		||||
Ambroise Rosset
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you. 
 | 
			
		||||
 my $ckp = new SNMP::Info(
 | 
			
		||||
                          AutoSpecify => 1,
 | 
			
		||||
                          Debug       => 1,
 | 
			
		||||
                          DestHost    => 'myrouter',
 | 
			
		||||
                          Community   => 'public',
 | 
			
		||||
                          Version     => 2
 | 
			
		||||
                        ) 
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $ckp->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass : $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Generic Net-SNMP devices
 | 
			
		||||
 | 
			
		||||
=head2 WARNING
 | 
			
		||||
 | 
			
		||||
To correctly and completelly work, you should add the following line in the file C</etc/snmp/snmpd.local.conf> on each of your CheckPoint devices:
 | 
			
		||||
 | 
			
		||||
 # Netdisco SNMP configuration
 | 
			
		||||
 extend  ckpVersion /opt/CPsuite-R77/fw1/bin/fw ver
 | 
			
		||||
 extend  ckpAsset /bin/clish -c 'show asset all'
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<UCD-SNMP-MIB>
 | 
			
		||||
 | 
			
		||||
=item F<NET-SNMP-TC>
 | 
			
		||||
 | 
			
		||||
=item F<HOST-RESOURCES-MIB>
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ckp->vendor()
 | 
			
		||||
 | 
			
		||||
Returns 'checkpoint'.
 | 
			
		||||
 | 
			
		||||
=item $ckp->model()
 | 
			
		||||
 | 
			
		||||
Return the model type of the CheckPoint device (Based on the sysObjectOID translation).
 | 
			
		||||
 | 
			
		||||
=item $ckp->os()
 | 
			
		||||
 | 
			
		||||
Returns the OS extracted from C<sysDescr>.
 | 
			
		||||
 | 
			
		||||
=item $ckp->os_ver()
 | 
			
		||||
 | 
			
		||||
Returns the software version extracted from C<sysDescr>, along
 | 
			
		||||
with the Net-SNMP version.
 | 
			
		||||
 | 
			
		||||
=item $ckp->uptime()
 | 
			
		||||
 | 
			
		||||
Returns the system uptime instead of the agent uptime.
 | 
			
		||||
NOTE: discontinuity timers and other Time Stamp based objects
 | 
			
		||||
are based on agent uptime, so use orig_uptime().
 | 
			
		||||
 | 
			
		||||
=item $ckp->serial()
 | 
			
		||||
 | 
			
		||||
Return the serial number of the device if the SNMP server is configured as indicated previously.
 | 
			
		||||
Return '' in other case.
 | 
			
		||||
 | 
			
		||||
=item $ckp->layers()
 | 
			
		||||
 | 
			
		||||
Return '01001100'.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP> for details.
 | 
			
		||||
 | 
			
		||||
=head1 TABLE ENTRIES
 | 
			
		||||
 | 
			
		||||
These are methods that return tables of information in the form of a reference
 | 
			
		||||
to a hash.
 | 
			
		||||
 | 
			
		||||
=head2 Overrides
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $ckp->i_ignore()
 | 
			
		||||
 | 
			
		||||
Returns reference to hash.  Increments value of IID if port is to be ignored.
 | 
			
		||||
 | 
			
		||||
Ignores loopback
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP> for details.
 | 
			
		||||
 | 
			
		||||
=head1 NOTES
 | 
			
		||||
 | 
			
		||||
In order to cause SNMP::Info to classify your device into this class, it
 | 
			
		||||
may be necessary to put a configuration line into your F<snmpd.conf>
 | 
			
		||||
similar to
 | 
			
		||||
 | 
			
		||||
  sysobjectid .1.3.6.1.4.1.8072.3.2.N
 | 
			
		||||
 | 
			
		||||
where N is the object ID for your OS from the C<NET-SNMP-TC> MIB (or
 | 
			
		||||
255 if not listed).  Some Net-SNMP installations default to an
 | 
			
		||||
incorrect return value for C<system.sysObjectId>.
 | 
			
		||||
 | 
			
		||||
In order to recognize a Net-SNMP device as Layer3, it may be necessary
 | 
			
		||||
to put a configuration line similar to
 | 
			
		||||
 | 
			
		||||
  sysservices 76
 | 
			
		||||
 | 
			
		||||
in your F<snmpd.conf>.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -31,59 +31,70 @@
 | 
			
		||||
package SNMP::Info::Layer3::Cisco;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoVTP;
 | 
			
		||||
use SNMP::Info::LLDP;
 | 
			
		||||
use SNMP::Info::CDP;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::CiscoImage;
 | 
			
		||||
use SNMP::Info::CiscoRTT;
 | 
			
		||||
use SNMP::Info::CiscoQOS;
 | 
			
		||||
use SNMP::Info::CiscoConfig;
 | 
			
		||||
use SNMP::Info::CiscoPower;
 | 
			
		||||
use SNMP::Info::CiscoStpExtensions;
 | 
			
		||||
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::Cisco::ISA = qw/SNMP::Info::CiscoVTP
 | 
			
		||||
    SNMP::Info::LLDP SNMP::Info::CDP
 | 
			
		||||
    SNMP::Info::CiscoStats SNMP::Info::CiscoRTT
 | 
			
		||||
    SNMP::Info::CiscoQOS SNMP::Info::CiscoConfig
 | 
			
		||||
    SNMP::Info::CiscoPower SNMP::Info::CiscoStpExtensions
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::Cisco::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '2.05';
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = (
 | 
			
		||||
    %SNMP::Info::Layer3::MIBS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::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::LLDP::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',
 | 
			
		||||
    %SNMP::Info::Layer3::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoPower::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoQOS::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::LLDP::GLOBALS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::GLOBALS,
 | 
			
		||||
    'eigrp_id' => 'cEigrpAsRouterId',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::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::LLDP::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::FUNCS,
 | 
			
		||||
 | 
			
		||||
    # EIGRP
 | 
			
		||||
@@ -92,33 +103,44 @@ $VERSION = '2.05';
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStpExtensions::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoPower::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoConfig::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoQOS::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoRTT::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoImage::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::MUNGE,
 | 
			
		||||
    %SNMP::Info::CDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::LLDP::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoVTP::MUNGE,
 | 
			
		||||
    'eigrp_peers' => \&SNMP::Info::munge_ip,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
sub i_vlan {
 | 
			
		||||
    my ($cisco)   = shift;
 | 
			
		||||
    my ($partial) = shift;
 | 
			
		||||
    my $cisco   = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my ($i_type)  = $cisco->i_type($partial);
 | 
			
		||||
    my ($i_descr) = $cisco->i_description($partial);
 | 
			
		||||
    my %i_vlan;
 | 
			
		||||
    my $i_type  = $cisco->i_type($partial);
 | 
			
		||||
    my $i_descr = $cisco->i_description($partial);
 | 
			
		||||
    my $i_vlan  = $cisco->SUPER::i_vlan($partial);
 | 
			
		||||
 | 
			
		||||
    foreach my $idx ( keys %$i_descr ) {
 | 
			
		||||
        if ( $i_type->{$idx} eq 'l2vlan' || $i_type->{$idx} eq 135 ) {
 | 
			
		||||
        next unless $i_type->{$idx};
 | 
			
		||||
        if (   $i_type->{$idx} eq 'l2vlan'
 | 
			
		||||
            || $i_type->{$idx} eq '135' && !defined $i_vlan->{$idx} )
 | 
			
		||||
        {
 | 
			
		||||
            if ( $i_descr->{$idx} =~ /\.(\d+)$/ ) {
 | 
			
		||||
                $i_vlan{$idx} = $1;
 | 
			
		||||
                $i_vlan->{$idx} = $1;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return \%i_vlan;
 | 
			
		||||
    return $i_vlan;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub cisco_comm_indexing { 
 | 
			
		||||
    my $cisco = shift;
 | 
			
		||||
    # If we get a VTP version, it's *extremely* likely that the device needs community based indexing
 | 
			
		||||
    my $vtp = $cisco->vtp_version() || '0';
 | 
			
		||||
    return ($vtp ne '0');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -127,7 +149,9 @@ __END__
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
 | 
			
		||||
that are not covered in other classes.
 | 
			
		||||
that are not covered in other classes and the base L3 Cisco class for other
 | 
			
		||||
device specific L3 Cisco classes.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
@@ -151,7 +175,8 @@ Max Baker
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Generic Cisco Routers running IOS
 | 
			
		||||
Subclass for Generic Cisco Routers running IOS and the base L3 Cisco class
 | 
			
		||||
for other device specific L3 Cisco classes.
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
@@ -159,12 +184,12 @@ Subclass for Generic Cisco Routers running IOS
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoVTP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoImage
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoRTT
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoQOS
 | 
			
		||||
@@ -173,6 +198,8 @@ Subclass for Generic Cisco Routers running IOS
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Power
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
@@ -187,12 +214,12 @@ Subclass for Generic Cisco Routers running IOS
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
@@ -201,6 +228,8 @@ 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::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
@@ -211,20 +240,25 @@ These are methods that return scalar value from SNMP
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item $cisco->vendor()
 | 
			
		||||
 | 
			
		||||
    Returns 'cisco'
 | 
			
		||||
 | 
			
		||||
=item $cisco->eigrp_id()
 | 
			
		||||
 | 
			
		||||
(C<cEigrpAsRouterId>)
 | 
			
		||||
 | 
			
		||||
=item $switch->cisco_comm_indexing()
 | 
			
		||||
 | 
			
		||||
Returns 1 when the device is likely to need vlan indexing.
 | 
			
		||||
Determined by checking C<vtpVersion>.
 | 
			
		||||
 | 
			
		||||
=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::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.
 | 
			
		||||
@@ -233,10 +267,6 @@ See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
@@ -253,6 +283,10 @@ See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
 | 
			
		||||
 | 
			
		||||
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::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
 | 
			
		||||
@@ -280,6 +314,10 @@ Returns a mapping between C<ifIndex> and the PVID or default VLAN.
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::LLDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CDP
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
@@ -288,10 +326,6 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
@@ -308,6 +342,10 @@ See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
							
								
								
									
										195
									
								
								lib/SNMP/Info/Layer3/CiscoASA.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								lib/SNMP/Info/Layer3/CiscoASA.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,195 @@
 | 
			
		||||
# 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 warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::CiscoASA::ISA = qw/
 | 
			
		||||
    SNMP::Info::CiscoStats
 | 
			
		||||
    SNMP::Info::Layer3
 | 
			
		||||
    Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::CiscoASA::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, );
 | 
			
		||||
 | 
			
		||||
%GLOBALS
 | 
			
		||||
    = ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS, );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
    %SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
    %SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
    'mac_table' => 'ifPhysAddress',
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = (
 | 
			
		||||
    %SNMP::Info::Layer3::MUNGE,
 | 
			
		||||
    %SNMP::Info::CiscoStats::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 bogus OUI
 | 
			
		||||
        if ( $mac !~ m/(0{1,2}:){2}(00|01)/ ) {
 | 
			
		||||
            push( @macs, $mac );
 | 
			
		||||
        }
 | 
			
		||||
        @macs = sort(@macs);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # return the least mac
 | 
			
		||||
    return $macs[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub i_description {
 | 
			
		||||
    my $self    = shift;
 | 
			
		||||
    my $partial = shift;
 | 
			
		||||
 | 
			
		||||
    my $i_descr = $self->orig_i_description($partial) || {};
 | 
			
		||||
 | 
			
		||||
    foreach my $ifindex ( keys %$i_descr ) {
 | 
			
		||||
        $i_descr->{$ifindex} =~ /'(.*)'/;
 | 
			
		||||
        $i_descr->{$ifindex} = $1
 | 
			
		||||
            if defined $1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $i_descr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
__END__
 | 
			
		||||
 | 
			
		||||
=head1 NAME
 | 
			
		||||
 | 
			
		||||
SNMP::Info::Layer3::CiscoASA - Cisco Adaptive Security Appliance
 | 
			
		||||
 | 
			
		||||
=head1 AUTHOR
 | 
			
		||||
 | 
			
		||||
Moe Kraus
 | 
			
		||||
 | 
			
		||||
=head1 SYNOPSIS
 | 
			
		||||
 | 
			
		||||
 # Let SNMP::Info determine the correct subclass for you.
 | 
			
		||||
 my $cisco = new SNMP::Info(
 | 
			
		||||
                        AutoSpecify => 1,
 | 
			
		||||
                        Debug       => 1,
 | 
			
		||||
                        # These arguments are passed directly to SNMP::Session
 | 
			
		||||
                        DestHost    => 'myswitch',
 | 
			
		||||
                        Community   => 'public',
 | 
			
		||||
                        Version     => 2
 | 
			
		||||
                        )
 | 
			
		||||
    or die "Can't connect to DestHost.\n";
 | 
			
		||||
 | 
			
		||||
 my $class      = $asa->class();
 | 
			
		||||
 print "SNMP::Info determined this device to fall under subclass: $class\n";
 | 
			
		||||
 | 
			
		||||
=head1 DESCRIPTION
 | 
			
		||||
 | 
			
		||||
Subclass for Cisco ASA Devices
 | 
			
		||||
 | 
			
		||||
=head2 Inherited Classes
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"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 $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 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"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.
 | 
			
		||||
 | 
			
		||||
=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::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
							
								
								
									
										232
									
								
								lib/SNMP/Info/Layer3/CiscoFWSM.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										232
									
								
								lib/SNMP/Info/Layer3/CiscoFWSM.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,232 @@
 | 
			
		||||
# 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 warnings;
 | 
			
		||||
use Exporter;
 | 
			
		||||
use SNMP::Info::CiscoStats;
 | 
			
		||||
use SNMP::Info::Layer3;
 | 
			
		||||
 | 
			
		||||
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::CiscoStats
 | 
			
		||||
	SNMP::Info::Layer3
 | 
			
		||||
	Exporter/;
 | 
			
		||||
@SNMP::Info::Layer3::CiscoFWSM::EXPORT_OK = qw//;
 | 
			
		||||
 | 
			
		||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
 | 
			
		||||
 | 
			
		||||
$VERSION = '3.52';
 | 
			
		||||
 | 
			
		||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoStats::MIBS, );
 | 
			
		||||
 | 
			
		||||
%GLOBALS
 | 
			
		||||
	= ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS, );
 | 
			
		||||
 | 
			
		||||
%FUNCS = (
 | 
			
		||||
	%SNMP::Info::Layer3::FUNCS,
 | 
			
		||||
	%SNMP::Info::CiscoStats::FUNCS,
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoStats::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::CiscoStats
 | 
			
		||||
 | 
			
		||||
=item SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head2 Required MIBs
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item Inherited Classes' MIBs
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
 | 
			
		||||
 | 
			
		||||
=back
 | 
			
		||||
 | 
			
		||||
=head1 GLOBALS
 | 
			
		||||
 | 
			
		||||
=head2 Globals imported from SNMP::Info::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"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
 | 
			
		||||
 | 
			
		||||
=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::CiscoStats
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=head2 Table Methods imported from SNMP::Info::Layer3
 | 
			
		||||
 | 
			
		||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user