Compare commits
	
		
			657 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | f7d4a78f41 | ||
|  | 4b15add4ff | ||
|  | 9842bb2dc2 | ||
|  | a59af743a9 | ||
|  | f65301f233 | ||
|  | 7fd2e31913 | ||
|  | c514baa9b2 | ||
|  | ac18ab7b10 | ||
|  | 3acf12ada3 | ||
|  | ce60c79008 | ||
|  | a665fe335b | ||
|  | ffb28b7e34 | ||
|  | f09c705e71 | ||
|  | 3de22ad136 | ||
|  | d36ef515a6 | ||
|  | 75db1771b7 | ||
|  | 4020a430f5 | ||
|  | d404cbd154 | ||
|  | d5f68ca4e7 | ||
|  | dc3d1e0b46 | ||
|  | e885efa921 | ||
|  | dcf2c0ee54 | ||
|  | feaeba8be4 | ||
|  | b4d19c937c | ||
|  | 7846cbce1a | ||
|  | 74b25e4c88 | ||
|  | ef2500dcc7 | ||
|  | 70379aaf6e | ||
|  | 4d471b38fb | ||
|  | 895b8ed373 | ||
|  | efb32ac10d | ||
|  | 7f3028cbdb | ||
|  | 1c1dbe6464 | ||
|  | b98b68c718 | ||
|  | f55edced32 | ||
|  | 0d7b482edd | ||
|  | 933766120f | ||
|  | fbfa2ec154 | ||
|  | 0e75c44cb8 | ||
|  | bce84023ca | ||
|  | a0cd7c57e2 | ||
|  | d535cea7db | ||
|  | 21f3b2b199 | ||
|  | 9f12bcf676 | ||
|  | dd1688a587 | ||
|  | 8c50ef81af | ||
|  | 8b753c83af | ||
|  | 7e3300552d | ||
|  | a3be7337bb | ||
|  | 1bf87a4cb2 | ||
|  | d4269ad79b | ||
|  | 807cd20da0 | ||
|  | 23a247c048 | ||
|  | 2b3674dcae | ||
|  | 86e120ea5f | ||
|  | 48725546a2 | ||
|  | 4731bbfe2f | ||
|  | 6dc369efbc | ||
|  | afc8eefaf1 | ||
|  | d8a532febe | ||
|  | fe39d38897 | ||
|  | 44cb254ee0 | ||
|  | 72d6d87bf9 | ||
|  | 81b8082fd4 | ||
|  | 948d96ed28 | ||
|  | 765a6417b2 | ||
|  | 5a895a09ca | ||
|  | 2773594274 | ||
|  | 846bb46e33 | ||
|  | 33d69e8dea | ||
|  | bbf5a5a570 | ||
|  | 651169f726 | ||
|  | 9b8dc0916c | ||
|  | f7ca5dfde2 | ||
|  | 80b88fbbb4 | ||
|  | 98281e7df6 | ||
|  | 470aca5c68 | ||
|  | 8f0183eeb8 | ||
|  | b5d88076a8 | ||
|  | 56ceb86f97 | ||
|  | abbc3d4a63 | ||
|  | d0609781e8 | ||
|  | 2ff3021eae | ||
|  | 31c286ca57 | ||
|  | dd982373a7 | ||
|  | 42d3df0e9c | ||
|  | 774339e98f | ||
|  | b0c1c7e2a7 | ||
|  | 36f882d916 | ||
|  | b1225583cd | ||
|  | b491a6921c | ||
|  | 63fedc6a41 | ||
|  | aefd0364fb | ||
|  | 3ae7073198 | ||
|  | 9c306812f9 | ||
|  | 3790a2fcb2 | ||
|  | 0b86645a63 | ||
|  | fa206be639 | ||
|  | 350ee49293 | ||
|  | 210d4d48a7 | ||
|  | ad8224bcec | ||
|  | 9943dff277 | ||
|  | bf0b7d989f | ||
|  | 6ec90b3b9b | ||
|  | 2a2214a0ac | ||
|  | 31b231804f | ||
|  | a4c66663c1 | ||
|  | b9e054093a | ||
|  | 1c7320ce1e | ||
|  | 50841b5109 | ||
|  | babbbb4e57 | ||
|  | e2544129bc | ||
|  | 39b5b3af9f | ||
|  | a263f54744 | ||
|  | 543072ca25 | ||
|  | 39356d72b4 | ||
|  | e013ac3a20 | ||
|  | a85c7a0404 | ||
|  | 4852ed4668 | ||
|  | d36fce44d0 | ||
|  | 60e63ac9cc | ||
|  | a97c48546c | ||
|  | dd96147712 | ||
|  | 912bf62e9b | ||
|  | 0791b7cccb | ||
|  | 78c194faee | ||
|  | 9d00126c83 | ||
|  | 6fa54dd4db | ||
|  | eb6420125e | ||
|  | 51be2d5dc5 | ||
|  | 762a01e619 | ||
|  | f0fb351137 | ||
|  | 6d39026616 | ||
|  | 723f8ea744 | ||
|  | f941f432e9 | ||
|  | 631f99f97b | ||
|  | 1840089789 | ||
|  | 36029e38a7 | ||
|  | 3abffc4d59 | ||
|  | 0f01c6c07c | ||
|  | 68b001105d | ||
|  | d459dd7f8c | ||
|  | 75a00fabe9 | ||
|  | 091a3692e3 | ||
|  | 3bcc522590 | ||
|  | 6c8d39d746 | ||
|  | b6720a2b43 | ||
|  | 6753b795b9 | ||
|  | cefbcce8e3 | ||
|  | 910c5420e3 | ||
|  | 02c8ed0764 | ||
|  | fda13addf0 | ||
|  | 211a06dbf1 | ||
|  | e886190e8e | ||
|  | 8b3a1fd357 | ||
|  | e7adf92b59 | ||
|  | 7de14a2bd9 | ||
|  | f37225ee9a | ||
|  | 52f9042ef0 | ||
|  | d38ef69120 | ||
|  | 6341ad15f8 | ||
|  | f3f01d5f15 | ||
|  | 23d11551c6 | ||
|  | 73b63c8379 | ||
|  | 2652998aba | ||
|  | 254bfd11a3 | ||
|  | 2c61248016 | ||
|  | 45e56b332e | ||
|  | 8003691e64 | ||
|  | 25b1801fe4 | ||
|  | 737bb252a7 | ||
|  | 14e0aa0952 | ||
|  | e7d83a5918 | ||
|  | bfbb2fb2ab | ||
|  | c8f686b7aa | ||
|  | 77fa064db5 | ||
|  | 6b70ccfd79 | ||
|  | 9b1995e90f | ||
|  | 75785f70c7 | ||
|  | ea9ad92cc4 | ||
|  | ad8762a7c4 | ||
|  | c73bc0ca2c | ||
|  | 07de5e53e3 | ||
|  | 141812bf4d | ||
|  | 2308826147 | ||
|  | 01fa098078 | ||
|  | 167cc2f3fa | ||
|  | ea53f79bb8 | ||
|  | 4b75ef1889 | ||
|  | c4ce6a2062 | ||
|  | 9e4e0e3510 | ||
|  | c0228965f4 | ||
|  | 0896bd881c | ||
|  | 42395d49fd | ||
|  | e08d22d51c | ||
|  | f0b429039e | ||
|  | d63baa2473 | ||
|  | e8b4acbee6 | ||
|  | b4734ea607 | ||
|  | 6698b049a4 | ||
|  | 68861fabfb | ||
|  | d93e3ab1b6 | ||
|  | bfd71b5add | ||
|  | 9c8e8fa4e0 | ||
|  | 2e2c6958d6 | ||
|  | 4ba91f9df8 | ||
|  | 3b604723bd | ||
|  | a2877729ff | ||
|  | 605ae68f6b | ||
|  | ef8afd8b65 | ||
|  | 9365c67a6b | ||
|  | 8e3f10673e | ||
|  | cc95604bd9 | ||
|  | 6799312ad0 | ||
|  | 8dee0fcd12 | ||
|  | dca78048c7 | ||
|  | 014d32cec1 | ||
|  | 477d845c39 | ||
|  | 6e5155ffbf | ||
|  | 39679992f0 | ||
|  | 4dee43a863 | ||
|  | 5c599bd3d2 | ||
|  | be0dbf6953 | ||
|  | a59572b392 | ||
|  | 19cdb388e5 | ||
|  | e68fa13289 | ||
|  | d938a2c0d6 | ||
|  | 16285ce2eb | ||
|  | e356189010 | ||
|  | 4230a07c94 | ||
|  | f2b0f67b5f | ||
|  | a8766a0b0b | ||
|  | b78b1b4860 | ||
|  | 6118b0d012 | ||
|  | ca48defd24 | ||
|  | 93787c4c45 | ||
|  | 5562144209 | ||
|  | b28f81adbb | ||
|  | 64846ed2de | ||
|  | d7d747af67 | ||
|  | 41e9332420 | ||
|  | 23613800b2 | ||
|  | 8100461520 | ||
|  | 07afff6ef0 | ||
|  | 400c26a1d7 | ||
|  | b6f7df332b | ||
|  | e5eee009b3 | ||
|  | bb731c6368 | ||
|  | a418ba0a1e | ||
|  | cea462662d | ||
|  | f3a8b1171b | ||
|  | bb773ccc0a | ||
|  | 61dc499369 | ||
|  | d806795a86 | ||
|  | 91f92f0fb9 | ||
|  | bde8da5e6b | ||
|  | f134368e6d | ||
|  | a6ff166e4e | ||
|  | 3ea6bd6217 | ||
|  | 6405ebfc3e | ||
|  | 94ab114cd3 | ||
|  | 954f58fdbc | ||
|  | 8232e783fa | ||
|  | 5aa21deb07 | ||
|  | b7ac11222a | ||
|  | b24da8c380 | ||
|  | ab2be759af | ||
|  | 78e5528c0d | ||
|  | 01ce4238dd | ||
|  | a82e8e32a0 | ||
|  | 770ab9c8ec | ||
|  | f63a71910c | ||
|  | 8fa27f8844 | ||
|  | ea59fa2c2d | ||
|  | a1769aa905 | ||
|  | 78119d6547 | ||
|  | f27d76fa9d | ||
|  | 4f8534169a | ||
|  | f531c9d9a7 | ||
|  | 1a80138026 | ||
|  | 4ff904f3cd | ||
|  | 721193ccb8 | ||
|  | b263fa4375 | ||
|  | 4681004b52 | ||
|  | 0ab688964f | ||
|  | 7e0ef60e24 | ||
|  | 41339c8df4 | ||
|  | 119c077d25 | ||
|  | 9af3f7c579 | ||
|  | e7c93b7abd | ||
|  | 20b655c7a2 | ||
|  | 9fca5b1e42 | ||
|  | 1c581f8e8f | ||
|  | 8d35e15624 | ||
|  | cf42fe1496 | ||
|  | 1af11bd088 | ||
|  | 073ec319e7 | ||
|  | 5852c3548b | ||
|  | 2344a1eacf | ||
|  | d0887fbea7 | ||
|  | e5ebda1b1e | ||
|  | 8d1681dbfc | ||
|  | 7221797826 | ||
|  | f2fdbb077c | ||
|  | a6fdb107b4 | ||
|  | 7f31038462 | ||
|  | 5fb7c78619 | ||
|  | 603345205a | ||
|  | bd85ebc8d6 | ||
|  | 2aca6d9300 | ||
|  | 4919cb0f69 | ||
|  | d134c342e8 | ||
|  | b1c7e78d12 | ||
|  | 0a0766afbd | ||
|  | 2d39911cba | ||
|  | 3bf60002f4 | ||
|  | 42db01335e | ||
|  | 752e1c632c | ||
|  | 892d2014ca | ||
|  | 1fdc486cd5 | ||
|  | 9e7f7f734e | ||
|  | e311f8a5c6 | ||
|  | 82755ab8db | ||
|  | 62823e3d83 | ||
|  | 66077c9662 | ||
|  | 74e129154b | ||
|  | 75880d9134 | ||
|  | 245fe93be4 | ||
|  | 54a0baa2fa | ||
|  | 4e18ccc9e2 | ||
|  | 9ed5a187a9 | ||
|  | a636ba6117 | ||
|  | facdf0aafe | ||
|  | 75dcf74148 | ||
|  | e252dac59c | ||
|  | 9d384f2bc2 | ||
|  | cc9a1c9f47 | ||
|  | b43eafd09a | ||
|  | 141470fdf4 | ||
|  | 2e18464635 | ||
|  | 87a287e0c9 | ||
|  | a38eafbf56 | ||
|  | 81c7203642 | ||
|  | c515a5e4a1 | ||
|  | 02e6807e44 | ||
|  | 90bb0ef071 | ||
|  | 209988cf9e | ||
|  | da130926a9 | ||
|  | 4c51c29428 | ||
|  | 2301d2e60a | ||
|  | 53a5b5aa0a | ||
|  | d13adfee80 | ||
|  | 9752bf2878 | ||
|  | 9949eeb389 | ||
|  | aceed9cc52 | ||
|  | 0371ca35d6 | ||
|  | ce0a350ef2 | ||
|  | 3b58ba8678 | ||
|  | a69b45d849 | ||
|  | ad0a1044b9 | ||
|  | 5336ec2db2 | ||
|  | e20cd6dd02 | ||
|  | 66f16f6617 | ||
|  | 0755487e02 | ||
|  | afeb37ae5e | ||
|  | cc05fb927f | ||
|  | facdf5b7a7 | ||
|  | 66bedd4d54 | ||
|  | 3a3c1efe46 | ||
|  | 1a069c2b52 | ||
|  | f7de9ffbc6 | ||
|  | 3c6cfa8ecf | ||
|  | 585d01895b | ||
|  | 63cac2a3a8 | ||
|  | 0623fbfdf1 | ||
|  | 0c711269ae | ||
|  | f676d27a3b | ||
|  | 64167df588 | ||
|  | 398f3ee74b | ||
|  | 125f02b8a2 | ||
|  | eeeabeec94 | ||
|  | 5fe0ebaeda | ||
|  | fda59f51f7 | ||
|  | e8de74c6a5 | ||
|  | da6716b107 | ||
|  | 62267f4e8e | ||
|  | fd1c91edac | ||
|  | a0b2010994 | ||
|  | bda796ae98 | ||
|  | 8b3b03b312 | ||
|  | cbc756a3f8 | ||
|  | 9af7a7661c | ||
|  | eab89e4736 | ||
|  | 8391cee4f3 | ||
|  | fcd0e30d64 | ||
|  | 4a454c9431 | ||
|  | cd751071e1 | ||
|  | c921e8b35c | ||
|  | 60d5591401 | ||
|  | 98e8e57747 | ||
|  | f6a4f937ee | ||
|  | 1e5eda927c | ||
|  | c6eb73bc7b | ||
|  | c49d8ab921 | ||
|  | 27b310ee68 | ||
|  | f6d0fb1d7e | ||
|  | ddc5fd8c96 | ||
|  | 26b13fbcd4 | ||
|  | 91b98085f6 | ||
|  | 1c948d6e45 | ||
|  | 76cbb05f19 | ||
|  | e7fcd98107 | ||
|  | 090d94191b | ||
|  | 2c3a6a3c6e | ||
|  | 814083e2fa | ||
|  | 7621b30bc2 | ||
|  | 9e2e55dcb3 | ||
|  | f8a1d5bc7a | ||
|  | 1a65be101e | ||
|  | 4c5d0a5695 | ||
|  | f8b3381d16 | ||
|  | 8a41e5063a | ||
|  | 24a84cdc25 | ||
|  | 25354e1f3e | ||
|  | 2025044952 | ||
|  | d00dcdad85 | ||
|  | fc069c13f5 | ||
|  | 69430f4a21 | ||
|  | a83855157b | ||
|  | 5ce80ba4ee | ||
|  | 16e96d9fcf | ||
|  | ac753c5970 | ||
|  | 313e187399 | ||
|  | f5aaee6c89 | ||
|  | c8b4f8f4fd | ||
|  | 6113dd3b98 | ||
|  | e21f22bb3b | ||
|  | bb4578dea5 | ||
|  | e83ca6fbe3 | ||
|  | ae9963cf85 | ||
|  | 650aef9c2d | ||
|  | 397b14da22 | ||
|  | 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 | 
							
								
								
									
										56
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| <!--- | ||||
|  | ||||
| READ THIS FIRST! | ||||
| ---------------- | ||||
|  | ||||
| the more info you can provide, the easier it is for us the help you, so please | ||||
| fill out as many of the items below as possible. | ||||
|  | ||||
| Provide a general summary of the issue in the Title above | ||||
|  | ||||
| when including netdisco config snippets, whitespace matters since it's a yaml file | ||||
| for github issues it really helps if you include the relevant config parts in a codeblock (code fencing) | ||||
| see the "code" subject on https://guides.github.com/features/mastering-markdown/ for that) | ||||
| this should preserve spaces in the issue tracker and make troubleshooting quicker | ||||
|  | ||||
| --> | ||||
|  | ||||
|  | ||||
| ## Expected Behavior | ||||
| <!--- If you're describing a bug, tell us what should happen --> | ||||
| <!--- If you're suggesting a change/improvement, tell us how it should work --> | ||||
|  | ||||
| ## Current Behavior | ||||
| <!--- If describing a bug, tell us what happens instead of the expected behavior --> | ||||
| <!--- If suggesting a change/improvement, explain the difference from current behavior --> | ||||
|  | ||||
| ## Possible Solution | ||||
| <!--- Not obligatory, but suggest a fix/reason for the bug, --> | ||||
| <!--- or ideas how to implement the addition or change --> | ||||
|  | ||||
| ## Steps to Reproduce (for bugs) | ||||
| <!--- Provide a link to a live example, or an unambiguous set of steps to --> | ||||
| <!--- reproduce this bug. Include code to reproduce, if relevant, or attach screenshots --> | ||||
| 1.  | ||||
| 2.  | ||||
| 3.  | ||||
| 4.  | ||||
|  | ||||
| ## Context | ||||
| <!--- How has this issue affected you? What are you trying to accomplish? --> | ||||
| <!--- Providing context helps us come up with a solution that is most useful in the real world --> | ||||
|  | ||||
| ## Your Device | ||||
| <!--- Some basic info about your device will help out pinpointing the issue more easily --> | ||||
| <!--- also, snmpwalk output of the following oid helps out a lot: .1.3.6.1.2.1.1 --> | ||||
| <!--- this is the system leaf of the snmp mib-2 --> | ||||
| * Vendor: | ||||
| * Device Model: | ||||
| * Operating System Version: | ||||
| * Snmpwalk output of .1.3.6.1.2.1.1: | ||||
|  | ||||
|  | ||||
| ## Your Environment | ||||
| <!--- Include as many relevant details about the environment you experienced the bug in --> | ||||
| * SNMP::Info version used:  | ||||
| * Netdisco version (if used):  | ||||
							
								
								
									
										19
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| name: GitHub Release on Tag | ||||
| on: | ||||
|   push: | ||||
|     tags: | ||||
|       - '[0-9].[0-9][0-9]' | ||||
| jobs: | ||||
|   release_snmp_info: | ||||
|     if: github.repository == 'netdisco/snmp-info' | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - name: Get the Tag | ||||
|         id: get_tag | ||||
|         run: echo ::set-output name=TAGVALUE::${GITHUB_REF#refs/tags/} | ||||
|       - name: Release | ||||
|         uses: softprops/action-gh-release@v1 | ||||
|         with: | ||||
|           name: SNMP::Info ${{ steps.get_tag.outputs.TAGVALUE }} | ||||
							
								
								
									
										122
									
								
								.github/workflows/test_and_publish.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								.github/workflows/test_and_publish.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | ||||
| name: Test and Publish SNMP::Info | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|     inputs: | ||||
|       success_irc_squawk: | ||||
|         description: 'Squawk to IRC on successful tests'      | ||||
|         required: false | ||||
|         default:  false | ||||
|       debug_test_enabled: | ||||
|         description: 'With build and test debug' | ||||
|         required: false | ||||
|         default:  false | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|     tags: | ||||
|       - '[0-9].[0-9][0-9]' | ||||
|   pull_request: | ||||
|     types: [opened, synchronize, reopened] | ||||
| jobs: | ||||
|   test_snmp_info: | ||||
|     name: Test and CPAN Upload | ||||
|     if: github.repository == 'netdisco/snmp-info' | ||||
|     runs-on: ubuntu-latest | ||||
|     container: | ||||
|       image: 'netdisco/netdisco:latest-do' | ||||
|       options: '--user root --entrypoint /bin/ash' | ||||
|       volumes: | ||||
|         - '/home/runner/work:/github/workspace' | ||||
|     defaults: | ||||
|       run: | ||||
|         working-directory: /github/workspace/snmp-info/snmp-info | ||||
|     steps: | ||||
|     - name: Get the Tag or Branch | ||||
|       run: echo "GH_REF_SHORT=$(echo ${GITHUB_REF##*/})" >> $GITHUB_ENV | ||||
|  | ||||
|     - name: Install packages | ||||
|       run: apk add openssh xz tmux bash curl sudo gcc make musl-dev perl-dev unzip jq | ||||
|     - name: Install fake apt-get | ||||
|       run: echo 'if [ "$1" == "update" ]; then exec apk update; else exec apk add openssh xz; fi' > /usr/local/bin/apt-get && chmod +x /usr/local/bin/apt-get | ||||
|  | ||||
|     - name: Check out latest code | ||||
|       uses: actions/checkout@v1 | ||||
|     - name: Fix owner of checkout | ||||
|       run: chown -R netdisco:netdisco /github/workspace/snmp-info/snmp-info | ||||
|  | ||||
|     - name: Install Perl deps | ||||
|       run: | | ||||
|         sudo -u netdisco /home/netdisco/bin/localenv cpanm --notest Hook::LexWrap Test::Class::Most Test::Distribution Test::MockObject::Extends PPI Class::ISA Module::Info File::Slurp Test::Perl::Critic Test::Spelling CPAN::Uploader | ||||
|  | ||||
|     - name: Run Tests | ||||
|       id: build_and_run_tests | ||||
|       run: | | ||||
|         sudo -u netdisco /home/netdisco/bin/localenv perl ./Build.PL | ||||
|         sudo -u netdisco /home/netdisco/bin/localenv ./Build test --test_files t/ --test_files xt/ | ||||
|       continue-on-error: true | ||||
|  | ||||
|     - name: IRC test failure notification | ||||
|       if: (steps.build_and_run_tests.outcome == 'failure') && (github.event_name != 'workflow_dispatch') && (github.event_name != 'pull_request') | ||||
|       uses: Gottox/irc-message-action@v2 | ||||
|       with: | ||||
|         channel: '#netdisco' | ||||
|         nickname: github-actions | ||||
|         message: |- | ||||
|           🤖 ${{ github.actor }} pushed to ${{ env.GH_REF_SHORT }}: https://github.com/${{ github.repository }}/commit/${{ github.sha }} | ||||
|           😭 TESTS have FAILED! 👀 https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | ||||
|     - name: IRC test success notification | ||||
|       if: (steps.build_and_run_tests.outcome == 'success') && github.event.inputs.success_irc_squawk | ||||
|       uses: Gottox/irc-message-action@v2 | ||||
|       with: | ||||
|         channel: '#netdisco' | ||||
|         nickname: github-actions | ||||
|         message: |- | ||||
|           🤖 ${{ github.actor }} pushed to ${{ env.GH_REF_SHORT }}: https://github.com/${{ github.repository }}/commit/${{ github.sha }} (tests PASSED 🎉) | ||||
|  | ||||
|     - name: Make release | ||||
|       if: steps.build_and_run_tests.outcome == 'success' | ||||
|       run: | | ||||
|         sudo -u netdisco /home/netdisco/bin/localenv rm ./MANIFEST | ||||
|         sudo -u netdisco /home/netdisco/bin/localenv ./Build manifest | ||||
|         sudo -u netdisco /home/netdisco/bin/localenv ./Build distmeta | ||||
|         sudo -u netdisco /home/netdisco/bin/localenv ./Build dist | ||||
|  | ||||
|     - name: Upload to CPAN | ||||
|       id: upload_to_cpan | ||||
|       if: success() && startsWith(github.ref, 'refs/tags/') | ||||
|       env: | ||||
|         PAUSE_USERNAME: ${{ secrets.PAUSE_USERNAME }} | ||||
|         PAUSE_PASSWORD: ${{ secrets.PAUSE_PASSWORD }} | ||||
|       run: | | ||||
|         bash -c 'RELEASENAME=(SNMP-Info-*.tar.gz) && ! curl -LI --fail https://cpan.metacpan.org/authors/id/O/OL/OLIVER/${RELEASENAME}' | ||||
|         sudo -u netdisco /home/netdisco/bin/localenv cpan-upload -u '${{ env.PAUSE_USERNAME }}' -p '${{ env.PAUSE_PASSWORD }}' SNMP-Info-*.tar.gz | ||||
|       continue-on-error: true | ||||
|  | ||||
|     - name: IRC upload failure notification | ||||
|       if: steps.upload_to_cpan.outcome == 'failure' | ||||
|       uses: Gottox/irc-message-action@v2 | ||||
|       with: | ||||
|         channel: '#netdisco' | ||||
|         nickname: github-actions | ||||
|         message: |- | ||||
|           🤖 Failed to upload SNMP::Info release ${{ env.GH_REF_SHORT }} to CPAN! 😭 | ||||
|           👀 https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | ||||
|     - name: IRC upload success notification | ||||
|       if: steps.upload_to_cpan.outcome == 'success' | ||||
|       uses: Gottox/irc-message-action@v2 | ||||
|       with: | ||||
|         channel: '#netdisco' | ||||
|         nickname: github-actions | ||||
|         message: |- | ||||
|           🤖 Uploaded SNMP::Info release ${{ env.GH_REF_SHORT }} to CPAN 🎉 | ||||
|  | ||||
|     - name: Setup tmate session | ||||
|       uses: mxschmitt/action-tmate@v3 | ||||
|       if: always() && github.event.inputs.debug_test_enabled | ||||
|       with: | ||||
|         sudo: true | ||||
|  | ||||
|     - name: Preserve status from tests | ||||
|       if: always() && (steps.build_and_run_tests.outcome == 'failure') | ||||
|       run: exit 1 | ||||
|  | ||||
							
								
								
									
										16
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +1,14 @@ | ||||
| *.db | ||||
| SNMP | ||||
| *.swp | ||||
| *.pid | ||||
| test.pl | ||||
| MYMETA.* | ||||
| *.tar.gz | ||||
| MANIFEST.* | ||||
| *.komodo* | ||||
| Makefile* | ||||
| Build | ||||
| _build | ||||
| blib | ||||
| cover_db | ||||
| .idea | ||||
| .vscode | ||||
|   | ||||
							
								
								
									
										54
									
								
								Build.PL
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								Build.PL
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| use strict; | ||||
| use warnings; | ||||
| use Module::Build; | ||||
|  | ||||
| Module::Build->new( | ||||
|   module_name => 'SNMP::Info', | ||||
|   license     => 'bsd', | ||||
|   dist_author => 'Eric A. Miller <emiller@cpan.org>', | ||||
|   # dynamic_config => 1, | ||||
|   create_readme => 1, | ||||
|   configure_requires => { | ||||
|     'Module::Build' => '0.42', | ||||
|   }, | ||||
|   # build_requires => { | ||||
|   # }, | ||||
|   requires => { | ||||
|     'SNMP' => '0', | ||||
|     'Math::BigInt' => '0', | ||||
|     'NetAddr::IP' => '4.068', | ||||
|   }, | ||||
|   recommends => { | ||||
|     'PPI' => '0', | ||||
|     'Class::ISA' => '0', | ||||
|     'Module::Info' => '0', | ||||
|     'Module::Load' => '0', | ||||
|     'File::Slurp' => '0', | ||||
|   }, | ||||
|   test_requires => { | ||||
|     'Test::More' => '0.88', | ||||
|     'Test::Distribution' => '0', | ||||
|     'Test::Class::Most'  => '0', | ||||
|     'Test::MockObject::Extends' => '0', | ||||
|     'File::Find' => '0', | ||||
|     'Path::Class' => '0', | ||||
|     'File::Slurper' => '0', | ||||
|     'Test::Exception' => '0.43', | ||||
|     'Class::Inspector' => '0', | ||||
|     'NetSNMP::default_store' => '0', | ||||
|     'Module::Find' => '0', | ||||
|     'Hook::LexWrap' => '0', | ||||
|   }, | ||||
|   # script_files => [ | ||||
|   # ], | ||||
|   # share_dir => 'share', | ||||
|   meta_merge => { | ||||
|     resources => { | ||||
|       homepage => 'http://netdisco.org/', | ||||
|       bugtracker => 'https://github.com/netdisco/snmp-info/issues', | ||||
|       repository => 'https://github.com/netdisco/snmp-info', | ||||
|       MailingList => 'https://lists.sourceforge.net/lists/listinfo/snmp-info-users', | ||||
|       IRC => 'irc://irc.libera.chat/#netdisco', | ||||
|     }, | ||||
|   }, | ||||
| )->create_build_script; | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1045
									
								
								DeviceMatrix.txt
									
									
									
									
									
								
							
							
						
						
									
										1045
									
								
								DeviceMatrix.txt
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,444 +0,0 @@ | ||||
| # SNMP::Info::Layer1::Cyclades | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer1::Cyclades; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer1; | ||||
|  | ||||
| @SNMP::Info::Layer1::Cyclades::ISA       = qw/SNMP::Info::Layer1 Exporter/; | ||||
| @SNMP::Info::Layer1::Cyclades::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
|  | ||||
| $VERSION = '3.19'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer1::MIBS, | ||||
|     'CYCLADES-ACS-SYS-MIB'  => 'cyACSversion', | ||||
|     'CYCLADES-ACS-CONF-MIB' => 'cyEthIPaddr', | ||||
|     'CYCLADES-ACS-INFO-MIB' => 'cyISPortTty', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|  | ||||
|     # CYCLADES-ACS-SYS-MIB | ||||
|     %SNMP::Info::Layer1::GLOBALS, | ||||
|     'os_ver'     => 'cyACSversion', | ||||
|     'cy_model'   => 'cyACSpname', | ||||
|     'serial'     => 'cyACSDevId', | ||||
|     'root_ip'    => 'cyEthIPaddr', | ||||
|     'ps1_status' => 'cyACSPw1', | ||||
|     'ps2_status' => 'cyACSPw2', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer1::FUNCS, | ||||
|  | ||||
|     # CYCLADES-ACS-INFO-MIB::cyInfoSerialTable | ||||
|     'cy_port_tty'   => 'cyISPortTty', | ||||
|     'cy_port_name'  => 'cyISPortName', | ||||
|     'cy_port_speed' => 'cyISPortSpeed', | ||||
|     'cy_port_cd'    => 'cyISPortSigCD', | ||||
|  | ||||
|     # CYCLADES-ACS-CONF-MIB::cySerialPortTable | ||||
|     'cy_port_socket' => 'cySPortSocketPort', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer1::MUNGE, ); | ||||
|  | ||||
| # These devices don't have a FDB and we probably don't want to poll for ARP | ||||
| # cache so turn off reported L2/L3. | ||||
| sub layers { | ||||
|     return '01000001'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'cyclades'; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'cyclades'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     my $model = $cyclades->cy_model(); | ||||
|  | ||||
|     return unless defined $model; | ||||
|  | ||||
|     return lc($model); | ||||
| } | ||||
|  | ||||
| # Extend interface methods to include serial ports | ||||
| # | ||||
| # Partials don't really help in this class, but implemented | ||||
| # for consistency | ||||
|  | ||||
| sub i_index { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $orig_index = $cyclades->orig_i_index($partial) || {}; | ||||
|     my $cy_index   = $cyclades->cy_port_socket()       || {}; | ||||
|  | ||||
|     my %i_index; | ||||
|     foreach my $iid ( keys %$orig_index ) { | ||||
|         my $index = $orig_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|  | ||||
|         $i_index{$iid} = $index; | ||||
|     } | ||||
|  | ||||
|     # Use alternative labeling system for the serial port, listening socket | ||||
|     # to avoid conflicts with ifIndex. | ||||
|     foreach my $iid ( keys %$cy_index ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|  | ||||
|         $i_index{$index} = $index; | ||||
|     } | ||||
|  | ||||
|     return \%i_index; | ||||
| } | ||||
|  | ||||
| sub interfaces { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_descr  = $cyclades->orig_i_description($partial) || {}; | ||||
|     my $cy_index = $cyclades->cy_port_socket()             || {}; | ||||
|     my $cy_p_tty = $cyclades->cy_port_tty()                || {}; | ||||
|  | ||||
|     my %if; | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|         my $descr = $i_descr->{$iid}; | ||||
|         next unless defined $descr; | ||||
|  | ||||
|         $if{$iid} = $descr; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$cy_p_tty ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|         my $name = $cy_p_tty->{$iid}; | ||||
|         next unless defined $name; | ||||
|  | ||||
|         $if{$index} = $name; | ||||
|     } | ||||
|  | ||||
|     return \%if; | ||||
| } | ||||
|  | ||||
| sub i_speed { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_speed    = $cyclades->orig_i_speed($partial) || {}; | ||||
|     my $cy_index   = $cyclades->cy_port_socket()       || {}; | ||||
|     my $cy_p_speed = $cyclades->cy_port_speed()        || {}; | ||||
|  | ||||
|     my %i_speed; | ||||
|     foreach my $iid ( keys %$i_speed ) { | ||||
|         my $speed = $i_speed->{$iid}; | ||||
|         next unless defined $speed; | ||||
|  | ||||
|         $i_speed{$iid} = $speed; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$cy_p_speed ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|         my $speed = $cy_p_speed->{$iid}; | ||||
|         next unless defined $speed; | ||||
|  | ||||
|         $i_speed{$index} = $speed; | ||||
|     } | ||||
|  | ||||
|     return \%i_speed; | ||||
| } | ||||
|  | ||||
| sub i_up { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_up     = $cyclades->orig_i_up($partial) || {}; | ||||
|     my $cy_index = $cyclades->cy_port_socket()    || {}; | ||||
|     my $cy_p_up  = $cyclades->cy_port_cd()        || {}; | ||||
|  | ||||
|     my %i_up; | ||||
|     foreach my $iid ( keys %$i_up ) { | ||||
|         my $up = $i_up->{$iid}; | ||||
|         next unless defined $up; | ||||
|  | ||||
|         $i_up{$iid} = $up; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$cy_p_up ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|         my $up = $cy_p_up->{$iid}; | ||||
|         next unless defined $up; | ||||
|  | ||||
|         $i_up{$index} = $up; | ||||
|     } | ||||
|  | ||||
|     return \%i_up; | ||||
| } | ||||
|  | ||||
| sub i_description { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_desc    = $cyclades->orig_i_description($partial) || {}; | ||||
|     my $cy_index  = $cyclades->cy_port_socket()             || {}; | ||||
|     my $cy_p_desc = $cyclades->cy_port_name()               || {}; | ||||
|  | ||||
|     my %descr; | ||||
|     foreach my $iid ( keys %$i_desc ) { | ||||
|         my $desc = $i_desc->{$iid}; | ||||
|         next unless defined $desc; | ||||
|  | ||||
|         $descr{$iid} = $desc; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$cy_p_desc ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|         my $desc = $cy_p_desc->{$iid}; | ||||
|         next unless defined $desc; | ||||
|  | ||||
|         $descr{$index} = $desc; | ||||
|     } | ||||
|  | ||||
|     return \%descr; | ||||
| } | ||||
|  | ||||
| sub i_name { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_name    = $cyclades->orig_i_name($partial) || {}; | ||||
|     my $cy_index  = $cyclades->cy_port_socket()      || {}; | ||||
|     my $cy_p_desc = $cyclades->cy_port_name()        || {}; | ||||
|  | ||||
|     my %i_name; | ||||
|     foreach my $iid ( keys %$i_name ) { | ||||
|         my $name = $i_name->{$iid}; | ||||
|         next unless defined $name; | ||||
|  | ||||
|         $i_name{$iid} = $name; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$cy_p_desc ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|         my $name = $cy_p_desc->{$iid}; | ||||
|         next unless defined $name; | ||||
|  | ||||
|         $i_name{$index} = $name; | ||||
|     } | ||||
|  | ||||
|     return \%i_name; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer1::Cyclades - SNMP Interface to Cyclades terminal servers | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|     #Let SNMP::Info determine the correct subclass for you. | ||||
|  | ||||
|     my $cyclades = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
|                         # These arguments are passed directly to SNMP::Session | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|     my $class = $cyclades->class(); | ||||
|     print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Cyclades device through SNMP. | ||||
|  | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
|  | ||||
| my $cyclades = new SNMP::Info::Layer1::Cyclades(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer1 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<CYCLADES-ACS-SYS-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS-CONF-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS-INFO-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cyclades->os_ver() | ||||
|  | ||||
| (C<cyACSversion>) | ||||
|  | ||||
| =item $cyclades->serial() | ||||
|  | ||||
| (C<cyACSDevId>) | ||||
|  | ||||
| =item $cyclades->root_ip() | ||||
|  | ||||
| (C<cyEthIPaddr>) | ||||
|  | ||||
| =item $cyclades->ps1_status() | ||||
|  | ||||
| (C<cyACSPw1>) | ||||
|  | ||||
| =item $cyclades->ps2_status() | ||||
|  | ||||
| (C<cyACSPw2>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cyclades->layers() | ||||
|  | ||||
| Returns 01000001.  These devices don't have a FDB and we probably don't want | ||||
| to poll for an ARP cache so turn off reported Layer 2 and Layer 3. | ||||
|  | ||||
| =item $cyclades->vendor() | ||||
|  | ||||
| Returns 'cyclades' | ||||
|  | ||||
| =item $cyclades->os() | ||||
|  | ||||
| Returns 'cyclades' | ||||
|  | ||||
| =item $cyclades->model() | ||||
|  | ||||
| Returns lower case (C<cyACSpname>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer1 | ||||
|  | ||||
| See L<SNMP::Info::Layer1/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cyclades->i_index() | ||||
|  | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
|  | ||||
| Extended to include serial ports.  Serial ports are indexed with the | ||||
| alternative labeling system for the serial port, the listening socket port | ||||
| C<cySPortSocketPort> to avoid conflicts with C<ifIndex>.   | ||||
|  | ||||
| =item $cyclades->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to physical ports.  Extended to include | ||||
| serial ports, C<cyISPortTty>. | ||||
|  | ||||
| =item $cyclades->i_speed() | ||||
|  | ||||
| Returns interface speed.  Extended to include serial ports, C<cyISPortSpeed>.  | ||||
|  | ||||
| =item $cyclades->i_up() | ||||
|  | ||||
| Returns link status for each port.  Extended to include serial ports, | ||||
| C<cyISPortSigCD>. | ||||
|  | ||||
| =item $cyclades->i_description() | ||||
|  | ||||
| Returns description of each port.  Extended to include serial ports, | ||||
| C<cyISPortName>. | ||||
|  | ||||
| =item $cyclades->i_name() | ||||
|  | ||||
| Returns name of each port.  Extended to include serial ports, C<cyISPortName>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer1 | ||||
|  | ||||
| See L<SNMP::Info::Layer1/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -1,177 +0,0 @@ | ||||
| # SNMP::Info::Layer2::Ubiquiti | ||||
| # $Id$ | ||||
| # | ||||
|  | ||||
| package SNMP::Info::Layer2::Ubiquiti; | ||||
|  | ||||
| use strict; | ||||
| use Exporter; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @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.19'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::IEEE802dot11::MIBS, | ||||
|  | ||||
| ); | ||||
|  | ||||
| %GLOBALS | ||||
|     = ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::IEEE802dot11::FUNCS, | ||||
|  | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, ); | ||||
|  | ||||
| sub os { | ||||
|     return 'Ubiquiti'; | ||||
| } | ||||
|  | ||||
| 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; | ||||
|         if ( $ver =~ /([\d\.]+)/ ) { | ||||
|             return $1; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'Ubiquiti Networks, Inc.'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $dot11 = shift; | ||||
|  | ||||
|     my $names = $dot11->dot11_prod_name(); | ||||
|  | ||||
|     foreach my $iid ( keys %$names ) { | ||||
|         my $prod = $names->{$iid}; | ||||
|         next unless defined $prod; | ||||
|         return $prod; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
|  | ||||
| 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>. | ||||
|  | ||||
| =item $ubnt->os() | ||||
|  | ||||
| Returns 'Ubiquiti' | ||||
|  | ||||
| =item $ubnt->os_ver() | ||||
|  | ||||
| Returns the software version extracted from C<dot11manufacturerProductVersion>. | ||||
|  | ||||
| =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 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 | ||||
| @@ -1,194 +0,0 @@ | ||||
| # SNMP::Info::Layer3::Timetra | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bill Fenner | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer3::Timetra; | ||||
|  | ||||
| use strict; | ||||
|  | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer3::Timetra::ISA = qw/SNMP::Info::Layer3 | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer3::Timetra::EXPORT_OK = qw//; | ||||
|  | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
|  | ||||
| $VERSION = '3.19'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer3::MIBS, 'TIMETRA-GLOBAL-MIB' => 'timetraReg', ); | ||||
|  | ||||
| %GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, ); | ||||
|  | ||||
| %FUNCS = ( %SNMP::Info::Layer3::FUNCS, ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer3::MUNGE, ); | ||||
|  | ||||
| sub model { | ||||
|     my $timetra = shift; | ||||
|     my $id      = $timetra->id(); | ||||
|     my $model   = &SNMP::translateObj($id); | ||||
|  | ||||
|     return $id unless defined $model; | ||||
|  | ||||
|     $model =~ s/^tmnxModel//; | ||||
|  | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'TiMOS'; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'alcatel-lucent'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $timetra = shift; | ||||
|  | ||||
|     my $descr = $timetra->description(); | ||||
|     if ( $descr =~ m/^TiMOS-(\S+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|  | ||||
|     # No clue what this will try but hey | ||||
|     return $timetra->SUPER::os_ver(); | ||||
| } | ||||
|  | ||||
| # The interface description contains the SFP type, so | ||||
| # to avoid losing historical information through a configuration change | ||||
| # we use interface name instead. | ||||
| sub interfaces { | ||||
|     my $alu     = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     return $alu->orig_i_name($partial); | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::Timetra - SNMP Interface to Alcatel-Lucent SR | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Bill Fenner | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $alu = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
|                         # These arguments are passed directly to SNMP::Session | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $alu->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for Alcatel-Lucent Service Routers | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<TIMETRA-GLOBAL-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $alu->vendor() | ||||
|  | ||||
| Returns 'alcatel-lucent' | ||||
|  | ||||
| =item $alu->os() | ||||
|  | ||||
| Returns 'TiMOS' | ||||
|  | ||||
| =item $alu->os_ver() | ||||
|  | ||||
| Grabs the version string from C<sysDescr>. | ||||
|  | ||||
| =item $alu->model() | ||||
|  | ||||
| Tries to reference $alu->id() to one of the product MIBs listed above | ||||
|  | ||||
| Removes 'tmnxModel' from the name for readability. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $alu->interfaces() | ||||
|  | ||||
| Returns C<ifName>, since the default Layer3 C<ifDescr> varies based | ||||
| upon the transceiver inserted. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -1,12 +1,12 @@ | ||||
| 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 | ||||
| Copyright (c) 2002,2003 Regents of the University of California | ||||
| All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without  | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are met: | ||||
| 
 | ||||
|     * Redistributions of source code must retain the above copyright notice, | ||||
| @@ -14,17 +14,17 @@ modification, are permitted provided that the following conditions are met: | ||||
|     * Redistributions in binary form must reproduce the above copyright notice, | ||||
|       this list of conditions and the following disclaimer in the documentation | ||||
|       and/or other materials provided with the distribution. | ||||
|     * Neither the name of the University of California, Santa Cruz nor the  | ||||
|       names of its contributors may be used to endorse or promote products  | ||||
|     * Neither the name of the University of California, Santa Cruz nor the | ||||
|       names of its contributors may be used to endorse or promote products | ||||
|       derived from this software without specific prior written permission. | ||||
| 
 | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||||
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED  | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  | ||||
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | ||||
| ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  | ||||
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||||
| ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  | ||||
| ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
							
								
								
									
										421
									
								
								MANIFEST
									
									
									
									
									
								
							
							
						
						
									
										421
									
								
								MANIFEST
									
									
									
									
									
								
							| @@ -1,122 +1,303 @@ | ||||
| ChangeLog | ||||
| COPYRIGHT | ||||
| DEVELOP | ||||
| DeviceMatrix.txt | ||||
| Info.pm | ||||
| Info/AdslLine.pm | ||||
| Info/Aggregate.pm | ||||
| Info/Airespace.pm | ||||
| Info/AMAP.pm | ||||
| Info/Bridge.pm | ||||
| Info/CDP.pm | ||||
| Info/CiscoAgg.pm | ||||
| Info/CiscoConfig.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/EDP.pm | ||||
| Info/Entity.pm | ||||
| Info/EtherLike.pm | ||||
| Info/FDP.pm | ||||
| Info/IEEE802dot11.pm | ||||
| Info/IEEE802dot3ad.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/Baystack.pm | ||||
| Info/Layer2/C1900.pm | ||||
| Info/Layer2/C2900.pm | ||||
| Info/Layer2/Catalyst.pm | ||||
| Info/Layer2/Centillion.pm | ||||
| Info/Layer2/Cisco.pm | ||||
| Info/Layer2/CiscoSB.pm | ||||
| Info/Layer2/HP.pm | ||||
| Info/Layer2/HP4000.pm | ||||
| Info/Layer2/HPVC.pm | ||||
| Info/Layer2/Kentrox.pm | ||||
| Info/Layer2/N2270.pm | ||||
| Info/Layer2/NAP222x.pm | ||||
| Info/Layer2/Netgear.pm | ||||
| Info/Layer2/NWSS2300.pm | ||||
| Info/Layer2/Orinoco.pm | ||||
| Info/Layer2/Trapeze.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/BlueCoatSG.pm | ||||
| Info/Layer3/C3550.pm | ||||
| Info/Layer3/C4000.pm | ||||
| Info/Layer3/C6500.pm | ||||
| Info/Layer3/Cisco.pm | ||||
| Info/Layer3/CiscoASA.pm | ||||
| Info/Layer3/CiscoFWSM.pm | ||||
| Info/Layer3/CiscoSwitch.pm | ||||
| Info/Layer3/Contivity.pm | ||||
| Info/Layer3/Dell.pm | ||||
| Info/Layer3/Enterasys.pm | ||||
| Info/Layer3/Extreme.pm | ||||
| Info/Layer3/F5.pm | ||||
| Info/Layer3/Force10.pm | ||||
| Info/Layer3/Foundry.pm | ||||
| Info/Layer3/H3C.pm | ||||
| Info/Layer3/HP9300.pm | ||||
| Info/Layer3/IBMGbTor.pm | ||||
| Info/Layer3/Juniper.pm | ||||
| Info/Layer3/Lantronix.pm | ||||
| Info/Layer3/Microsoft.pm | ||||
| Info/Layer3/Mikrotik.pm | ||||
| Info/Layer3/N1600.pm | ||||
| Info/Layer3/Netscreen.pm | ||||
| Info/Layer3/NetSNMP.pm | ||||
| Info/Layer3/Nexus.pm | ||||
| Info/Layer3/PacketFront.pm | ||||
| Info/Layer3/Passport.pm | ||||
| Info/Layer3/Pf.pm | ||||
| Info/Layer3/Pica8.pm | ||||
| Info/Layer3/SonicWALL.pm | ||||
| Info/Layer3/Steelhead.pm | ||||
| Info/Layer3/Sun.pm | ||||
| Info/Layer3/Tasman.pm | ||||
| Info/Layer3/Timetra.pm | ||||
| Info/Layer7.pm | ||||
| Info/Layer7/APC.pm | ||||
| Info/Layer7/Neoteris.pm | ||||
| Info/Layer7/Netscaler.pm | ||||
| Info/LLDP.pm | ||||
| Info/MAU.pm | ||||
| Info/MRO.pm | ||||
| Info/NortelStack.pm | ||||
| Info/PowerEthernet.pm | ||||
| Info/RapidCity.pm | ||||
| Info/SONMP.pm | ||||
| Makefile.PL | ||||
| .perltidyrc | ||||
| Build.PL | ||||
| Changes | ||||
| contrib/DEVELOP | ||||
| contrib/util/docmunge | ||||
| contrib/util/make_dev_matrix.pl | ||||
| contrib/util/make_snmpdata.pl | ||||
| contrib/util/push_ver | ||||
| contrib/util/run_test | ||||
| contrib/util/test_class.pl | ||||
| contrib/util/test_class_mocked.pl | ||||
| lib/SNMP/Info.pm | ||||
| lib/SNMP/Info/AdslLine.pm | ||||
| lib/SNMP/Info/Aggregate.pm | ||||
| lib/SNMP/Info/Airespace.pm | ||||
| lib/SNMP/Info/AMAP.pm | ||||
| lib/SNMP/Info/Bridge.pm | ||||
| lib/SNMP/Info/CDP.pm | ||||
| lib/SNMP/Info/CiscoAgg.pm | ||||
| lib/SNMP/Info/CiscoBGP.pm | ||||
| lib/SNMP/Info/CiscoConfig.pm | ||||
| lib/SNMP/Info/CiscoPortSecurity.pm | ||||
| lib/SNMP/Info/CiscoPower.pm | ||||
| lib/SNMP/Info/CiscoQOS.pm | ||||
| lib/SNMP/Info/CiscoRTT.pm | ||||
| lib/SNMP/Info/CiscoStack.pm | ||||
| lib/SNMP/Info/CiscoStats.pm | ||||
| lib/SNMP/Info/CiscoStpExtensions.pm | ||||
| lib/SNMP/Info/CiscoVTP.pm | ||||
| lib/SNMP/Info/DocsisCM.pm | ||||
| lib/SNMP/Info/DocsisHE.pm | ||||
| lib/SNMP/Info/EDP.pm | ||||
| lib/SNMP/Info/Entity.pm | ||||
| lib/SNMP/Info/EtherLike.pm | ||||
| lib/SNMP/Info/FDP.pm | ||||
| lib/SNMP/Info/IEEE802_Bridge.pm | ||||
| lib/SNMP/Info/IEEE802dot11.pm | ||||
| lib/SNMP/Info/IEEE802dot3ad.pm | ||||
| lib/SNMP/Info/IPv6.pm | ||||
| lib/SNMP/Info/Layer1.pm | ||||
| lib/SNMP/Info/Layer1/Allied.pm | ||||
| lib/SNMP/Info/Layer1/Asante.pm | ||||
| lib/SNMP/Info/Layer1/Bayhub.pm | ||||
| lib/SNMP/Info/Layer1/Cyclades.pm | ||||
| lib/SNMP/Info/Layer1/S3000.pm | ||||
| lib/SNMP/Info/Layer2.pm | ||||
| lib/SNMP/Info/Layer2/3Com.pm | ||||
| lib/SNMP/Info/Layer2/Adtran.pm | ||||
| lib/SNMP/Info/Layer2/Aerohive.pm | ||||
| lib/SNMP/Info/Layer2/Airespace.pm | ||||
| lib/SNMP/Info/Layer2/Aironet.pm | ||||
| lib/SNMP/Info/Layer2/Allied.pm | ||||
| lib/SNMP/Info/Layer2/Atmedia.pm | ||||
| lib/SNMP/Info/Layer2/Baystack.pm | ||||
| lib/SNMP/Info/Layer2/C1900.pm | ||||
| lib/SNMP/Info/Layer2/C2900.pm | ||||
| lib/SNMP/Info/Layer2/Catalyst.pm | ||||
| lib/SNMP/Info/Layer2/Centillion.pm | ||||
| lib/SNMP/Info/Layer2/Cisco.pm | ||||
| lib/SNMP/Info/Layer2/CiscoSB.pm | ||||
| lib/SNMP/Info/Layer2/Exinda.pm | ||||
| lib/SNMP/Info/Layer2/HP.pm | ||||
| lib/SNMP/Info/Layer2/HP4000.pm | ||||
| lib/SNMP/Info/Layer2/HPVC.pm | ||||
| lib/SNMP/Info/Layer2/Kentrox.pm | ||||
| lib/SNMP/Info/Layer2/N2270.pm | ||||
| lib/SNMP/Info/Layer2/NAP222x.pm | ||||
| lib/SNMP/Info/Layer2/Netgear.pm | ||||
| lib/SNMP/Info/Layer2/Nexans.pm | ||||
| lib/SNMP/Info/Layer2/NWSS2300.pm | ||||
| lib/SNMP/Info/Layer2/Orinoco.pm | ||||
| lib/SNMP/Info/Layer2/Sixnet.pm | ||||
| lib/SNMP/Info/Layer2/Trapeze.pm | ||||
| lib/SNMP/Info/Layer2/Ubiquiti.pm | ||||
| lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm | ||||
| lib/SNMP/Info/Layer3.pm | ||||
| lib/SNMP/Info/Layer3/Aironet.pm | ||||
| lib/SNMP/Info/Layer3/AlcatelLucent.pm | ||||
| lib/SNMP/Info/Layer3/AlteonAD.pm | ||||
| lib/SNMP/Info/Layer3/Altiga.pm | ||||
| lib/SNMP/Info/Layer3/Arista.pm | ||||
| lib/SNMP/Info/Layer3/Aruba.pm | ||||
| lib/SNMP/Info/Layer3/ArubaCX.pm | ||||
| lib/SNMP/Info/Layer3/BayRS.pm | ||||
| lib/SNMP/Info/Layer3/BlueCoatSG.pm | ||||
| lib/SNMP/Info/Layer3/C3550.pm | ||||
| lib/SNMP/Info/Layer3/C4000.pm | ||||
| lib/SNMP/Info/Layer3/C6500.pm | ||||
| lib/SNMP/Info/Layer3/CheckPoint.pm | ||||
| lib/SNMP/Info/Layer3/Ciena.pm | ||||
| lib/SNMP/Info/Layer3/Cisco.pm | ||||
| lib/SNMP/Info/Layer3/CiscoASA.pm | ||||
| lib/SNMP/Info/Layer3/CiscoFWSM.pm | ||||
| lib/SNMP/Info/Layer3/CiscoSwitch.pm | ||||
| lib/SNMP/Info/Layer3/Contivity.pm | ||||
| lib/SNMP/Info/Layer3/Cumulus.pm | ||||
| lib/SNMP/Info/Layer3/Dell.pm | ||||
| lib/SNMP/Info/Layer3/DLink.pm | ||||
| lib/SNMP/Info/Layer3/Enterasys.pm | ||||
| lib/SNMP/Info/Layer3/ERX.pm | ||||
| lib/SNMP/Info/Layer3/Extreme.pm | ||||
| lib/SNMP/Info/Layer3/F5.pm | ||||
| lib/SNMP/Info/Layer3/Force10.pm | ||||
| lib/SNMP/Info/Layer3/Fortinet.pm | ||||
| lib/SNMP/Info/Layer3/Foundry.pm | ||||
| lib/SNMP/Info/Layer3/Genua.pm | ||||
| lib/SNMP/Info/Layer3/H3C.pm | ||||
| lib/SNMP/Info/Layer3/HP9300.pm | ||||
| lib/SNMP/Info/Layer3/Huawei.pm | ||||
| lib/SNMP/Info/Layer3/IBMGbTor.pm | ||||
| lib/SNMP/Info/Layer3/Juniper.pm | ||||
| lib/SNMP/Info/Layer3/Lantronix.pm | ||||
| lib/SNMP/Info/Layer3/Lenovo.pm | ||||
| lib/SNMP/Info/Layer3/Microsoft.pm | ||||
| lib/SNMP/Info/Layer3/Mikrotik.pm | ||||
| lib/SNMP/Info/Layer3/N1600.pm | ||||
| lib/SNMP/Info/Layer3/Netscreen.pm | ||||
| lib/SNMP/Info/Layer3/NetSNMP.pm | ||||
| lib/SNMP/Info/Layer3/Nexus.pm | ||||
| lib/SNMP/Info/Layer3/OneAccess.pm | ||||
| lib/SNMP/Info/Layer3/PacketFront.pm | ||||
| lib/SNMP/Info/Layer3/PaloAlto.pm | ||||
| lib/SNMP/Info/Layer3/Passport.pm | ||||
| lib/SNMP/Info/Layer3/Pf.pm | ||||
| lib/SNMP/Info/Layer3/Pica8.pm | ||||
| lib/SNMP/Info/Layer3/Redlion.pm | ||||
| lib/SNMP/Info/Layer3/Scalance.pm | ||||
| lib/SNMP/Info/Layer3/SonicWALL.pm | ||||
| lib/SNMP/Info/Layer3/Steelfusion.pm | ||||
| lib/SNMP/Info/Layer3/Steelhead.pm | ||||
| lib/SNMP/Info/Layer3/SteelheadEx.pm | ||||
| lib/SNMP/Info/Layer3/Sun.pm | ||||
| lib/SNMP/Info/Layer3/Tasman.pm | ||||
| lib/SNMP/Info/Layer3/Teltonika.pm | ||||
| lib/SNMP/Info/Layer3/Timetra.pm | ||||
| lib/SNMP/Info/Layer3/VMware.pm | ||||
| lib/SNMP/Info/Layer3/VyOS.pm | ||||
| lib/SNMP/Info/Layer3/Whiterabbit.pm | ||||
| lib/SNMP/Info/Layer7.pm | ||||
| lib/SNMP/Info/Layer7/APC.pm | ||||
| lib/SNMP/Info/Layer7/Arbor.pm | ||||
| lib/SNMP/Info/Layer7/CiscoIPS.pm | ||||
| lib/SNMP/Info/Layer7/Gigamon.pm | ||||
| lib/SNMP/Info/Layer7/HWGroup.pm | ||||
| lib/SNMP/Info/Layer7/Liebert.pm | ||||
| lib/SNMP/Info/Layer7/Neoteris.pm | ||||
| lib/SNMP/Info/Layer7/Netscaler.pm | ||||
| lib/SNMP/Info/LLDP.pm | ||||
| lib/SNMP/Info/MAU.pm | ||||
| lib/SNMP/Info/MRO.pm | ||||
| lib/SNMP/Info/NortelStack.pm | ||||
| lib/SNMP/Info/PortAccessEntity.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/prereq.t | ||||
| t/push_ver | ||||
| t/run_test | ||||
| t/test_class.pl | ||||
| t/util/make_snmpdata.pl | ||||
| t/util/test_class_mocked.pl | ||||
| t/00_load.t | ||||
| xt/.perltidyrc | ||||
| xt/00_local_distribution.t | ||||
| xt/00_local_docininfo.t | ||||
| xt/00_local_perlcritic.t | ||||
| xt/00_local_pod-coverage.t | ||||
| xt/00_local_pod.t | ||||
| xt/00_local_prereq.t | ||||
| xt/00_local_spelling.t | ||||
| xt/00_local_versionsync.t | ||||
| xt/10_remote_snmplabs.t | ||||
| xt/21_run.t | ||||
| xt/lib/My/Test/Class.pm | ||||
| xt/lib/Test/SNMP/Info.pm | ||||
| xt/lib/Test/SNMP/Info/AdslLine.pm | ||||
| xt/lib/Test/SNMP/Info/Aggregate.pm | ||||
| xt/lib/Test/SNMP/Info/Airespace.pm | ||||
| xt/lib/Test/SNMP/Info/AMAP.pm | ||||
| xt/lib/Test/SNMP/Info/Bridge.pm | ||||
| xt/lib/Test/SNMP/Info/CDP.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoAgg.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoConfig.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoPortSecurity.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoPower.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoQOS.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoRTT.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoStats.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoStpExtensions.pm | ||||
| xt/lib/Test/SNMP/Info/CiscoVTP.pm | ||||
| xt/lib/Test/SNMP/Info/EDP.pm | ||||
| xt/lib/Test/SNMP/Info/Entity.pm | ||||
| xt/lib/Test/SNMP/Info/EtherLike.pm | ||||
| xt/lib/Test/SNMP/Info/FDP.pm | ||||
| xt/lib/Test/SNMP/Info/IEEE802dot11.pm | ||||
| xt/lib/Test/SNMP/Info/IEEE802dot3ad.pm | ||||
| xt/lib/Test/SNMP/Info/IPv6.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1/Allied.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1/Asante.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1/Bayhub.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1/Cyclades.pm | ||||
| xt/lib/Test/SNMP/Info/Layer1/S3000.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/3Com.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Aerohive.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Airespace.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Aironet.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Allied.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Atmedia.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Baystack.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/C1900.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/C2900.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Catalyst.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Centillion.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Cisco.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/CiscoSB.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Exinda.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/HP.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/HP4000.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/HPVC.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Kentrox.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/N2270.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/NAP222x.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Netgear.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Nexans.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/NWSS2300.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Orinoco.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Sixnet.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Trapeze.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/Ubiquiti.pm | ||||
| xt/lib/Test/SNMP/Info/Layer2/ZyXEL_DSLAM.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Aironet.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/AlcatelLucent.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/AlteonAD.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Altiga.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Arista.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Aruba.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/BayRS.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/BlueCoatSG.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/C3550.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/C4000.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/C6500.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/CheckPoint.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Cisco.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/CiscoASA.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/CiscoFWSM.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/CiscoSwitch.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Contivity.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Cumulus.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Dell.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/DLink.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Enterasys.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/ERX.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Extreme.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/F5.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Force10.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Fortinet.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Foundry.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Genua.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/H3C.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/HP9300.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Huawei.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/IBMGbTor.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Juniper.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Lantronix.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Lenovo.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Microsoft.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Mikrotik.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/N1600.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Netscreen.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/NetSNMP.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Nexus.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/OneAccess.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/PacketFront.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/PaloAlto.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Passport.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Pf.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Pica8.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Redlion.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Scalance.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/SonicWALL.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Steelhead.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Sun.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Tasman.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Teltonika.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/Timetra.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/VMware.pm | ||||
| xt/lib/Test/SNMP/Info/Layer3/VyOS.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/APC.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/Arbor.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/CiscoIPS.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/Gigamon.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/Liebert.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/Neoteris.pm | ||||
| xt/lib/Test/SNMP/Info/Layer7/Netscaler.pm | ||||
| xt/lib/Test/SNMP/Info/LLDP.pm | ||||
| xt/lib/Test/SNMP/Info/MAU.pm | ||||
| xt/lib/Test/SNMP/Info/NortelStack.pm | ||||
| xt/lib/Test/SNMP/Info/PowerEthernet.pm | ||||
| xt/lib/Test/SNMP/Info/RapidCity.pm | ||||
| xt/lib/Test/SNMP/Info/SONMP.pm | ||||
|   | ||||
| @@ -1,28 +1,73 @@ | ||||
| # 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 | ||||
| .gitignore | ||||
| \B\.gitignore\b | ||||
| \b_darcs\b | ||||
| \B\.cvsignore$ | ||||
|  | ||||
| # Makemaker generated files and dirs. | ||||
| ^MANIFEST\. | ||||
| ^Makefile$ | ||||
| ^blib/ | ||||
| ^MakeMaker-\d | ||||
| pm_to_blib | ||||
| MYMETA.* | ||||
| # 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$ | ||||
|  | ||||
| # ignore intellij | ||||
| \B\.idea | ||||
|   | ||||
							
								
								
									
										648
									
								
								META.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										648
									
								
								META.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,648 @@ | ||||
| { | ||||
|    "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.4231", | ||||
|    "license" : [ | ||||
|       "bsd" | ||||
|    ], | ||||
|    "meta-spec" : { | ||||
|       "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", | ||||
|       "version" : 2 | ||||
|    }, | ||||
|    "name" : "SNMP-Info", | ||||
|    "prereqs" : { | ||||
|       "configure" : { | ||||
|          "requires" : { | ||||
|             "Module::Build" : "0.42" | ||||
|          } | ||||
|       }, | ||||
|       "runtime" : { | ||||
|          "recommends" : { | ||||
|             "Class::ISA" : "0", | ||||
|             "File::Slurp" : "0", | ||||
|             "Module::Info" : "0", | ||||
|             "Module::Load" : "0", | ||||
|             "PPI" : "0" | ||||
|          }, | ||||
|          "requires" : { | ||||
|             "Math::BigInt" : "0", | ||||
|             "NetAddr::IP" : "4.068", | ||||
|             "SNMP" : "0" | ||||
|          } | ||||
|       }, | ||||
|       "test" : { | ||||
|          "requires" : { | ||||
|             "Class::Inspector" : "0", | ||||
|             "File::Find" : "0", | ||||
|             "File::Slurper" : "0", | ||||
|             "Hook::LexWrap" : "0", | ||||
|             "Module::Find" : "0", | ||||
|             "NetSNMP::default_store" : "0", | ||||
|             "Path::Class" : "0", | ||||
|             "Test::Class::Most" : "0", | ||||
|             "Test::Distribution" : "0", | ||||
|             "Test::Exception" : "0.43", | ||||
|             "Test::MockObject::Extends" : "0", | ||||
|             "Test::More" : "0.88" | ||||
|          } | ||||
|       } | ||||
|    }, | ||||
|    "provides" : { | ||||
|       "SNMP::Info" : { | ||||
|          "file" : "lib/SNMP/Info.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::AMAP" : { | ||||
|          "file" : "lib/SNMP/Info/AMAP.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::AdslLine" : { | ||||
|          "file" : "lib/SNMP/Info/AdslLine.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Aggregate" : { | ||||
|          "file" : "lib/SNMP/Info/Aggregate.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Airespace" : { | ||||
|          "file" : "lib/SNMP/Info/Airespace.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Bridge" : { | ||||
|          "file" : "lib/SNMP/Info/Bridge.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CDP" : { | ||||
|          "file" : "lib/SNMP/Info/CDP.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoAgg" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoAgg.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoBGP" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoBGP.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoConfig" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoConfig.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoPortSecurity" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoPortSecurity.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoPower" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoPower.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoQOS" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoQOS.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoRTT" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoRTT.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoStack" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoStack.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoStats" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoStats.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoStpExtensions" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoStpExtensions.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::CiscoVTP" : { | ||||
|          "file" : "lib/SNMP/Info/CiscoVTP.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::DocsisCM" : { | ||||
|          "file" : "lib/SNMP/Info/DocsisCM.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::DocsisHE" : { | ||||
|          "file" : "lib/SNMP/Info/DocsisHE.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::EDP" : { | ||||
|          "file" : "lib/SNMP/Info/EDP.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Entity" : { | ||||
|          "file" : "lib/SNMP/Info/Entity.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::EtherLike" : { | ||||
|          "file" : "lib/SNMP/Info/EtherLike.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::FDP" : { | ||||
|          "file" : "lib/SNMP/Info/FDP.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::IEEE802_Bridge" : { | ||||
|          "file" : "lib/SNMP/Info/IEEE802_Bridge.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::IEEE802dot11" : { | ||||
|          "file" : "lib/SNMP/Info/IEEE802dot11.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::IEEE802dot3ad" : { | ||||
|          "file" : "lib/SNMP/Info/IEEE802dot3ad.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::IPv6" : { | ||||
|          "file" : "lib/SNMP/Info/IPv6.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::LLDP" : { | ||||
|          "file" : "lib/SNMP/Info/LLDP.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Allied" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Allied.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Asante" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Asante.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Bayhub" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Bayhub.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::Cyclades" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/Cyclades.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer1::S3000" : { | ||||
|          "file" : "lib/SNMP/Info/Layer1/S3000.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::3Com" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/3Com.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Adtran" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Adtran.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Aerohive" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Aerohive.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Airespace" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Airespace.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Aironet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Aironet.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Allied" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Allied.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Atmedia" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Atmedia.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Baystack" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Baystack.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::C1900" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/C1900.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::C2900" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/C2900.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Catalyst" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Catalyst.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Centillion" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Centillion.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Cisco" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Cisco.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::CiscoSB" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/CiscoSB.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Exinda" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Exinda.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::HP" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/HP.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::HP4000" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/HP4000.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::HPVC" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/HPVC.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Kentrox" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Kentrox.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::N2270" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/N2270.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::NAP222x" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/NAP222x.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::NWSS2300" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/NWSS2300.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Netgear" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Netgear.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Nexans" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Nexans.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Orinoco" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Orinoco.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Sixnet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Sixnet.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Trapeze" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Trapeze.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::Ubiquiti" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/Ubiquiti.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer2::ZyXEL_DSLAM" : { | ||||
|          "file" : "lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Aironet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Aironet.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::AlcatelLucent" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/AlcatelLucent.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::AlteonAD" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/AlteonAD.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Altiga" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Altiga.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Arista" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Arista.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Aruba" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Aruba.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::ArubaCX" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/ArubaCX.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::BayRS" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/BayRS.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::BlueCoatSG" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/BlueCoatSG.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::C3550" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/C3550.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::C4000" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/C4000.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::C6500" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/C6500.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CheckPoint" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CheckPoint.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Ciena" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Ciena.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Cisco" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Cisco.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CiscoASA" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CiscoASA.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CiscoFWSM" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CiscoFWSM.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::CiscoSwitch" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/CiscoSwitch.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Contivity" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Contivity.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Cumulus" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Cumulus.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::DLink" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/DLink.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Dell" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Dell.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::ERX" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/ERX.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Enterasys" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Enterasys.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Extreme" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Extreme.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::F5" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/F5.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Force10" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Force10.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Fortinet" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Fortinet.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Foundry" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Foundry.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Genua" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Genua.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::H3C" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/H3C.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::HP9300" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/HP9300.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Huawei" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Huawei.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::IBMGbTor" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/IBMGbTor.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Juniper" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Juniper.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Lantronix" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Lantronix.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Lenovo" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Lenovo.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Microsoft" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Microsoft.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Mikrotik" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Mikrotik.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::N1600" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/N1600.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::NetSNMP" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/NetSNMP.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Netscreen" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Netscreen.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Nexus" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Nexus.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::OneAccess" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/OneAccess.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::PacketFront" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/PacketFront.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::PaloAlto" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/PaloAlto.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Passport" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Passport.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Pf" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Pf.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Pica8" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Pica8.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Redlion" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Redlion.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Scalance" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Scalance.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::SonicWALL" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/SonicWALL.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Steelfusion" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Steelfusion.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Steelhead" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Steelhead.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::SteelheadEx" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/SteelheadEx.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Sun" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Sun.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Tasman" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Tasman.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Teltonika" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Teltonika.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Timetra" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Timetra.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::VMware" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/VMware.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::VyOS" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/VyOS.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer3::Whiterabbit" : { | ||||
|          "file" : "lib/SNMP/Info/Layer3/Whiterabbit.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::APC" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/APC.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Arbor" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Arbor.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::CiscoIPS" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/CiscoIPS.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Gigamon" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Gigamon.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::HWGroup" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/HWGroup.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Liebert" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Liebert.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Neoteris" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Neoteris.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::Layer7::Netscaler" : { | ||||
|          "file" : "lib/SNMP/Info/Layer7/Netscaler.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::MAU" : { | ||||
|          "file" : "lib/SNMP/Info/MAU.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::MRO" : { | ||||
|          "file" : "lib/SNMP/Info/MRO.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::NortelStack" : { | ||||
|          "file" : "lib/SNMP/Info/NortelStack.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::PortAccessEntity" : { | ||||
|          "file" : "lib/SNMP/Info/PortAccessEntity.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::PowerEthernet" : { | ||||
|          "file" : "lib/SNMP/Info/PowerEthernet.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::RapidCity" : { | ||||
|          "file" : "lib/SNMP/Info/RapidCity.pm", | ||||
|          "version" : "3.88" | ||||
|       }, | ||||
|       "SNMP::Info::SONMP" : { | ||||
|          "file" : "lib/SNMP/Info/SONMP.pm", | ||||
|          "version" : "3.88" | ||||
|       } | ||||
|    }, | ||||
|    "release_status" : "stable", | ||||
|    "resources" : { | ||||
|       "bugtracker" : { | ||||
|          "web" : "https://github.com/netdisco/snmp-info/issues" | ||||
|       }, | ||||
|       "homepage" : "http://netdisco.org/", | ||||
|       "license" : [ | ||||
|          "http://opensource.org/licenses/bsd-license.php" | ||||
|       ], | ||||
|       "repository" : { | ||||
|          "url" : "https://github.com/netdisco/snmp-info" | ||||
|       }, | ||||
|       "x_IRC" : "irc://irc.libera.chat/#netdisco", | ||||
|       "x_MailingList" : "https://lists.sourceforge.net/lists/listinfo/snmp-info-users" | ||||
|    }, | ||||
|    "version" : "3.88", | ||||
|    "x_serialization_backend" : "JSON::PP version 4.06" | ||||
| } | ||||
							
								
								
									
										478
									
								
								META.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										478
									
								
								META.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,478 @@ | ||||
| --- | ||||
| abstract: 'OO Interface to Network devices and MIBs through SNMP' | ||||
| author: | ||||
|   - 'Eric A. Miller <emiller@cpan.org>' | ||||
| build_requires: | ||||
|   Class::Inspector: '0' | ||||
|   File::Find: '0' | ||||
|   File::Slurper: '0' | ||||
|   Hook::LexWrap: '0' | ||||
|   Module::Find: '0' | ||||
|   NetSNMP::default_store: '0' | ||||
|   Path::Class: '0' | ||||
|   Test::Class::Most: '0' | ||||
|   Test::Distribution: '0' | ||||
|   Test::Exception: '0.43' | ||||
|   Test::MockObject::Extends: '0' | ||||
|   Test::More: '0.88' | ||||
| configure_requires: | ||||
|   Module::Build: '0.42' | ||||
| dynamic_config: 1 | ||||
| generated_by: 'Module::Build version 0.4231, 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.88' | ||||
|   SNMP::Info::AMAP: | ||||
|     file: lib/SNMP/Info/AMAP.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::AdslLine: | ||||
|     file: lib/SNMP/Info/AdslLine.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Aggregate: | ||||
|     file: lib/SNMP/Info/Aggregate.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Airespace: | ||||
|     file: lib/SNMP/Info/Airespace.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Bridge: | ||||
|     file: lib/SNMP/Info/Bridge.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CDP: | ||||
|     file: lib/SNMP/Info/CDP.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoAgg: | ||||
|     file: lib/SNMP/Info/CiscoAgg.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoBGP: | ||||
|     file: lib/SNMP/Info/CiscoBGP.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoConfig: | ||||
|     file: lib/SNMP/Info/CiscoConfig.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoPortSecurity: | ||||
|     file: lib/SNMP/Info/CiscoPortSecurity.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoPower: | ||||
|     file: lib/SNMP/Info/CiscoPower.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoQOS: | ||||
|     file: lib/SNMP/Info/CiscoQOS.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoRTT: | ||||
|     file: lib/SNMP/Info/CiscoRTT.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoStack: | ||||
|     file: lib/SNMP/Info/CiscoStack.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoStats: | ||||
|     file: lib/SNMP/Info/CiscoStats.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoStpExtensions: | ||||
|     file: lib/SNMP/Info/CiscoStpExtensions.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::CiscoVTP: | ||||
|     file: lib/SNMP/Info/CiscoVTP.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::DocsisCM: | ||||
|     file: lib/SNMP/Info/DocsisCM.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::DocsisHE: | ||||
|     file: lib/SNMP/Info/DocsisHE.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::EDP: | ||||
|     file: lib/SNMP/Info/EDP.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Entity: | ||||
|     file: lib/SNMP/Info/Entity.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::EtherLike: | ||||
|     file: lib/SNMP/Info/EtherLike.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::FDP: | ||||
|     file: lib/SNMP/Info/FDP.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::IEEE802_Bridge: | ||||
|     file: lib/SNMP/Info/IEEE802_Bridge.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::IEEE802dot11: | ||||
|     file: lib/SNMP/Info/IEEE802dot11.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::IEEE802dot3ad: | ||||
|     file: lib/SNMP/Info/IEEE802dot3ad.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::IPv6: | ||||
|     file: lib/SNMP/Info/IPv6.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::LLDP: | ||||
|     file: lib/SNMP/Info/LLDP.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer1: | ||||
|     file: lib/SNMP/Info/Layer1.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer1::Allied: | ||||
|     file: lib/SNMP/Info/Layer1/Allied.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer1::Asante: | ||||
|     file: lib/SNMP/Info/Layer1/Asante.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer1::Bayhub: | ||||
|     file: lib/SNMP/Info/Layer1/Bayhub.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer1::Cyclades: | ||||
|     file: lib/SNMP/Info/Layer1/Cyclades.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer1::S3000: | ||||
|     file: lib/SNMP/Info/Layer1/S3000.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2: | ||||
|     file: lib/SNMP/Info/Layer2.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::3Com: | ||||
|     file: lib/SNMP/Info/Layer2/3Com.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Adtran: | ||||
|     file: lib/SNMP/Info/Layer2/Adtran.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Aerohive: | ||||
|     file: lib/SNMP/Info/Layer2/Aerohive.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Airespace: | ||||
|     file: lib/SNMP/Info/Layer2/Airespace.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Aironet: | ||||
|     file: lib/SNMP/Info/Layer2/Aironet.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Allied: | ||||
|     file: lib/SNMP/Info/Layer2/Allied.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Atmedia: | ||||
|     file: lib/SNMP/Info/Layer2/Atmedia.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Baystack: | ||||
|     file: lib/SNMP/Info/Layer2/Baystack.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::C1900: | ||||
|     file: lib/SNMP/Info/Layer2/C1900.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::C2900: | ||||
|     file: lib/SNMP/Info/Layer2/C2900.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Catalyst: | ||||
|     file: lib/SNMP/Info/Layer2/Catalyst.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Centillion: | ||||
|     file: lib/SNMP/Info/Layer2/Centillion.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Cisco: | ||||
|     file: lib/SNMP/Info/Layer2/Cisco.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::CiscoSB: | ||||
|     file: lib/SNMP/Info/Layer2/CiscoSB.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Exinda: | ||||
|     file: lib/SNMP/Info/Layer2/Exinda.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::HP: | ||||
|     file: lib/SNMP/Info/Layer2/HP.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::HP4000: | ||||
|     file: lib/SNMP/Info/Layer2/HP4000.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::HPVC: | ||||
|     file: lib/SNMP/Info/Layer2/HPVC.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Kentrox: | ||||
|     file: lib/SNMP/Info/Layer2/Kentrox.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::N2270: | ||||
|     file: lib/SNMP/Info/Layer2/N2270.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::NAP222x: | ||||
|     file: lib/SNMP/Info/Layer2/NAP222x.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::NWSS2300: | ||||
|     file: lib/SNMP/Info/Layer2/NWSS2300.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Netgear: | ||||
|     file: lib/SNMP/Info/Layer2/Netgear.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Nexans: | ||||
|     file: lib/SNMP/Info/Layer2/Nexans.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Orinoco: | ||||
|     file: lib/SNMP/Info/Layer2/Orinoco.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Sixnet: | ||||
|     file: lib/SNMP/Info/Layer2/Sixnet.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Trapeze: | ||||
|     file: lib/SNMP/Info/Layer2/Trapeze.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::Ubiquiti: | ||||
|     file: lib/SNMP/Info/Layer2/Ubiquiti.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer2::ZyXEL_DSLAM: | ||||
|     file: lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3: | ||||
|     file: lib/SNMP/Info/Layer3.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Aironet: | ||||
|     file: lib/SNMP/Info/Layer3/Aironet.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::AlcatelLucent: | ||||
|     file: lib/SNMP/Info/Layer3/AlcatelLucent.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::AlteonAD: | ||||
|     file: lib/SNMP/Info/Layer3/AlteonAD.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Altiga: | ||||
|     file: lib/SNMP/Info/Layer3/Altiga.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Arista: | ||||
|     file: lib/SNMP/Info/Layer3/Arista.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Aruba: | ||||
|     file: lib/SNMP/Info/Layer3/Aruba.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::ArubaCX: | ||||
|     file: lib/SNMP/Info/Layer3/ArubaCX.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::BayRS: | ||||
|     file: lib/SNMP/Info/Layer3/BayRS.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::BlueCoatSG: | ||||
|     file: lib/SNMP/Info/Layer3/BlueCoatSG.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::C3550: | ||||
|     file: lib/SNMP/Info/Layer3/C3550.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::C4000: | ||||
|     file: lib/SNMP/Info/Layer3/C4000.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::C6500: | ||||
|     file: lib/SNMP/Info/Layer3/C6500.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::CheckPoint: | ||||
|     file: lib/SNMP/Info/Layer3/CheckPoint.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Ciena: | ||||
|     file: lib/SNMP/Info/Layer3/Ciena.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Cisco: | ||||
|     file: lib/SNMP/Info/Layer3/Cisco.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::CiscoASA: | ||||
|     file: lib/SNMP/Info/Layer3/CiscoASA.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::CiscoFWSM: | ||||
|     file: lib/SNMP/Info/Layer3/CiscoFWSM.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::CiscoSwitch: | ||||
|     file: lib/SNMP/Info/Layer3/CiscoSwitch.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Contivity: | ||||
|     file: lib/SNMP/Info/Layer3/Contivity.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Cumulus: | ||||
|     file: lib/SNMP/Info/Layer3/Cumulus.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::DLink: | ||||
|     file: lib/SNMP/Info/Layer3/DLink.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Dell: | ||||
|     file: lib/SNMP/Info/Layer3/Dell.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::ERX: | ||||
|     file: lib/SNMP/Info/Layer3/ERX.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Enterasys: | ||||
|     file: lib/SNMP/Info/Layer3/Enterasys.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Extreme: | ||||
|     file: lib/SNMP/Info/Layer3/Extreme.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::F5: | ||||
|     file: lib/SNMP/Info/Layer3/F5.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Force10: | ||||
|     file: lib/SNMP/Info/Layer3/Force10.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Fortinet: | ||||
|     file: lib/SNMP/Info/Layer3/Fortinet.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Foundry: | ||||
|     file: lib/SNMP/Info/Layer3/Foundry.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Genua: | ||||
|     file: lib/SNMP/Info/Layer3/Genua.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::H3C: | ||||
|     file: lib/SNMP/Info/Layer3/H3C.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::HP9300: | ||||
|     file: lib/SNMP/Info/Layer3/HP9300.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Huawei: | ||||
|     file: lib/SNMP/Info/Layer3/Huawei.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::IBMGbTor: | ||||
|     file: lib/SNMP/Info/Layer3/IBMGbTor.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Juniper: | ||||
|     file: lib/SNMP/Info/Layer3/Juniper.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Lantronix: | ||||
|     file: lib/SNMP/Info/Layer3/Lantronix.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Lenovo: | ||||
|     file: lib/SNMP/Info/Layer3/Lenovo.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Microsoft: | ||||
|     file: lib/SNMP/Info/Layer3/Microsoft.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Mikrotik: | ||||
|     file: lib/SNMP/Info/Layer3/Mikrotik.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::N1600: | ||||
|     file: lib/SNMP/Info/Layer3/N1600.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::NetSNMP: | ||||
|     file: lib/SNMP/Info/Layer3/NetSNMP.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Netscreen: | ||||
|     file: lib/SNMP/Info/Layer3/Netscreen.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Nexus: | ||||
|     file: lib/SNMP/Info/Layer3/Nexus.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::OneAccess: | ||||
|     file: lib/SNMP/Info/Layer3/OneAccess.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::PacketFront: | ||||
|     file: lib/SNMP/Info/Layer3/PacketFront.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::PaloAlto: | ||||
|     file: lib/SNMP/Info/Layer3/PaloAlto.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Passport: | ||||
|     file: lib/SNMP/Info/Layer3/Passport.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Pf: | ||||
|     file: lib/SNMP/Info/Layer3/Pf.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Pica8: | ||||
|     file: lib/SNMP/Info/Layer3/Pica8.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Redlion: | ||||
|     file: lib/SNMP/Info/Layer3/Redlion.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Scalance: | ||||
|     file: lib/SNMP/Info/Layer3/Scalance.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::SonicWALL: | ||||
|     file: lib/SNMP/Info/Layer3/SonicWALL.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Steelfusion: | ||||
|     file: lib/SNMP/Info/Layer3/Steelfusion.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Steelhead: | ||||
|     file: lib/SNMP/Info/Layer3/Steelhead.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::SteelheadEx: | ||||
|     file: lib/SNMP/Info/Layer3/SteelheadEx.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Sun: | ||||
|     file: lib/SNMP/Info/Layer3/Sun.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Tasman: | ||||
|     file: lib/SNMP/Info/Layer3/Tasman.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Teltonika: | ||||
|     file: lib/SNMP/Info/Layer3/Teltonika.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Timetra: | ||||
|     file: lib/SNMP/Info/Layer3/Timetra.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::VMware: | ||||
|     file: lib/SNMP/Info/Layer3/VMware.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::VyOS: | ||||
|     file: lib/SNMP/Info/Layer3/VyOS.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer3::Whiterabbit: | ||||
|     file: lib/SNMP/Info/Layer3/Whiterabbit.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer7: | ||||
|     file: lib/SNMP/Info/Layer7.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer7::APC: | ||||
|     file: lib/SNMP/Info/Layer7/APC.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer7::Arbor: | ||||
|     file: lib/SNMP/Info/Layer7/Arbor.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer7::CiscoIPS: | ||||
|     file: lib/SNMP/Info/Layer7/CiscoIPS.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer7::Gigamon: | ||||
|     file: lib/SNMP/Info/Layer7/Gigamon.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer7::HWGroup: | ||||
|     file: lib/SNMP/Info/Layer7/HWGroup.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer7::Liebert: | ||||
|     file: lib/SNMP/Info/Layer7/Liebert.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer7::Neoteris: | ||||
|     file: lib/SNMP/Info/Layer7/Neoteris.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::Layer7::Netscaler: | ||||
|     file: lib/SNMP/Info/Layer7/Netscaler.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::MAU: | ||||
|     file: lib/SNMP/Info/MAU.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::MRO: | ||||
|     file: lib/SNMP/Info/MRO.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::NortelStack: | ||||
|     file: lib/SNMP/Info/NortelStack.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::PortAccessEntity: | ||||
|     file: lib/SNMP/Info/PortAccessEntity.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::PowerEthernet: | ||||
|     file: lib/SNMP/Info/PowerEthernet.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::RapidCity: | ||||
|     file: lib/SNMP/Info/RapidCity.pm | ||||
|     version: '3.88' | ||||
|   SNMP::Info::SONMP: | ||||
|     file: lib/SNMP/Info/SONMP.pm | ||||
|     version: '3.88' | ||||
| recommends: | ||||
|   Class::ISA: '0' | ||||
|   File::Slurp: '0' | ||||
|   Module::Info: '0' | ||||
|   Module::Load: '0' | ||||
|   PPI: '0' | ||||
| requires: | ||||
|   Math::BigInt: '0' | ||||
|   NetAddr::IP: '4.068' | ||||
|   SNMP: '0' | ||||
| resources: | ||||
|   IRC: irc://irc.libera.chat/#netdisco | ||||
|   MailingList: https://lists.sourceforge.net/lists/listinfo/snmp-info-users | ||||
|   bugtracker: https://github.com/netdisco/snmp-info/issues | ||||
|   homepage: http://netdisco.org/ | ||||
|   license: http://opensource.org/licenses/bsd-license.php | ||||
|   repository: https://github.com/netdisco/snmp-info | ||||
| version: '3.88' | ||||
| 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,26 +4,30 @@ Coding Guidelines: | ||||
|     - tab-width of 4, no tab characters | ||||
|     - keep POD documentation up-to-date | ||||
|     - always update ChangeLog before committing | ||||
|     - always update DeviceMatrix.txt before committing | ||||
|     - check-in required mibs to netdisco-mibs and release new package if needed | ||||
| 
 | ||||
| Release and Testing Instructions:  | ||||
|     - Please see misc/RELEASE in Netdisco | ||||
|       ( http://netdisco.cvs.sourceforge.net/viewvc/netdisco/misc/RELEASE?view=markup ) | ||||
|       and follow all testing and release guidelines | ||||
| Release and Testing Instructions: | ||||
|     - for netdisco see: | ||||
|         -> https://github.com/netdisco/netdisco/wiki/Developing | ||||
|         -> https://metacpan.org/pod/App::Netdisco | ||||
|     - for snmp::info see: | ||||
|         -> https://github.com/netdisco/snmp-info/wiki/Release-Process | ||||
|         -> https://metacpan.org/pod/SNMP::Info#EXTENDING-SNMP::INFO | ||||
|     - for netdisco-mibs see: | ||||
|         -> https://github.com/netdisco/netdisco-mibs/wiki | ||||
| 
 | ||||
| FAQ: | ||||
|     - Do I have to update the version number and timestamp in modified files before committing?  | ||||
|     - Do I have to update the version number and timestamp in modified files before committing? | ||||
|     -> No.  These are RCS tags that are automatically updated by CVS when you commit | ||||
| 
 | ||||
|     - Should I add changes at the top of the ChangeLog? | ||||
|     -> Yes. The changelog is created one commit at a time.  If there isn't a | ||||
|         section for the current version, then add one at the top and put your | ||||
|         changes after.  You can leave the date field for the release empty ().  | ||||
|         changes after.  You can leave the date field for the release empty (). | ||||
| 
 | ||||
|     - What should I change the $VERSION to? | ||||
|     -> If you are the first person to get to a file after a release, update it | ||||
|        to either  release++ or "release++ dash cvs".    | ||||
|        to either  release++ or "release++ dash cvs". | ||||
|        Example: File is marked 2.01, change it to 2.02-cvs with your new changes. | ||||
|        Example: File is marked 2.02-cvs,  no change until packaging for release when the -cvs is removed. | ||||
|        TODO: Is there still an odd/even scheme as introduced by Eric? | ||||
| @@ -28,7 +28,7 @@ if ($@) { | ||||
|             } else { | ||||
|                 $graph{$vendor}->{$family}=[]; | ||||
|             } | ||||
|              | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
|     my $now = scalar localtime; | ||||
| @@ -83,7 +83,7 @@ foreach my $vendor (sort sort_nocase keys %$matrix){ | ||||
|                 } elsif (defined $vendor_defaults->{$a}){ | ||||
|                     $val = $vendor_defaults->{$a}; | ||||
|                     $class = 'vendor'; | ||||
|                 }  | ||||
|                 } | ||||
|                 print "  <TD CLASS='$class'>",join("<BR>\n",@$val),"</TD>\n"; | ||||
|             } | ||||
|             print "</TR></TABLE>\n"; | ||||
| @@ -141,7 +141,7 @@ sub parse_data { | ||||
| 
 | ||||
|         my ($cmd,$value); | ||||
|         if ($line =~ /^([a-z-_]+)\s*:\s*(.*)$/) { | ||||
|             $cmd = $1;  $value = $2;  | ||||
|             $cmd = $1;  $value = $2; | ||||
|         } else { | ||||
|             print "What do i do with this line : $line \n"; | ||||
|             next; | ||||
| @@ -164,18 +164,18 @@ sub parse_data { | ||||
|             $family = $value; | ||||
|             $model = undef; | ||||
|             print "$family has no vendor.\n" unless defined $vendor; | ||||
|             $Matrix->{$vendor}->{families}->{$family} = {}  | ||||
|             $Matrix->{$vendor}->{families}->{$family} = {} | ||||
|                 unless defined $Matrix->{$vendor}->{families}->{$family}; | ||||
|             $class = $Matrix->{$vendor}->{families}->{$family}; | ||||
|             $class->{defaults}->{type}='family'; | ||||
|             next; | ||||
|         }    | ||||
|         } | ||||
| 
 | ||||
|         if ($cmd eq 'device') { | ||||
|             $model = $value; | ||||
|             print "$model has no family.\n" unless defined $family; | ||||
|             print "$model has no vendor.\n" unless defined $vendor; | ||||
|             $Matrix->{$vendor}->{families}->{$family}->{models}->{$model} = {}  | ||||
|             $Matrix->{$vendor}->{families}->{$family}->{models}->{$model} = {} | ||||
|                 unless defined $Matrix->{$vendor}->{families}->{$family}->{models}->{$model}; | ||||
|             $class = $Matrix->{$vendor}->{families}->{$family}->{models}->{$model}; | ||||
|             $class->{defaults}->{type}='device'; | ||||
| @@ -233,7 +233,7 @@ sub html_head { | ||||
|     .vendor { font-size:12pt; color:#777777; } | ||||
|     .family { font-size:12pt; color:blue; } | ||||
|     .model  { font-size:12pt; color:red; } | ||||
|     .note   { color:red; }  | ||||
|     .note   { color:red; } | ||||
| //--> | ||||
| </STYLE> | ||||
| </HEAD> | ||||
| @@ -304,7 +304,7 @@ be assumed working. | ||||
|         Discovery Protocol (LLDP), Cisco Discovery Protocol (CDP), | ||||
|         SynOptics/Bay/Nortel/Avaya Network Management Protocol (SONMP), | ||||
|         Foundry/Brocade Discovery Protocol (FDP), Extreme Discovery | ||||
|         Protocol (EDP), and Alcatel Mapping Adjacency Protocol (AMAP).  | ||||
|         Protocol (EDP), and Alcatel Mapping Adjacency Protocol (AMAP). | ||||
|     </TD> | ||||
| </TR> | ||||
| <TR> | ||||
| @@ -325,7 +325,7 @@ be assumed working. | ||||
| </BODY> | ||||
| </HTML> | ||||
| end_tail | ||||
|      | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| sub print_headers { | ||||
| @@ -80,7 +80,7 @@ unless ( defined $sysdescr ) { | ||||
| 
 | ||||
| SNMP::loadModules(@ARGV); | ||||
| 
 | ||||
| # Create a hash of MIB Modules for which we want results  | ||||
| # Create a hash of MIB Modules for which we want results | ||||
| my %mib_hash = map {$_ => 1} @ARGV; | ||||
| # Add the common MIB Modules we always want | ||||
| my @common_mibs = ('SNMPv2-MIB', 'IF-MIB'); | ||||
| @@ -3,9 +3,9 @@ | ||||
| 
 | ||||
| use File::Glob qw/bsd_glob/; | ||||
| 
 | ||||
| my @pms = glob_rec("../Info"); | ||||
| my @pms = glob_rec("./lib"); | ||||
| 
 | ||||
| $new_version = shift @ARGV || '3.01'; | ||||
| $new_version = shift @ARGV || die "missing new version\n"; | ||||
| 
 | ||||
| foreach my $p (@pms) { | ||||
|     print "$p\n"; | ||||
| @@ -16,6 +16,7 @@ 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; | ||||
|     } | ||||
| 
 | ||||
| @@ -34,7 +35,7 @@ sub glob_rec { | ||||
| 
 | ||||
|     foreach my $f (@files) { | ||||
|         next if $f eq '\.$'; | ||||
|          | ||||
| 
 | ||||
|         if (-d $f) { | ||||
|             push @pms, glob_rec($f); | ||||
|             next; | ||||
| @@ -250,11 +250,11 @@ test_class.pl [options] | ||||
| 
 | ||||
| Options: | ||||
| 
 | ||||
|     -c|class    SNMP::Info class to use, Layer2::Catalyst     | ||||
|     -c|class    SNMP::Info class to use, Layer2::Catalyst | ||||
|     -d|dev      Device | ||||
|     -s|comm     SNMP community | ||||
|     -v|ver      SNMP version | ||||
|     -p|print    Print values  | ||||
|     -p|print    Print values | ||||
|     -i|ignore   Ignore Net-SNMP configuration file | ||||
|     -m|mibdir   Directory containing MIB Files | ||||
|     -n|nobulk   Disable bulkwalk | ||||
| @@ -294,7 +294,7 @@ SNMP version. Default 2. | ||||
| =item B<-print> | ||||
| 
 | ||||
| Print values of a class method rather than summarizing.  May be repeated | ||||
| multiple times.  | ||||
| multiple times. | ||||
| 
 | ||||
| -print i_description -print i_type | ||||
| 
 | ||||
| @@ -308,7 +308,7 @@ provided. | ||||
| =item B<-mibdir> | ||||
| 
 | ||||
| Directory containing MIB Files.  Multiple directories should be separated by a | ||||
| colon ':'.  | ||||
| colon ':'. | ||||
| 
 | ||||
| -mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp | ||||
| 
 | ||||
| @@ -1,4 +1,4 @@ | ||||
| #!/usr/bin/perl | ||||
| #!/usr/bin/env perl | ||||
| # | ||||
| # test_class_mocked.pl | ||||
| # | ||||
| @@ -33,7 +33,7 @@ use strict; | ||||
| use warnings; | ||||
| use Carp; | ||||
| use FindBin; | ||||
| use lib "$FindBin::Bin/../../.."; | ||||
| use lib "$FindBin::Bin/../../lib"; | ||||
| use File::Slurp qw(slurp); | ||||
| use Getopt::Long; | ||||
| use Pod::Usage; | ||||
| @@ -385,9 +385,9 @@ test_class_mocked.pl [options] | ||||
| 
 | ||||
| Options: | ||||
| 
 | ||||
|     -class    SNMP::Info class to use, Layer2::Catalyst     | ||||
|     -class    SNMP::Info class to use, Layer2::Catalyst | ||||
|     -file     File containing data gathered using make_snmpdata.pl | ||||
|     -print    Print values  | ||||
|     -print    Print values | ||||
|     -debug    Debugging flag | ||||
|     -ignore   Ignore Net-SNMP configuration file | ||||
|     -mibdir   Directory containing MIB Files | ||||
| @@ -414,7 +414,7 @@ mandatory option. | ||||
| =item B<-print> | ||||
| 
 | ||||
| Print values of a class method rather than summarizing.  May be repeated | ||||
| multiple times.  | ||||
| multiple times. | ||||
| 
 | ||||
| -print i_description -print i_type | ||||
| 
 | ||||
| @@ -434,7 +434,7 @@ provided. | ||||
| =item B<-mibdir> | ||||
| 
 | ||||
| Directory containing MIB Files.  Multiple directories should be separated by a | ||||
| colon ':'.  | ||||
| colon ':'. | ||||
| 
 | ||||
| -mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp | ||||
| 
 | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -30,26 +30,27 @@ | ||||
| package SNMP::Info::AMAP; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::LLDP::EXPORT_OK = qw//; | ||||
| @SNMP::Info::AMAP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::AMAP::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS | ||||
|     = ( 'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', ); | ||||
| %MIBS = ( | ||||
|   'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
| 
 | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
| 
 | ||||
|     # EXTREME-EDP-MIB::extremeEdpTable | ||||
|     # ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB::aipAMAPRemHostname | ||||
|     'amap_rem_sysname' => 'aipAMAPRemHostname', | ||||
| ); | ||||
| 
 | ||||
| @@ -91,7 +92,7 @@ sub _conn_table_mac { | ||||
| # address since they should all originate from the same device, but we don't | ||||
| # know if they would all be reachable from the network management application. | ||||
| # | ||||
| # We don't inplement partials since this is private index function | ||||
| # We don't implement partials since this is private index function | ||||
| sub _amap_index { | ||||
|     my $amap = shift; | ||||
| 
 | ||||
| @@ -240,10 +241,10 @@ Eric Miller | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  my $amap = new SNMP::Info (  | ||||
|  my $amap = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
| @@ -253,7 +254,7 @@ Eric Miller | ||||
| 
 | ||||
|  $hasamap   = $amap->hasAMAP() ? 'yes' : 'no'; | ||||
| 
 | ||||
|  # Print out a map of device ports with LLDP neighbors: | ||||
|  # Print out a map of device ports with AMAP neighbors: | ||||
|  my $interfaces    = $amap->interfaces(); | ||||
|  my $amap_if       = $amap->amap_if(); | ||||
|  my $amap_ip       = $amap->amap_ip(); | ||||
| @@ -269,7 +270,7 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented  | ||||
| SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented | ||||
| interface to Alcatel Mapping Adjacency Protocol (AMAP) information through | ||||
| SNMP. | ||||
| 
 | ||||
| @@ -291,7 +292,7 @@ None. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| @@ -299,7 +300,7 @@ These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| =item $amap->hasAMAP() | ||||
| 
 | ||||
| Is AMAP is active in this device?   | ||||
| Is AMAP is active in this device? | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -322,7 +323,7 @@ Returns the mapping to the SNMP Interface Table. | ||||
| 
 | ||||
| Returns remote IPv4 addresses.  Note: AMAP returns all IP addresses associated | ||||
| with the remote device.  It would be preferable to include only one address | ||||
| since they should all originate from the same device, but amap_ip() can not  | ||||
| since they should all originate from the same device, but amap_ip() can not | ||||
| determine if all addresses are reachable from the network management | ||||
| application therefore all addresses are returned and the calling application | ||||
| must determine which address to use and if they are in fact from the same | ||||
| @@ -30,15 +30,16 @@ | ||||
| package SNMP::Info::AdslLine; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::AdslLine::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::AdslLine::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' ); | ||||
| 
 | ||||
| @@ -50,7 +51,7 @@ $VERSION = '3.19'; | ||||
|     'adsl_atuc_curr_tx_rate'        => 'adslAtucChanCurrTxRate', | ||||
|     'adsl_atuc_prev_tx_rate'        => 'adslAtucChanPrevTxRate', | ||||
|     'adsl_atuc_crc_block_len'       => 'adslAtucChanCrcBlockLength', | ||||
|      | ||||
| 
 | ||||
|     # ADSL-LINE-MIB::adslAturChanTable | ||||
|     'adsl_atur_interleave_delay'    => 'adslAturChanInterleaveDelay', | ||||
|     'adsl_atur_curr_tx_rate'        => 'adslAturChanCurrTxRate', | ||||
| @@ -73,14 +74,14 @@ Alexander Hartmaier | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $info = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $info->class(); | ||||
| @@ -88,7 +89,7 @@ Alexander Hartmaier | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::AdslLine is a subclass of SNMP::Info that provides  | ||||
| SNMP::Info::AdslLine is a subclass of SNMP::Info that provides | ||||
| information about the adsl interfaces of a device. | ||||
| 
 | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| @@ -105,8 +106,6 @@ none. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| =over | ||||
| @@ -30,17 +30,19 @@ | ||||
| package SNMP::Info::Aggregate; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::Aggregate::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Aggregate::EXPORT_OK = qw/agg_ports_ifstack/; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = (); # IF-MIB | ||||
| # Load MIB for leafs referenced within class | ||||
| %MIBS = ('IF-MIB' => 'ifIndex',); | ||||
| 
 | ||||
| %GLOBALS = (); | ||||
| 
 | ||||
| @@ -61,7 +63,7 @@ sub agg_ports_ifstack { | ||||
|   foreach my $idx ( keys %$ifStack ) { | ||||
|       my ( $higher, $lower ) = split /\./, $idx; | ||||
|       next if ( $higher == 0 or $lower == 0 ); | ||||
|       if ( $ifType->{ $higher } eq 'ieee8023adLag' ) { | ||||
|       if ( $ifType->{ $higher } eq 'ieee8023adLag'  or $ifType->{ $higher } eq 'propMultiplexor') { | ||||
|           $ret->{ $lower } = $higher; | ||||
|       } | ||||
|   } | ||||
| @@ -83,14 +85,14 @@ SNMP::Info Developers | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $info = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $info->class(); | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Airespace | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::Airespace; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::Airespace::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Airespace::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -84,7 +84,7 @@ $VERSION = '3.19'; | ||||
|     'airespace_ess_ifname'    => 'bsnDot11EssInterfaceName', | ||||
|     'airespace_ess_aclname'   => 'bsnDot11EssAclName', | ||||
|     'airespace_ess_bcast'     => 'bsnDot11EssBroadcastSsid', | ||||
|      | ||||
| 
 | ||||
|     # AIRESPACE-WIRELESS-MIB::bsnAPTable | ||||
|     'airespace_ap_mac'      => 'bsnAPDot3MacAddress', | ||||
|     'airespace_ap_name'     => 'bsnAPName', | ||||
| @@ -508,8 +508,8 @@ sub ip_index { | ||||
|     my $airespace = shift; | ||||
|     my $partial   = shift; | ||||
| 
 | ||||
|     my $ip_index = $airespace->orig_ip_index($partial) || {}; | ||||
|     my $if_ip    = $airespace->airespace_if_ip()       || {}; | ||||
|     my $ip_index = $airespace->SUPER::ip_index($partial) || {}; | ||||
|     my $if_ip    = $airespace->airespace_if_ip()         || {}; | ||||
| 
 | ||||
|     my %ip_index; | ||||
|     foreach my $ip ( keys %$ip_index ) { | ||||
| @@ -534,9 +534,9 @@ sub ip_netmask { | ||||
|     my $airespace = shift; | ||||
|     my $partial   = shift; | ||||
| 
 | ||||
|     my $ip_mask = $airespace->orig_ip_netmask($partial) || {}; | ||||
|     my $if_ip   = $airespace->airespace_if_ip()         || {}; | ||||
|     my $if_mask = $airespace->airespace_if_mask()       || {}; | ||||
|     my $ip_mask = $airespace->SUPER::ip_netmask($partial) || {}; | ||||
|     my $if_ip   = $airespace->airespace_if_ip()           || {}; | ||||
|     my $if_mask = $airespace->airespace_if_mask()         || {}; | ||||
| 
 | ||||
|     my %ip_netmask; | ||||
|     foreach my $ip ( keys %$ip_mask ) { | ||||
| @@ -764,14 +764,14 @@ sub dot11_cur_tx_pwr_mw { | ||||
|     my $partial   = shift; | ||||
|     my $cur       = $airespace->airespace_apif_power($partial); | ||||
|     my $pwr_abs   = $airespace->airespace_apif_a_pwr($partial); | ||||
|      | ||||
| 
 | ||||
|     my $dot11_cur_tx_pwr_mw = {}; | ||||
|     foreach my $idx ( keys %$cur ) { | ||||
|         my $pwr = $cur->{$idx}; | ||||
|         if ( $pwr >= 1 && $pwr <= 8 ) { | ||||
| 
 | ||||
|             my @pwr_list = split(/,/, $pwr_abs->{$idx} );  | ||||
|             $dot11_cur_tx_pwr_mw->{$idx} = $pwr_list[$pwr-1];  | ||||
|             my @pwr_list = split(/,/, $pwr_abs->{$idx} ); | ||||
|             $dot11_cur_tx_pwr_mw->{$idx} = $pwr_list[$pwr-1]; | ||||
| 
 | ||||
|         } | ||||
|         else { | ||||
| @@ -1087,7 +1087,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
| 
 | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -1204,7 +1204,7 @@ valid only when the Transfer Mode is tftp. | ||||
| =item $airespace->airespace_ul_path() | ||||
| 
 | ||||
| Transfer upload tftp path configures the directory path where the file is to | ||||
| be uploaded to. The switch remembers the last file path used.  | ||||
| be uploaded to. The switch remembers the last file path used. | ||||
| 
 | ||||
| (C<agentTransferUploadPath>) | ||||
| 
 | ||||
| @@ -1279,7 +1279,7 @@ radio interface. | ||||
| =item $airespace->i_ssidmac() | ||||
| 
 | ||||
| With the same keys as i_ssidlist, returns the Basic service set | ||||
| identification (BSSID), MAC address, the AP is using for the SSID.  | ||||
| identification (BSSID), MAC address, the AP is using for the SSID. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -1346,7 +1346,7 @@ Name of the interface used by this WLAN. | ||||
| Name of ACL for the WLAN. This is applicable only when Web Authentication is | ||||
| enabled. | ||||
| 
 | ||||
| (C<bsnDot11EssAclName>)            | ||||
| (C<bsnDot11EssAclName>) | ||||
| 
 | ||||
| =item $airespace->airespace_ess_bcast() | ||||
| 
 | ||||
| @@ -1672,14 +1672,14 @@ to an empty string. | ||||
| 
 | ||||
| =item $airespace->i_index() | ||||
| 
 | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
| 
 | ||||
| Extends C<ifIndex> to support thin APs and WLAN virtual interfaces as device | ||||
| interfaces. | ||||
| 
 | ||||
| =item $airespace->interfaces() | ||||
| 
 | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device  | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device | ||||
| interfaces.  The thin AP MAC address airespace_ap_mac() and Slot ID | ||||
| airespace_apif_slot() are used as the port identifier.  Virtual interfaces | ||||
| use airespace_if_name() as the port identifier. | ||||
| @@ -1717,7 +1717,7 @@ for thin AP interfaces. | ||||
| =item $airespace->i_mac() | ||||
| 
 | ||||
| Returns reference to map of IIDs to MAC address of the interface.  Returns | ||||
| C<ifPhysAddress> for Ethernet interfaces and airespace_if_mac() for virtual  | ||||
| C<ifPhysAddress> for Ethernet interfaces and airespace_if_mac() for virtual | ||||
| interfaces. | ||||
| 
 | ||||
| =item $airespace->i_vlan() | ||||
| @@ -1751,7 +1751,7 @@ the interface iid. | ||||
| =item $airespace->fw_port() | ||||
| 
 | ||||
| Returns reference to a hash, value being airespace_sta_mac() and | ||||
| airespace_sta_slot() combined to match the interface iid.   | ||||
| airespace_sta_slot() combined to match the interface iid. | ||||
| 
 | ||||
| =item $airespace->fw_mac() | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Bridge | ||||
| # $Id$ | ||||
| # | ||||
| # Changes since Version 0.7 Copyright (c) 2004 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -34,19 +33,21 @@ | ||||
| package SNMP::Info::Bridge; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::Bridge::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Bridge::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/; | ||||
| our ($VERSION, $DEBUG, %MIBS, %FUNCS, %GLOBALS, %MUNGE, $INIT); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     'BRIDGE-MIB'   => 'dot1dBaseBridgeAddress', | ||||
|     'Q-BRIDGE-MIB' => 'dot1qPvid', | ||||
|     'RSTP-MIB'     => 'dot1dStpPortOperEdgePort', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
| @@ -84,6 +85,17 @@ $VERSION = '3.19'; | ||||
|     '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', | ||||
| @@ -93,6 +105,10 @@ $VERSION = '3.19'; | ||||
|     'stp_p_bridge'   => 'dot1dStpPortDesignatedBridge', | ||||
|     'stp_p_port'     => 'dot1dStpPortDesignatedPort', | ||||
| 
 | ||||
|     # Rapid Spanning Tree Protocol Table : dot1dStpExtPortEntry | ||||
|     'is_edgeport_admin' => 'dot1dStpPortAdminEdgePort', | ||||
|     'is_edgeport_oper'  => 'dot1dStpPortOperEdgePort', | ||||
| 
 | ||||
|     # Q-BRIDGE-MIB : dot1qPortVlanTable | ||||
|     'qb_i_vlan'        => 'dot1qPvid', | ||||
|     'qb_i_vlan_type'   => 'dot1qPortAcceptableFrameTypes', | ||||
| @@ -125,15 +141,18 @@ $VERSION = '3.19'; | ||||
|     '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, | ||||
| 
 | ||||
| ); | ||||
| 
 | ||||
| @@ -163,10 +182,20 @@ sub qb_fw_vlan { | ||||
|     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); | ||||
|         $qb_fw_vlan->{$idx} = $fdb_id; | ||||
|         # 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; | ||||
| } | ||||
| @@ -189,13 +218,34 @@ sub qb_i_vlan_t { | ||||
|     return $i_vlan; | ||||
| } | ||||
| 
 | ||||
| # Most devices now support Q-BRIDGE-MIB, fall back to  | ||||
| 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); | ||||
|     unless ($bridge->can('cisco_comm_indexing') && $bridge->cisco_comm_indexing()){ | ||||
|         my $qb = $bridge->qb_fw_mac(); | ||||
|         return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|     } | ||||
| 
 | ||||
|     return $bridge->SUPER::fw_mac(); | ||||
| } | ||||
| @@ -203,8 +253,10 @@ sub fw_mac { | ||||
| sub fw_port { | ||||
|     my $bridge = shift; | ||||
| 
 | ||||
|     my $qb = $bridge->qb_fw_port(); | ||||
|     return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|     unless ($bridge->can('cisco_comm_indexing') && $bridge->cisco_comm_indexing()){ | ||||
|         my $qb = $bridge->qb_fw_port(); | ||||
|         return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|     } | ||||
| 
 | ||||
|     return $bridge->SUPER::fw_port(); | ||||
| } | ||||
| @@ -212,9 +264,11 @@ sub fw_port { | ||||
| sub fw_status { | ||||
|     my $bridge = shift; | ||||
| 
 | ||||
|     my $qb = $bridge->qb_fw_status(); | ||||
|     return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|      | ||||
|     unless ($bridge->can('cisco_comm_indexing') && $bridge->cisco_comm_indexing()){ | ||||
|         my $qb = $bridge->qb_fw_status(); | ||||
|         return $qb if (ref {} eq ref $qb and scalar keys %$qb); | ||||
|     } | ||||
| 
 | ||||
|     return $bridge->SUPER::fw_status(); | ||||
| } | ||||
| 
 | ||||
| @@ -248,11 +302,11 @@ sub i_stp_port { | ||||
|     my %i_stp_port; | ||||
| 
 | ||||
|     foreach my $index ( keys %$stp_p_port ) { | ||||
|         my $bridge = $stp_p_port->{$index}; | ||||
|         my $bport  = $stp_p_port->{$index}; | ||||
|         my $iid    = $bp_index->{$index}; | ||||
|         next unless defined $iid; | ||||
|         next unless defined $bridge; | ||||
|         $i_stp_port{$iid} = $bridge; | ||||
|         next unless defined $bport; | ||||
|         $i_stp_port{$iid} = $bport; | ||||
|     } | ||||
|     return \%i_stp_port; | ||||
| } | ||||
| @@ -267,11 +321,11 @@ sub i_stp_id { | ||||
|     my %i_stp_id; | ||||
| 
 | ||||
|     foreach my $index ( keys %$stp_p_id ) { | ||||
|         my $bridge = $stp_p_id->{$index}; | ||||
|         my $bport  = $stp_p_id->{$index}; | ||||
|         my $iid    = $bp_index->{$index}; | ||||
|         next unless defined $iid; | ||||
|         next unless defined $bridge; | ||||
|         $i_stp_id{$iid} = $bridge; | ||||
|         next unless defined $bport; | ||||
|         $i_stp_id{$iid} = $bport; | ||||
|     } | ||||
|     return \%i_stp_id; | ||||
| } | ||||
| @@ -286,11 +340,11 @@ sub i_stp_bridge { | ||||
|     my %i_stp_bridge; | ||||
| 
 | ||||
|     foreach my $index ( keys %$stp_p_bridge ) { | ||||
|         my $bridge = $stp_p_bridge->{$index}; | ||||
|         my $bport  = $stp_p_bridge->{$index}; | ||||
|         my $iid    = $bp_index->{$index}; | ||||
|         next unless defined $iid; | ||||
|         next unless defined $bridge; | ||||
|         $i_stp_bridge{$iid} = $bridge; | ||||
|         next unless defined $bport; | ||||
|         $i_stp_bridge{$iid} = $bport; | ||||
|     } | ||||
|     return \%i_stp_bridge; | ||||
| } | ||||
| @@ -312,7 +366,7 @@ sub i_vlan { | ||||
|     my $bridge  = shift; | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     my $index = $bridge->bp_index(); | ||||
|     my $index = $bridge->bp_index() or return {}; | ||||
| 
 | ||||
|     # If given a partial it will be an ifIndex, we need to use dot1dBasePort | ||||
|     if ($partial) { | ||||
| @@ -343,20 +397,31 @@ 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}; | ||||
| @@ -364,7 +429,7 @@ sub i_vlan_membership { | ||||
|         my $vlan; | ||||
| 
 | ||||
|         # Strip TimeFilter if we're using VlanCurrentTable | ||||
|         ( $vlan = $idx ) =~ s/^\d+\.//; | ||||
|         ($vlan = $idx) =~ s/^(\d+\.)*//g; | ||||
| 
 | ||||
|         # Convert portlist bit array to bp_index array | ||||
|         for ( my $i = 0; $i <= $#$portlist; $i++ ) { | ||||
| @@ -376,10 +441,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 { | ||||
| @@ -496,10 +561,10 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  my $bridge = new SNMP::Info (  | ||||
|  my $bridge = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'switch',  | ||||
|                              DestHost    => 'switch', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                              ); | ||||
| @@ -520,7 +585,7 @@ Max Baker | ||||
|     my $port  = $interfaces->{$iid}; | ||||
| 
 | ||||
|     print "Port:$port forwarding to $mac\n"; | ||||
|  }  | ||||
|  } | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| @@ -529,12 +594,12 @@ MAC Forwarding Table and Spanning Tree Protocol info. | ||||
| 
 | ||||
| F<Q-BRIDGE-MIB> holds 802.1q information -- VLANs and Trunking.  Cisco tends | ||||
| not to use this MIB, but some proprietary ones.  HP and some nicer vendors use | ||||
| this.  This is from C<RFC2674_q>.   | ||||
| this.  This is from C<RFC2674_q>. | ||||
| 
 | ||||
| Create or use a subclass of SNMP::Info that inherits this class.  Do not use | ||||
| directly. | ||||
| 
 | ||||
| For debugging you can call new() directly as you would in SNMP::Info  | ||||
| For debugging you can call new() directly as you would in SNMP::Info | ||||
| 
 | ||||
|  my $bridge = new SNMP::Info::Bridge(...); | ||||
| 
 | ||||
| @@ -550,12 +615,11 @@ None. | ||||
| 
 | ||||
| =item F<Q-BRIDGE-MIB> | ||||
| 
 | ||||
| =item F<RSTP-MIB> | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| F<BRIDGE-MIB> needs to be extracted from | ||||
| ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz | ||||
| 
 | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| @@ -598,19 +662,19 @@ Returns root of STP. | ||||
| 
 | ||||
| (C<dot1dStpDesignatedRoot>) | ||||
| 
 | ||||
| =item $bridge->qb_vlans_max()  | ||||
| =item $bridge->qb_vlans_max() | ||||
| 
 | ||||
| Maximum number of VLANS supported on this device. | ||||
| 
 | ||||
| (C<dot1qMaxSupportedVlans>) | ||||
| 
 | ||||
| =item $bridge->qb_vlans()  | ||||
| =item $bridge->qb_vlans() | ||||
| 
 | ||||
| Current number of VLANs that are configured in this device. | ||||
| 
 | ||||
| (C<dot1qNumVlans>) | ||||
| 
 | ||||
| =item $bridge->qb_next_vlan_index()  | ||||
| =item $bridge->qb_next_vlan_index() | ||||
| 
 | ||||
| The next available value for C<dot1qVlanIndex> of a local VLAN entry in | ||||
| C<dot1qVlanStaticTable> | ||||
| @@ -642,18 +706,28 @@ IDs.  These are the VLANs which are members of the egress list for the port. | ||||
|   Example: | ||||
|   my $interfaces = $bridge->interfaces(); | ||||
|   my $vlans      = $bridge->i_vlan_membership(); | ||||
|    | ||||
| 
 | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
|     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 = FDB ID, value = VLAN ID. | ||||
| 
 | ||||
| =item $bridge->v_index() | ||||
| 
 | ||||
| Returns VLAN IDs | ||||
| @@ -662,7 +736,7 @@ Returns VLAN IDs | ||||
| 
 | ||||
| =head2 Forwarding Table (C<dot1dTpFdbEntry>) | ||||
| 
 | ||||
| =over  | ||||
| =over | ||||
| 
 | ||||
| =item $bridge->fw_mac() | ||||
| 
 | ||||
| @@ -707,6 +781,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> | ||||
| @@ -838,7 +954,7 @@ The set of ports which are assigned to the egress list for this VLAN. | ||||
| =item $bridge->qb_cv_untagged() | ||||
| 
 | ||||
| The set of ports which should transmit egress packets for this VLAN as | ||||
| untagged.  | ||||
| untagged. | ||||
| 
 | ||||
| (C<dot1qVlanCurrentUntaggedPorts>) | ||||
| 
 | ||||
| @@ -876,7 +992,7 @@ for this VLAN. | ||||
| =item $bridge->qb_v_untagged() | ||||
| 
 | ||||
| The set of ports which should transmit egress packets for this VLAN as | ||||
| untagged.  | ||||
| untagged. | ||||
| 
 | ||||
| (C<dot1qVlanStaticUntaggedPorts>) | ||||
| 
 | ||||
| @@ -916,13 +1032,13 @@ Returns reference to hash of forwarding table entries status | ||||
| (C<dot1qTpFdbStatus>) | ||||
| 
 | ||||
| =back | ||||
|   | ||||
| 
 | ||||
| =head1 SET METHODS | ||||
| 
 | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CDP | ||||
| # $Id$ | ||||
| # | ||||
| # Changes since Version 0.7 Copyright (c) 2004 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -34,16 +33,17 @@ | ||||
| package SNMP::Info::CDP; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::CDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CDP::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars | ||||
|     qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT %CDP_CAPABILITIES/; | ||||
| our | ||||
|     ($VERSION, $DEBUG, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $INIT, %CDP_CAPABILITIES); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| # Five data structures required by SNMP::Info | ||||
| %MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' ); | ||||
| @@ -54,16 +54,15 @@ $VERSION = '3.19'; | ||||
|     'cdp_run'      => 'cdpGlobalRun', | ||||
|     'cdp_interval' => 'cdpGlobalMessageInterval', | ||||
|     'cdp_holdtime' => 'cdpGlobalHoldTime', | ||||
|     'cdp_gid'       => 'cdpGlobalDeviceId', | ||||
|     'cdp_gid'      => 'cdpGlobalDeviceId', | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     'cdp_index'        => 'cdpCacheIfIndex', | ||||
|     'cdp_proto'        => 'cdpCacheAddressType', | ||||
|     'cdp_addr'         => 'cdpCacheAddress', | ||||
|     'cdp_ver'          => 'cdpCacheVersion', | ||||
|     'cdp_dev_id'       => 'cdpCacheDeviceId', | ||||
|     'cdp_port'         => 'cdpCacheDevicePort', | ||||
|     'cdp_dev_port'     => 'cdpCacheDevicePort', | ||||
|     'cdp_platform'     => 'cdpCachePlatform', | ||||
|     'cdp_capabilities' => 'cdpCacheCapabilities', | ||||
|     'cdp_domain'       => 'cdpCacheVTPMgmtDomain', | ||||
| @@ -80,11 +79,9 @@ $VERSION = '3.19'; | ||||
|     'cdp_capabilities' => \&SNMP::Info::munge_bits, | ||||
|     'cdp_platform'     => \&SNMP::Info::munge_null, | ||||
|     'cdp_domain'       => \&SNMP::Info::munge_null, | ||||
|     'cdp_port'         => \&SNMP::Info::munge_null, | ||||
|     'cdp_ver'          => \&SNMP::Info::munge_null, | ||||
|     'cdp_ip'           => \&SNMP::Info::munge_ip, | ||||
|     'cdp_power'        => \&munge_power, | ||||
| 
 | ||||
| ); | ||||
| 
 | ||||
| %CDP_CAPABILITIES = ( | ||||
| @@ -111,28 +108,21 @@ sub munge_power { | ||||
| sub hasCDP { | ||||
|     my $cdp = shift; | ||||
| 
 | ||||
|     my $ver = $cdp->{_version}; | ||||
|     # Check the global that is supposed to indicate CDP is running | ||||
|     my $cdp_run = $cdp->cdp_run(); | ||||
|     return 1 if $cdp_run; | ||||
| 
 | ||||
|     # SNMP v1 clients dont have the globals | ||||
|     if ( defined $ver and $ver == 1 ) { | ||||
|         my $cdp_ip = $cdp->cdp_ip(); | ||||
|     # SNMP v1 clients don't have the globals, fallback | ||||
|     # by checking if it would report neighbors | ||||
|     my $cdp_ip = $cdp->cdp_ip() || {}; | ||||
|     return 1 if scalar keys %$cdp_ip; | ||||
| 
 | ||||
|         # See if anything in cdp cache, if so we have cdp | ||||
|         return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) ); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     return $cdp->cdp_run(); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub cdp_if { | ||||
|     my $cdp = shift; | ||||
| 
 | ||||
|     # See if by some miracle Cisco implemented the cdpCacheIfIndex entry | ||||
|     my $cdp_index = $cdp->cdp_index(); | ||||
|     return $cdp_index if defined $cdp_index; | ||||
| 
 | ||||
|     # Nope, didn't think so. Now we fake it. | ||||
|     my $cdp_ip = $cdp->cdp_ip(); | ||||
|     unless ( defined $cdp_ip ) { | ||||
|         $cdp->error_throw( | ||||
| @@ -225,6 +215,28 @@ sub cdp_id { | ||||
|     return \%cdp_id; | ||||
| } | ||||
| 
 | ||||
| sub cdp_port { | ||||
|     my $cdp    = shift; | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     my $ch = $cdp->cdp_dev_port($partial) || {}; | ||||
| 
 | ||||
|     # most devices return a string with the interface name here (Port-ID TLV) | ||||
|     # see https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/cdp/command/cdp-cr-book/cdp-cr-a1.html | ||||
|     # it seems however that some devices report hex encoded mac addresses for this, see | ||||
|     # https://github.com/netdisco/snmp-info/issues/252 | ||||
|     # once these bad devices get known we can figure out workarounds for them | ||||
| 
 | ||||
|     my %cdp_port; | ||||
|     foreach my $key ( sort keys %$ch ) { | ||||
|         my $port = $ch->{$key}; | ||||
|         next unless $port; | ||||
|         $port = SNMP::Info::munge_null($port); | ||||
|         $cdp_port{$key} = $port; | ||||
|     } | ||||
|     return \%cdp_port; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
| __END__ | ||||
| 
 | ||||
| @@ -238,10 +250,10 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  my $cdp = new SNMP::Info (  | ||||
|  my $cdp = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
| @@ -252,7 +264,7 @@ Max Baker | ||||
|  $hascdp   = $cdp->hasCDP() ? 'yes' : 'no'; | ||||
| 
 | ||||
|  # Print out a map of device ports with CDP neighbors: | ||||
|  my $interfaces = $cdp->interfaces(); | ||||
|  my $interfaces   = $cdp->interfaces(); | ||||
|  my $cdp_if       = $cdp->cdp_if(); | ||||
|  my $cdp_ip       = $cdp->cdp_ip(); | ||||
|  my $cdp_port     = $cdp->cdp_port(); | ||||
| @@ -267,17 +279,17 @@ Max Baker | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented  | ||||
| SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented | ||||
| interface to CDP information through SNMP. | ||||
| 
 | ||||
| CDP is a Layer 2 protocol that supplies topology information of devices that | ||||
| also speak CDP, mostly switches and routers.  CDP is implemented in Cisco and | ||||
| some HP devices. | ||||
| also speak CDP, mostly switches and routers.  CDP is implemented by Cisco and | ||||
| several other vendors. | ||||
| 
 | ||||
| Create or use a device subclass that inherits this class.  Do not use | ||||
| directly. | ||||
| 
 | ||||
| Each device implements a subset of the global and cache entries.  | ||||
| Each device implements a subset of the global and cache entries. | ||||
| Check the return value to see if that data is held by the device. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| @@ -292,9 +304,7 @@ None. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| 
 | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| @@ -302,7 +312,7 @@ These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| =item  $cdp->hasCDP() | ||||
| 
 | ||||
| Is CDP is active in this device?   | ||||
| Is CDP is active in this device? | ||||
| 
 | ||||
| Accounts for SNMP version 1 devices which may have CDP but not cdp_run() | ||||
| 
 | ||||
| @@ -321,13 +331,13 @@ Interval in seconds at which CDP messages are generated. | ||||
| 
 | ||||
| =item $cdp->cdp_holdtime() | ||||
| 
 | ||||
| Time in seconds that CDP messages are kept.  | ||||
| Time in seconds that CDP messages are kept. | ||||
| 
 | ||||
| (C<cdpGlobalHoldTime>) | ||||
| 
 | ||||
| =item  $cdp->cdp_gid()  | ||||
| =item  $cdp->cdp_gid() | ||||
| 
 | ||||
| Returns CDP device ID.   | ||||
| Returns CDP device ID. | ||||
| 
 | ||||
| This is the device id broadcast via CDP to other devices, and is what is | ||||
| retrieved from remote devices with $cdp->id(). | ||||
| @@ -348,9 +358,9 @@ to a hash. | ||||
| =item $cdp->cdp_capabilities() | ||||
| 
 | ||||
| Returns Device Functional Capabilities.  Results are munged into an ascii | ||||
| binary string, MSB.  Each digit represents a bit from the table below from  | ||||
| binary string, MSB.  Each digit represents a bit from the table below from | ||||
| the CDP Capabilities Mapping to Smartport Type table within the | ||||
| Cisco Small Business 200 Series Smart Switch Administration Guide,  | ||||
| Cisco Small Business 200 Series Smart Switch Administration Guide, | ||||
| L<http://www.cisco.com/c/en/us/support/switches/small-business-200-series-smart-switches/products-maintenance-guides-list.html>: | ||||
| 
 | ||||
| (Bit) - Description | ||||
| @@ -400,7 +410,7 @@ C<CISCO-VTP-MIB::managementDomainName> | ||||
| 
 | ||||
| (C<cdpCacheVTPMgmtDomain>) | ||||
| 
 | ||||
| =item $cdp->cdp_duplex()  | ||||
| =item $cdp->cdp_duplex() | ||||
| 
 | ||||
| Returns the port duplex status from remote devices. | ||||
| 
 | ||||
| @@ -417,7 +427,7 @@ Returns remote device id string | ||||
| Returns the mapping to the SNMP Interface Table. | ||||
| 
 | ||||
| Note that a lot devices don't implement $cdp->cdp_index(),  So if it isn't | ||||
| around, we fake it.  | ||||
| around, we fake it. | ||||
| 
 | ||||
| In order to map the cdp table entry back to the interfaces() entry, we | ||||
| truncate the last number off of it : | ||||
| @@ -428,7 +438,7 @@ truncate the last number off of it : | ||||
| 
 | ||||
|   # if not, let's fake it | ||||
|   my $cdp_ip       = $device->cdp_ip(); | ||||
|      | ||||
| 
 | ||||
|   my %cdp_if | ||||
|   foreach my $key (keys %$cdp_ip){ | ||||
|       $iid = $key; | ||||
| @@ -436,13 +446,13 @@ truncate the last number off of it : | ||||
|       $iid =~ s/\.\d+$//; | ||||
|       $cdp_if{$key} = $iid; | ||||
|   } | ||||
|   | ||||
| 
 | ||||
|   return \%cdp_if; | ||||
| 
 | ||||
| 
 | ||||
| =item $cdp->cdp_index() | ||||
| 
 | ||||
| Returns the mapping to the SNMP2 Interface table for CDP Cache Entries.  | ||||
| Returns the mapping to the SNMP2 Interface table for CDP Cache Entries. | ||||
| 
 | ||||
| Most devices don't implement this, so you probably want to use $cdp->cdp_if() | ||||
| instead. | ||||
| @@ -464,17 +474,18 @@ Returns remote address | ||||
| 
 | ||||
| (C<cdpCacheAddress>) | ||||
| 
 | ||||
| =item $cdp->cdp_platform()  | ||||
| =item $cdp->cdp_platform() | ||||
| 
 | ||||
| Returns remote platform id  | ||||
| Returns remote platform id | ||||
| 
 | ||||
| (C<cdpCachePlatform>) | ||||
| 
 | ||||
| =item $cdp->cdp_port() | ||||
| 
 | ||||
| Returns remote port ID | ||||
| Returns remote Port-ID. Most of the time this is a string with the port name, but this | ||||
| is not guaranteed to be so. | ||||
| 
 | ||||
| (C<cdpDevicePort>) | ||||
| (C<cdpCacheDevicePort>) | ||||
| 
 | ||||
| =item  $cdp->cdp_proto() | ||||
| 
 | ||||
| @@ -482,7 +493,7 @@ Returns remote address type received.  Usually IP. | ||||
| 
 | ||||
| (C<cdpCacheAddressType>) | ||||
| 
 | ||||
| =item $cdp->cdp_ver()  | ||||
| =item $cdp->cdp_ver() | ||||
| 
 | ||||
| Returns remote hardware version | ||||
| 
 | ||||
| @@ -501,7 +512,7 @@ for decimal placement. | ||||
| 
 | ||||
| (C<cdpCachePowerConsumption>) | ||||
| 
 | ||||
| =item  $cdp->cdp_cap()  | ||||
| =item  $cdp->cdp_cap() | ||||
| 
 | ||||
| Returns hash of arrays with each array containing the system capabilities | ||||
| supported by the remote system.  Possible elements in the array are | ||||
| @@ -1,6 +1,6 @@ | ||||
| # SNMP::Info::CiscoAgg | ||||
| # | ||||
| # Copyright (c) 2014 SNMP::Info Developers | ||||
| # Copyright (c) 2019 SNMP::Info Developers | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| @@ -30,31 +30,71 @@ | ||||
| package SNMP::Info::CiscoAgg; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::IEEE802dot3ad 'agg_ports_lag'; | ||||
| use SNMP::Info::IEEE802dot3ad; | ||||
| 
 | ||||
| @SNMP::Info::CiscoAgg::ISA = qw/ | ||||
|   SNMP::Info::IEEE802dot3ad | ||||
|   Exporter | ||||
| /; | ||||
| 
 | ||||
| @SNMP::Info::CiscoAgg::EXPORT_OK = qw/ | ||||
|   agg_ports | ||||
|   agg_ports_cisco | ||||
|   agg_ports_lag | ||||
|   agg_ports_pagp | ||||
| /; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($DEBUG, $VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|   %SNMP::Info::IEEE802dot3ad::MIBS, | ||||
|   'CISCO-PAGP-MIB'   => 'pagpGroupIfIndex', | ||||
|   'CISCO-PAGP-MIB'         => 'pagpGroupIfIndex', | ||||
|   'CISCO-LAG-MIB'          => 'clagAggPortListPorts', | ||||
|   'CISCO-IF-EXTENSION-MIB' => 'cieIfLastInTime', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = (); | ||||
| 
 | ||||
| %FUNCS = (); | ||||
| %FUNCS = ( | ||||
|   %SNMP::Info::IEEE802dot3ad::FUNCS, | ||||
|   'lag_ports'         => 'clagAggPortListPorts', | ||||
|   'lag_members'       => 'clagAggPortListInterfaceIndexList', | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = (); | ||||
| %MUNGE = ( | ||||
|   %SNMP::Info::IEEE802dot3ad::MUNGE, | ||||
|   'lag_ports'     => \&SNMP::Info::munge_port_list, | ||||
|   'lag_members'   => \&munge_port_ifindex, | ||||
| ); | ||||
| 
 | ||||
| sub munge_port_ifindex { | ||||
|     my $plist = shift; | ||||
|     return unless defined $plist; | ||||
|     return unless length $plist; | ||||
| 
 | ||||
|     my $list = [ map {sprintf "%d", hex($_)} unpack( "(A8)*", join( '' ,  map { sprintf "%02x", $_} unpack( "(C4)*", $plist ) ))  ]; | ||||
| 
 | ||||
|     return $list; | ||||
| } | ||||
| 
 | ||||
| sub agg_ports_cisco { | ||||
|   my $dev = shift; | ||||
|   my $group = $dev->lag_members; | ||||
| 
 | ||||
|   my $mapping = {}; | ||||
|   for my $master (keys %$group) { | ||||
|     my $slaves = $group->{$master}; | ||||
|     for my $slave (@$slaves) { | ||||
|       $mapping->{$slave} = $master; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return $mapping; | ||||
| } | ||||
| 
 | ||||
| sub agg_ports_pagp { | ||||
|   my $dev = shift; | ||||
| @@ -76,9 +116,28 @@ sub agg_ports_pagp { | ||||
|   return $mapping; | ||||
| } | ||||
| 
 | ||||
| # until we have PAgP data and need to combine with LAG data | ||||
| sub agg_ports_lag { | ||||
|   my $dev = shift; | ||||
| 
 | ||||
|   # same note as for agg_ports_pagp, it will miss mappings if interfaces | ||||
|   # are down or lacp is not synced. | ||||
| 
 | ||||
|   my $mapping = {}; | ||||
|   my $group = $dev->dot3adAggPortSelectedAggID; | ||||
|   for my $slave (keys %$group) { | ||||
|     my $master = $group->{$slave}; | ||||
|     next if($master == 0 || $slave == $master); | ||||
| 
 | ||||
|     $mapping->{$slave} = $master; | ||||
|   } | ||||
| 
 | ||||
|   return $mapping; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| # combine PAgP, LAG & Cisco proprietary data | ||||
| sub agg_ports { | ||||
|   my $ret = {%{agg_ports_pagp(@_)}, %{agg_ports_lag(@_)}}; | ||||
|   my $ret = {%{agg_ports_pagp(@_)}, %{agg_ports_lag(@_)}, %{agg_ports_cisco(@_)}}; | ||||
|   return $ret; | ||||
| } | ||||
| 
 | ||||
| @@ -96,14 +155,14 @@ SNMP::Info Developers | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $info = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $info->class(); | ||||
| @@ -112,7 +171,7 @@ SNMP::Info Developers | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| This class provides access to Aggregated Links configuration on Cisco devices. | ||||
| It combines Cisco PAgP and IEEE 802.3ad information. | ||||
| It combines Cisco PAgP, Cisco proprietary info and IEEE 802.3ad information. | ||||
| 
 | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| 
 | ||||
| @@ -126,11 +185,13 @@ L<SNMP::Info::IEEE802dot3ad> | ||||
| 
 | ||||
| =item F<CISCO-PAGP-MIB> | ||||
| 
 | ||||
| =item F<CISCO-LAG-MIB> | ||||
| 
 | ||||
| =item F<CISCO-IF-EXTENSION-MIB> | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| 
 | ||||
| =head1 METHODS | ||||
| =head1 TABLE METHODS | ||||
| 
 | ||||
| =over 4 | ||||
| 
 | ||||
| @@ -140,11 +201,52 @@ Returns a HASH reference mapping from slave to master port for each member of | ||||
| a port bundle on the device. Keys are ifIndex of the slave ports, Values are | ||||
| ifIndex of the corresponding master ports. | ||||
| 
 | ||||
| =item C<agg_ports_cisco> | ||||
| 
 | ||||
| Implements the cisco LAG info retrieval. Merged into C<agg_ports> data | ||||
| automatically. Will fetch all members of C<clagAggPortListInterfaceIndexList> | ||||
| even if they are not running an aggregation protocol. | ||||
| 
 | ||||
| =item C<agg_ports_pagp> | ||||
| 
 | ||||
| Implements the PAgP LAG info retrieval. Merged into C<agg_ports> data | ||||
| automatically. | ||||
| 
 | ||||
| =item C<lag_members> | ||||
| 
 | ||||
| Mimics C<ad_lag_ports> from L<SNMP::Info::IEEE802dot3ad> but based on ifindex | ||||
| instead of instead of bp_index. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 OVERRIDES | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item C<agg_ports_lag> | ||||
| 
 | ||||
| This will retrieve LAG ports based on C<dot3adAggPortSelectedAggID> data. | ||||
| It will be merged into C<agg_ports> data. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::IEEE802dot3ad | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::IEEE802dot3ad> for details. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 MUNGES | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item C<munge_port_ifindex> | ||||
| 
 | ||||
| Takes C<clagAggPortListInterfaceIndexList>, uses the index as master port, then | ||||
| returns all members as ifindex. Works with single or multiple slaves to a master. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =cut | ||||
							
								
								
									
										267
									
								
								lib/SNMP/Info/CiscoBGP.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								lib/SNMP/Info/CiscoBGP.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,267 @@ | ||||
| # SNMP::Info::CiscoBGP | ||||
| # | ||||
| # Copyright (c) 2022 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::CiscoBGP; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::CiscoBGP::ISA       = qw( SNMP::Info Exporter ); | ||||
| @SNMP::Info::CiscoBGP::EXPORT_OK = qw( | ||||
|     parse_cisco_bgp_peer2_entry_index | ||||
| ); | ||||
|  | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %MIBS = ( 'CISCO-BGP4-MIB' => 'cbgpPeer2State', ); | ||||
|  | ||||
| %GLOBALS = (); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     # cbgpPeer2Table | ||||
|     'cisco_bgp_peer2_state'               => 'cbgpPeer2State', | ||||
|     'cisco_bgp_peer2_adminstatus'         => 'cbgpPeer2AdminStatus', | ||||
|     'cisco_bgp_peer2_localaddr'           => 'cbgpPeer2LocalAddr', | ||||
|     'cisco_bgp_peer2_localport'           => 'cbgpPeer2LocalPort', | ||||
|     'cisco_bgp_peer2_localas'             => 'cbgpPeer2LocalAs', | ||||
|     'cisco_bgp_peer2_localidentifier'     => 'cbgpPeer2LocalIdentifier', | ||||
|     'cisco_bgp_peer2_remoteport'          => 'cbgpPeer2RemotePort', | ||||
|     'cisco_bgp_peer2_remoteas'            => 'cbgpPeer2RemoteAs', | ||||
|     'cisco_bgp_peer2_remoteidentifier'    => 'cbgpPeer2RemoteIdentifier', | ||||
|     'cisco_bgp_peer2_inupdates'           => 'cbgpPeer2InUpdates', | ||||
|     'cisco_bgp_peer2_outupdates'          => 'cbgpPeer2OutUpdates', | ||||
|     'cisco_bgp_peer2_intotalmessages'     => 'cbgpPeer2InTotalMessages', | ||||
|     'cisco_bgp_peer2_outtotalmessages'    => 'cbgpPeer2OutTotalMessages', | ||||
|     'cisco_bgp_peer2_lasterror'           => 'cbgpPeer2LastError', | ||||
|     'cisco_bgp_peer2_fsmestablishedtransitions' | ||||
|                                     => 'cbgpPeer2FsmEstablishedTransitions', | ||||
|     'cisco_bgp_peer2_fsmestablishedtime'  => 'cbgpPeer2FsmEstablishedTime', | ||||
|     'cisco_bgp_peer2_connectretryinterval'=> 'cbgpPeer2ConnectRetryInterval', | ||||
|     'cisco_bgp_peer2_holdtime'            => 'cbgpPeer2HoldTime', | ||||
|     'cisco_bgp_peer2_keepalive'           => 'cbgpPeer2KeepAlive', | ||||
|     'cisco_bgp_peer2_holdtimeconfigured'  => 'cbgpPeer2HoldTimeConfigured', | ||||
|     'cisco_bgp_peer2_keepaliveconfigured' => 'cbgpPeer2KeepAliveConfigured', | ||||
|     'cisco_bgp_peer2_minasoriginationinterval' | ||||
|                                     => 'cbgpPeer2MinASOriginationInterval', | ||||
|     'cisco_bgp_peer2_inupdatelapsedtime'  => 'cbgpPeer2InUpdateElapsedTime', | ||||
|     'cisco_bgp_peer2_lasterrortxt'        => 'cbgpPeer2LastErrorTxt', | ||||
|     'cisco_bgp_peer2_prevstate'           => 'cbgpPeer2PrevState', | ||||
|  | ||||
|     # cbgpPeer2AddrFamilyPrefixTable | ||||
|     'cisco_bgp_peer2_acceptedprefixes'    => 'cbgpPeer2AcceptedPrefixes', | ||||
|     'cisco_bgp_peer2_deniedprefixes'      => 'cbgpPeer2DeniedPrefixes', | ||||
|     'cisco_bgp_peer2_prefixadminlimit'    => 'cbgpPeer2PrefixAdminLimit', | ||||
|     'cisco_bgp_peer2_prefixthreshold'     => 'cbgpPeer2PrefixThreshold', | ||||
|     'cisco_bgp_peer2_prefixclearthreshold'=> 'cbgpPeer2PrefixClearThreshold', | ||||
|     'cisco_bgp_peer2_advertisedprefixes'  => 'cbgpPeer2AdvertisedPrefixes', | ||||
|     'cisco_bgp_peer2_suppressedprefixes'  => 'cbgpPeer2SuppressedPrefixes', | ||||
|     'cisco_bgp_peer2_withdrawnprefixes'   => 'cbgpPeer2WithdrawnPrefixes', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     'cisco_bgp_peer2_localaddr'           => \&SNMP::Info::munge_inetaddress, | ||||
|     'cisco_bgp_peer2_lasterror'           => \&SNMP::Info::munge_octet2hex, | ||||
| ); | ||||
|  | ||||
| sub parse_cisco_bgp_peer2_entry_index { | ||||
|     my ($self, $index) = @_; | ||||
|     my ($type, $addrlength, $ip) = split(/\./, $index, 3); | ||||
|     # decode IPv6 remote address | ||||
|     if ($addrlength == 16) { | ||||
|         # copied from SNMP::Info::IPv6/ipv6_addr | ||||
|         my @parts = split(/\./, $ip); | ||||
|         $ip = sprintf("%x:%x:%x:%x:%x:%x:%x:%x", | ||||
|             unpack('n8', pack('C*', @parts))); | ||||
|     } | ||||
|     return $type, $addrlength, $ip; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::CiscoBGP - SNMP Interface to Cisco's BGP MIBs | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Alexander Hartmaier | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
| # Let SNMP::Info determine the correct subclass for you. | ||||
| my $device = SNMP::Info->( | ||||
|     AutoSpecify => 1, | ||||
|     Debug       => 1, | ||||
|     DestHost    => 'myswitch', | ||||
|     Community   => 'public', | ||||
|     Version     => 2 | ||||
| ) or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
| my $remoteas_for_index = $device->cisco_bgp_peer2_remoteas; | ||||
|  | ||||
| for my $index (keys $remoteas_for_index->%*) { | ||||
|     my ($type, $addrlength, $ip) = | ||||
|         $device->parse_cisco_bgp_peer2_entry_index($index); | ||||
|     printf('remote: %-39s  type: %-4s  remote AS: %5d', | ||||
|         $ip, $type, $remoteas_for_index->{$index}); | ||||
| } | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::CiscoBGP is a subclass of SNMP::Info that provides | ||||
| information about a cisco device's BGP configuration and state. | ||||
|  | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| none. | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<CISCO-BGP4-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| =over | ||||
|  | ||||
| None | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| =head2 Cisco BGP Peer 2 Table (cbgpPeer2Table) | ||||
|  | ||||
| This table contains, one entry per BGP peer, information about the connections | ||||
| with BGP peers. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item cisco_bgp_peer2_state (cbgpPeer2State) | ||||
|  | ||||
| =item cisco_bgp_peer2_adminstatus (cbgpPeer2AdminStatus) | ||||
|  | ||||
| =item cisco_bgp_peer2_localaddr (cbgpPeer2LocalAddr) | ||||
|  | ||||
| =item cisco_bgp_peer2_localport (cbgpPeer2LocalPort) | ||||
|  | ||||
| =item cisco_bgp_peer2_localas (cbgpPeer2LocalAs) | ||||
|  | ||||
| =item cisco_bgp_peer2_localidentifier (cbgpPeer2LocalIdentifier) | ||||
|  | ||||
| =item cisco_bgp_peer2_remoteport (cbgpPeer2RemotePort) | ||||
|  | ||||
| =item cisco_bgp_peer2_remoteas (cbgpPeer2RemoteAs) | ||||
|  | ||||
| =item cisco_bgp_peer2_remoteidentifier (cbgpPeer2RemoteIdentifier) | ||||
|  | ||||
| =item cisco_bgp_peer2_inupdates (cbgpPeer2InUpdates) | ||||
|  | ||||
| =item cisco_bgp_peer2_outupdates (cbgpPeer2OutUpdates) | ||||
|  | ||||
| =item cisco_bgp_peer2_intotalmessages (cbgpPeer2InTotalMessages) | ||||
|  | ||||
| =item cisco_bgp_peer2_outtotalmessages (cbgpPeer2OutTotalMessages) | ||||
|  | ||||
| =item cisco_bgp_peer2_lasterror (cbgpPeer2LastError) | ||||
|  | ||||
| =item cisco_bgp_peer2_fsmestablishedtransitions (cbgpPeer2FsmEstablishedTransitions) | ||||
|  | ||||
| =item cisco_bgp_peer2_fsmestablishedtime (cbgpPeer2FsmEstablishedTime) | ||||
|  | ||||
| =item cisco_bgp_peer2_connectretryinterval (cbgpPeer2ConnectRetryInterval) | ||||
|  | ||||
| =item cisco_bgp_peer2_holdtime (cbgpPeer2HoldTime) | ||||
|  | ||||
| =item cisco_bgp_peer2_keepalive (cbgpPeer2KeepAlive) | ||||
|  | ||||
| =item cisco_bgp_peer2_holdtimeconfigured (cbgpPeer2HoldTimeConfigured) | ||||
|  | ||||
| =item cisco_bgp_peer2_keepaliveconfigured (cbgpPeer2KeepAliveConfigured) | ||||
|  | ||||
| =item cisco_bgp_peer2_minasoriginationinterval (cbgpPeer2MinASOriginationInterval) | ||||
|  | ||||
| =item cisco_bgp_peer2_inupdatelapsedtime (cbgpPeer2InUpdateElapsedTime) | ||||
|  | ||||
| =item cisco_bgp_peer2_lasterrortxt (cbgpPeer2LastErrorTxt) | ||||
|  | ||||
| =item cisco_bgp_peer2_prevstate (cbgpPeer2PrevState) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Cisco BGP Peer 2 Address Family Prefix Table (cbgpPeer2AddrFamilyPrefixTable) | ||||
|  | ||||
| This table contains prefix related information related to address families | ||||
| supported by a peer. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item cisco_bgp_peer2_acceptedprefixes (cbgpPeer2AcceptedPrefixes) | ||||
|  | ||||
| =item cisco_bgp_peer2_deniedprefixes (cbgpPeer2DeniedPrefixes) | ||||
|  | ||||
| =item cisco_bgp_peer2_prefixadminlimit (cbgpPeer2PrefixAdminLimit) | ||||
|  | ||||
| =item cisco_bgp_peer2_prefixthreshold (cbgpPeer2PrefixThreshold) | ||||
|  | ||||
| =item cisco_bgp_peer2_prefixclearthreshold (cbgpPeer2PrefixClearThreshold) | ||||
|  | ||||
| =item cisco_bgp_peer2_advertisedprefixes (cbgpPeer2AdvertisedPrefixes) | ||||
|  | ||||
| =item cisco_bgp_peer2_suppressedprefixes (cbgpPeer2SuppressedPrefixes) | ||||
|  | ||||
| =item cisco_bgp_peer2_withdrawnprefixes (cbgpPeer2WithdrawnPrefixes) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 METHODS | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item parse_cisco_bgp_peer2_entry_index | ||||
|  | ||||
| Takes a cbgpPeer2Entry index as returned by all methods of the Cisco BGP Peer | ||||
| 2 Table methods. | ||||
|  | ||||
| Returns a list of type (numeric, cbgpPeer2Type), address length (in bytes: | ||||
| 4 for IPv4, 16 for IPv6) and the remote IP address as string. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoConfig | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::CiscoConfig; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::CiscoConfig::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoConfig::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %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 ) ) { | ||||
| @@ -275,7 +279,7 @@ Justin Hunter, Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
| 
 | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -332,10 +336,6 @@ These are methods that return scalar value from SNMP | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Config Copy Request Table  (C<ccCopyTable>) | ||||
| 
 | ||||
| =over | ||||
| @@ -431,7 +431,7 @@ Table of Flash copy operation entries. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -448,7 +448,7 @@ older procedure has been depreciated by Cisco and is utilized only to support | ||||
| devices running older code revisions. | ||||
| 
 | ||||
|  Example: | ||||
|  $ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig')  | ||||
|  $ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig') | ||||
|     or die "Couldn't save config. ",$ciscoconfig->error(1); | ||||
| 
 | ||||
| =item $ciscoconfig->copy_run_start() | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoPortSecurity | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,19 +30,22 @@ | ||||
| package SNMP::Info::CiscoPortSecurity; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::CiscoPortSecurity::ISA       = qw/Exporter/; | ||||
| @SNMP::Info::CiscoPortSecurity::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoPortSecurity::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PAECAPABILITIES); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB', | ||||
|     'CISCO-PAE-MIB'           => 'ciscoPaeMIB', | ||||
|     'IEEE8021-PAE-MIB'        => 'dot1xAuthLastEapolFrameSource', | ||||
|     'CISCO-ERR-DISABLE-MIB'   => 'ciscoErrDisableMIB', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
| @@ -81,37 +83,34 @@ $VERSION = '3.19'; | ||||
|     # CISCO-PORT-SECURITY-MIB::cpsIfVlanTable | ||||
|     'cps_i_v_mac_count' => 'cpsIfVlanCurSecureMacAddrCount', | ||||
|     'cps_i_v_mac_max'   => 'cpsIfVlanMaxSecureMacAddr', | ||||
|     'cps_i_v'           => 'cpsIfVlanIndex', | ||||
| 
 | ||||
|     # CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable | ||||
|     'cps_i_v_mac_status' => 'cpsIfVlanSecureMacAddrRowStatus', | ||||
|     'cps_i_v_mac_age'    => 'cpsIfVlanSecureMacAddrRemainAge', | ||||
|     'cps_i_v_mac_type'   => 'cpsIfVlanSecureMacAddrType', | ||||
|     'cps_i_v_vlan'       => 'cpsIfVlanSecureVlanIndex', | ||||
|     'cps_i_v_mac'        => 'cpsIfVlanSecureMacAddress', | ||||
| 
 | ||||
|     # CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable | ||||
|     'cps_m_status' => 'cpsSecureMacAddrRowStatus', | ||||
|     'cps_m_age'    => 'cpsSecureMacAddrRemainingAge', | ||||
|     'cps_m_type'   => 'cpsSecureMacAddrType', | ||||
|     'cps_m_mac'    => 'cpsSecureMacAddress', | ||||
| 
 | ||||
|     # IEEE8021-PAE-MIB::dot1xPaePortEntry | ||||
|     'pae_i_capabilities'            => 'dot1xPaePortCapabilities', | ||||
|     'pae_i_last_eapol_frame_source' => 'dot1xAuthLastEapolFrameSource', | ||||
| 
 | ||||
|     # CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusEntry | ||||
|     'cerr_i_cause' => 'cErrDisableIfStatusCause', | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     'cps_i_mac'                     => \&SNMP::Info::munge_mac, | ||||
|     'cps_m_mac'                     => \&SNMP::Info::munge_mac, | ||||
|     'cps_i_v_mac'                   => \&SNMP::Info::munge_mac, | ||||
|     'pae_i_last_eapol_frame_source' => \&SNMP::Info::munge_mac, | ||||
|     'pae_i_capabilities'            => \&munge_pae_capabilities, | ||||
| ); | ||||
| 
 | ||||
| %PAECAPABILITIES = ( | ||||
|     0 => 'dot1xPaePortAuthCapable', | ||||
|     1 => 'dot1xPaePortSuppCapable' | ||||
|     1 => 'dot1xPaePortSuppCapable', | ||||
| ); | ||||
| 
 | ||||
| sub munge_pae_capabilities { | ||||
| @@ -123,13 +122,29 @@ sub munge_pae_capabilities { | ||||
|     return join( ' ', @vals ); | ||||
| } | ||||
| 
 | ||||
| # Define a generic method to show the cause for a port to be err-disabled. | ||||
| # Cisco indexes cErrDisableIfStatusCause by {ifindex,vlan}, but for a more | ||||
| # generic method, using ifIndex only makes it easier to implement across | ||||
| # device classes. Besides, several (most?) err-disable features will disable | ||||
| # the whole interface anyway, and not just a vlan on the interface. | ||||
| sub i_err_disable_cause { | ||||
|     my $cps = shift; | ||||
|     my $ret; | ||||
|     my $causes = $cps->cerr_i_cause() || {}; | ||||
|     foreach my $interfacevlan (keys %$causes) { | ||||
|         my ($iid, $vid) = split(/\./, $interfacevlan); | ||||
|         $ret->{$iid} = $causes->{$interfacevlan}; | ||||
|     } | ||||
|     return $ret; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
| __END__ | ||||
| 
 | ||||
| =head1 NAME | ||||
| 
 | ||||
| SNMP::Info::CiscoPortSecurity - SNMP Interface to data from | ||||
| F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB> | ||||
| F<CISCO-PORT-SECURITY-MIB>, F<CISCO-PAE-MIB> and F<CISCO-ERR-DISABLE-MIB>. | ||||
| 
 | ||||
| =head1 AUTHOR | ||||
| 
 | ||||
| @@ -137,14 +152,14 @@ Eric Miller | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $cps = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $cps->class(); | ||||
| @@ -153,8 +168,9 @@ Eric Miller | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::CiscoPortSecurity is a subclass of SNMP::Info that provides | ||||
| an interface to the F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB>.  These | ||||
| MIBs are used across the Catalyst family under CatOS and IOS. | ||||
| an interface to the F<CISCO-PORT-SECURITY-MIB>, F<CISCO-PAE-MIB> and | ||||
| F<CISCO-ERR-DISABLE-MIB>. These MIBs are used across the Catalyst | ||||
| family under CatOS and IOS. | ||||
| 
 | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| 
 | ||||
| @@ -172,16 +188,14 @@ None. | ||||
| 
 | ||||
| =item F<IEEE8021-PAE-MIB> | ||||
| 
 | ||||
| =item F<CISCO-ERR-DISABLE-MIB> | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 F<CISCO-PORT-SECURITY-MIB> globals | ||||
| 
 | ||||
| =over | ||||
| @@ -300,10 +314,6 @@ These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| (C<cpsIfVlanMaxSecureMacAddr>) | ||||
| 
 | ||||
| =item $cps->cps_i_v() | ||||
| 
 | ||||
| (C<cpsIfVlanIndex>) | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable> | ||||
| @@ -322,14 +332,6 @@ These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| (C<cpsIfVlanSecureMacAddrType>) | ||||
| 
 | ||||
| =item $cps->cps_i_v_vlan() | ||||
| 
 | ||||
| (C<cpsIfVlanSecureVlanIndex>) | ||||
| 
 | ||||
| =item $cps->cps_i_v_mac() | ||||
| 
 | ||||
| (C<cpsIfVlanSecureMacAddress>) | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 C<CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable> | ||||
| @@ -348,10 +350,6 @@ These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| (C<cpsSecureMacAddrType>) | ||||
| 
 | ||||
| =item $cps->cps_m_mac() | ||||
| 
 | ||||
| (C<cpsSecureMacAddress>) | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 C<IEEE8021-PAE-MIB::dot1xPaePortEntry> | ||||
| @@ -374,6 +372,31 @@ The source MAC address carried in the most recently received EAPOL frame. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 C<CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusEntry> | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $cps->cerr_i_cause() | ||||
| 
 | ||||
| C<cErrDisableIfStatusCause> | ||||
| 
 | ||||
| Indicates the feature/event that caused the {interface, vlan} (or the entire | ||||
| interface) to be error-disabled. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 METHODS | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item C<i_err_disable_cause> | ||||
| 
 | ||||
| Returns a HASH reference mapping ifIndex to err-disabled cause. The returned | ||||
| data is sparse, so if the ifIndex is not present in the return value, the port | ||||
| is not err-disabled. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 Data Munging Callback Subroutines | ||||
| 
 | ||||
| =over | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoPower | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bill Fenner | ||||
| # All rights reserved. | ||||
| @@ -31,24 +30,26 @@ | ||||
| package SNMP::Info::CiscoPower; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::CiscoPower::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoPower::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex', | ||||
|           'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' ); | ||||
|           'CISCO-CDP-MIB' => 'cdpCachePowerConsumption', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = (); | ||||
| 
 | ||||
| %FUNCS = (  | ||||
|     'cpeth_ent_phy'     => 'cpeExtPsePortEntPhyIndex',  | ||||
|     'peth_port_power'   => 'cpeExtPsePortPwrConsumption',  | ||||
| %FUNCS = ( | ||||
|     'cpeth_ent_phy'     => 'cpeExtPsePortEntPhyIndex', | ||||
|     'peth_port_power'   => 'cpeExtPsePortPwrConsumption', | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = (); | ||||
| @@ -113,14 +114,14 @@ Bill Fenner | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $poe = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $poe->class(); | ||||
| @@ -153,6 +154,8 @@ Note that it requires that the device inherits from Info::Entity. | ||||
| 
 | ||||
| =item F<CISCO-POWER-ETHERNET-EXT-MIB> | ||||
| 
 | ||||
| =item F<CISCO-CDP-MIB> | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| @@ -176,7 +179,7 @@ Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>. | ||||
| 
 | ||||
| Power supplied by PoE ports, in milliwatts | ||||
| (C<cpeExtPsePortPwrConsumption>) | ||||
|   | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 CDP Port table | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoQOS | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2005 Alexander Hartmaier | ||||
| # All rights reserved. | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::CiscoQOS; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::CiscoQOS::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoQOS::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', ); | ||||
| 
 | ||||
| @@ -86,14 +86,14 @@ Alexander Hartmaier | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $qos = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $qos->class(); | ||||
| @@ -101,7 +101,7 @@ Alexander Hartmaier | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::CiscoQOS is a subclass of SNMP::Info that provides  | ||||
| SNMP::Info::CiscoQOS is a subclass of SNMP::Info that provides | ||||
| information about a cisco device's QoS config. | ||||
| 
 | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| @@ -118,8 +118,6 @@ none. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| =over | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoRTT | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2005 Alexander Hartmaier | ||||
| # All rights reserved. | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::CiscoRTT; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::CiscoRTT::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoRTT::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', ); | ||||
| 
 | ||||
| @@ -67,14 +67,14 @@ Alexander Hartmaier | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $rtt = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $rtt->class(); | ||||
| @@ -82,7 +82,7 @@ Alexander Hartmaier | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::CiscoRTT is a subclass of SNMP::Info that provides  | ||||
| SNMP::Info::CiscoRTT is a subclass of SNMP::Info that provides | ||||
| information about a cisco device's RTT values. | ||||
| 
 | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| @@ -99,8 +99,6 @@ none. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| =over | ||||
| @@ -113,7 +111,7 @@ None | ||||
| 
 | ||||
| =head2 Overall Control Group Table | ||||
| 
 | ||||
| This table is from C<CISCO-RTTMAN-MIB::rttMonCtrlAdminTable> | ||||
| This table is from C<CISCO-RTTMON-MIB::rttMonCtrlAdminTable> | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoStack | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -31,14 +30,15 @@ | ||||
| package SNMP::Info::CiscoStack; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| 
 | ||||
| @SNMP::Info::CiscoStack::ISA       = qw/Exporter/; | ||||
| @SNMP::Info::CiscoStack::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PORTSTAT); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', ); | ||||
| 
 | ||||
| @@ -106,7 +106,7 @@ $VERSION = '3.19'; | ||||
|     1 => 'other', | ||||
|     2 => 'ok', | ||||
|     3 => 'minorFault', | ||||
|     4 => 'majorFault' | ||||
|     4 => 'majorFault', | ||||
| ); | ||||
| 
 | ||||
| # Changes binary byte describing each port into ascii, and returns | ||||
| @@ -194,7 +194,7 @@ sub i_duplex_admin { | ||||
|         next if ( defined $partial and $iid !~ /^$partial$/ ); | ||||
| 
 | ||||
|         # Test for gigabit | ||||
|         if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 1 ) { | ||||
|         if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) { | ||||
|             $i_duplex_admin->{$iid} = 'full'; | ||||
|         } | ||||
| 
 | ||||
| @@ -286,8 +286,7 @@ __END__ | ||||
| 
 | ||||
| =head1 NAME | ||||
| 
 | ||||
| SNMP::Info::CiscoStack - SNMP Interface to data from F<CISCO-STACK-MIB> and | ||||
| F<CISCO-PORT-SECURITY-MIB> | ||||
| SNMP::Info::CiscoStack - SNMP Interface to data from F<CISCO-STACK-MIB> | ||||
| 
 | ||||
| =head1 AUTHOR | ||||
| 
 | ||||
| @@ -295,17 +294,17 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  my $ciscostats = new SNMP::Info( | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $ciscostack = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $ciscostats->class(); | ||||
|  my $class = $ciscostack->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| @@ -386,7 +385,7 @@ Returns a map to IID for ports that are physical ports, not vlans, etc. | ||||
| 
 | ||||
| =item $stack->i_type() | ||||
| 
 | ||||
| Crosses p_port() with p_type() and returns the results.  | ||||
| Crosses p_port() with p_type() and returns the results. | ||||
| 
 | ||||
| Overrides with C<ifType> if p_type() isn't available. | ||||
| 
 | ||||
| @@ -425,7 +424,7 @@ C<portAdminSpeed> | ||||
| 
 | ||||
|     Example: | ||||
|     my %if_map = reverse %{$stack->interfaces()}; | ||||
|     $stack->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})  | ||||
|     $stack->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'}) | ||||
|         or die "Couldn't change port speed. ",$stack->error(1); | ||||
| 
 | ||||
| =item $stack->set_i_duplex_admin(duplex, ifIndex) | ||||
| @@ -439,7 +438,7 @@ C<portAdminSpeed> | ||||
| 
 | ||||
|     Example: | ||||
|     my %if_map = reverse %{$stack->interfaces()}; | ||||
|     $stack->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})  | ||||
|     $stack->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) | ||||
|         or die "Couldn't change port duplex. ",$stack->error(1); | ||||
| 
 | ||||
| =back | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoStats | ||||
| # $Id$ | ||||
| # | ||||
| # Changes since Version 0.7 Copyright (c) 2008-2009 Max Baker and SNMP::Info Developers | ||||
| # All rights reserved. | ||||
| @@ -34,22 +33,23 @@ | ||||
| package SNMP::Info::CiscoStats; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::CiscoStats::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoStats::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     'SNMPv2-MIB'            => 'sysDescr', | ||||
|     'CISCO-PROCESS-MIB'     => 'cpmCPUTotal5sec', | ||||
|     'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed', | ||||
|     'OLD-CISCO-SYSTEM-MIB'  => 'writeMem', | ||||
|     'CISCO-PRODUCTS-MIB'    => 'sysName', | ||||
|     'CISCO-PRODUCTS-MIB'    => 'ciscoIGS', | ||||
|     'ENTITY-MIB'            => 'entPhysicalSoftwareRev', | ||||
|     'CISCO-IMAGE-MIB'       => 'ciscoImageString', | ||||
| 
 | ||||
| @@ -88,7 +88,7 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
|     # CISCO-FLASH-MIB::ciscoFlashDeviceTable | ||||
|     'cisco_flash_size' => 'ciscoFlashDeviceSize', | ||||
|      | ||||
| 
 | ||||
|     # CISCO-IMAGE-MIB | ||||
|     'ci_images' => 'ciscoImageString', | ||||
| ); | ||||
| @@ -105,6 +105,11 @@ sub os { | ||||
| 
 | ||||
|     # order here matters - there are Catalysts that run IOS and have catalyst | ||||
|     # in their description field, as well as Catalysts that run IOS-XE. | ||||
|     return 'ios-xe'   if ( $descr =~ /Denali/ ); | ||||
|     return 'ios-xe'   if ( $descr =~ /Fuji/ ); | ||||
|     return 'ios-xe'   if ( $descr =~ /Everest/ ); | ||||
|     return 'ios-xe'   if ( $descr =~ /Gibraltar/ ); | ||||
|     return 'ios-xe'   if ( $descr =~ /Amsterdam/ ); | ||||
|     return 'ios-xe'   if ( $descr =~ /IOS-XE/ ); | ||||
|     return 'ios-xr'   if ( $descr =~ /IOS XR/ ); | ||||
|     return 'ios'      if ( $descr =~ /IOS/ ); | ||||
| @@ -334,7 +339,7 @@ Eric Miller, Max Baker, Sam Stickland | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $ciscostats = new SNMP::Info( | ||||
|                     AutoSpecify => 1, | ||||
|                     Debug       => 1, | ||||
| @@ -342,7 +347,7 @@ Eric Miller, Max Baker, Sam Stickland | ||||
|                     DestHost    => 'myswitch', | ||||
|                     Community   => 'public', | ||||
|                     Version     => 2 | ||||
|                     )  | ||||
|                     ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $ciscostats->class(); | ||||
| @@ -351,7 +356,7 @@ Eric Miller, Max Baker, Sam Stickland | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory, | ||||
| os and version information about Cisco Devices.  | ||||
| os and version information about Cisco Devices. | ||||
| 
 | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| 
 | ||||
| @@ -385,8 +390,6 @@ None. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| =over | ||||
| @@ -447,7 +450,7 @@ Tries to parse C<ROMMON> version from rom_id() string | ||||
| 
 | ||||
| Current CPU usage in percent. | ||||
| 
 | ||||
| C<1.3.6.1.4.1.9.2.1.56.0> =  | ||||
| C<1.3.6.1.4.1.9.2.1.56.0> = | ||||
| C<OLD-CISCO-CPU-MIB:avgBusyPer> | ||||
| 
 | ||||
| =item $ciscostats->ios_cpu_1min() | ||||
| @@ -1,42 +1,42 @@ | ||||
| # SNMP::Info::CiscoStpExtensions | ||||
| # | ||||
| # Copyright (c)2009 Carlos Vicente | ||||
| # All rights reserved.   | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without  | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| #  | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer in the documentation | ||||
| #       and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the author nor the  | ||||
| #       names of its contributors may be used to endorse or promote products  | ||||
| #     * Neither the name of the author nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| #  | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||||
| # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED  | ||||
| # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  | ||||
| # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | ||||
| # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  | ||||
| # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||||
| # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  | ||||
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  | ||||
| # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| package SNMP::Info::CiscoStpExtensions; | ||||
| 
 | ||||
| use strict; | ||||
| 
 | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| 
 | ||||
| use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/; | ||||
| our ($VERSION, $DEBUG, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PORTSTAT, $INIT); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| @SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//; | ||||
| @@ -54,12 +54,15 @@ $VERSION = '3.19'; | ||||
|             'stpx_stp_type'          => 'stpxSpanningTreeType', | ||||
|             'stpx_bpduguard_enable'  => 'stpxFastStartBpduGuardEnable', | ||||
|             'stpx_bpdufilter_enable' => 'stpxFastStartBpduFilterEnable', | ||||
|             'stpx_faststart_default' => 'stpxFastStartGlobalDefaultMode', | ||||
|            ); | ||||
| 
 | ||||
| %FUNCS   = ( | ||||
|             %SNMP::Info::Bridge::FUNCS, | ||||
|             'stpx_rootguard_enabled'      => 'stpxRootGuardConfigEnabled', | ||||
|             'stpx_loopguard_enabled'      => 'stpxLoopGuardConfigEnabled', | ||||
|             'stpx_faststart_enabled'      => 'stpxFastStartPortEnable', | ||||
|             'stpx_faststart_operational'  => 'stpxFastStartPortMode', | ||||
|             'stpx_port_bpduguard_mode'    => 'stpxFastStartPortBpduGuardMode', | ||||
|             'stpx_port_bpdufilter_mode'   => 'stpxFastStartPortBpduFilterMode', | ||||
|             'stpx_smst_root'              => 'stpxSMSTInstanceCISTRegionalRoot', | ||||
| @@ -69,7 +72,7 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
| %MUNGE   = ( | ||||
|             %SNMP::Info::Bridge::MUNGE, | ||||
|            'stpx_mst_config_digest'     => \&SNMP::Info::CiscoStpExtensions::oct2str, | ||||
|            'stpx_mst_config_digest'      => \&SNMP::Info::CiscoStpExtensions::oct2str, | ||||
|            ); | ||||
| 
 | ||||
| 
 | ||||
| @@ -103,11 +106,11 @@ sub mst_region_rev { | ||||
| 
 | ||||
| sub mst_vlan2instance { | ||||
|     my $self = shift; | ||||
|      | ||||
| 
 | ||||
|     # Get MST vlan-to-instance mapping | ||||
|     my $m1k2k = $self->stpx_smst_vlans_mapped_1k2k; | ||||
|     my $m3k4k = $self->stpx_smst_vlans_mapped_3k4k; | ||||
|     | ||||
| 
 | ||||
|     # Get list of VLANs | ||||
|     my $vlan_membership = $self->i_vlan_membership; | ||||
|     my @vlans; | ||||
| @@ -137,7 +140,7 @@ sub mst_vlan2instance { | ||||
|                     $res{$vlan} = $inst; | ||||
|                     last; | ||||
|                 } | ||||
|             }        | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return \%res; | ||||
| @@ -159,7 +162,7 @@ sub i_rootguard_enabled { | ||||
|         $res{$iid} = $enabled; | ||||
|     } | ||||
|     return \%res; | ||||
| }   | ||||
| } | ||||
| 
 | ||||
| sub i_loopguard_enabled { | ||||
|     my $self    = shift; | ||||
| @@ -177,7 +180,7 @@ sub i_loopguard_enabled { | ||||
|         $res{$iid} = $enabled; | ||||
|     } | ||||
|     return \%res; | ||||
| }   | ||||
| } | ||||
| 
 | ||||
| sub i_bpduguard_enabled { | ||||
|     my $self    = shift; | ||||
| @@ -186,7 +189,7 @@ sub i_bpduguard_enabled { | ||||
|     my $bpdugm_default = $self->stpx_bpduguard_enable(); | ||||
|     my $bp_index       = $self->bp_index($partial); | ||||
|     my $bpdugm         = $self->stpx_port_bpduguard_mode(); | ||||
|      | ||||
| 
 | ||||
|     my %res; | ||||
|     foreach my $index ( keys %$bpdugm ){ | ||||
|         my $mode = $bpdugm->{$index}; | ||||
| @@ -209,7 +212,7 @@ sub i_bpdufilter_enabled { | ||||
|     my $bpdufm_default = $self->stpx_bpdufilter_enable(); | ||||
|     my $bp_index       = $self->bp_index($partial); | ||||
|     my $bpdufm         = $self->stpx_port_bpdufilter_mode(); | ||||
|      | ||||
| 
 | ||||
|     my %res; | ||||
|     foreach my $index ( keys %$bpdufm ){ | ||||
|         my $mode = $bpdufm->{$index}; | ||||
| @@ -225,6 +228,36 @@ sub i_bpdufilter_enabled { | ||||
|     return \%res; | ||||
| } | ||||
| 
 | ||||
| sub i_faststart_enabled { | ||||
|     my $self    = shift; | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     my $faststart_default = $self->stpx_faststart_default(); | ||||
|     my $bp_index          = $self->bp_index($partial); | ||||
|     my $faststart         = $self->stpx_faststart_enabled(); | ||||
|     my $faststart_oper    = $self->stpx_faststart_operational(); | ||||
| 
 | ||||
|     my %res; | ||||
|     # stpxFastStartPortEnable is deprecated in favour of stpxFastStartPortMode | ||||
|     # see https://github.com/netdisco/netdisco/issues/12 | ||||
|     foreach my $index ( keys %$faststart, keys %$faststart_oper ){ | ||||
|         my $mode = $faststart_oper->{$index} || $faststart->{$index}; | ||||
|         my $iid  = $bp_index->{$index}; | ||||
|         next unless defined $iid; | ||||
|         next unless defined $mode; | ||||
|         if ( $mode eq 'default' ){ | ||||
|             $res{$iid} =  $faststart_default; | ||||
|         }else{ | ||||
|             $res{$iid} = $mode; | ||||
|         } | ||||
|         $res{$iid} = 'enable'  if $res{$iid} eq 'true'; | ||||
|         $res{$iid} = 'disable' if $res{$iid} eq 'false'; | ||||
|         $res{$iid} = 1 if $res{$iid} =~ m/enable/i; # enableForTrunk | ||||
|         $res{$iid} = 0 if $res{$iid} eq 'disable'; | ||||
|     } | ||||
|     return \%res; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| sub oct2str { | ||||
|     my ($v) = @_; | ||||
| @@ -244,12 +277,25 @@ Carlos Vicente | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|    my $stpx = new SNMP::Info( | ||||
|                          AutoSpecify => 1, | ||||
|                          Debug       => 1, | ||||
|                          DestHost    => 'myswitch', | ||||
|                          Community   => 'public', | ||||
|                          Version     => 2 | ||||
|                        ) | ||||
| 
 | ||||
|    or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|    my $class = $stpx->class(); | ||||
|    print " Using device sub class : $class\n"; | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Create or use a subclass of SNMP::Info that inherits this class.  Do not use | ||||
| directly. | ||||
| 
 | ||||
| For debugging you can call new() directly as you would in SNMP::Info  | ||||
| For debugging you can call new() directly as you would in SNMP::Info | ||||
| 
 | ||||
|  my $stpx = new SNMP::Info::CiscoStpExtensions(...); | ||||
| 
 | ||||
| @@ -257,15 +303,21 @@ For debugging you can call new() directly as you would in SNMP::Info | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item SNMP::Info  | ||||
| =item SNMP::Info | ||||
| 
 | ||||
| =item SNMP::Info::Bridge  | ||||
| =item SNMP::Info::Bridge | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| =head2 Required MIBs | ||||
| 
 | ||||
| =head1 GLOBAL METHODS | ||||
| =over | ||||
| 
 | ||||
| =item F<CISCO-STP-EXTENSIONS-MIB> | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| @@ -273,7 +325,7 @@ These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| =item $stpx->stp_ver() | ||||
| 
 | ||||
| Returns the particular STP version running on this device.   | ||||
| Returns the particular STP version running on this device. | ||||
| Meant to override SNMP::Info::Brigde::stp_ver() | ||||
| 
 | ||||
| Values: C<pvstPlus>, C<mistp>, C<mistpPvstPlus>, C<mst>, C<rapidPvstPlus> | ||||
| @@ -291,25 +343,25 @@ to a hash. | ||||
| 
 | ||||
| =item $stpx->mst_config_digest() | ||||
| 
 | ||||
| Returns the Multiple Spanning Tree (MST) configuration digest  | ||||
| Returns the Multiple Spanning Tree (MST) configuration digest | ||||
| 
 | ||||
| (C<stpxSMSTConfigDigest>) | ||||
| 
 | ||||
| =item $stpx->mst_region_name() | ||||
| 
 | ||||
| Returns the Multiple Spanning Tree (MST) region name  | ||||
| Returns the Multiple Spanning Tree (MST) region name | ||||
| 
 | ||||
| (C<stpxMSTRegionName>) | ||||
| 
 | ||||
| =item $stpx->mst_region_rev() | ||||
| 
 | ||||
| Returns the Multiple Spanning Tree (MST) region name  | ||||
| Returns the Multiple Spanning Tree (MST) region name | ||||
| 
 | ||||
| (C<stpxSMSTRegionRevision>) | ||||
| 
 | ||||
| =item $stpx->mst_vlan2instance() | ||||
| 
 | ||||
| Returns the mapping of vlan to MST instance in the form of a hash reference  | ||||
| Returns the mapping of vlan to MST instance in the form of a hash reference | ||||
| with key = VLAN id, value = STP instance | ||||
| 
 | ||||
| =item $stpx->i_rootguard_enabled() | ||||
| @@ -340,6 +392,13 @@ Format is a hash reference with key = C<ifIndex>, value = [1|0] | ||||
| 
 | ||||
| (C<stpxFastStartBpduFilterEnable>) | ||||
| 
 | ||||
| =item $stpx->i_faststart_enabled() | ||||
| 
 | ||||
| Returns 1 or 0 depending on whether FastStart (aka PortFast) is enabled on a | ||||
| given port.  Format is a hash reference with key = C<ifIndex>, value = [1|0] | ||||
| 
 | ||||
| (C<stpxFastStartPortEnable> and C<stpxFastStartPortMode>) | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 MUNGES | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::CiscoVTP | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::CiscoVTP; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::CiscoVTP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::CiscoVTP::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     'CISCO-VTP-MIB'                       => 'vtpVlanName', | ||||
| @@ -61,7 +61,6 @@ $VERSION = '3.19'; | ||||
| %FUNCS = ( | ||||
| 
 | ||||
|     # CISCO-VTP-MIB::managementDomainTable | ||||
|     'vtp_d_index'     => 'managementDomainIndex', | ||||
|     'vtp_d_name'      => 'managementDomainName', | ||||
|     'vtp_d_mode'      => 'managementDomainLocalMode', | ||||
|     'vtp_d_rev'       => 'managementDomainConfigRevNumber', | ||||
| @@ -149,6 +148,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,8 +165,17 @@ 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; | ||||
|         } | ||||
|     } | ||||
| @@ -190,6 +199,32 @@ sub i_vlan { | ||||
|     return \%i_vlans; | ||||
| } | ||||
| 
 | ||||
| sub i_subinterfaces { | ||||
|     my $vtp    = shift; | ||||
|     my %i_subs = %{ $vtp->SUPER::i_subinterfaces() || {} }; | ||||
| 
 | ||||
|     # CISCO-VLAN-IFTABLE-RELATION-MIB | ||||
|     # Used for traditional Cisco Routers and Aironet | ||||
| 
 | ||||
|     my $v_cvi_if = $vtp->v_cvi_if(); | ||||
|     if ( defined $v_cvi_if ) { | ||||
| 
 | ||||
|         # Translate vlan.parent_physical_interface_iid -> iid | ||||
|         #       to iid -> [iid, iid, ...] | ||||
|         foreach my $i ( keys %$v_cvi_if ) { | ||||
|             my ( $vlan, $phys ) = split( /\./, $i ); | ||||
|             my $iid = $v_cvi_if->{$i}; | ||||
| 
 | ||||
|             next unless $phys and $iid; | ||||
|             next if $phys == $iid; | ||||
| 
 | ||||
|             push @{ $i_subs{$phys} }, $iid; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return \%i_subs; | ||||
| } | ||||
| 
 | ||||
| sub i_untagged { | ||||
|     my $vtp = shift; | ||||
|     my ( $ifindex ) = @_; | ||||
| @@ -217,6 +252,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 = {}; | ||||
| 
 | ||||
| @@ -224,14 +261,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; | ||||
| @@ -248,7 +295,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'; | ||||
| @@ -270,6 +319,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 ) = @_; | ||||
| @@ -492,14 +555,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $vtp = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $vtp->class(); | ||||
| @@ -507,7 +570,7 @@ Max Baker | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::CiscoVTP is a subclass of SNMP::Info that provides  | ||||
| SNMP::Info::CiscoVTP is a subclass of SNMP::Info that provides | ||||
| information about a Cisco device's VLAN and VTP Domain membership. | ||||
| 
 | ||||
| Use or create in a subclass of SNMP::Info.  Do not use directly. | ||||
| @@ -528,8 +591,6 @@ None. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| =over | ||||
| @@ -583,13 +644,35 @@ IDs.  These are the VLANs which are members of enabled VLAN list for the port. | ||||
|   Example: | ||||
|   my $interfaces = $vtp->interfaces(); | ||||
|   my $vlans      = $vtp->i_vlan_membership(); | ||||
|    | ||||
| 
 | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
|     print "Port: $port VLAN: $vlan\n"; | ||||
|   } | ||||
| 
 | ||||
| =item $vtp->i_subinterfaces() | ||||
| 
 | ||||
| Returns reference to hash of arrays: key = C<ifIndex>, value = array of | ||||
| C<ifIndex>. These are the VLAN subinterfaces (C<l2vlan> type) for the parent | ||||
| (C<ethernetCsmacd> type) interface. | ||||
| 
 | ||||
|   Example: | ||||
|   my $interfaces = $vtp->interfaces(); | ||||
|   my $i_subs     = $vtp->i_subinterfaces(); | ||||
| 
 | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $subs = join(',', sort(map {$interfaces->{$_}} @{$i_subs->{$iid}})); | ||||
|     print "Port: $port has subinterfaces: $subs\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>) | ||||
| @@ -679,7 +762,7 @@ for a good treaty of how to connect to the VLANs | ||||
| 
 | ||||
| =item $vtp->i_vlan_type() | ||||
| 
 | ||||
| Static, Dynamic, or multiVlan.   | ||||
| Static, Dynamic, or multiVlan. | ||||
| 
 | ||||
| (C<vmVlanType>) | ||||
| 
 | ||||
| @@ -726,7 +809,7 @@ Each bit represents a VLAN.  This is 3072 through 4095 | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $vtp->i_voice_vlan()  | ||||
| =item $vtp->i_voice_vlan() | ||||
| 
 | ||||
| (C<vmVoiceVlanId>) | ||||
| 
 | ||||
| @@ -736,10 +819,6 @@ Each bit represents a VLAN.  This is 3072 through 4095 | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $vtp->vtp_d_index() | ||||
| 
 | ||||
| (C<managementDomainIndex>) | ||||
| 
 | ||||
| =item $vtp->vtp_d_name() | ||||
| 
 | ||||
| (C<managementDomainName>) | ||||
| @@ -845,7 +924,7 @@ Each bit represents a VLAN.  This is 3072 through 4095 | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -857,7 +936,7 @@ VLAN ID and port C<ifIndex>.  This method should only be used on end station | ||||
| 
 | ||||
|   Example: | ||||
|   my %if_map = reverse %{$vtp->interfaces()}; | ||||
|   $vtp->set_i_vlan('2', $if_map{'FastEthernet0/1'})  | ||||
|   $vtp->set_i_vlan('2', $if_map{'FastEthernet0/1'}) | ||||
|     or die "Couldn't change port VLAN. ",$vtp->error(1); | ||||
| 
 | ||||
| =item $vtp->set_i_pvid ( pvid, ifIndex ) | ||||
| @@ -867,7 +946,7 @@ port C<ifIndex>.  This method should only be used on trunk ports. | ||||
| 
 | ||||
|   Example: | ||||
|   my %if_map = reverse %{$vtp->interfaces()}; | ||||
|   $vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'})  | ||||
|   $vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'}) | ||||
|     or die "Couldn't change port default VLAN. ",$vtp->error(1); | ||||
| 
 | ||||
| =item $vtp->set_i_untagged ( vlan, ifIndex ) | ||||
| @@ -883,7 +962,7 @@ numeric VLAN ID and port C<ifIndex>. | ||||
| 
 | ||||
|   Example: | ||||
|   my %if_map = reverse %{$vtp->interfaces()}; | ||||
|   $vtp->set_add_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})  | ||||
|   $vtp->set_add_i_vlan_tagged('2', $if_map{'FastEthernet0/1'}) | ||||
|     or die "Couldn't add port to egress list. ",$vtp->error(1); | ||||
| 
 | ||||
| =item $vtp->set_remove_i_vlan_tagged ( vlan, ifIndex ) | ||||
| @@ -893,7 +972,7 @@ with the numeric VLAN ID and port C<ifIndex>. | ||||
| 
 | ||||
|   Example: | ||||
|   my %if_map = reverse %{$vtp->interfaces()}; | ||||
|   $vtp->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})  | ||||
|   $vtp->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'}) | ||||
|     or die "Couldn't add port to egress list. ",$vtp->error(1); | ||||
| 
 | ||||
| =back | ||||
							
								
								
									
										126
									
								
								lib/SNMP/Info/DocsisCM.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								lib/SNMP/Info/DocsisCM.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| # SNMP::Info::DocsisCM - SNMP Interface to DOCSIS Cable Modems | ||||
| # | ||||
| # Copyright (c) 2019 by The Netdisco Developer Team. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::DocsisCM; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
|  | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::DocsisCM::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::DocsisCM::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|   | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS | ||||
| ); | ||||
|  | ||||
| %FUNCS  = ( | ||||
|     %SNMP::Info::Layer2::FUNCS | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE | ||||
| ); | ||||
|  | ||||
| sub vendor { | ||||
|     my $cm = shift; | ||||
|     my $descr = $cm->description(); | ||||
|     return $1 if $descr =~ /VENDOR: (.*?);/; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $cm = shift; | ||||
|     my $descr = $cm->description(); | ||||
|     return $1 if $descr =~ /MODEL: (.*?)>>/; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return "CM"; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $cm = shift; | ||||
|     my $descr = $cm->description(); | ||||
|     return $1 if $descr =~ /SW_REV: (.*?);/; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::DocsisCM - SNMP Interface for DOCSIS Cable Modems | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
| SNMP::Info::DocsisCM is a subclass of SNMP::Info that provides info | ||||
| about a given cable modem. Extracts data from the sysDescr, which is  | ||||
| mandated in the DOCSIS specification to match | ||||
| "HW_REV: <value>; VENDOR: <value>; BOOTR: <value>; SW_REV: <value>; MODEL: <value>" | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cm->vendor() | ||||
|  | ||||
| Returns the vendor of the cable modem. | ||||
|  | ||||
| =item $cm->model() | ||||
|  | ||||
| Returns the model of the cable modem. | ||||
|  | ||||
| =item $cm->os() | ||||
|  | ||||
| Returns 'cm', as the actual os is vendor and model dependent. | ||||
|  | ||||
| =item $cm->os_ver() | ||||
|  | ||||
| Returns the version of the software, extracted from the SW_REV field. | ||||
|  | ||||
| =back | ||||
|  | ||||
							
								
								
									
										124
									
								
								lib/SNMP/Info/DocsisHE.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								lib/SNMP/Info/DocsisHE.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| package SNMP::Info::DocsisHE; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
|  | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::DocsisHE::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::DocsisHE::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'DOCS-IF3-MIB' => 'docsIf3Mib', | ||||
|     'DOCS-IF-MIB'  => 'docsIfMib', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = (); | ||||
|  | ||||
| %FUNCS  = ( | ||||
|     # DOCSIS 3.0 (DOCS-IF3-MIB) from CableLabs | ||||
|     'docs_if3_cmts_cm_status_md_if_index'=> 'docsIf3CmtsCmRegStatusMdIfIndex', | ||||
|     # DOCSIS (1.1, etc) from IETF | ||||
|     'docs_if_cmts_cm_status_inet_address_type' => 'docsIfCmtsCmStatusInetAddressType', | ||||
|     'docs_if_cmts_cm_status_inet_address'      => 'docsIfCmtsCmStatusInetAddress', | ||||
|     'docs_cmts_cm_down_channel_if_index'       => 'docsIfCmtsCmStatusDownChannelIfIndex', | ||||
|     'docs_cmts_cm_up_channel_if_index'         => 'docsIfCmtsCmStatusUpChannelIfIndex', | ||||
| ); | ||||
|  | ||||
| %MUNGE = (); | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::DocsisHE - SNMP Interface for F<DOCS-IF-MIB> and F<DOCS-IF3-MIB> | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Ryan Gasik | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  my $cmts = new SNMP::Info( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'cmts', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                           ); | ||||
|  # Get a list of modems off the DOCSIS CMTS | ||||
|  my $modems = $cmts->docs_if_cmts_cm_status_inet_address() | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
| SNMP::Info::DocsisHE is a subclass of SNMP::Info that provides information | ||||
| about the cable modems of a DOCSIS CMTS. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<DOCS-IF-MIB> | ||||
| Standard IETF MIBs for DOCSIS 1.1 | ||||
|  | ||||
| =item F<DOCS-IF3-MIB> | ||||
| CableLabs MIBs for DOCSIS 3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $info->docs_if3_cmts_cm_status_md_if_index() | ||||
|  | ||||
| Returns reference to hash of the IfIndex associated with each cable modem. | ||||
|  | ||||
| (C<docsIf3CmtsCmRegStatusMdIfIndex>) | ||||
|  | ||||
| =item $info->docs_if_cmts_cm_status_inet_address_type() | ||||
|  | ||||
| Returns reference to hash of the type of IP address (ie, IPv4, IPv6) | ||||
| associated with each cable modem | ||||
|  | ||||
| (C<docsIfCmtsCmStatusInetAddressType>) | ||||
|  | ||||
| =item $info->docs_if_cmts_cm_status_inet_address() | ||||
|  | ||||
| Returns reference to hash of the IP address associated with each | ||||
| cable modem. | ||||
|  | ||||
| (C<docsIfCmtsCmStatusInetAddress>) | ||||
|  | ||||
| =item $info->docs_cmts_cm_down_channel_if_index() | ||||
|  | ||||
| Returns reference to hash of the IfIndex of the down channel | ||||
| (for DOCSIS 1.1) or a down channel (DOCSIS 3+) associated with each | ||||
| cable modem. | ||||
|  | ||||
| (C<docsIfCmtsCmStatusDownChannelIfIndex>) | ||||
|  | ||||
| =item $info->docs_cmts_cm_up_channel_if_index() | ||||
|  | ||||
| Returns reference to hash of the IfIndex of the up channel | ||||
| (for DOCSIS 1.1) or a up channel (DOCSIS 3+) associated with each | ||||
| cable modem. | ||||
|  | ||||
| (C<docsIfCmtsCmStatusUpChannelIfIndex>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
| @@ -31,15 +31,16 @@ | ||||
| package SNMP::Info::EDP; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::LLDP::EXPORT_OK = qw//; | ||||
| @SNMP::Info::EDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::EDP::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     'EXTREME-EDP-MIB'   => 'extremeEdpPortIfIndex', | ||||
| @@ -64,7 +65,7 @@ sub hasEDP { | ||||
|     my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {}; | ||||
| 
 | ||||
|     return 1 if ( scalar( keys %$edp_ip ) ); | ||||
|      | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| @@ -75,12 +76,12 @@ sub hasEDP { | ||||
| # address since they should all originate from the same device, but we don't | ||||
| # know if they would all be reachable from the network management application. | ||||
| # | ||||
| # We don't inplement partials since this is private index function | ||||
| # We don't implement partials since this is private index function | ||||
| sub _edp_index { | ||||
|     my $edp = shift; | ||||
| 
 | ||||
|     my $edp_ip  = $edp->extremeEdpNeighborVlanIpAddress() || {}; | ||||
|      | ||||
| 
 | ||||
|     my %edp_index; | ||||
|     foreach my $key ( keys %$edp_ip ) { | ||||
|         my $ip = $edp_ip->{$key}; | ||||
| @@ -103,7 +104,7 @@ sub edp_if { | ||||
|         $iid = $1 if $iid =~ /^(\d+)\./; | ||||
|         $edp_if{$key} = $iid; | ||||
|     } | ||||
|   | ||||
| 
 | ||||
|   return \%edp_if; | ||||
| } | ||||
| 
 | ||||
| @@ -193,10 +194,10 @@ Eric Miller | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  my $edp = new SNMP::Info (  | ||||
|  my $edp = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
| @@ -204,10 +205,10 @@ Eric Miller | ||||
|  my $class = $edp->class(); | ||||
|  print " Using device sub class : $class\n"; | ||||
| 
 | ||||
|  $haslldp   = $edp->hasLLDP() ? 'yes' : 'no'; | ||||
|  $hasedp   = $edp->hasEDP() ? 'yes' : 'no'; | ||||
| 
 | ||||
|  # Print out a map of device ports with LLDP neighbors: | ||||
|  my $interfaces    = $edp->interfaces(); | ||||
|  # Print out a map of device ports with EDP neighbors: | ||||
|  my $interfaces   = $edp->interfaces(); | ||||
|  my $edp_if       = $edp->edp_if(); | ||||
|  my $edp_ip       = $edp->edp_ip(); | ||||
|  my $edp_port     = $edp->edp_port(); | ||||
| @@ -222,7 +223,7 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented  | ||||
| SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented | ||||
| interface to EDP information through SNMP. | ||||
| 
 | ||||
| EDP is a Layer 2 protocol that allows a network device to advertise its | ||||
| @@ -243,7 +244,7 @@ None. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| @@ -251,7 +252,7 @@ These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| =item $edp->hasEDP() | ||||
| 
 | ||||
| Is EDP is active in this device?   | ||||
| Is EDP active on this device? | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -285,7 +286,7 @@ Returns remote port ID | ||||
| 
 | ||||
| Returns the operating system version of the remote system. | ||||
| 
 | ||||
| Nulls are removed before the value is returned.  | ||||
| Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<extremeEdpNeighborSoftwareVersion>) | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Entity | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Entity; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::Entity::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Entity::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' ); | ||||
| 
 | ||||
| @@ -75,7 +75,7 @@ sub e_index { | ||||
|     my $entity  = shift; | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     # Force use of MIB leaf to avoid inheritance issues in psuedo classes | ||||
|     # Force use of MIB leaf to avoid inheritance issues in pseudo classes | ||||
|     my $e_descr = $entity->entPhysicalDescr($partial); | ||||
| 
 | ||||
|     return unless ($e_descr); | ||||
| @@ -109,6 +109,57 @@ sub e_port { | ||||
|     return \%e_port; | ||||
| } | ||||
| 
 | ||||
| sub entity_derived_serial { | ||||
|     my $entity  = shift; | ||||
| 
 | ||||
|     my $e_parent = $entity->e_parent() || {}; | ||||
|     my $e_class  = $entity->e_class() || {}; | ||||
| 
 | ||||
|     # Sort keys to return a consistent result between runs | ||||
|     foreach my $iid ( sort keys %$e_parent ) { | ||||
|         my $parent = $e_parent->{$iid}; | ||||
|         my $class = $e_class->{$iid} || ''; | ||||
|         # Only consider serial numbers for entries without a parent, or | ||||
|         # if they are of type "chassis" | ||||
|         if ( $parent eq '0' or $class eq 'chassis') { | ||||
|             my $serial = $entity->e_serial($iid); | ||||
|             if ( $serial && $serial->{$iid} ) { | ||||
|                 return $serial->{$iid}; | ||||
|             } | ||||
|             else { | ||||
|                 my $descr = $entity->e_descr($iid); | ||||
|                 if ( $descr and $descr->{$iid} =~ /serial#?:\s*([a-z0-9]+)/i ) | ||||
|                 { | ||||
|                     return $1; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub entity_derived_os_ver { | ||||
|     my $entity  = shift; | ||||
| 
 | ||||
|     my $e_parent = $entity->e_parent() || {}; | ||||
|     my $e_class  = $entity->e_class() || {}; | ||||
| 
 | ||||
|     # Sort keys to return a consistent result between runs | ||||
|     foreach my $iid ( sort keys %$e_parent ) { | ||||
|         my $parent = $e_parent->{$iid}; | ||||
|         my $class = $e_class->{$iid} || ''; | ||||
|         # Only consider serial numbers for entries without a parent, or | ||||
|         # if they are of type "chassis" | ||||
|         if ( $parent eq '0' or $class eq 'chassis') { | ||||
|             my $os_ver = $entity->e_swver($iid); | ||||
|             if ( $os_ver && $os_ver->{$iid} ) { | ||||
|                 return $os_ver->{$iid}; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
| 
 | ||||
| __END__ | ||||
| @@ -123,14 +174,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $entity = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $entity->class(); | ||||
| @@ -162,8 +213,6 @@ none. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| none. | ||||
| @@ -173,6 +222,23 @@ none. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $entity->entity_derived_serial() | ||||
| 
 | ||||
| Tries to determine the device serial number from the F<ENTITY-MIB>. Only | ||||
| considers serial numbers for entries without a parent, or if they are of type | ||||
| chassis. Looks at C<entPhysicalSerialNum> and then C<entPhysicalDescr> for | ||||
| serial number. | ||||
| 
 | ||||
| =item $entity->entity_derived_os_ver() | ||||
| 
 | ||||
| Tries to determine the device OS version from the F<ENTITY-MIB>. Only | ||||
| considers serial numbers for entries without a parent, or if they are of type | ||||
| chassis. Looks at C<entPhysicalSoftwareRev> for the version. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Entity Table | ||||
| 
 | ||||
| =over | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::EtherLike | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::EtherLike; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::EtherLike::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::EtherLike::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( 'EtherLike-MIB' => 'etherMIB' ); | ||||
| 
 | ||||
| @@ -68,8 +68,7 @@ $VERSION = '3.19'; | ||||
|     'el_xmit_defer'      => 'dot3StatsDeferredTransmissions', | ||||
| 
 | ||||
|     # Ethernet-like Collision Statistics Group | ||||
|     'el_coll_count' => 'dot3CollCount', | ||||
|     'el_coll_freq'  => 'dot3CollFrequencies' | ||||
|     'el_coll_freq'  => 'dot3CollFrequencies', | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( %SNMP::Info::MUNGE, 'el_duplex' => \&munge_el_duplex, ); | ||||
| @@ -96,22 +95,22 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  my $el = new SNMP::Info (  | ||||
|  my $el = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
|   | ||||
|  my $class = $cdp->class(); | ||||
| 
 | ||||
|  my $class = $el->class(); | ||||
|  print " Using device sub class : $class\n"; | ||||
| 
 | ||||
|  # Find the duplex setting for a port on a device that implements | ||||
|  # ETHERLIKE-MIB | ||||
|  my $interfaces = $el->interfaces(); | ||||
|  my $el_index   = $el->el_index(); | ||||
|  my $el_duplex  = $el->el_duplex();  | ||||
|  my $el_duplex  = $el->el_duplex(); | ||||
| 
 | ||||
|  foreach my $el_port (keys %$el_duplex){ | ||||
|     my $duplex = $el_duplex->{$el_port}; | ||||
| @@ -123,7 +122,7 @@ Max Baker | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies  | ||||
| SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies | ||||
| access to the F<ETHERLIKE-MIB> used by some Layer 3 Devices such as | ||||
| Cisco routers. | ||||
| 
 | ||||
| @@ -134,7 +133,7 @@ directly. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| None.   | ||||
| None. | ||||
| 
 | ||||
| =head2 Required MIBs | ||||
| 
 | ||||
| @@ -144,8 +143,6 @@ None. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar values from SNMP | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::FDP | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bruce Rodger, Max Baker | ||||
| # All rights reserved. | ||||
| @@ -34,15 +33,16 @@ | ||||
| package SNMP::Info::FDP; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::FDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::FDP::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' ); | ||||
| 
 | ||||
| @@ -50,11 +50,9 @@ $VERSION = '3.19'; | ||||
|     'fdp_run'      => 'snFdpGlobalRun', | ||||
|     'fdp_interval' => 'snFdpGlobalMessageInterval', | ||||
|     'fdp_holdtime' => 'snFdpGlobalHoldTime', | ||||
|     'fdp_id'       => 'snFdpGlobalDeviceId', | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     'fdp_index'        => 'snFdpCacheIfIndex', | ||||
|     'fdp_proto'        => 'snFdpCacheAddressType', | ||||
|     'fdp_ip'           => 'snFdpCacheAddress', | ||||
|     'fdp_ver'          => 'snFdpCacheVersion', | ||||
| @@ -62,14 +60,12 @@ $VERSION = '3.19'; | ||||
|     'fdp_port'         => 'snFdpCacheDevicePort', | ||||
|     'fdp_platform'     => 'snFdpCachePlatform', | ||||
|     'fdp_capabilities' => 'snFdpCacheCapabilities', | ||||
|     'fdp_domain'       => 'snFdpCacheVTPMgmtDomain', | ||||
|     'fdp_vlan'         => 'snFdpCacheNativeVLAN', | ||||
|     'fdp_duplex'       => 'snFdpCacheDuplex', | ||||
|     'fdp_cache_type'   => 'snFdpCacheVendorId', | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     'fdp_capabilities' => \&SNMP::Info::munge_bits, | ||||
|     'fdp_ip'           => \&SNMP::Info::munge_ip | ||||
|     'fdp_ip'           => \&SNMP::Info::munge_ip, | ||||
| ); | ||||
| 
 | ||||
| sub fdp_run { | ||||
| @@ -84,9 +80,7 @@ sub fdp_run { | ||||
| sub hasFDP { | ||||
|     my $fdp = shift; | ||||
| 
 | ||||
|     my $ver = $fdp->{_version}; | ||||
| 
 | ||||
|     #my $ver = $fdp->fdp_ver; | ||||
|     my $ver = $fdp->snmp_ver(); | ||||
| 
 | ||||
|     # SNMP v1 clients dont have the globals | ||||
|     if ( defined $ver and $ver == 1 ) { | ||||
| @@ -103,11 +97,6 @@ sub hasFDP { | ||||
| sub fdp_if { | ||||
|     my $fdp = shift; | ||||
| 
 | ||||
|     # See if by some miracle Cisco implemented the fdpCacheIfIndex entry | ||||
|     my $fdp_index = $fdp->fdp_index(); | ||||
|     return $fdp_index if defined $fdp_index; | ||||
| 
 | ||||
|     # Nope, didn't think so. Now we fake it. | ||||
|     my $fdp_ip = $fdp->fdp_ip(); | ||||
|     unless ( defined $fdp_ip ) { | ||||
|         $fdp->error_throw( | ||||
| @@ -143,10 +132,10 @@ Bruce Rodger, Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  my $fdp = new SNMP::Info (  | ||||
|  my $fdp = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
| @@ -157,7 +146,7 @@ Bruce Rodger, Max Baker | ||||
|  $hasfdp   = $fdp->hasFDP() ? 'yes' : 'no'; | ||||
| 
 | ||||
|  # Print out a map of device ports with FDP neighbors: | ||||
|  my $interfaces = $fdp->interfaces(); | ||||
|  my $interfaces   = $fdp->interfaces(); | ||||
|  my $fdp_if       = $fdp->fdp_if(); | ||||
|  my $fdp_ip       = $fdp->fdp_ip(); | ||||
|  my $fdp_port     = $fdp->fdp_port(); | ||||
| @@ -172,7 +161,7 @@ Bruce Rodger, Max Baker | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::FDP is a subclass of SNMP::Info that provides an object oriented  | ||||
| SNMP::Info::FDP is a subclass of SNMP::Info that provides an object oriented | ||||
| interface to FDP information through SNMP. | ||||
| 
 | ||||
| FDP is a Layer 2 protocol that supplies topology information of | ||||
| @@ -183,7 +172,7 @@ virtually identical.  FDP is implemented in Brocade (Foundry) devices. | ||||
| Create or use a device subclass that inherits this class.  Do not use | ||||
| directly. | ||||
| 
 | ||||
| Each device implements a subset of the global and cache entries.  | ||||
| Each device implements a subset of the global and cache entries. | ||||
| Check the return value to see if that data is held by the device. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| @@ -197,11 +186,11 @@ None. | ||||
| =item F<FOUNDRY-SN-SWITCH-GROUP-MIB> | ||||
| 
 | ||||
| Needs a reasonably recent MIB. Works OK with B2R07604A.mib, but doesn't | ||||
| work with B2R07600C.  | ||||
| work with B2R07600C. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| @@ -209,13 +198,13 @@ These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| =item  $fdp->hasFDP() | ||||
| 
 | ||||
| Is FDP is active in this device?   | ||||
| Is FDP is active in this device? | ||||
| 
 | ||||
| Accounts for SNMP version 1 devices which may have FDP but not fdp_run() | ||||
| 
 | ||||
| =item $fdp->fdp_run() | ||||
| 
 | ||||
| Is FDP enabled on this device?   | ||||
| Is FDP enabled on this device? | ||||
| 
 | ||||
| (C<fdpGlobalRun>) | ||||
| 
 | ||||
| @@ -227,19 +216,10 @@ Interval in seconds at which FDP messages are generated. | ||||
| 
 | ||||
| =item $fdp->fdp_holdtime() | ||||
| 
 | ||||
| Time in seconds that FDP messages are kept.  | ||||
| Time in seconds that FDP messages are kept. | ||||
| 
 | ||||
| (C<fdpGlobalHoldTime>) | ||||
| 
 | ||||
| =item  $fdp->fdp_id()  | ||||
| 
 | ||||
| Returns FDP device ID.   | ||||
| 
 | ||||
| This is the device id broadcast via FDP to other devices, and is what is | ||||
| retrieved from remote devices with $fdp->id(). | ||||
| 
 | ||||
| (C<fdpGlobalDeviceId>) | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Overrides | ||||
| @@ -256,13 +236,13 @@ Interval in seconds at which FDP messages are generated. | ||||
| 
 | ||||
| =item $fdp->fdp_holdtime() | ||||
| 
 | ||||
| Time in seconds that FDP messages are kept.  | ||||
| Time in seconds that FDP messages are kept. | ||||
| 
 | ||||
| (C<fdpGlobalHoldTime>) | ||||
| 
 | ||||
| =item  $fdp->fdp_id()  | ||||
| =item  $fdp->fdp_id() | ||||
| 
 | ||||
| Returns FDP device ID.   | ||||
| Returns FDP device ID. | ||||
| 
 | ||||
| This is the device id broadcast via FDP to other devices, and is what is | ||||
| retrieved from remote devices with $fdp->id(). | ||||
| @@ -323,19 +303,6 @@ Thanks to Martin Lorensen for a pointer to this information. | ||||
| 
 | ||||
| (C<fdpCacheCapabilities>) | ||||
| 
 | ||||
| =item $fdp->fdp_domain() | ||||
| 
 | ||||
| The CDP version of this returns remote VTP Management Domain as defined | ||||
| in C<CISCO-VTP-MIB::managementDomainName> | ||||
| 
 | ||||
| (C<fdpCacheVTPMgmtDomain>) | ||||
| 
 | ||||
| =item $fdp->fdp_duplex()  | ||||
| 
 | ||||
| Returns the port duplex status from remote devices. | ||||
| 
 | ||||
| (C<fdpCacheDuplex>) | ||||
| 
 | ||||
| =item $fdp->fdp_id() | ||||
| 
 | ||||
| Returns remote device id string | ||||
| @@ -346,19 +313,11 @@ Returns remote device id string | ||||
| 
 | ||||
| Returns the mapping to the SNMP Interface Table. | ||||
| 
 | ||||
| Note that a lot devices don't implement $fdp->fdp_index(),  So if it isn't | ||||
| around, we fake it.  | ||||
| 
 | ||||
| In order to map the fdp table entry back to the interfaces() entry, we | ||||
| truncate the last number off of it : | ||||
| 
 | ||||
|   # it exists, yay. | ||||
|   my $fdp_index     = $device->fdp_index(); | ||||
|   return $fdp_index if defined $fdp_index; | ||||
| 
 | ||||
|   # if not, let's fake it | ||||
|   my $fdp_ip       = $device->fdp_ip(); | ||||
|      | ||||
| 
 | ||||
|   my %fdp_if | ||||
|   foreach my $key (keys %$fdp_ip){ | ||||
|       $iid = $key; | ||||
| @@ -366,30 +325,18 @@ truncate the last number off of it : | ||||
|       $iid =~ s/\.\d+$//; | ||||
|       $fdp_if{$key} = $iid; | ||||
|   } | ||||
|   | ||||
| 
 | ||||
|   return \%fdp_if; | ||||
| 
 | ||||
| 
 | ||||
| =item $fdp->fdp_index() | ||||
| 
 | ||||
| Returns the mapping to the SNMP2 Interface table for FDP Cache Entries.  | ||||
| 
 | ||||
| Most devices don't implement this, so you probably want to use $fdp->fdp_if() | ||||
| instead. | ||||
| 
 | ||||
| See fdp_if() entry. | ||||
| 
 | ||||
| (C<fdpCacheIfIndex>) | ||||
| 
 | ||||
| =item  $fdp->fdp_ip() | ||||
| 
 | ||||
| Returns remote IP address | ||||
| 
 | ||||
| (C<fdpCacheAddress>) | ||||
| 
 | ||||
| =item $fdp->fdp_platform()  | ||||
| =item $fdp->fdp_platform() | ||||
| 
 | ||||
| Returns remote platform id  | ||||
| Returns remote platform id | ||||
| 
 | ||||
| (C<fdpCachePlatform>) | ||||
| 
 | ||||
| @@ -405,17 +352,17 @@ Returns remote address type received.  Usually IP. | ||||
| 
 | ||||
| (C<fdpCacheAddressType>) | ||||
| 
 | ||||
| =item $fdp->fdp_ver()  | ||||
| =item $fdp->fdp_ver() | ||||
| 
 | ||||
| Returns remote hardware version | ||||
| 
 | ||||
| (C<fdpCacheVersion>) | ||||
| 
 | ||||
| =item $fdp->fdp_vlan() | ||||
| =item $fdp->fdp_cache_type() | ||||
| 
 | ||||
| Returns the remote interface native VLAN. | ||||
| Returns type of entry received, either FDP or CDP. | ||||
| 
 | ||||
| (C<fdpCacheNativeVLAN>) | ||||
| (C<snFdpCacheVendorId>) | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
							
								
								
									
										230
									
								
								lib/SNMP/Info/IEEE802_Bridge.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								lib/SNMP/Info/IEEE802_Bridge.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,230 @@ | ||||
| # SNMP::Info::IEEE802_Bridge | ||||
| # | ||||
| # Changes since Version 0.7 Copyright (c) 2004 Max Baker | ||||
| # All rights reserved. | ||||
| # | ||||
| # Copyright (c) 2002,2003 Regents of the University of California | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::IEEE802_Bridge; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
|  | ||||
| @SNMP::Info::IEEE802_Bridge::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::IEEE802_Bridge::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, $DEBUG, %MIBS, %FUNCS, %GLOBALS, %MUNGE, $INIT); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     'IEEE8021-Q-BRIDGE-MIB' => 'ieee8021QBridgeVlanCurrentEgressPorts', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     'iqb_i_vlan'        => 'ieee8021QBridgePvid', | ||||
|     'iqb_i_vlan_type'   => 'ieee8021QBridgePortAcceptableFrameTypes', | ||||
|     'iqb_i_vlan_in_flt' => 'ieee8021QBridgePortIngressFiltering', | ||||
|  | ||||
|     'iqb_cv_egress'   => 'ieee8021QBridgeVlanCurrentEgressPorts', | ||||
|     'iqb_cv_untagged' => 'ieee8021QBridgeVlanCurrentUntaggedPorts', | ||||
|     'iqb_cv_stat'     => 'ieee8021QBridgeVlanStatus', | ||||
|  | ||||
|     'iqb_v_name'        => 'ieee8021QBridgeVlanStaticName', | ||||
|     'iqb_v_egress'      => 'ieee8021QBridgeVlanStaticEgressPorts', | ||||
|     'iqb_v_fbdn_egress' => 'ieee8021QBridgeVlanForbiddenEgressPorts', | ||||
|     'iqb_v_untagged'    => 'ieee8021QBridgeVlanStaticUntaggedPorts', | ||||
|     'iqb_v_stat'        => 'ieee8021QBridgeVlanStaticRowStatus', | ||||
|  | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|  | ||||
|     # Inherit all the built in munging | ||||
|     %SNMP::Info::MUNGE, | ||||
|  | ||||
|     # Add ones for our class | ||||
|     'iqb_cv_egress'     => \&SNMP::Info::munge_port_list, | ||||
|     'iqb_cv_untagged'   => \&SNMP::Info::munge_port_list, | ||||
|     'iqb_v_egress'      => \&SNMP::Info::munge_port_list, | ||||
|     'iqb_v_fbdn_egress' => \&SNMP::Info::munge_port_list, | ||||
|     'iqb_v_untagged'    => \&SNMP::Info::munge_port_list, | ||||
|  | ||||
| ); | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::IEEE802_Bridge - SNMP Interface to SNMP data available through the | ||||
| F<IEEE8021-Q-BRIDGE-MIB> | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Jeroen van Ingen | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
| FIXME update with better example | ||||
|  my $bridge = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'switch', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                              ); | ||||
|  | ||||
|  my $class = $bridge->class(); | ||||
|  print " Using device sub class : $class\n"; | ||||
|  | ||||
|  # Grab Forwarding Tables | ||||
|  my $interfaces = $bridge->interfaces(); | ||||
|  my $fw_mac     = $bridge->fw_mac(); | ||||
|  my $fw_port    = $bridge->fw_port(); | ||||
|  my $bp_index   = $bridge->bp_index(); | ||||
|  | ||||
|  foreach my $fw_index (keys %$fw_mac){ | ||||
|     my $mac   = $fw_mac->{$fw_index}; | ||||
|     my $bp_id = $fw_port->{$fw_index}; | ||||
|     my $iid   = $bp_index->{$bp_id}; | ||||
|     my $port  = $interfaces->{$iid}; | ||||
|  | ||||
|     print "Port:$port forwarding to $mac\n"; | ||||
|  } | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| F<IEEE8021-Q-BRIDGE-MIB> is used by some newer switches / Layer 2 devices. | ||||
| It is derived from the IETF Q-BRIDGE-MIB (RFC 4363), extending it with the | ||||
| concept of multiple VLAN-aware bridges (PBB). | ||||
|  | ||||
| Create or use a subclass of SNMP::Info that inherits this class.  Do not use | ||||
| directly. | ||||
|  | ||||
| For debugging you can call new() directly as you would in SNMP::Info | ||||
|  | ||||
|  my $bridge = new SNMP::Info::IEEE802_Bridge(...); | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| None. | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<IEEE8021-Q-BRIDGE-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar values from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Per-port VLAN configuration in the device (C<ieee8021QBridgePortVlanTable>) | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $bridge->iqb_i_vlan() | ||||
|  | ||||
| (C<ieee8021QBridgePvid>) | ||||
|  | ||||
| =item $bridge->iqb_i_vlan_type() | ||||
|  | ||||
| (C<ieee8021QBridgePortAcceptableFrameTypes>) | ||||
|  | ||||
| =item $bridge->iqb_i_vlan_in_flt() | ||||
|  | ||||
| (C<ieee8021QBridgePortIngressFiltering>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 VLAN Current Table (C<ieee8021QBridgeVlanCurrentTable>) | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $bridge->iqb_cv_egress() | ||||
|  | ||||
| (C<ieee8021QBridgeVlanCurrentEgressPorts>) | ||||
|  | ||||
| =item $bridge->iqb_cv_untagged() | ||||
|  | ||||
| (C<ieee8021QBridgeVlanCurrentUntaggedPorts>) | ||||
|  | ||||
| =item $bridge->iqb_cv_stat() | ||||
|  | ||||
| (C<ieee8021QBridgeVlanStatus>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 VLAN Static Table (C<ieee8021QBridgeVlanStaticTable>) | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $bridge->iqb_v_name() | ||||
|  | ||||
| (C<ieee8021QBridgeVlanStaticName>) | ||||
|  | ||||
| =item $bridge->iqb_v_egress() | ||||
|  | ||||
| (C<ieee8021QBridgeVlanStaticEgressPorts>) | ||||
|  | ||||
| =item $bridge->iqb_v_fbdn_egress() | ||||
|  | ||||
| (C<ieee8021QBridgeVlanForbiddenEgressPorts>) | ||||
|  | ||||
| =item $bridge->iqb_v_untagged() | ||||
|  | ||||
| (C<ieee8021QBridgeVlanStaticUntaggedPorts>) | ||||
|  | ||||
| =item $bridge->iqb_v_stat() | ||||
|  | ||||
| C<active> ! | ||||
|  | ||||
| (C<ieee8021QBridgeVlanStaticRowStatus>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::IEEE802dot11 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,14 +30,16 @@ | ||||
| package SNMP::Info::IEEE802dot11; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::IEEE802dot11::ISA       = qw/Exporter/; | ||||
| @SNMP::Info::IEEE802dot11::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::IEEE802dot11::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', ); | ||||
| 
 | ||||
| @@ -202,7 +203,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
| 
 | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -1,6 +1,6 @@ | ||||
| # SNMP::Info::IEEE802dot3ad | ||||
| # | ||||
| # Copyright (c) 2014 SNMP::Info Developers | ||||
| # Copyright (c) 2018 SNMP::Info Developers | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| @@ -30,6 +30,7 @@ | ||||
| package SNMP::Info::IEEE802dot3ad; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Aggregate; | ||||
| 
 | ||||
| @@ -41,9 +42,9 @@ use SNMP::Info::Aggregate; | ||||
|   agg_ports_lag | ||||
| /; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|   %SNMP::Info::Aggregate::MIBS, | ||||
| @@ -52,29 +53,40 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
| %GLOBALS = (); | ||||
| 
 | ||||
| %FUNCS = (); | ||||
| %FUNCS = ( | ||||
|   'ad_lag_ports'    => 'dot3adAggPortListPorts', | ||||
|  ); | ||||
| 
 | ||||
| %MUNGE = (); | ||||
| %MUNGE = ( | ||||
|   'ad_lag_ports' => \&SNMP::Info::munge_port_list, | ||||
|  ); | ||||
| 
 | ||||
| sub agg_ports_lag { | ||||
|   my $dev = shift; | ||||
| 
 | ||||
|   # TODO: implement partial | ||||
|   my $masters = $dev->dot3adAggActorOperKey; | ||||
|   my $slaves  = $dev->dot3adAggPortActorOperKey; | ||||
|   my $ports  = $dev->ad_lag_ports(); | ||||
|   my $index  = $dev->bp_index() || {}; | ||||
| 
 | ||||
|   return {} unless | ||||
|     ref {} eq ref $masters and scalar keys %$masters | ||||
|     and ref {} eq ref $slaves and scalar keys %$slaves; | ||||
|   return {} unless ref {} eq ref $ports and scalar keys %$ports; | ||||
| 
 | ||||
|   my $ret = {}; | ||||
|   foreach my $s (keys %$slaves) { | ||||
|       next if $slaves->{$s} == 0; | ||||
|       foreach my $m (keys %$masters) { | ||||
|           next unless $masters->{$m} == $slaves->{$s}; | ||||
|           $ret->{$s} = $m; | ||||
|           last; | ||||
|   foreach my $m ( keys %$ports ) { | ||||
|     my $idx = $m; | ||||
|     my $portlist = $ports->{$m}; | ||||
|     next unless $portlist; | ||||
| 
 | ||||
|     # While dot3adAggTable is indexed by ifIndex, the portlist is indexed | ||||
|     # with a dot1dBasePort, so we need to use dot1dBasePortIfIndex to map to | ||||
|     # the ifIndex. If we don't have dot1dBasePortIfIndex assume | ||||
|     # dot1dBasePort = ifIndex | ||||
|     for ( my $i = 0; $i <= scalar(@$portlist); $i++ ) { | ||||
|       my $ifindex = $i+1; | ||||
|       if ( exists($index->{$i+1}) and defined($index->{$i+1}) ) { | ||||
|         $ifindex = $index->{$i+1}; | ||||
|       } | ||||
|       $ret->{$ifindex} = $idx if ( @$portlist[$i] ); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return $ret; | ||||
| @@ -94,14 +106,14 @@ SNMP::Info Developers | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $info = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $info->class(); | ||||
| @@ -30,13 +30,14 @@ | ||||
| package SNMP::Info::IPv6; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::IPv6::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::IPv6::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE $METHOD/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, $METHOD); | ||||
| 
 | ||||
| use constant { | ||||
|     IPMIB   => 1, | ||||
| @@ -44,19 +45,19 @@ use constant { | ||||
|     IPV6MIB => 3, | ||||
| }; | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| %MIBS = (  | ||||
| %MIBS = ( | ||||
|     'IP-MIB'            => 'ipv6InterfaceTableLastChange', | ||||
|     'IPV6-MIB'          => 'ipv6IfTableLastChange', | ||||
|     'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress',  | ||||
|     'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = (); | ||||
| 
 | ||||
| %FUNCS = (  | ||||
| %FUNCS = ( | ||||
|     'ip_n2p_phys_addr'  => 'ipNetToPhysicalPhysAddress',    # IP-MIB | ||||
|     'c_inet_phys_addr'  => 'cInetNetToMediaPhysAddress',    # CISCO-IETF-IP-MIB | ||||
|     'i6_n2p_phys_addr'  => 'ipv6NetToMediaPhysAddress',     # IPV6-MIB | ||||
| @@ -67,20 +68,24 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
|     'ip_n2p_phys_state' => 'ipNetToPhysicalState',          # IP-MIB | ||||
|     'c_inet_phys_state' => 'cInetNetToMediaState',          # CISCO-IETF-IP-MIB | ||||
|     'i6_n2p_phys_state' => 'ipv6NetToMediaState',           # IPV6-MIB | ||||
|     'i6_n2p_phys_state' => 'ipv6IfNetToMediaState',         # IPV6-MIB | ||||
| 
 | ||||
|     'ip_pfx_origin'     => 'ipAddressPrefixOrigin',         # IP-MIB | ||||
|     'c_pfx_origin'      => 'cIpAddressPfxOrigin',           # CISCO-IETF-IP-MIB  | ||||
|     'c_pfx_origin'      => 'cIpAddressPfxOrigin',           # CISCO-IETF-IP-MIB | ||||
| 
 | ||||
|     'ip_addr6_pfx'      => 'ipAddressPrefix',              # IP-MIB  | ||||
|     'c_addr6_pfx'       => 'cIpAddressPrefix',              # CISCO-IETF-IP-MIB  | ||||
|     'ip_addr6_pfx'      => 'ipAddressPrefix',               # IP-MIB | ||||
|     'c_addr6_pfx'       => 'cIpAddressPrefix',              # CISCO-IETF-IP-MIB | ||||
| 
 | ||||
|     'ip_addr6_index'    => 'ipAddressIfIndex',              # IP-MIBw | ||||
|     'c_addr6_index'     => 'cIpAddressIfIndex',             # CISCO-IETF-IP-MIB  | ||||
|     # Commented out are not-accessible according to MIB | ||||
|     #'ip_addr6_pfxlen'   => 'ipAddressPrefixLength',        # IP-MIB | ||||
|     #'c_addr6_pfxlen'    => 'cIpAddressPfxLength',          # CISCO-IETF-IP-MIB | ||||
|     'i6_addr_pfxlen'    => 'ipv6AddrPfxLength',             # IPV6-MIB | ||||
| 
 | ||||
|     'ip_addr6_index'    => 'ipAddressIfIndex',              # IP-MIB | ||||
|     'c_addr6_index'     => 'cIpAddressIfIndex',             # CISCO-IETF-IP-MIB | ||||
| 
 | ||||
|     'ip_addr6_type'     => 'ipAddressType',                 # IP-MIB | ||||
|     'c_addr6_type'      => 'cIpAddressType',                # CISCO-IETF-IP-MIB | ||||
|      | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
| @@ -102,8 +107,8 @@ sub ipv6_n2p_mac { | ||||
|     foreach my $row (keys %$phys_addr) { | ||||
|         if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) { | ||||
|             my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4; | ||||
|             if ($info::METHOD == IPV6MIB) {  | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index;  | ||||
|             if ($info::METHOD == IPV6MIB) { | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index; | ||||
|                 # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes) | ||||
|                 $v6addr = join('.', $addrtype, $addrsize, $v6addr); | ||||
|                 $addrtype = 2; | ||||
| @@ -129,8 +134,8 @@ sub ipv6_n2p_addr { | ||||
|     foreach my $row (keys %$net_addr) { | ||||
|         if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) { | ||||
|             my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4; | ||||
|             if ($info::METHOD == IPV6MIB) {  | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index;  | ||||
|             if ($info::METHOD == IPV6MIB) { | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index; | ||||
|                 # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes) | ||||
|                 $v6addr = join('.', $addrtype, $addrsize, $v6addr); | ||||
|                 $addrtype = 2; | ||||
| @@ -138,10 +143,16 @@ sub ipv6_n2p_addr { | ||||
|             if ($addrtype == 2) { # IPv6 | ||||
|                 my $v6_packed = pack("C*", split(/\./, $v6addr)); | ||||
|                 if (length($v6_packed) == 15) { | ||||
|                     # Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize,  | ||||
|                     # Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize, | ||||
|                     # so what we've collected in that variable is actually the first byte of the address. | ||||
|                     $v6_packed = pack('C', $addrsize) . $v6_packed; | ||||
|                 } | ||||
|                 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; | ||||
| @@ -167,8 +178,8 @@ sub ipv6_n2p_if { | ||||
|     foreach my $row (keys %$phys_addr) { | ||||
|         if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) { | ||||
|             my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4; | ||||
|             if ($info::METHOD == IPV6MIB) {  | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index;  | ||||
|             if ($info::METHOD == IPV6MIB) { | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index; | ||||
|                 # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes) | ||||
|                 $v6addr = join('.', $addrtype, $addrsize, $v6addr); | ||||
|                 $addrtype = 2; | ||||
| @@ -194,8 +205,8 @@ sub ipv6_n2p_type { | ||||
|     foreach my $row (keys %$phys_type) { | ||||
|         if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) { | ||||
|             my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4; | ||||
|             if ($info::METHOD == IPV6MIB) {  | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index;  | ||||
|             if ($info::METHOD == IPV6MIB) { | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index; | ||||
|                 # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes) | ||||
|                 $v6addr = join('.', $addrtype, $addrsize, $v6addr); | ||||
|                 $addrtype = 2; | ||||
| @@ -221,8 +232,8 @@ sub ipv6_n2p_state { | ||||
|     foreach my $row (keys %$phys_state) { | ||||
|         if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) { | ||||
|             my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4; | ||||
|             if ($info::METHOD == IPV6MIB) {  | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index;  | ||||
|             if ($info::METHOD == IPV6MIB) { | ||||
|                 # IPV6-MIB doesn't include the addrtype in the index; | ||||
|                 # also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes) | ||||
|                 $v6addr = join('.', $addrtype, $addrsize, $v6addr); | ||||
|                 $addrtype = 2; | ||||
| @@ -307,7 +318,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+)$/ ){ | ||||
| @@ -321,9 +334,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))); | ||||
|         } elsif ($info->debug()) { | ||||
|             printf("%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'; | ||||
| @@ -343,6 +407,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; | ||||
|         } | ||||
| @@ -378,14 +443,14 @@ Jeroen van Ingen and Carlos Vicente | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $info = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $info->class(); | ||||
| @@ -393,12 +458,12 @@ Jeroen van Ingen and Carlos Vicente | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses  | ||||
| The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses | ||||
| to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>, | ||||
| F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the | ||||
| device. | ||||
| 
 | ||||
| This class is inherited by Info::Layer3 to provide IPv6 node tracking across   | ||||
| This class is inherited by Info::Layer3 to provide IPv6 node tracking across | ||||
| device classes. | ||||
| 
 | ||||
| For debugging purposes you can call this class directly as you would | ||||
| @@ -415,7 +480,9 @@ none. | ||||
| =over | ||||
| 
 | ||||
| =item F<IP-MIB> | ||||
| 
 | ||||
| =item F<IPV6-MIB> | ||||
| 
 | ||||
| =item F<CISCO-IETF-IP-MIB> | ||||
| 
 | ||||
| =back | ||||
| @@ -455,10 +522,18 @@ Maps an IPv6 address to its type (unicast, anycast, etc.) | ||||
| 
 | ||||
| Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.) | ||||
| 
 | ||||
| =item $info->ipv6_addr_prefix()  | ||||
| =item $info->ipv6_addr_prefix() | ||||
| 
 | ||||
| Maps IPv6 addresses with their prefixes | ||||
| 
 | ||||
| =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 | ||||
| @@ -473,7 +548,7 @@ Maps an address of type C<cInetNetToMediaNetAddressType> on interface C<ifIndex> | ||||
| 
 | ||||
| =head1 MUNGES | ||||
| 
 | ||||
| =over  | ||||
| =over | ||||
| 
 | ||||
| =item munge_physaddr() | ||||
| 
 | ||||
| @@ -1,7 +1,6 @@ | ||||
| # SNMP::Info::LLDP | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # Copyright (c) 2018 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| @@ -31,18 +30,20 @@ | ||||
| package SNMP::Info::LLDP; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::LLDP::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::LLDP::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     'LLDP-MIB'          => 'lldpLocSysCapEnabled', | ||||
|     'LLDP-EXT-MED-MIB'  => 'lldpXMedMIB', | ||||
|     'LLDP-EXT-DOT1-MIB' => 'lldpXdot1MIB', | ||||
|     'LLDP-EXT-DOT3-MIB' => 'lldpXdot3MIB', | ||||
| ); | ||||
| @@ -51,13 +52,18 @@ $VERSION = '3.19'; | ||||
|     'lldp_sysname' => 'lldpLocSysName', | ||||
|     'lldp_sysdesc' => 'lldpLocSysDesc', | ||||
|     'lldp_sys_cap' => 'lldpLocSysCapEnabled', | ||||
|     'lldp_loc_id_type'  => 'lldpLocChassisIdSubtype', | ||||
|     'lldp_loc_id_os'    => 'lldpLocChassisId', | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
| 
 | ||||
|     # LLDP-MIB::lldpLocManAddrTable | ||||
|     'lldp_lman_addr' => 'lldpLocManAddrIfId', | ||||
| 
 | ||||
|     # LLDP-MIB::LldpLocPortEntry | ||||
|     'lldp_lport_id'   => 'lldpLocPortId', | ||||
|     'lldp_lport_desc' => 'lldpLocPortDesc', | ||||
| 
 | ||||
|     # LLDP-MIB::lldpRemTable | ||||
|     'lldp_rem_id_type'  => 'lldpRemChassisIdSubtype', | ||||
|     'lldp_rem_id'       => 'lldpRemChassisId', | ||||
| @@ -69,6 +75,18 @@ $VERSION = '3.19'; | ||||
|     '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', | ||||
| ); | ||||
| @@ -79,9 +97,22 @@ $VERSION = '3.19'; | ||||
|     'lldp_rem_sysname'   => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_sysdesc'   => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_port_desc' => \&SNMP::Info::munge_null, | ||||
|     'lldp_lport_id'      => \&SNMP::Info::munge_null, | ||||
|     'lldp_lport_desc'    => \&SNMP::Info::munge_null, | ||||
|     'lldp_sys_cap'       => \&SNMP::Info::munge_bits, | ||||
|     'lldp_rem_sys_cap'   => \&SNMP::Info::munge_bits, | ||||
|     'lldp_rem_cap_spt'   => \&SNMP::Info::munge_bits, | ||||
| 
 | ||||
|     'lldp_rem_hw_rev' => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_fw_rev' => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_sw_rev' => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_serial' => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_vendor' => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_model'  => \&SNMP::Info::munge_null, | ||||
|     'lldp_rem_asset'  => \&SNMP::Info::munge_null, | ||||
| 
 | ||||
|     'lldp_rem_media_cap'     => \&SNMP::Info::munge_bits, | ||||
|     'lldp_rem_media_cap_spt' => \&SNMP::Info::munge_bits, | ||||
| ); | ||||
| 
 | ||||
| sub hasLLDP { | ||||
| @@ -92,7 +123,8 @@ sub hasLLDP { | ||||
|     my $lldp_cap = $lldp->lldp_sys_cap(); | ||||
|     return 1 if defined $lldp_cap; | ||||
| 
 | ||||
|     # If the device doesn't return local system capabilities, fallback by checking if it would report neighbors | ||||
|     # If the device doesn't return local system capabilities, fallback | ||||
|     # by checking if it would report neighbors | ||||
|     my $lldp_rem = $lldp->lldp_rem_id() || {}; | ||||
|     return 1 if scalar keys %$lldp_rem; | ||||
| 
 | ||||
| @@ -114,13 +146,22 @@ sub lldp_if { | ||||
|         my @aOID = split( '\.', $key ); | ||||
|         my $port = $aOID[1]; | ||||
|         next unless $port; | ||||
|         # Local LLDP port may not equate to ifIndex, see LldpPortNumber TEXTUAL-CONVENTION in LLDP-MIB. | ||||
|         # Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex, | ||||
|         # prefer ifDescr over ifAlias because using cross ref with description is correct behavior  | ||||
|         # according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though. | ||||
|         my $lldp_desc = $lldp->lldpLocPortDesc($port); | ||||
| 
 | ||||
|         # Local LLDP port may not equate to ifIndex, see LldpPortNumber | ||||
|         # TEXTUAL-CONVENTION in LLDP-MIB. Cross reference lldpLocPortDesc | ||||
|         # with ifDescr and ifAlias to get ifIndex, prefer ifDescr over | ||||
|         # ifAlias because using cross ref with description is correct | ||||
|         # behavior according to the LLDP-MIB. Some devices (eg H3C gear) | ||||
|         # seem to use ifAlias though. | ||||
|         # snmp::info #372 -> to make things even more complex some devices | ||||
|         # have different behaviour depending on os version (nx-os 6 vs 7) | ||||
|         # so we made this a function to allow overrides in more specific | ||||
|         # modules | ||||
|         my $lldp_desc = $lldp->lldp_lport_desc($port); | ||||
|         my $desc      = $lldp_desc->{$port}; | ||||
|         # If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum | ||||
| 
 | ||||
|         # If cross reference is successful use it, otherwise stick with | ||||
|         # lldpRemLocalPortNum | ||||
|         if ( $desc && exists $r_i_descr{$desc} ) { | ||||
|             $port = $r_i_descr{$desc}; | ||||
|         } | ||||
| @@ -141,7 +182,7 @@ sub lldp_ip { | ||||
| 
 | ||||
|     my %lldp_ip; | ||||
|     foreach my $key ( keys %$rman_addr ) { | ||||
|         my ( $index, $proto, $addr ) = _lldp_addr_index($key); | ||||
|         my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key); | ||||
|         next unless defined $index; | ||||
|         next unless $proto == 1; | ||||
|         $lldp_ip{$index} = $addr; | ||||
| @@ -149,6 +190,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->_lldp_addr_index($key); | ||||
|         next unless defined $index; | ||||
|         next unless $proto == 2; | ||||
|         $lldp_ipv6{$index} = $addr; | ||||
|     } | ||||
|     return \%lldp_ipv6; | ||||
| } | ||||
| 
 | ||||
| sub lldp_mac { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     my $rman_addr = $lldp->lldp_rman_addr($partial) || {}; | ||||
| 
 | ||||
|     my %lldp_ipv6; | ||||
|     foreach my $key ( keys %$rman_addr ) { | ||||
|         my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key); | ||||
|         next unless defined $index; | ||||
|         next unless $proto == 6; | ||||
|         $lldp_ipv6{$index} = $addr; | ||||
|     } | ||||
|     return \%lldp_ipv6; | ||||
| } | ||||
| 
 | ||||
| sub lldp_addr { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift; | ||||
| @@ -157,7 +230,7 @@ sub lldp_addr { | ||||
| 
 | ||||
|     my %lldp_ip; | ||||
|     foreach my $key ( keys %$rman_addr ) { | ||||
|         my ( $index, $proto, $addr ) = _lldp_addr_index($key); | ||||
|         my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key); | ||||
|         next unless defined $index; | ||||
|         $lldp_ip{$index} = $addr; | ||||
|     } | ||||
| @@ -177,7 +250,10 @@ sub lldp_port { | ||||
|     foreach my $key ( sort keys %$pid ) { | ||||
|         my $port = $pdesc->{$key}; | ||||
|         my $type = $ptype->{$key}; | ||||
|         if ( $type and $type eq 'interfaceName' ) { | ||||
|         if (    $type | ||||
|             and ( $type eq 'interfaceName' or $type eq 'local' ) | ||||
|             and ( defined $pid->{$key} and $pid->{$key} !~ /^\d+$/ ) ) | ||||
|         { | ||||
| 
 | ||||
|             # If the pid claims to be an interface name, | ||||
|             # believe it. | ||||
| @@ -190,8 +266,7 @@ sub lldp_port { | ||||
| 
 | ||||
|           # May need to format other types in the future, i.e. Network address | ||||
|             if ( $type =~ /mac/ ) { | ||||
|                 $port = join( ':', | ||||
|                     map { sprintf "%02x", $_ } unpack( 'C*', $port ) ); | ||||
|                 $port = SNMP::Info::munge_mac($port) | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @@ -210,6 +285,29 @@ sub lldp_port { | ||||
|     return \%lldp_port; | ||||
| } | ||||
| 
 | ||||
| sub _lldp_id_string { | ||||
|     my $lldp    = shift; | ||||
|     my $id    = shift; | ||||
|     my $type    = shift; | ||||
| 
 | ||||
|     # May need to format other types in the future | ||||
|     if ( $type =~ /mac/ ) { | ||||
|         $id = SNMP::Info::munge_mac($id) | ||||
|     } elsif ( $type eq 'networkAddress' ) { | ||||
|         if ( length( unpack( 'H*', $id ) ) == 10 ) { | ||||
| 
 | ||||
|             # IP address - first octet is IANA Address Family Number, need | ||||
|             # walk with IPv6 | ||||
|             my @octets | ||||
|                 = ( map { sprintf "%02x", $_ } unpack( 'C*', $id ) ) | ||||
|                 [ 1 .. 4 ]; | ||||
|             $id = join '.', map { hex($_) } @octets; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return $id; | ||||
| } | ||||
| 
 | ||||
| sub lldp_id { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift; | ||||
| @@ -224,25 +322,19 @@ sub lldp_id { | ||||
|         my $type = $ch_type->{$key}; | ||||
|         next unless $type; | ||||
| 
 | ||||
|         # May need to format other types in the future | ||||
|         if ( $type =~ /mac/ ) { | ||||
|             $id = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) ); | ||||
|         } | ||||
|         elsif ( $type eq 'networkAddress' ) { | ||||
|             if ( length( unpack( 'H*', $id ) ) == 10 ) { | ||||
| 
 | ||||
|                 # IP address (first octet is sign, I guess) | ||||
|                 my @octets | ||||
|                     = ( map { sprintf "%02x", $_ } unpack( 'C*', $id ) ) | ||||
|                     [ 1 .. 4 ]; | ||||
|                 $id = join '.', map { hex($_) } @octets; | ||||
|             } | ||||
|         } | ||||
|         $id = $lldp->_lldp_id_string($id, $type); | ||||
|         $lldp_id{$key} = $id; | ||||
|     } | ||||
|     return \%lldp_id; | ||||
| } | ||||
| 
 | ||||
| sub lldp_loc_id { | ||||
|     my $lldp    = shift; | ||||
|     my $ch_type = $lldp->lldp_loc_id_type(); | ||||
|     my $ch      = $lldp->lldp_loc_id_os(); | ||||
|     return $lldp->_lldp_id_string($ch, $ch_type); | ||||
| } | ||||
| 
 | ||||
| sub lldp_platform { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift; | ||||
| @@ -267,7 +359,41 @@ sub lldp_cap { | ||||
|     # Encoded as BITS which Perl Net-SNMP implementation doesn't seem to | ||||
|     # be able to enumerate for us, so we have to get it from the MIB | ||||
|     # and enumerate ourselves | ||||
|     my $oid = SNMP::translateObj( 'lldpRemSysCapEnabled', 0, 1 ) || ''; | ||||
|     my $oid | ||||
|         = SNMP::translateObj( 'LLDP-MIB::lldpRemSysCapEnabled', 0, 1 ) || ''; | ||||
|     my $enums = ( | ||||
|         ( ref {} eq ref $SNMP::MIB{$oid}{'enums'} ) | ||||
|         ? $SNMP::MIB{$oid}{'enums'} | ||||
|         : {} | ||||
|     ); | ||||
|     my %r_enums = reverse %$enums; | ||||
| 
 | ||||
|     my %lldp_cap; | ||||
|     foreach my $key ( keys %$lldp_caps ) { | ||||
|         my $cap_bits = $lldp_caps->{$key}; | ||||
|         next unless $cap_bits; | ||||
| 
 | ||||
|         my $count = 0; | ||||
|         foreach my $bit ( split //, $cap_bits ) { | ||||
|             if ($bit) { | ||||
|                 push( @{ $lldp_cap{$key} }, $r_enums{$count} ); | ||||
|             } | ||||
|             $count++; | ||||
|         } | ||||
|     } | ||||
|     return \%lldp_cap; | ||||
| } | ||||
| 
 | ||||
| sub lldp_media_cap { | ||||
|     my $lldp    = shift; | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     my $lldp_caps = $lldp->lldp_rem_media_cap_spt($partial) || {}; | ||||
| 
 | ||||
|     # Encoded as BITS which Perl Net-SNMP implementation doesn't seem to | ||||
|     # be able to enumerate for us, so we have to get it from the MIB | ||||
|     # and enumerate ourselves | ||||
|     my $oid = SNMP::translateObj( 'lldpXMedRemCapCurrent', 0, 1 ) || ''; | ||||
|     my $enums = ( | ||||
|         ( ref {} eq ref $SNMP::MIB{$oid}{'enums'} ) | ||||
|         ? $SNMP::MIB{$oid}{'enums'} | ||||
| @@ -312,24 +438,32 @@ sub lldp_cap { | ||||
| # Break up the lldpRemManAddrTable INDEX into common index, protocol, | ||||
| # and address. | ||||
| sub _lldp_addr_index { | ||||
|     my $idx    = shift; | ||||
|     my @oids   = split( /\./, $idx ); | ||||
|     my $index  = join( '.', splice( @oids, 0, 3 ) ); | ||||
|     my $proto  = shift(@oids); | ||||
|     my $length = shift(@oids) if scalar @oids > 4; | ||||
|     my $lldp = shift; | ||||
|     my $idx  = shift; | ||||
| 
 | ||||
|     my @oids = split( /\./, $idx ); | ||||
|     my $index = join( '.', splice( @oids, 0, 3 ) ); | ||||
|     my $proto = shift(@oids); | ||||
|     shift(@oids) if scalar @oids > 4;    # $length | ||||
| 
 | ||||
|     # IPv4 | ||||
|     if ( $proto == 1 ) { | ||||
|         return ( $index, $proto, join( '.', @oids ) ); | ||||
|     } | ||||
| 
 | ||||
|     # IPv6 | ||||
|     elsif ( $proto == 2 ) { | ||||
|         return ( $index, $proto, | ||||
|             join( ':', unpack( '(H4)*', pack( 'C*', @oids ) ) ) ); | ||||
|     } | ||||
| 
 | ||||
|     # MAC | ||||
|     elsif ( $proto == 6 ) { | ||||
|         return ( $index, $proto, | ||||
|             join( ':', map { sprintf "%02x", $_ } @oids ) ); | ||||
|     } | ||||
| 
 | ||||
|     # TODO - Need to handle other protocols, i.e. IPv6 | ||||
|     # TODO - Other protocols may be used as well; implement when needed? | ||||
|     else { | ||||
|         return; | ||||
|     } | ||||
| @@ -348,10 +482,10 @@ Eric Miller | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  my $lldp = new SNMP::Info (  | ||||
|  my $lldp = new SNMP::Info ( | ||||
|                              AutoSpecify => 1, | ||||
|                              Debug       => 1, | ||||
|                              DestHost    => 'router',  | ||||
|                              DestHost    => 'router', | ||||
|                              Community   => 'public', | ||||
|                              Version     => 2 | ||||
|                            ); | ||||
| @@ -377,7 +511,7 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| SNMP::Info::LLDP is a subclass of SNMP::Info that provides an object oriented  | ||||
| SNMP::Info::LLDP is a subclass of SNMP::Info that provides an object oriented | ||||
| interface to LLDP information through SNMP. | ||||
| 
 | ||||
| LLDP is a Layer 2 protocol that allows a network device to advertise its | ||||
| @@ -397,13 +531,15 @@ None. | ||||
| 
 | ||||
| =item F<LLDP-MIB> | ||||
| 
 | ||||
| =item F<LLDP-EXT-MED-MIB> | ||||
| 
 | ||||
| =item F<LLDP-EXT-DOT1-MIB> | ||||
| 
 | ||||
| =item F<LLDP-EXT-DOT3-MIB> | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 GLOBAL METHODS | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| @@ -411,7 +547,7 @@ These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| =item $lldp->hasLLDP() | ||||
| 
 | ||||
| Is LLDP is active in this device?   | ||||
| Is LLDP is active in this device? | ||||
| 
 | ||||
| Note:  LLDP may be active, but nothing in C<lldpRemoteSystemsData> Tables so | ||||
| the device would not return any useful topology information. | ||||
| @@ -422,7 +558,7 @@ The string value used to identify the system name of the local system.  If the | ||||
| local agent supports IETF RFC 3418, C<lldpLocSysName> object should have the | ||||
| same value of C<sysName> object. | ||||
| 
 | ||||
| Nulls are removed before the value is returned.  | ||||
| Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpLocSysName>) | ||||
| 
 | ||||
| @@ -436,7 +572,7 @@ Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpLocSysDesc>) | ||||
| 
 | ||||
| =item  $lldp->lldp_sys_cap()  | ||||
| =item  $lldp->lldp_sys_cap() | ||||
| 
 | ||||
| Returns which system capabilities are enabled on the local system.  Results | ||||
| are munged into an ascii binary string, LSB.  Each digit represents a bit | ||||
| @@ -468,6 +604,22 @@ capability and nothing else." | ||||
| 
 | ||||
| (C<lldpLocSysCapEnabled>) | ||||
| 
 | ||||
| =item $lldp->lldp_loc_id() | ||||
| 
 | ||||
| The string value used to identify the chassis component associated with  | ||||
| the local system. | ||||
| 
 | ||||
| (C<lldpLocChassisId>) | ||||
| 
 | ||||
| =item $lldp->lldp_loc_id_type() | ||||
| 
 | ||||
| The type of encoding used to identify the chassis associated with the  | ||||
| local system. | ||||
| 
 | ||||
| This is used by the above method to decode the octet string in C<lldpLocChassisId> | ||||
| 
 | ||||
| (C<lldpLocChassisIdSubtype>) | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 TABLE METHODS | ||||
| @@ -486,8 +638,8 @@ with the remote system. | ||||
| 
 | ||||
| =item $lldp->lldp_if() | ||||
| 
 | ||||
| Returns the mapping to the SNMP Interface Table. Tries to cross reference  | ||||
| (C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>),  | ||||
| Returns the mapping to the SNMP Interface Table. Tries to cross reference | ||||
| (C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>), | ||||
| if unable defaults to (C<lldpRemLocalPortNum>). | ||||
| 
 | ||||
| =item  $lldp->lldp_ip() | ||||
| @@ -495,10 +647,24 @@ if unable defaults to (C<lldpRemLocalPortNum>). | ||||
| 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() | ||||
| 
 | ||||
| @@ -509,12 +675,18 @@ Returns remote port ID | ||||
| Tries to return something useful from C<lldp_rem_sysdesc()> or | ||||
| C<lldp_rem_sysname()>. | ||||
| 
 | ||||
| =item  $lldp->lldp_cap()  | ||||
| =item  $lldp->lldp_cap() | ||||
| 
 | ||||
| Returns hash of arrays with each array containing the system capabilities | ||||
| supported by the remote system.  Possible elements in the array are | ||||
| enumerated from C<LldpSystemCapabilitiesMap>. | ||||
| 
 | ||||
| =item  $lldp->lldp_media_cap() | ||||
| 
 | ||||
| Returns hash of arrays with each array containing the media capabilities | ||||
| supported by the remote system.  Possible elements in the array are | ||||
| enumerated from C<LldpXMedCapabilities>. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 LLDP Remote Table (C<lldpRemTable>) | ||||
| @@ -530,7 +702,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>) | ||||
| @@ -554,7 +726,7 @@ the remote system. | ||||
| Returns the string value used to identify the description of the given port | ||||
| associated with the remote system. | ||||
| 
 | ||||
| Nulls are removed before the value is returned.  | ||||
| Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpRemPortDesc>) | ||||
| 
 | ||||
| @@ -563,7 +735,7 @@ Nulls are removed before the value is returned. | ||||
| Returns the string value used to identify the system name of the remote | ||||
| system. | ||||
| 
 | ||||
| Nulls are removed before the value is returned.  | ||||
| Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpRemSysName>) | ||||
| 
 | ||||
| @@ -572,11 +744,70 @@ Nulls are removed before the value is returned. | ||||
| Returns the string value used to identify the system description of the | ||||
| remote system. | ||||
| 
 | ||||
| Nulls are removed before the value is returned.  | ||||
| Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpRemSysDesc>) | ||||
| 
 | ||||
| =item  $lldp->lldp_rem_sys_cap()  | ||||
| =item $lldp->lldp_rem_hw_rev() | ||||
| 
 | ||||
| Returns the string value used to identify the hardware revision of the | ||||
| remote system. Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpXMedRemHardwareRev>) | ||||
| 
 | ||||
| =item $lldp->lldp_rem_fw_rev() | ||||
| 
 | ||||
| Returns the string value used to identify the firmware revision of the | ||||
| remote system. Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpXMedRemHardwareRev>) | ||||
| 
 | ||||
| =item $lldp->lldp_rem_sw_rev() | ||||
| 
 | ||||
| Returns the string value used to identify the software revision of the | ||||
| remote system. Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpXMedRemSoftwareRev>) | ||||
| 
 | ||||
| =item $lldp->lldp_rem_serial() | ||||
| 
 | ||||
| Returns the string value used to identify the serial number of the | ||||
| remote system. Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpXMedRemSerialNum>) | ||||
| 
 | ||||
| =item $lldp->lldp_rem_vendor() | ||||
| 
 | ||||
| Returns the string value used to identify the manufacturer of the | ||||
| remote system. Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpXMedRemMfgName>) | ||||
| 
 | ||||
| =item $lldp->lldp_rem_asset() | ||||
| 
 | ||||
| Returns the string value used to identify the asset number of the | ||||
| remote system. Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpXMedRemAssetID>) | ||||
| 
 | ||||
| =item $lldp->lldp_rem_model() | ||||
| 
 | ||||
| Returns the string value used to identify the model of the | ||||
| remote system. Nulls are removed before the value is returned. | ||||
| 
 | ||||
| (C<lldpXMedRemModelName>) | ||||
| 
 | ||||
| =item  $lldp->lldp_rem_media_cap_spt() | ||||
| 
 | ||||
| Returns which media capabilities are supported on the remote system. Results | ||||
| are munged into an ascii binary string, LSB. | ||||
| 
 | ||||
| =item  $lldp->lldp_rem_media_cap() | ||||
| 
 | ||||
| Returns which media capabilities are enabled on the remote system. Results | ||||
| are munged into an ascii binary string, LSB. | ||||
| 
 | ||||
| =item  $lldp->lldp_rem_sys_cap() | ||||
| 
 | ||||
| Returns which system capabilities are enabled on the remote system.  Results | ||||
| are munged into an ascii binary string, LSB.  Each digit represents a bit | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Layer1; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| 
 | ||||
| @SNMP::Info::Layer1::ISA       = qw/SNMP::Info Exporter/; | ||||
| @SNMP::Info::Layer1::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' ); | ||||
| 
 | ||||
| @@ -49,7 +49,7 @@ $VERSION = '3.19'; | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     'ports_managed' => 'ifNumber', | ||||
|     'rptr_slots'    => 'rptrGroupCapacity', | ||||
|     'slots'         => 'rptrGroupCapacity' | ||||
|     'slots'         => 'rptrGroupCapacity', | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
| @@ -86,7 +86,7 @@ sub ports { | ||||
| } | ||||
| 
 | ||||
| # $l1->model() - Looks at sysObjectID which gives the oid of the system | ||||
| #       name, contained in a propriatry MIB. | ||||
| #       name, contained in a proprietary MIB. | ||||
| sub model { | ||||
|     my $l1    = shift; | ||||
|     my $id    = $l1->id(); | ||||
| @@ -172,14 +172,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $l1 = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $l1->class(); | ||||
| @@ -203,15 +203,15 @@ This class is usually used as a superclass for more specific device classes | ||||
| listed under SNMP::Info::Layer1::*   Please read all docs under SNMP::Info | ||||
| first. | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Layer1 device through SNMP.  Information is stored in a number of MIBs. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
| 
 | ||||
|  my $l1 = new SNMP::Info::Layer1(...); | ||||
| 
 | ||||
| =head2 Inherited Classes  | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -219,7 +219,7 @@ after determining a more specific class using the method above. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Required MIBs  | ||||
| =head2 Required MIBs | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -227,12 +227,9 @@ after determining a more specific class using the method above. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| MIBs required for L<SNMP::Info/"Required MIBs"> | ||||
| MIBs required for L<SNMP::Info/"REQUIREMENTS"> | ||||
| 
 | ||||
| See L<SNMP::Info/"Required MIBs"> for its MIB requirements. | ||||
| 
 | ||||
| F<SNMP-REPEATER-MIB> needs to be extracted from | ||||
| ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz | ||||
| See L<SNMP::Info/"REQUIREMENTS"> for its MIB requirements. | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| @@ -242,7 +239,7 @@ These are methods that return scalar value from SNMP | ||||
| 
 | ||||
| =item $l1->ports_managed() | ||||
| 
 | ||||
| Gets the number of ports under the interface mib  | ||||
| Gets the number of ports under the interface mib | ||||
| 
 | ||||
| (C<ifNumber>) | ||||
| 
 | ||||
| @@ -278,7 +275,7 @@ Number of 'groups' in the Repeater MIB | ||||
| 
 | ||||
| =head2 Global Methods imported from SNMP::Info | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
| 
 | ||||
| =head1 TABLE METHODS | ||||
| 
 | ||||
| @@ -341,6 +338,6 @@ Group (slot) Number for given port. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
| 
 | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer1::Allied | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Layer1::Allied; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer1; | ||||
| 
 | ||||
| @SNMP::Info::Layer1::Allied::ISA       = qw/SNMP::Info::Layer1 Exporter/; | ||||
| @SNMP::Info::Layer1::Allied::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', ); | ||||
| @@ -52,9 +52,14 @@ $VERSION = '3.19'; | ||||
|     'ati_up'     => 'linkTestLED', | ||||
| ); | ||||
| 
 | ||||
| %MIBS = ( %SNMP::Info::Layer1::MIBS, 'ATI-MIB' => 'atiPortGroupIndex' ); | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer1::MIBS, | ||||
|     'ATI-MIB' => 'atiPortGroupIndex', | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( %SNMP::Info::Layer1::MUNGE, ); | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer1::MUNGE, | ||||
| ); | ||||
| 
 | ||||
| sub vendor { | ||||
|     return 'allied'; | ||||
| @@ -68,9 +73,10 @@ sub os_ver { | ||||
|     my $allied = shift; | ||||
|     my $descr  = $allied->description(); | ||||
| 
 | ||||
|     if ( $descr =~ m/version (\d+\.\d+)/ ) { | ||||
|     if ( defined ($descr) && $descr =~ m/version (\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub model { | ||||
| @@ -78,7 +84,7 @@ sub model { | ||||
| 
 | ||||
|     my $desc = $allied->description(); | ||||
| 
 | ||||
|     if ( $desc =~ /(AT-\d{4}\S{1}?)/ ) { | ||||
|     if ( defined ($desc) && $desc =~ /(AT-\d{4}\S{1})/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| @@ -127,14 +133,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $allied = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myhub', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $allied->class(); | ||||
| @@ -142,8 +148,8 @@ Max Baker | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Allied device through SNMP. See inherited classes' documentation for  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Allied device through SNMP. See inherited classes' documentation for | ||||
| inherited methods. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| @@ -180,7 +186,7 @@ Returns 'allied' :) | ||||
| 
 | ||||
| =item $allied->os() | ||||
| 
 | ||||
| Returns 'allied'  | ||||
| Returns 'allied' | ||||
| 
 | ||||
| =item $allied->os_ver() | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer1::Asante | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Layer1::Asante; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer1; | ||||
| 
 | ||||
| @SNMP::Info::Layer1::Asante::ISA       = qw/SNMP::Info::Layer1 Exporter/; | ||||
| @SNMP::Info::Layer1::Asante::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, ); | ||||
| @@ -50,11 +50,11 @@ $VERSION = '3.19'; | ||||
|     %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, ); | ||||
| 
 | ||||
| @@ -81,9 +81,10 @@ sub os_ver { | ||||
|     my $asante = shift; | ||||
|     my $descr  = $asante->description(); | ||||
| 
 | ||||
|     if ( $descr =~ /software v(\d+\.\d+)/ ) { | ||||
|     if ( defined ($descr) && $descr =~ /software v(\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub vendor { | ||||
| @@ -94,7 +95,7 @@ sub model { | ||||
|     my $asante = shift; | ||||
| 
 | ||||
|     my $id    = $asante->id(); | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|     my $model = SNMP::translateObj($id); | ||||
| 
 | ||||
|     return $model; | ||||
| } | ||||
| @@ -108,8 +109,8 @@ sub i_up { | ||||
|     my $i_up = {}; | ||||
|     foreach my $port ( keys %$asante_up ) { | ||||
|         my $up = $asante_up->{$port}; | ||||
|         $i_up->{$port} = 'down' if $up =~ /on/; | ||||
|         $i_up->{$port} = 'up'   if $up =~ /off/; | ||||
|         $i_up->{$port} = 'down' if $up =~ /off/; | ||||
|         $i_up->{$port} = 'up'   if $up =~ /on/; | ||||
|     } | ||||
| 
 | ||||
|     return $i_up; | ||||
| @@ -149,7 +150,7 @@ sub i_name { | ||||
|     my $asante  = shift; | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     my $i_name = $asante->orig_i_descr($partial) || {}; | ||||
|     my $i_name = $asante->orig_i_description($partial) || {}; | ||||
| 
 | ||||
|     my %i_name; | ||||
| 
 | ||||
| @@ -172,14 +173,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $asante = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $asante->class(); | ||||
| @@ -187,7 +188,7 @@ Max Baker | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from an | ||||
| Asante device through SNMP. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| @@ -202,7 +203,7 @@ Asante device through SNMP. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item F<ASANTE-HUB1012-MIB> | ||||
| =item F<ASANTE-AH1012-MIB> | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -226,11 +227,11 @@ Culls software version from description() | ||||
| 
 | ||||
| =item $asante->vendor() | ||||
| 
 | ||||
| Returns 'asante' :) | ||||
| 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 | ||||
| @@ -249,7 +250,7 @@ See L<SNMP::Info::Layer1/"GLOBALS"> for details. | ||||
| 
 | ||||
| Returns reference to the map between IID and physical Port. | ||||
| 
 | ||||
| =item $asante->i_description()  | ||||
| =item $asante->i_description() | ||||
| 
 | ||||
| Description of the interface. | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer1::Bayhub | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller, Max Baker | ||||
| # All rights reserved. | ||||
| @@ -31,18 +30,19 @@ | ||||
| package SNMP::Info::Layer1::Bayhub; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::SONMP; | ||||
| use SNMP::Info::NortelStack; | ||||
| use SNMP::Info::Layer2; | ||||
| 
 | ||||
| @SNMP::Info::Layer1::Bayhub::ISA | ||||
|     = qw/SNMP::Info::SONMP SNMP::Info::NortelStack  SNMP::Info::Layer2 Exporter/; | ||||
|     = qw/SNMP::Info::SONMP SNMP::Info::NortelStack SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer1::Bayhub::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -492,7 +492,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
| 
 | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -501,14 +501,9 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Bay hub device through SNMP.  Also provides device MAC to port mapping through | ||||
| the proprietary MIB.  | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
| my $bayhub = new SNMP::Info::Layer1::Bayhub(...); | ||||
| the proprietary MIB. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| @@ -607,18 +602,18 @@ to a hash. | ||||
| 
 | ||||
| =item $bayhub->i_index() | ||||
| 
 | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
| 
 | ||||
| Since hubs do not support C<ifIndex>, the interface index is created using the | ||||
| formula (board * 256 + port). | ||||
| 
 | ||||
| =item $bayhub->interfaces() | ||||
| 
 | ||||
| Returns reference to map of IIDs to physical ports.  | ||||
| Returns reference to map of IIDs to physical ports. | ||||
| 
 | ||||
| =item $bayhub->i_duplex() | ||||
| 
 | ||||
| Returns half, hubs do not support full duplex.  | ||||
| Returns half, hubs do not support full duplex. | ||||
| 
 | ||||
| =item $bayhub->i_duplex_admin() | ||||
| 
 | ||||
| @@ -644,7 +639,7 @@ State choices are 'up' or 'down' | ||||
| 
 | ||||
| Example: | ||||
|   my %if_map = reverse %{$bayhub->interfaces()}; | ||||
|   $bayhub->set_i_up_admin('down', $if_map{'1.1'})  | ||||
|   $bayhub->set_i_up_admin('down', $if_map{'1.1'}) | ||||
|       or die "Couldn't change port state. ",$bayhub->error(1); | ||||
| 
 | ||||
| =item $bayhub->bp_index() | ||||
| @@ -671,51 +666,51 @@ L<SNMP::Info::NortelStack/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $bayhub->e_index()  | ||||
| =item $bayhub->e_index() | ||||
| 
 | ||||
| Returns ns_e_index(). | ||||
| 
 | ||||
| =item $bayhub->e_class()  | ||||
| =item $bayhub->e_class() | ||||
| 
 | ||||
| Returns ns_e_class(). | ||||
| 
 | ||||
| =item $bayhub->e_descr()  | ||||
| =item $bayhub->e_descr() | ||||
| 
 | ||||
| Returns ns_e_descr(). | ||||
| 
 | ||||
| =item $bayhub->e_name()  | ||||
| =item $bayhub->e_name() | ||||
| 
 | ||||
| Returns ns_e_name(). | ||||
| 
 | ||||
| =item $bayhub->e_fwver()  | ||||
| =item $bayhub->e_fwver() | ||||
| 
 | ||||
| Returns ns_e_fwver(). | ||||
| 
 | ||||
| =item $bayhub->e_hwver()  | ||||
| =item $bayhub->e_hwver() | ||||
| 
 | ||||
| Returns ns_e_hwver(). | ||||
| 
 | ||||
| =item $bayhub->e_parent()  | ||||
| =item $bayhub->e_parent() | ||||
| 
 | ||||
| Returns ns_e_parent(). | ||||
| 
 | ||||
| =item $bayhub->e_pos()  | ||||
| =item $bayhub->e_pos() | ||||
| 
 | ||||
| Returns ns_e_pos(). | ||||
| 
 | ||||
| =item $bayhub->e_serial()  | ||||
| =item $bayhub->e_serial() | ||||
| 
 | ||||
| Returns ns_e_serial(). | ||||
| 
 | ||||
| =item $bayhub->e_swver()  | ||||
| =item $bayhub->e_swver() | ||||
| 
 | ||||
| Returns ns_e_swver(). | ||||
| 
 | ||||
| =item $bayhub->e_type()  | ||||
| =item $bayhub->e_type() | ||||
| 
 | ||||
| Returns ns_e_type(). | ||||
| 
 | ||||
| =item $bayhub->e_vendor()  | ||||
| =item $bayhub->e_vendor() | ||||
| 
 | ||||
| Returns ns_e_vendor(). | ||||
| 
 | ||||
							
								
								
									
										640
									
								
								lib/SNMP/Info/Layer1/Cyclades.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										640
									
								
								lib/SNMP/Info/Layer1/Cyclades.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,640 @@ | ||||
| # SNMP::Info::Layer1::Cyclades | ||||
| # | ||||
| # Copyright (c) 2018 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer1::Cyclades; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer1; | ||||
|  | ||||
| @SNMP::Info::Layer1::Cyclades::ISA       = qw/SNMP::Info::Layer1 Exporter/; | ||||
| @SNMP::Info::Layer1::Cyclades::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer1::MIBS, | ||||
|     'CYCLADES-ACS-SYS-MIB'    => 'cyACSversion', | ||||
|     'CYCLADES-ACS5K-SYS-MIB'  => 'cyACS5Kversion', | ||||
|     'CYCLADES-ACS-CONF-MIB'   => 'cyACSConf', | ||||
|     'CYCLADES-ACS5K-CONF-MIB' => 'cyACS5KConf', | ||||
|     'CYCLADES-ACS-INFO-MIB'   => 'cyACSInfo', | ||||
|     'CYCLADES-ACS5K-INFO-MIB' => 'cyACS5KInfo', | ||||
|     'ACS-MIB'                 => 'acs6016', | ||||
|     'ACS8000-MIB'             => 'acs8048', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|  | ||||
|     %SNMP::Info::Layer1::GLOBALS, | ||||
|  | ||||
|     # CYCLADES-ACS-SYS-MIB | ||||
|     'cy_os_ver'     => 'cyACSversion', | ||||
|     'cy_model'      => 'cyACSpname', | ||||
|     'cy_serial'     => 'cyACSDevId', | ||||
|     'cy_ps1_status' => 'cyACSPw1', | ||||
|     'cy_ps2_status' => 'cyACSPw2', | ||||
|  | ||||
|     # CYCLADES-ACS-CONF-MIB | ||||
|     'cy_root_ip' => 'CYCLADES_ACS_CONF_MIB__cyEthIPaddr', | ||||
|  | ||||
|     # CYCLADES-ACS5K-SYS-MIB | ||||
|     'cy5k_os_ver'     => 'cyACS5Kversion', | ||||
|     'cy5k_model'      => 'cyACS5Kpname', | ||||
|     'cy5k_serial'     => 'cyACS5KDevId', | ||||
|     'cy5k_ps1_status' => 'cyACS5KPw1', | ||||
|     'cy5k_ps2_status' => 'cyACS5KPw2', | ||||
|  | ||||
|     # CYCLADES-ACS5K-CONF-MIB | ||||
|     'cy5k_root_ip'   => 'CYCLADES_ACS5K_CONF_MIB__cyEthIPaddr', | ||||
|  | ||||
|     # ACS-MIB | ||||
|     'acs_os_ver'     => 'ACS_MIB__acsFirmwareVersion', | ||||
|     'acs_model'      => 'ACS_MIB__acsProductModel', | ||||
|     'acs_serial'     => 'ACS_MIB__acsSerialNumber', | ||||
|     'acs_ps1_status' => 'ACS_MIB__acsPowerSupplyStatePw1', | ||||
|     'acs_ps2_status' => 'ACS_MIB__acsPowerSupplyStatePw2', | ||||
|  | ||||
|     # ACS8000-MIB | ||||
|     'acs8k_os_ver'     => 'ACS8000_MIB__acsFirmwareVersion', | ||||
|     'acs8k_model'      => 'ACS8000_MIB__acsProductModel', | ||||
|     'acs8k_serial'     => 'ACS8000_MIB__acsSerialNumber', | ||||
|     'acs8k_ps1_status' => 'ACS8000_MIB__acsPowerSupplyStatePw1', | ||||
|     'acs8k_ps2_status' => 'ACS8000_MIB__acsPowerSupplyStatePw2', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer1::FUNCS, | ||||
|  | ||||
|     # CYCLADES-ACS-INFO-MIB::cyInfoSerialTable | ||||
|     'cy_port_tty'   => 'CYCLADES_ACS_INFO_MIB__cyISPortTty', | ||||
|     'cy_port_name'  => 'CYCLADES_ACS_INFO_MIB__cyISPortName', | ||||
|     'cy_port_speed' => 'CYCLADES_ACS_INFO_MIB__cyISPortSpeed', | ||||
|     'cy_port_cd'    => 'CYCLADES_ACS_INFO_MIB__cyISPortSigCD', | ||||
|  | ||||
|     # CYCLADES-ACS-CONF-MIB::cySerialPortTable | ||||
|     'cy_port_socket' => 'CYCLADES_ACS_CONF_MIB__cySPortSocketPort', | ||||
|  | ||||
|     # CYCLADES-ACS5K-INFO-MIB::cyInfoSerialTable | ||||
|     'cy5k_port_tty'   => 'CYCLADES_ACS5K_INFO_MIB__cyISPortTty', | ||||
|     'cy5k_port_name'  => 'CYCLADES_ACS5K_INFO_MIB__cyISPortName', | ||||
|     'cy5k_port_speed' => 'CYCLADES_ACS5K_INFO_MIB__cyISPortSpeed', | ||||
|     'cy5k_port_cd'    => 'CYCLADES_ACS5K_INFO_MIB__cyISPortSigCD', | ||||
|  | ||||
|     # CYCLADES-ACS5K-CONF-MIB::cySerialPortTable | ||||
|     'cy5k_port_socket' => 'CYCLADES_ACS5K_CONF_MIB__cySPortSocketPort', | ||||
|  | ||||
|     # ACS-MIB::acsSerialPortTable | ||||
|     'acs_port_tty'   => 'ACS_MIB__acsSerialPortTableDeviceName', | ||||
|     'acs_port_name'  => 'ACS_MIB__acsSerialPortTableName', | ||||
|     'acs_port_speed' => 'ACS_MIB__acsSerialPortTableComSpeed', | ||||
|     'acs_port_cd'    => 'ACS_MIB__acsSerialPortTableSignalStateDCD', | ||||
|  | ||||
|     # Equivalent to cySPortSocketPort doesn't exist in ACS-MIB | ||||
|     # Use 'acsSerialPortTableDeviceName' as an equivalent, it just needs | ||||
|     # to be unique so that we can differentiate between the index in the | ||||
|     # acsSerialPortTable from ifIndex which are both integers | ||||
|     # ACS-MIB::acsSerialPortTableEntry | ||||
|     'acs_port_socket' => 'ACS_MIB__acsSerialPortTableDeviceName', | ||||
|  | ||||
|     # ACS8000-MIB::acsSerialPortTable | ||||
|     'acs8k_port_tty'   => 'ACS8000_MIB__acsSerialPortTableDeviceName', | ||||
|     'acs8k_port_name'  => 'ACS8000_MIB__acsSerialPortTableName', | ||||
|     'acs8k_port_speed' => 'ACS8000_MIB__acsSerialPortTableComSpeed', | ||||
|     'acs8k_port_cd'    => 'ACS8000_MIB__acsSerialPortTableSignalStateDCD', | ||||
|  | ||||
|     # Equivalent to cySPortSocketPort doesn't exist in ACS-MIB | ||||
|     # Use 'acsSerialPortTableDeviceName' as an equivalent, it just needs | ||||
|     # to be unique so that we can differentiate between the index in the | ||||
|     # acsSerialPortTable from ifIndex which are both integers | ||||
|     # ACS8000-MIB::acsSerialPortTableEntry | ||||
|     'acs8k_port_socket' => 'ACS8000_MIB__acsSerialPortTableDeviceName', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer1::MUNGE, ); | ||||
|  | ||||
| # These devices don't have a FDB and we probably don't want to poll for ARP | ||||
| # cache so turn off reported L2/L3. | ||||
| sub layers { | ||||
|     return '01000001'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'avocent'; | ||||
| } | ||||
|  | ||||
| # Use "short circuit" to return the first MIB instance that returns data to | ||||
| # reduce network communications | ||||
| # We'll try newest (acs*) first assuming those are most likely deployed | ||||
| sub os_ver { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     return | ||||
|            $cyclades->acs_os_ver() | ||||
|         || $cyclades->acs8k_os_ver() | ||||
|         || $cyclades->cy5k_os_ver() | ||||
|         || $cyclades->cy_os_ver() | ||||
|         || undef; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'vertiv'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     my $model | ||||
|         = $cyclades->acs_model() | ||||
|         || $cyclades->acs8k_model() | ||||
|         || $cyclades->cy5k_model() | ||||
|         || $cyclades->cy_model() | ||||
|         || undef; | ||||
|  | ||||
|     return lc($model) if ( defined $model ); | ||||
|  | ||||
|     my $id   = $cyclades->id(); | ||||
|     my $prod = SNMP::translateObj($id); | ||||
|  | ||||
|     return $prod || $id; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     return | ||||
|            $cyclades->acs_serial() | ||||
|         || $cyclades->acs8k_serial() | ||||
|         || $cyclades->cy5k_serial() | ||||
|         || $cyclades->cy_serial() | ||||
|         || undef; | ||||
| } | ||||
|  | ||||
| sub root_ip { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     return | ||||
|            $cyclades->cy5k_root_ip() | ||||
|         || $cyclades->cy_root_ip() | ||||
|         || undef; | ||||
| } | ||||
|  | ||||
| sub ps1_status { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     return | ||||
|            $cyclades->acs_ps1_status() | ||||
|         || $cyclades->acs8k_ps1_status() | ||||
|         || $cyclades->cy5k_ps1_status() | ||||
|         || $cyclades->cy_ps1_status() | ||||
|         || undef; | ||||
| } | ||||
|  | ||||
| sub ps2_status { | ||||
|     my $cyclades = shift; | ||||
|  | ||||
|     return | ||||
|            $cyclades->acs_ps2_status() | ||||
|         || $cyclades->acs8k_ps2_status() | ||||
|         || $cyclades->cy5k_ps2_status() | ||||
|         || $cyclades->cy_ps2_status() | ||||
|         || undef; | ||||
| } | ||||
|  | ||||
| # Extend interface methods to include serial ports | ||||
| # | ||||
| # Partials don't really help in this class, but implemented | ||||
| # for consistency | ||||
|  | ||||
| sub i_index { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $orig_index = $cyclades->orig_i_index($partial) || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|  | ||||
|     my %i_index; | ||||
|     foreach my $iid ( keys %$orig_index ) { | ||||
|         my $index = $orig_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|  | ||||
|         $i_index{$iid} = $index; | ||||
|     } | ||||
|  | ||||
|     # Use alternative labeling system for the serial port, listening socket | ||||
|     # to avoid conflicts with ifIndex. | ||||
|     foreach my $iid ( keys %$cy_index ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|  | ||||
|         $i_index{$index} = $index; | ||||
|     } | ||||
|  | ||||
|     return \%i_index; | ||||
| } | ||||
|  | ||||
| sub interfaces { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_descr = $cyclades->orig_i_description($partial) || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|     my $cy_p_tty | ||||
|         = $cyclades->acs_port_tty() | ||||
|         || $cyclades->acs8k_port_tty() | ||||
|         || $cyclades->cy5k_port_tty() | ||||
|         || $cyclades->cy_port_tty() | ||||
|         || {}; | ||||
|  | ||||
|     my %if; | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|         my $descr = $i_descr->{$iid}; | ||||
|         next unless defined $descr; | ||||
|  | ||||
|         $if{$iid} = $descr; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$cy_p_tty ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|         my $name = $cy_p_tty->{$iid}; | ||||
|         next unless defined $name; | ||||
|  | ||||
|         $if{$index} = $name; | ||||
|     } | ||||
|  | ||||
|     return \%if; | ||||
| } | ||||
|  | ||||
| sub i_speed { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_speed    = $cyclades->orig_i_speed($partial) || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|     my $cy_p_speed | ||||
|         = $cyclades->acs_port_speed() | ||||
|         || $cyclades->acs8k_port_speed() | ||||
|         || $cyclades->cy5k_port_speed() | ||||
|         || $cyclades->cy_port_speed() | ||||
|         || {}; | ||||
|  | ||||
|     my %i_speed; | ||||
|     foreach my $iid ( keys %$i_speed ) { | ||||
|         my $speed = $i_speed->{$iid}; | ||||
|         next unless defined $speed; | ||||
|  | ||||
|         $i_speed{$iid} = $speed; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$cy_p_speed ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|         my $speed = $cy_p_speed->{$iid}; | ||||
|         next unless defined $speed; | ||||
|  | ||||
|         $i_speed{$index} = $speed; | ||||
|     } | ||||
|  | ||||
|     return \%i_speed; | ||||
| } | ||||
|  | ||||
| sub i_up { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_up     = $cyclades->orig_i_up($partial) || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|     my $cy_p_up | ||||
|         = $cyclades->acs_port_cd() | ||||
|         || $cyclades->acs8k_port_cd() | ||||
|         || $cyclades->cy5k_port_cd() | ||||
|         || $cyclades->cy_port_cd() | ||||
|         || {}; | ||||
|  | ||||
|     my %i_up; | ||||
|     foreach my $iid ( keys %$i_up ) { | ||||
|         my $up = $i_up->{$iid}; | ||||
|         next unless defined $up; | ||||
|  | ||||
|         $i_up{$iid} = $up; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$cy_p_up ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|         my $up = $cy_p_up->{$iid}; | ||||
|         next unless defined $up; | ||||
|  | ||||
|         $i_up{$index} = $up; | ||||
|     } | ||||
|  | ||||
|     return \%i_up; | ||||
| } | ||||
|  | ||||
| sub i_description { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_desc    = $cyclades->orig_i_description($partial) || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|     my $cy_p_desc | ||||
|         = $cyclades->acs_port_name() | ||||
|         || $cyclades->acs8k_port_name() | ||||
|         || $cyclades->cy5k_port_name() | ||||
|         || $cyclades->cy_port_name() | ||||
|         || {}; | ||||
|  | ||||
|     my %descr; | ||||
|     foreach my $iid ( keys %$i_desc ) { | ||||
|         my $desc = $i_desc->{$iid}; | ||||
|         next unless defined $desc; | ||||
|  | ||||
|         $descr{$iid} = $desc; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$cy_p_desc ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|         my $desc = $cy_p_desc->{$iid}; | ||||
|         next unless defined $desc; | ||||
|  | ||||
|         $descr{$index} = $desc; | ||||
|     } | ||||
|  | ||||
|     return \%descr; | ||||
| } | ||||
|  | ||||
| sub i_name { | ||||
|     my $cyclades = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $i_name    = $cyclades->orig_i_name($partial) || {}; | ||||
|     my $cy_index | ||||
|         = $cyclades->acs_port_socket() | ||||
|         || $cyclades->acs8k_port_socket() | ||||
|         || $cyclades->cy5k_port_socket() | ||||
|         || $cyclades->cy_port_socket() | ||||
|         || {}; | ||||
|     my $cy_p_desc | ||||
|         = $cyclades->acs_port_name() | ||||
|         || $cyclades->acs8k_port_name() | ||||
|         || $cyclades->cy5k_port_name() | ||||
|         || $cyclades->cy_port_name() | ||||
|         || {}; | ||||
|  | ||||
|     my %i_name; | ||||
|     foreach my $iid ( keys %$i_name ) { | ||||
|         my $name = $i_name->{$iid}; | ||||
|         next unless defined $name; | ||||
|  | ||||
|         $i_name{$iid} = $name; | ||||
|     } | ||||
|  | ||||
|     foreach my $iid ( keys %$cy_p_desc ) { | ||||
|         my $index = $cy_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|         next if ( defined $partial and $index !~ /^$partial$/ ); | ||||
|         my $name = $cy_p_desc->{$iid}; | ||||
|         next unless defined $name; | ||||
|  | ||||
|         $i_name{$index} = $name; | ||||
|     } | ||||
|  | ||||
|     return \%i_name; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer1::Cyclades - SNMP Interface to Cyclades/Avocent terminal | ||||
| servers | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|     #Let SNMP::Info determine the correct subclass for you. | ||||
|  | ||||
|     my $cyclades = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
|                         # These arguments are passed directly to SNMP::Session | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|     my $class = $cyclades->class(); | ||||
|     print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Cyclades/Avocent device through SNMP. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer1 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<ACS-MIB> | ||||
|  | ||||
| =item F<ACS6000-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS-SYS-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS-CONF-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS-INFO-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS5K-SYS-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS5K-CONF-MIB> | ||||
|  | ||||
| =item F<CYCLADES-ACS5K-INFO-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cyclades->os_ver() | ||||
|  | ||||
| (C<acsFirmwareVersion>), (C<cyACS5Kversion>), or (C<cyACSversion>) | ||||
|  | ||||
| =item $cyclades->serial() | ||||
|  | ||||
| (C<acsSerialNumber>), (C<cyACS5KDevId>), or (C<cyACSDevId>) | ||||
|  | ||||
| =item $cyclades->root_ip() | ||||
|  | ||||
| (C<cyEthIPaddr>) | ||||
|  | ||||
| =item $cyclades->ps1_status() | ||||
|  | ||||
| (C<acsPowerSupplyStatePw1>), (C<cyACS5KPw1>), or (C<cyACSPw1>) | ||||
|  | ||||
| =item $cyclades->ps2_status() | ||||
|  | ||||
| (C<acsPowerSupplyStatePw2>), (C<cyACS5KPw2>), or (C<cyACSPw2>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cyclades->layers() | ||||
|  | ||||
| Returns 01000001.  These devices don't have a FDB and we probably don't want | ||||
| to poll for an ARP cache so turn off reported Layer 2 and Layer 3. | ||||
|  | ||||
| =item $cyclades->vendor() | ||||
|  | ||||
| Returns 'vertiv' | ||||
|  | ||||
| =item $cyclades->os() | ||||
|  | ||||
| Returns 'avocent' | ||||
|  | ||||
| =item $cyclades->model() | ||||
|  | ||||
| Returns lower case (C<cyACSpname>) or (C<acsProductModel>) if it exists | ||||
| otherwise tries to reference $cyclades->id() to one of the MIBs listed above | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer1 | ||||
|  | ||||
| See L<SNMP::Info::Layer1/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cyclades->i_index() | ||||
|  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
|  | ||||
| Extended to include serial ports.  Serial ports are indexed with the | ||||
| alternative labeling system for the serial port, either the listening socket | ||||
| port C<cySPortSocketPort> or C<acsSerialPortTableDeviceName> name to avoid | ||||
| conflicts with C<ifIndex>. | ||||
|  | ||||
| =item $cyclades->interfaces() | ||||
|  | ||||
| Returns reference to map of IIDs to physical ports.  Extended to include | ||||
| serial ports, C<acsSerialPortTableDeviceName> or C<cyISPortTty>. | ||||
|  | ||||
| =item $cyclades->i_speed() | ||||
|  | ||||
| Returns interface speed.  Extended to include serial ports, | ||||
| C<acsSerialPortTableComSpeed> or C<cyISPortSpeed>. | ||||
|  | ||||
| =item $cyclades->i_up() | ||||
|  | ||||
| Returns link status for each port.  Extended to include serial ports, | ||||
| C<acsSerialPortTableSignalStateDCD> or C<cyISPortSigCD>. | ||||
|  | ||||
| =item $cyclades->i_description() | ||||
|  | ||||
| Returns description of each port.  Extended to include serial ports, | ||||
| C<acsSerialPortTableName> or C<cyISPortName>. | ||||
|  | ||||
| =item $cyclades->i_name() | ||||
|  | ||||
| Returns name of each port.  Extended to include serial ports, | ||||
| C<acsSerialPortTableName> or C<cyISPortName>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer1 | ||||
|  | ||||
| See L<SNMP::Info::Layer1/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer1::S3000 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::Layer1::S3000; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| 
 | ||||
| @SNMP::Info::Layer1::S3000::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer1::S3000::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -373,7 +373,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
| 
 | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -382,15 +382,10 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Bay hub device through SNMP.  Also provides device MAC to port mapping through | ||||
| the proprietary MIB. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
| my $s3000 = new SNMP::Info::Layer1::S3000(...); | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| @@ -447,7 +442,7 @@ Returns the firmware version. (C<s3AgentFwVer>) | ||||
| 
 | ||||
| =item $s3000->mac() | ||||
| 
 | ||||
| Returns MAC of the advertised IP address of the device.  | ||||
| Returns MAC of the advertised IP address of the device. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -477,7 +472,7 @@ to a hash. | ||||
| 
 | ||||
| =item $s3000->i_index() | ||||
| 
 | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
| 
 | ||||
| Since hubs do not support C<ifIndex>, the interface index is created using the | ||||
| formula (board * 256 + port).  This is required to support devices with more | ||||
| @@ -485,11 +480,11 @@ than one module. | ||||
| 
 | ||||
| =item $s3000->interfaces() | ||||
| 
 | ||||
| Returns reference to map of IIDs to physical ports.  | ||||
| Returns reference to map of IIDs to physical ports. | ||||
| 
 | ||||
| =item $s3000->i_duplex() | ||||
| 
 | ||||
| Returns half, hubs do not support full duplex.  | ||||
| Returns half, hubs do not support full duplex. | ||||
| 
 | ||||
| =item $s3000->i_duplex_admin() | ||||
| 
 | ||||
| @@ -516,7 +511,7 @@ State choices are 'up' or 'down' | ||||
| 
 | ||||
| Example: | ||||
|   my %if_map = reverse %{$s3000->interfaces()}; | ||||
|   $s3000->set_i_up_admin('down', $if_map{'1.1'})  | ||||
|   $s3000->set_i_up_admin('down', $if_map{'1.1'}) | ||||
|       or die "Couldn't change port state. ",$s3000->error(1); | ||||
| 
 | ||||
| =item $s3000->bp_index() | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on | ||||
| # | ||||
| @@ -33,30 +32,47 @@ | ||||
| package SNMP::Info::Layer2; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::Entity; | ||||
| use SNMP::Info::PortAccessEntity; | ||||
| use SNMP::Info::PowerEthernet; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::DocsisHE; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::ISA = qw/ | ||||
|         SNMP::Info SNMP::Info::Bridge | ||||
|         SNMP::Info::Entity | ||||
|         SNMP::Info::PowerEthernet | ||||
|         SNMP::Info::LLDP | ||||
|         SNMP::Info::DocsisHE | ||||
|         SNMP::Info::PortAccessEntity | ||||
|         Exporter | ||||
| /; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::ISA | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet Exporter/; | ||||
| @SNMP::Info::Layer2::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,         %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS,   %SNMP::Info::DocsisHE::MIBS, | ||||
|     %SNMP::Info::PortAccessEntity::MIBS | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     %SNMP::Info::Bridge::GLOBALS, | ||||
|     %SNMP::Info::DocsisHE::GLOBALS, | ||||
|     %SNMP::Info::Entity::GLOBALS, | ||||
|     %SNMP::Info::PowerEthernet::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::PortAccessEntity::GLOBALS, | ||||
|     'serial1' => | ||||
|         '.1.3.6.1.4.1.9.3.6.3.0',    # OLD-CISCO-CHASSIS-MIB::chassisId.0 | ||||
| ); | ||||
| @@ -64,6 +80,8 @@ $VERSION = '3.19'; | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS,         %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS,   %SNMP::Info::DocsisHE::FUNCS, | ||||
|     %SNMP::Info::PortAccessEntity::FUNCS | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
| @@ -71,14 +89,17 @@ $VERSION = '3.19'; | ||||
|     # Inherit all the built in munging | ||||
|     %SNMP::Info::MUNGE, | ||||
|     %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::DocsisHE::MUNGE, | ||||
|     %SNMP::Info::Entity::MUNGE, | ||||
|     %SNMP::Info::PowerEthernet::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::PortAccessEntity::MUNGE, | ||||
| ); | ||||
| 
 | ||||
| # Method OverRides | ||||
| 
 | ||||
| # $l2->model() - Looks at sysObjectID which gives the oid of the system | ||||
| #       name, contained in a propriatry MIB. | ||||
| #       name, contained in a proprietary MIB. | ||||
| sub model { | ||||
|     my $l2    = shift; | ||||
|     my $id    = $l2->id(); | ||||
| @@ -97,8 +118,8 @@ sub model { | ||||
| 
 | ||||
| sub vendor { | ||||
|     my $l2    = shift; | ||||
|     my $model = $l2->model(); | ||||
|     my $descr = $l2->description(); | ||||
|     my $model = $l2->model() || ''; | ||||
|     my $descr = $l2->description() || ''; | ||||
| 
 | ||||
|     if ( $model =~ /hp/i or $descr =~ /\bhp\b/i ) { | ||||
|         return 'hp'; | ||||
| @@ -113,41 +134,18 @@ sub vendor { | ||||
| sub serial { | ||||
|     my $l2 = shift; | ||||
| 
 | ||||
|     my $serial1  = $l2->serial1(); | ||||
|     my $e_descr  = $l2->e_descr() || {}; | ||||
|     my $e_serial = $l2->e_serial() || {}; | ||||
| 
 | ||||
|     my $serial2 = $e_serial->{1} || undef; | ||||
|     my $chassis = $e_descr->{1}  || undef; | ||||
| 
 | ||||
|     # precedence | ||||
|     #   serial2,chassis parse,serial1 | ||||
|     return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ ); | ||||
| 
 | ||||
|     if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i ) { | ||||
|         return $1; | ||||
|     my $entity_serial = $l2->entity_derived_serial(); | ||||
|     if ( defined $entity_serial and $entity_serial !~ /^\s*$/ ){ | ||||
|         return $entity_serial; | ||||
|     } | ||||
| 
 | ||||
|     return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ ); | ||||
|     my $serial1  = $l2->serial1(); | ||||
|     if ( defined $serial1 and $serial1 !~ /^\s*$/ ) { | ||||
|         return $serial1; | ||||
|     } | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub 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 { | ||||
| @@ -160,15 +158,25 @@ sub interfaces { | ||||
|     # Replace the Index with the ifDescr field. | ||||
|     # Check for duplicates in ifDescr, if so uniquely identify by adding | ||||
|     # ifIndex to repeated values | ||||
|     my %seen; | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|     my (%seen, %first_seen_as); | ||||
|     foreach my $iid ( sort keys %$i_descr ) { | ||||
|         my $port = $i_descr->{$iid}; | ||||
|         next unless defined $port; | ||||
| 
 | ||||
|         $port = SNMP::Info::munge_null($port); | ||||
|         $port =~ s/^\s+//; $port =~ s/\s+$//; | ||||
|         next unless length $port; | ||||
| 
 | ||||
|         if ( $seen{$port}++ ) { | ||||
|             # (#320) also fixup the port this is a duplicate of | ||||
|             $interfaces->{ $first_seen_as{$port} } | ||||
|               = sprintf( "%s (%d)", $port, $first_seen_as{$port} ); | ||||
| 
 | ||||
|             $interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid ); | ||||
|         } | ||||
|         else { | ||||
|             $interfaces->{$iid} = $port; | ||||
|             $first_seen_as{$port} = $iid; | ||||
|         } | ||||
|     } | ||||
|     return $interfaces; | ||||
| @@ -187,14 +195,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $l2 = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $l2->class(); | ||||
| @@ -217,11 +225,11 @@ This class is usually used as a superclass for more specific device classes | ||||
| listed under SNMP::Info::Layer2::*   Please read all docs under SNMP::Info | ||||
| first. | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Layer2 device through SNMP.  Information is stored in a number of MIBs. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
| 
 | ||||
|  my $l2 = new SNMP::Info::Layer2(...); | ||||
| 
 | ||||
| @@ -233,8 +241,16 @@ after determining a more specific class using the method above. | ||||
| 
 | ||||
| =item SNMP::Info::Bridge | ||||
| 
 | ||||
| =item SNMP::Info::DocsisHE | ||||
| 
 | ||||
| =item SNMP::Info::Entity | ||||
| 
 | ||||
| =item SNMP::Info::LLDP | ||||
| 
 | ||||
| =item SNMP::Info::PowerEthernet | ||||
| 
 | ||||
| =item SNMP::Info::PortAccessEntity | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Required MIBs | ||||
| @@ -259,7 +275,7 @@ These are methods that return scalar value from SNMP | ||||
| 
 | ||||
| =item $l2->model() | ||||
| 
 | ||||
| Cross references $l2->id() with product IDs in the  | ||||
| Cross references $l2->id() with product IDs in the | ||||
| Cisco MIBs. | ||||
| 
 | ||||
| For HP devices, removes C<'hpswitch'> from the name | ||||
| @@ -272,13 +288,13 @@ Tries to discover the vendor from $l2->model() and $l2->description() | ||||
| 
 | ||||
| =item $l2->serial() | ||||
| 
 | ||||
| Returns serial number if available through SNMP | ||||
| Returns a serial number if found from F<ENTITY-MIB> and F<OLD-CISCO->... MIB. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| @@ -288,6 +304,14 @@ 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. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::PortAccessEntity | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::PortAccessEntity/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head1 TABLE METHODS | ||||
| 
 | ||||
| These are methods that return tables of information in the form of a reference | ||||
| @@ -304,17 +328,11 @@ 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 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| @@ -324,4 +342,12 @@ 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. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::PortAccessEntity | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::PortAccessEntity/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =cut | ||||
| @@ -1,39 +1,63 @@ | ||||
| # SNMP::Info::Layer2::3Com - SNMP Interface to 3Com Devices | ||||
| # | ||||
| # Copyright (c) 2019 by The Netdisco Developer Team. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| package SNMP::Info::Layer2::3Com; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::CDP; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::3Com::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::3Com::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::3Com::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %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'; | ||||
| } | ||||
| @@ -48,6 +72,7 @@ sub serial { | ||||
|             return $e_serial->{$e}; | ||||
|         } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub os_ver { | ||||
| @@ -60,19 +85,25 @@ sub os_ver { | ||||
|             return $e_swver->{$e}; | ||||
|         } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub vendor { | ||||
|     return '3Com'; | ||||
|     return '3com'; | ||||
| } | ||||
| 
 | ||||
| sub model { | ||||
| 
 | ||||
|     my $dsmodel = shift; | ||||
|     my $descr = $dsmodel->description(); | ||||
|     if ( $descr =~ /^([\S ]+) Software.*/){ | ||||
| 
 | ||||
|     if (defined ($descr)) { | ||||
|       if ($descr =~ /^([\S ]+) Software.*/) { | ||||
|         return $1; | ||||
|       } else { | ||||
|         return $descr; | ||||
|       } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
| @@ -94,7 +125,7 @@ Max Kosmach | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -117,6 +148,8 @@ Subclass for 3Com L2 devices | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item F<A3Com-products-MIB> | ||||
| 
 | ||||
| =item Inherited Classes' MIBs | ||||
| 
 | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
| @@ -133,7 +166,7 @@ These are methods that return scalar value from SNMP | ||||
| 
 | ||||
| =item $device->vendor() | ||||
| 
 | ||||
| Returns '3Com' | ||||
| Returns '3com' | ||||
| 
 | ||||
| =item $device->os() | ||||
| 
 | ||||
							
								
								
									
										308
									
								
								lib/SNMP/Info/Layer2/Adtran.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								lib/SNMP/Info/Layer2/Adtran.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,308 @@ | ||||
| # SNMP::Info::Layer2::Adtran - SNMP Interface to Adtran Devices | ||||
| # | ||||
| # Copyright (c) 2019 by The Netdisco Developer Team. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Adtran; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::Layer3; | ||||
|  | ||||
| @SNMP::Info::Layer2::Adtran::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Adtran::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| # This will be filled in with the device's index into the EntPhysicalEntry | ||||
| # table by the serial() function. | ||||
| our $index = undef; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| #    'ADTRAN-GENEVC-MIB'     => 'adGenEVCMIB', | ||||
| #    'ADTRAN-GENMEF-MIB'     => 'adGenMEFMIB', | ||||
| #    'ADTRAN-GENPORT-MIB'    => 'adGenPort', | ||||
|     'ADTRAN-MIB'            => 'adtran', | ||||
|     'ADTRAN-AOSUNIT'     => 'adGenAOSUnitMib', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     'serial'    => 'adProdSerialNumber', | ||||
|     'ad_mgmtevcvid' => 'adGenEVCSysMgmtEVCSTagVID', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( %SNMP::Info::Layer2::FUNCS, | ||||
|            %SNMP::Info::Layer3::FUNCS, | ||||
|            'ad_evcstag' => 'adGenEVCLookupName', | ||||
|            'ad_menport' => 'adGenMenPortRowStatus', | ||||
|            'ad_evcnamevid' => 'adGenEVCSTagVID', | ||||
|            'ad_mgmtevcports' => 'adGenSysMgmtEVCInterfaceConnectionType', | ||||
|            'ad_evcmapuniport' => 'adGenMEFMapUNIPort', | ||||
|            'ad_evcmapevc' => 'adGenMEFMapAssociatedEVCAlias', | ||||
|            'ad_genportcustuse' => 'adGenPortCustomerUse', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE ); | ||||
|  | ||||
| sub vendor { | ||||
|     return 'adtran'; | ||||
| } | ||||
| sub os { | ||||
|     return 'aos'; | ||||
| } | ||||
|  | ||||
| sub layers { | ||||
|     my $adtran = shift; | ||||
|  | ||||
|     my $layers = $adtran->SUPER::layers(); | ||||
|     # Some netvantas don't report L2 properly | ||||
|     my $macs   = $adtran->fw_mac(); | ||||
|  | ||||
|     if (keys %$macs) { | ||||
|         my $l = substr $layers, 6, 1, "1"; | ||||
|     } | ||||
|  | ||||
|     return $layers; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $adtran = shift; | ||||
|     my $ver = $adtran->adProdSwVersion() || undef; | ||||
|     return $ver if (defined $ver); | ||||
|     my $aos_ver = $adtran->adAOSDeviceVersion(); | ||||
|     return $aos_ver; | ||||
| } | ||||
| sub model { | ||||
|     my $adtran = shift; | ||||
|     my $id = $adtran->id(); | ||||
|     my $mod = $adtran->adProdName() || undef; | ||||
|     return $mod if (defined $mod); | ||||
|     my $model = $adtran->adAOSDeviceProductName() || undef; | ||||
|     return $model; | ||||
| } | ||||
| sub serial { | ||||
|     my $adtran = shift; | ||||
|     my $e_serial = $adtran->e_serial() || {}; | ||||
|     my $serial2 = $e_serial->{1} || undef; | ||||
|     return $serial2 if ( defined $serial2 ); | ||||
|     return $adtran->orig_serial(); | ||||
| } | ||||
|  | ||||
| sub i_name { | ||||
|     my $adtran = shift; | ||||
|     my $partial = shift; | ||||
|     my $i_name = $adtran->SUPER::i_alias() || undef; | ||||
|     return $i_name if (defined $i_name); | ||||
|     $i_name = {}; | ||||
|     my $adname = $adtran->ad_genportcustuse() || undef; | ||||
|     if (defined $adname) { | ||||
|         foreach my $port (keys %$adname) { | ||||
|             my @splitout = split(/\./,$port); | ||||
|             $i_name->{$splitout[1]} = $adname->{$port}; | ||||
|         } | ||||
|     } | ||||
|     return $i_name; | ||||
| } | ||||
| sub i_vlan { | ||||
|     my $adtran = shift; | ||||
|     my $partial = shift; | ||||
|     my $uniports = $adtran->ad_evcmapuniport() || undef; | ||||
|     my $evcmaps = $adtran->ad_evcmapevc() || undef; | ||||
|     my $v_names = $adtran->ad_evcnamevid() || undef; | ||||
|     if (defined $uniports) { | ||||
|         my $vlans = {}; | ||||
|         foreach my $oid (keys %$v_names) { | ||||
|             my $name = pack("C*", split(/\./,$oid)); | ||||
|             $vlans->{$name} = $v_names->{$oid}; | ||||
|         } | ||||
|         my $i_vlan = {}; | ||||
|         foreach my $evcmap (keys %$evcmaps) { | ||||
|             $i_vlan->{$uniports->{$evcmap}} = $vlans->{$evcmaps->{$evcmap}}; | ||||
|         } | ||||
|         return $i_vlan; | ||||
|     } | ||||
|     return {}; | ||||
|  | ||||
| } | ||||
|  | ||||
| sub i_vlan_membership { | ||||
|     my $adtran  = shift; | ||||
|     my $partial = shift; | ||||
|     my $i_vlan = $adtran->ad_menport(); | ||||
|     if (defined $i_vlan) { | ||||
|         my $vlans = {}; | ||||
|         my $v_name = $adtran->v_name(); | ||||
|         foreach my $vid (keys %$v_name) { | ||||
|             $vlans->{$v_name->{$vid}} = $vid; | ||||
|         } | ||||
|         my $if_vlans = {}; | ||||
|         foreach my $entry (keys %$i_vlan) { | ||||
|             my @splitout = split(/(\.0)+\./,$entry); | ||||
|             my $name = pack("C*", split(/\./,$splitout[0])); | ||||
|             push @{$if_vlans->{$splitout[2]}}, $vlans->{$name}; | ||||
|         } | ||||
|         my $mgmtevcports = $adtran->ad_mgmtevcports(); | ||||
|         my $mgmtevcid = $adtran->ad_mgmtevcvid(); | ||||
|         foreach my $port (keys %$mgmtevcports) { | ||||
|            push @{$if_vlans->{$port}}, $mgmtevcid; | ||||
|         } | ||||
|         return $if_vlans; | ||||
|     } | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| sub v_name { | ||||
|     my $adtran = shift; | ||||
|     my $partial = shift; | ||||
|     my $v_index = $adtran->ad_evcstag(); | ||||
|     return {} unless defined $v_index; | ||||
|     $v_index->{$adtran->ad_mgmtevcvid()} = 'system-management-evc'; | ||||
|     return $v_index; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Adtran - SNMP Interface to Adtran Devices | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $adtran = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $adtran->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for adtran Devices running JUNOS | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $adtran->vendor() | ||||
|  | ||||
| Returns 'adtran' | ||||
|  | ||||
| =item $adtran->os() | ||||
|  | ||||
| Returns 'aos' | ||||
|  | ||||
| =item $adtran->layers() | ||||
|  | ||||
| Ensures that layer two is reported, at least. | ||||
|  | ||||
| =item $adtran->os_ver() | ||||
|  | ||||
| Returns the software version extracted first from C<adProdSwVersion> or | ||||
| C<adAOSDeviceVersion>. | ||||
|  | ||||
| =item $adtran->model() | ||||
|  | ||||
| Returns the model extracted first from C<adProdName> or | ||||
| C<adAOSDeviceProductName>. | ||||
|  | ||||
| =item $adtran->serial() | ||||
|  | ||||
| Returns serial number. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $adtran->v_name() | ||||
|  | ||||
| VLAN names table. | ||||
|  | ||||
| =item $adtran->i_name() | ||||
|  | ||||
| Interface names table. | ||||
|  | ||||
| =item $adtran->i_vlan() | ||||
|  | ||||
| Returns a mapping between C<ifIndex> and the PVID or default VLAN. | ||||
|  | ||||
| =item $adtran->i_vlan_membership() | ||||
|  | ||||
| Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN | ||||
| IDs.  These are the VLANs which are members of the egress list for the port. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
							
								
								
									
										512
									
								
								lib/SNMP/Info/Layer2/Aerohive.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										512
									
								
								lib/SNMP/Info/Layer2/Aerohive.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,512 @@ | ||||
| # SNMP::Info::Layer2::Aerohive | ||||
| # | ||||
| # Copyright (c) 2018 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Aerohive; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Aerohive::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Aerohive::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'AH-SYSTEM-MIB'    => 'ahSystemSerial', | ||||
|     'AH-INTERFACE-MIB' => 'ahSSIDName', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|  | ||||
|     # AH-SYSTEM-MIB | ||||
|     'serial' => 'ahSystemSerial', | ||||
|     'os_bin' => 'ahFirmwareVersion', | ||||
|     # not documented in the most recent mib, | ||||
|     # but this is the base mac for the device | ||||
|     'ah_mac' => '.1.3.6.1.4.1.26928.1.3.2.0', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|  | ||||
|     # AH-INTERFACE-MIB::ahRadioAttributeTable | ||||
|     'i_80211channel'      => 'ahRadioChannel', | ||||
|     'dot11_cur_tx_pwr_mw' => 'ahRadioTxPower', | ||||
|  | ||||
|     # AH-INTERFACE-MIB::ahXIfTable | ||||
|     'ah_i_ssidlist' => 'ahSSIDName', | ||||
|  | ||||
|     # AH-INTERFACE-MIB::ahAssociationTable | ||||
|     'cd11_txrate'      => 'ahClientLastTxRate', | ||||
|     'cd11_uptime'      => 'ahClientLinkUptime', | ||||
|     'cd11_sigstrength' => 'ahClientRSSI', | ||||
|     'cd11_rxpkt'       => 'ahClientRxDataFrames', | ||||
|     'cd11_txpkt'       => 'ahClientTxDataFrames', | ||||
|     'cd11_rxbyte'      => 'ahClientRxDataOctets', | ||||
|     'cd11_txbyte'      => 'ahClientTxDataOctets', | ||||
|     'cd11_ssid'        => 'ahClientSSID', | ||||
|     'ah_c_vlan'        => 'ahClientVLAN', | ||||
|     'ah_c_ip'          => 'ahClientIP', | ||||
| ); | ||||
|  | ||||
| %MUNGE | ||||
|     = ( %SNMP::Info::Layer2::MUNGE, 'at_paddr' => \&SNMP::Info::munge_mac, ); | ||||
|  | ||||
| # hiveos does not have sysServices | ||||
| sub layers { | ||||
|     return '00000111'; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'aerohive'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'hiveos'; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $aerohive = shift; | ||||
|  | ||||
|     return $aerohive->ahSystemSerial() | ||||
|       || $aerohive->SUPER::serial(); | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $aerohive = shift; | ||||
|     my $descr    = $aerohive->description(); | ||||
|  | ||||
|     if ( defined ($descr) && $descr =~ m/\bHiveOS\s(\d+\.\w+)\b/ix ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub mac { | ||||
|     my $aerohive = shift; | ||||
|     my $ahmac = $aerohive->ah_mac(); | ||||
|  | ||||
|     # newer hiveos version just return the mac address | ||||
|     if (defined $ahmac) { | ||||
|       # aerohive has a 0000:0000:0000 mac format by default, | ||||
|       # change to 00:00:00:00:00:00 | ||||
|       $ahmac =~ s/(..)(..:?)/$1:$2/g; | ||||
|       return $ahmac; | ||||
|     } | ||||
|  | ||||
|     my @macs; | ||||
|     my $macs = $aerohive->i_mac(); | ||||
|     foreach my $iid (keys %$macs) { | ||||
|       if (defined $macs->{$iid}) { | ||||
|         push( @macs, $macs->{$iid} ); | ||||
|       } | ||||
|       @macs = sort(@macs); | ||||
|     } | ||||
|     return $macs[0]; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $aerohive = shift; | ||||
|     my $descr    = $aerohive->description(); | ||||
|  | ||||
|     if ( defined ($descr) && $descr =~ m/\b(?:Hive|)(AP\d+)\b/ix ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub i_ssidlist { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $ssids = $aerohive->ah_i_ssidlist($partial) || {}; | ||||
|  | ||||
|     my %i_ssidlist; | ||||
|     foreach my $iid ( keys %$ssids ) { | ||||
|         my $ssid = $ssids->{$iid}; | ||||
|         next if $ssid =~ /N\/A/i; | ||||
|  | ||||
|         $i_ssidlist{$iid} = $ssid; | ||||
|     } | ||||
|     return \%i_ssidlist; | ||||
| } | ||||
|  | ||||
| sub i_ssidmac { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $ssids = $aerohive->i_ssidlist($partial) || {}; | ||||
|     my $macs  = $aerohive->i_mac($partial)      || {}; | ||||
|  | ||||
|     my %i_ssidmac; | ||||
|     foreach my $iid ( keys %$ssids ) { | ||||
|         my $mac = $macs->{$iid}; | ||||
|         next unless $mac; | ||||
|  | ||||
|         $i_ssidmac{$iid} = $mac; | ||||
|     } | ||||
|     return \%i_ssidmac; | ||||
| } | ||||
|  | ||||
| # Break up the ahAssociationEntry INDEX into ifIndex and MAC Address. | ||||
| sub _ah_association_index { | ||||
|     my $idx     = shift; | ||||
|     my @values  = split( /\./, $idx ); | ||||
|     my $ifindex = shift(@values); | ||||
|     my $length  = shift(@values); | ||||
|     return ( $ifindex, join( ':', map { sprintf "%02x", $_ } @values ) ); | ||||
| } | ||||
|  | ||||
| sub cd11_port { | ||||
|     my $aerohive = shift; | ||||
|  | ||||
|     my $cd11_txrate = $aerohive->cd11_txrate(); | ||||
|     my $interfaces  = $aerohive->interfaces(); | ||||
|  | ||||
|     my %ret; | ||||
|     foreach ( keys %$cd11_txrate ) { | ||||
|         my ( $ifindex, $mac ) = _ah_association_index($_); | ||||
|         $ret{$_} = $interfaces->{$ifindex}; | ||||
|     } | ||||
|     return \%ret; | ||||
| } | ||||
|  | ||||
| sub cd11_mac { | ||||
|     my $aerohive = shift; | ||||
|  | ||||
|     my $cd11_txrate = $aerohive->cd11_txrate(); | ||||
|  | ||||
|     my %ret; | ||||
|     foreach ( keys %$cd11_txrate ) { | ||||
|         my ( $ifindex, $mac ) = _ah_association_index($_); | ||||
|         $ret{$_} = $mac; | ||||
|     } | ||||
|     return \%ret; | ||||
| } | ||||
|  | ||||
| # Does not support the standard Bridge MIB | ||||
| sub bp_index { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     # somewhere caching is doing something strange, without load_ | ||||
|     # netdisco can't find bp_index mappings & will not registerer | ||||
|     # any clients. netdisco/netdisco#496 | ||||
|     my $i_index = $aerohive->load_i_index($partial) || {}; | ||||
|  | ||||
|     my %bp_index; | ||||
|     foreach my $iid ( keys %$i_index ) { | ||||
|         my $index = $i_index->{$iid}; | ||||
|         next unless defined $index; | ||||
|  | ||||
|         $bp_index{$index} = $iid; | ||||
|     } | ||||
|  | ||||
|     return \%bp_index; | ||||
| } | ||||
|  | ||||
| sub qb_fw_port { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $txrate = $aerohive->cd11_txrate($partial) || {}; | ||||
|  | ||||
|     my $qb_fw_port = {}; | ||||
|     foreach my $idx ( keys %$txrate ) { | ||||
|         my ( $fdb_id, $mac ) = _ah_association_index($idx); | ||||
|         $qb_fw_port->{$idx} = $fdb_id; | ||||
|     } | ||||
|     return $qb_fw_port; | ||||
| } | ||||
|  | ||||
| sub qb_fw_mac { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $txrate = $aerohive->cd11_txrate($partial) || {}; | ||||
|  | ||||
|     my $qb_fw_mac = {}; | ||||
|     foreach my $idx ( keys %$txrate ) { | ||||
|         my ( $fdb_id, $mac ) = _ah_association_index($idx); | ||||
|         $qb_fw_mac->{$idx} = $mac; | ||||
|     } | ||||
|     return $qb_fw_mac; | ||||
| } | ||||
|  | ||||
| sub qb_fw_vlan { | ||||
|     my $aerohive = shift; | ||||
|     my $partial  = shift; | ||||
|  | ||||
|     my $vlans = $aerohive->ah_c_vlan($partial) || {}; | ||||
|  | ||||
|     my $qb_fw_vlan = {}; | ||||
|     foreach my $idx ( keys %$vlans ) { | ||||
|         my $vlan = $vlans->{$idx}; | ||||
|         next unless defined $vlan; | ||||
|         $qb_fw_vlan->{$idx} = $vlan; | ||||
|     } | ||||
|     return $qb_fw_vlan; | ||||
| } | ||||
|  | ||||
| # arpnip: | ||||
| # | ||||
| # This is the AP snooping on the MAC->IP mappings. | ||||
| # Pretending this is arpnip data allows us to get MAC->IP | ||||
| # mappings even for stations that only communicate locally. | ||||
|  | ||||
| sub at_paddr { | ||||
|     my $aerohive = shift; | ||||
|  | ||||
|     my $txrate = $aerohive->cd11_txrate() || {}; | ||||
|  | ||||
|     my $at_paddr = {}; | ||||
|     foreach my $idx ( keys %$txrate ) { | ||||
|         my ( $fdb_id, $mac ) = _ah_association_index($idx); | ||||
|         $at_paddr->{$idx} = $mac; | ||||
|     } | ||||
|     return $at_paddr; | ||||
| } | ||||
|  | ||||
| sub at_netaddr { | ||||
|     my $aerohive = shift; | ||||
|  | ||||
|     my $ips = $aerohive->ah_c_ip() || {}; | ||||
|  | ||||
|     my $ret = {}; | ||||
|     foreach my $idx ( keys %$ips ) { | ||||
|         next if ( $ips->{$idx} eq '0.0.0.0' ); | ||||
|         $ret->{$idx} = $ips->{$idx}; | ||||
|     } | ||||
|     return $ret; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Aerohive - SNMP Interface to Aerohive / Extreme | ||||
| access points | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $aerohive = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $aerohive->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to the configuration information obtainable from an | ||||
| Aerohive / Extreme wireless access point through SNMP. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<AH-SYSTEM-MIB> | ||||
|  | ||||
| =item F<AH-INTERFACE-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $aerohive->vendor() | ||||
|  | ||||
| Returns 'aerohive'. | ||||
|  | ||||
| =item $aerohive->os() | ||||
|  | ||||
| Returns 'hiveos'. | ||||
|  | ||||
| =item $aerohive->serial() | ||||
|  | ||||
| Returns the serial number extracted from C<ahSystemSerial>. | ||||
|  | ||||
| =item $aerohive->os_ver() | ||||
|  | ||||
| Returns the OS version extracted from C<sysDescr>. | ||||
|  | ||||
| =item $aerohive->os_bin() | ||||
|  | ||||
| Returns the firmware version extracted from C<ahFirmwareVersion>. | ||||
|  | ||||
| =item $aerohive->mac() | ||||
|  | ||||
| Returns the base mac address of the aerohive unit from an undocumented | ||||
| snmp oid. if this oid is not available it will walk all interfaces and | ||||
| return the lowest numbered mac address. | ||||
|  | ||||
| =item $aerohive->model() | ||||
|  | ||||
| Returns the model extracted from C<sysDescr>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $aerohive->layers() | ||||
|  | ||||
| Returns 00000111. Layer 2 and Layer 3 functionality through proprietary MIBs. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $aerohive->i_ssidlist() | ||||
|  | ||||
| Returns reference to hash. SSID's recognized by the radio interface. | ||||
|  | ||||
| =item $aerohive->i_ssidmac() | ||||
|  | ||||
| With the same keys as i_ssidlist, returns the Basic service set | ||||
| identification (BSSID), MAC address, the AP is using for the SSID. | ||||
|  | ||||
| =item $aerohive->i_80211channel() | ||||
|  | ||||
| Returns reference to hash.  Current operating frequency channel of the radio | ||||
| interface. | ||||
|  | ||||
| C<ahRadioChannel> | ||||
|  | ||||
| =item $aerohive->dot11_cur_tx_pwr_mw() | ||||
|  | ||||
| Returns reference to hash.  Current transmit power, in milliwatts, of the | ||||
| radio interface. | ||||
|  | ||||
| C<ahRadioTxPower> | ||||
|  | ||||
| =item $aerohive->cd11_port() | ||||
|  | ||||
| Returns radio interfaces. | ||||
|  | ||||
| =item $aerohive->cd11_mac() | ||||
|  | ||||
| Returns client radio interface MAC addresses. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $aerohive->bp_index() | ||||
|  | ||||
| Simulates bridge MIB by returning reference to a hash mapping i_index() to | ||||
| the interface iid. | ||||
|  | ||||
| =item $aerohive->qb_fw_port() | ||||
|  | ||||
| Returns reference to hash of forwarding table entries port interface | ||||
| identifier (iid). | ||||
|  | ||||
| =item $aerohive->qb_fw_mac() | ||||
|  | ||||
| Returns reference to hash of forwarding table MAC Addresses. | ||||
|  | ||||
| C<ahClientMac> | ||||
|  | ||||
| =item $aerohive->qb_fw_vlan() | ||||
|  | ||||
| Returns reference to hash of forwarding table entries VLAN ID. | ||||
|  | ||||
| C<ahClientVLAN> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Arp Cache Table Augmentation | ||||
|  | ||||
| The AP has knowledge of MAC->IP mappings for wireless clients. | ||||
| Augmenting the arp cache data with these MAC->IP mappings enables visibility | ||||
| for stations that only communicate locally. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $aerohive->at_paddr() | ||||
|  | ||||
| C<ahClientMac> | ||||
|  | ||||
| =item $aerohive->at_netaddr() | ||||
|  | ||||
| C<ahClientIP> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -29,6 +29,7 @@ | ||||
| package SNMP::Info::Layer2::Airespace; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::CDP; | ||||
| @@ -38,9 +39,9 @@ use SNMP::Info::Airespace; | ||||
|     = qw/SNMP::Info::Airespace SNMP::Info::CDP SNMP::Info::Bridge Exporter/; | ||||
| @SNMP::Info::Layer2::Airespace::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,      %SNMP::Info::Bridge::MIBS, | ||||
| @@ -97,6 +98,14 @@ my $mcs_index = { | ||||
| 	m13 => '104', | ||||
| 	m14 => '117', | ||||
| 	m15 => '130', | ||||
| 	m16 => '19.5', | ||||
| 	m17 => '39', | ||||
| 	m18 => '58.5', | ||||
| 	m19 => '78', | ||||
| 	m20 => '117', | ||||
| 	m21 => '156', | ||||
| 	m22 => '175.5', | ||||
| 	m23 => '195', | ||||
| 	# This is a cheat for 802.11a bonded | ||||
| 	m108 => '108', | ||||
|     }, | ||||
| @@ -117,6 +126,14 @@ my $mcs_index = { | ||||
| 	m13 => '240', | ||||
| 	m14 => '270', | ||||
| 	m15 => '300', | ||||
| 	m16 => '45', | ||||
| 	m17 => '90', | ||||
| 	m18 => '135', | ||||
| 	m19 => '180', | ||||
| 	m20 => '270', | ||||
| 	m21 => '360', | ||||
| 	m22 => '405', | ||||
| 	m23 => '450', | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| @@ -150,11 +167,11 @@ sub cd11_mac { | ||||
| 
 | ||||
| sub cd11_txrate { | ||||
|     my $airespace = shift; | ||||
|      | ||||
| 
 | ||||
|     my $rates  = $airespace->client_txrate() || {}; | ||||
|     my $protos = $airespace->cd11_proto()    || {}; | ||||
|     my $bws    = $airespace->cd11n_ch_bw()   || {}; | ||||
|      | ||||
| 
 | ||||
|     my $cd11_txrate = {}; | ||||
|     foreach my $idx ( keys %$rates ) { | ||||
| 	my $rate = $rates->{$idx} || '0.0'; | ||||
| @@ -165,6 +182,7 @@ sub cd11_txrate { | ||||
| 	elsif ( $rate =~ /^m/ ) { | ||||
| 	    my $band = $protos->{$idx}; | ||||
| 	    my $bw   = $bws->{$band}; | ||||
| 	    # FIXME throw some kind of error if we get an index/rate that we haven't implemented yet? Now we simply return "0.0"... | ||||
| 	    $cd11_txrate->{$idx} = [ $mcs_index->{$bw}->{$rate} || '0.0' ]; | ||||
| 	} | ||||
| 	else { | ||||
| @@ -176,7 +194,7 @@ sub cd11_txrate { | ||||
| 
 | ||||
| sub munge_cd11n_ch_bw { | ||||
|     my $bw = shift; | ||||
|      | ||||
| 
 | ||||
|     if ( $bw =~ /forty/ ) { | ||||
| 	return 40; | ||||
|     } | ||||
| @@ -185,7 +203,7 @@ sub munge_cd11n_ch_bw { | ||||
| 
 | ||||
| sub munge_cd11_proto { | ||||
|     my $bw = shift; | ||||
|      | ||||
| 
 | ||||
|     return 2 if ( $bw eq 'dot11n5' ); | ||||
| 
 | ||||
|     return 1; | ||||
| @@ -243,7 +261,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
| 
 | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -252,14 +270,9 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from  | ||||
| Provides abstraction to the configuration information obtainable from | ||||
| Cisco (Airespace) Wireless Controllers through SNMP. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
| my $airespace = new SNMP::Info::Layer2::Airespace(...); | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| @@ -329,7 +342,7 @@ See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
| 
 | ||||
| =over  | ||||
| =over | ||||
| 
 | ||||
| =item cd11_mac() | ||||
| 
 | ||||
| @@ -339,7 +352,7 @@ Returns client radio interface MAC addresses. | ||||
| 
 | ||||
| Returns client transmission speed in Mbs. | ||||
| 
 | ||||
| =back  | ||||
| =back | ||||
| 
 | ||||
| =head2 Overrides | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Aironet | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,9 +32,9 @@ | ||||
| package SNMP::Info::Layer2::Aironet; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::Entity; | ||||
| use SNMP::Info::EtherLike; | ||||
| use SNMP::Info::CiscoStats; | ||||
| use SNMP::Info::CiscoConfig; | ||||
| @@ -43,30 +42,28 @@ use SNMP::Info::CDP; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::Aironet::ISA | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::EtherLike | ||||
|     SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/; | ||||
| @SNMP::Info::Layer2::Aironet::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::IEEE802dot11::GLOBALS, | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::Entity::GLOBALS, | ||||
|     %SNMP::Info::EtherLike::GLOBALS, | ||||
|     %SNMP::Info::CiscoStats::GLOBALS, | ||||
|     %SNMP::Info::CiscoConfig::GLOBALS, | ||||
|     %SNMP::Info::CDP::GLOBALS, | ||||
|     'serial' => 'entPhysicalSerialNum.1', | ||||
|     'descr'  => 'sysDescr' | ||||
|     'ps1_type' => 'cpoePdCurrentPowerSource', | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::IEEE802dot11::FUNCS, | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::Entity::FUNCS, | ||||
|     %SNMP::Info::EtherLike::FUNCS, | ||||
|     %SNMP::Info::CiscoStats::FUNCS, | ||||
|     %SNMP::Info::CiscoConfig::FUNCS, | ||||
| @@ -88,7 +85,6 @@ $VERSION = '3.19'; | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::IEEE802dot11::MIBS, | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::Entity::MIBS, | ||||
|     %SNMP::Info::EtherLike::MIBS, | ||||
|     %SNMP::Info::CiscoStats::MIBS, | ||||
|     %SNMP::Info::CiscoConfig::MIBS, | ||||
| @@ -97,12 +93,12 @@ $VERSION = '3.19'; | ||||
|     'CISCO-DOT11-ASSOCIATION-MIB'         => 'cDot11ClientSubIfIndex', | ||||
|     'CISCO-DOT11-SSID-SECURITY-MIB'       => 'cdot11SecVlanNameId', | ||||
|     'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex', | ||||
|     'CISCO-POE-PD-MIB'                    => 'cpoePdCurrentPowerSource', | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::IEEE802dot11::MUNGE, | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     %SNMP::Info::Entity::MUNGE, | ||||
|     %SNMP::Info::EtherLike::MUNGE, | ||||
|     %SNMP::Info::CiscoStats::MUNGE, | ||||
|     %SNMP::Info::CiscoConfig::MUNGE, | ||||
| @@ -117,7 +113,6 @@ $VERSION = '3.19'; | ||||
|     = \&SNMP::Info::IEEE802dot11::dot11_cur_tx_pwr_mw; | ||||
| 
 | ||||
| sub vendor { | ||||
| 
 | ||||
|     # Sorry, but it's true. | ||||
|     return 'cisco'; | ||||
| } | ||||
| @@ -134,11 +129,16 @@ sub interfaces { | ||||
| # Tag on e_descr.1 | ||||
| sub description { | ||||
|     my $aironet = shift; | ||||
|     my $descr   = $aironet->descr(); | ||||
|     my $descr   = $aironet->SUPER::description(); | ||||
|     my $e_descr = $aironet->e_descr(); | ||||
| 
 | ||||
|     $descr = "$e_descr->{1}  $descr" if defined $e_descr->{1}; | ||||
| 
 | ||||
|     if (defined $e_descr->{1}) { | ||||
|       if (defined $descr) { | ||||
|         $descr = "$e_descr->{1}  $descr" | ||||
|       } else { | ||||
|         $descr = "$e_descr->{1}" | ||||
|       } | ||||
|     } | ||||
|     return $descr; | ||||
| } | ||||
| 
 | ||||
| @@ -442,7 +442,7 @@ sub i_ssidmac { | ||||
|     my $partial    = shift; | ||||
|     my $mbss_mac_addr = $aironet->mbss_mac_addr(); | ||||
| 
 | ||||
|     # Same logic as i_ssidbcast to return same indexes as i_ssidlist  | ||||
|     # Same logic as i_ssidbcast to return same indexes as i_ssidlist | ||||
|     my $map = {}; | ||||
|     foreach my $key ( keys %$mbss_mac_addr ) { | ||||
|         my ( $interface, @idx ) = split( /\./, $key ); | ||||
| @@ -457,6 +457,18 @@ sub i_ssidmac { | ||||
|     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__ | ||||
| 
 | ||||
| @@ -471,14 +483,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $aironet = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $aironet->class(); | ||||
| @@ -504,7 +516,7 @@ This class is for devices running Cisco IOS software (newer) | ||||
| =back | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
| 
 | ||||
| my $aironet = new SNMP::Info::Layer2::Aironet(...); | ||||
| 
 | ||||
| @@ -514,8 +526,6 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...); | ||||
| 
 | ||||
| =item SNMP::Info::Layer2 | ||||
| 
 | ||||
| =item SNMP::Info::Entity | ||||
| 
 | ||||
| =item SNMP::Info::EtherLike | ||||
| 
 | ||||
| =item SNMP::Info::CiscoStats | ||||
| @@ -528,6 +538,16 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...); | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item F<CISCO-DOT11-ASSOCIATION-MIB> | ||||
| 
 | ||||
| =item F<CISCO-DOT11-IF-MIB> | ||||
| 
 | ||||
| =item F<CISCO-DOT11-SSID-SECURITY-MIB> | ||||
| 
 | ||||
| =item F<CISCO-POE-PD-MIB> | ||||
| 
 | ||||
| =item F<CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB> | ||||
| 
 | ||||
| =item Inherited Classes | ||||
| 
 | ||||
| MIBs required by the inherited classes listed above. | ||||
| @@ -540,17 +560,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 | ||||
| 
 | ||||
| @@ -558,10 +574,6 @@ System description | ||||
| 
 | ||||
| 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. | ||||
| @@ -646,7 +658,12 @@ being broadcast. | ||||
| =item $aironet->i_ssidmac() | ||||
| 
 | ||||
| With the same keys as i_ssidlist, returns the Basic service set | ||||
| identification (BSSID), MAC address, the AP is using for the SSID.  | ||||
| identification (BSSID), MAC address, the AP is using for the SSID. | ||||
| 
 | ||||
| =item $aironet ps1_status() | ||||
| 
 | ||||
| Returns the PoE injector status based on C<cpoePdSupportedPower> and | ||||
| C<cpoePdSupportedPowerMode>. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -654,10 +671,6 @@ identification (BSSID), MAC address, the AP is using for the SSID. | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Entity | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::EtherLike | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details. | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Allied | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -31,6 +30,7 @@ | ||||
| package SNMP::Info::Layer2::Allied; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::Layer1; | ||||
| @@ -38,9 +38,9 @@ use SNMP::Info::Layer1; | ||||
| @SNMP::Info::Layer2::Allied::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Allied::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %GLOBALS = ( %SNMP::Info::Layer2::GLOBALS ); | ||||
| 
 | ||||
| @@ -70,17 +70,17 @@ sub os_ver { | ||||
|     my $allied = shift; | ||||
|     my $descr  = $allied->description(); | ||||
| 
 | ||||
|     if ( $descr =~ m/version (\d+\.\d+)/ ) { | ||||
|     if ( defined ($descr) && $descr =~ m/version (\d+\.\d+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub model { | ||||
|     my $allied = shift; | ||||
| 
 | ||||
|     my $desc = $allied->description(); | ||||
| 
 | ||||
|     if ( $desc =~ /(AT-80\d{2}\S*)/ ) { | ||||
|     if ( defined ($desc) &&  $desc =~ /(AT-80\d{2}\S*)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| @@ -137,14 +137,14 @@ Max Baker, Dmitry Sergienko <dmitry@trifle.net> | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $allied = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myhub', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $allied->class(); | ||||
| @@ -152,8 +152,8 @@ Max Baker, Dmitry Sergienko <dmitry@trifle.net> | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Allied device through SNMP. See inherited classes' documentation for  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Allied device through SNMP. See inherited classes' documentation for | ||||
| inherited methods. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| @@ -190,11 +190,11 @@ These are methods that return scalar value from SNMP | ||||
| 
 | ||||
| =item $allied->vendor() | ||||
| 
 | ||||
| Returns 'allied' :) | ||||
| Returns 'allied' | ||||
| 
 | ||||
| =item $allied->os() | ||||
| 
 | ||||
| Returns 'allied'  | ||||
| Returns 'allied' | ||||
| 
 | ||||
| =item $allied->os_ver() | ||||
| 
 | ||||
| @@ -212,7 +212,7 @@ Tries to cull out C<AT-nnnnX> out of the description field. | ||||
| 
 | ||||
| =item $allied->mac() | ||||
| 
 | ||||
| Returns device MAC.  | ||||
| Returns device MAC. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
							
								
								
									
										168
									
								
								lib/SNMP/Info/Layer2/Atmedia.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								lib/SNMP/Info/Layer2/Atmedia.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | ||||
| # SNMP::Info::Layer2::Atmedia | ||||
| # | ||||
| # Copyright (c) 2018 Netdisco Developers | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Atmedia; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Atmedia::ISA       = qw/SNMP::Info::Layer2/; | ||||
| @SNMP::Info::Layer2::Atmedia::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %MIBS = ( %SNMP::Info::Layer2::MIBS ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     'os_ver'          => '.1.3.6.1.4.1.13458.1.2.1.0', | ||||
|     'atm_serial'      => '.1.3.6.1.4.1.13458.1.1.2.0', | ||||
|     'atm_hardversion' => '.1.3.6.1.4.1.13458.1.3.1.0', | ||||
|     'atm_model'       => '.1.3.6.1.4.1.13458.1.1.6.0', | ||||
| ); | ||||
|  | ||||
| %FUNCS = (%SNMP::Info::Layer2::FUNCS); | ||||
|  | ||||
| %MUNGE = (%SNMP::Info::Layer2::MUNGE); | ||||
|  | ||||
| sub serial { | ||||
|     my $atmedia = shift; | ||||
|  | ||||
|     return $atmedia->atm_serial(); | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'Atmedia-OS'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $atmedia = shift; | ||||
|  | ||||
|     my $atmedia_model = $atmedia->atm_model(); | ||||
|     if (defined $atmedia_model) { | ||||
|       $atmedia_model =~ s/\<|\>//g; | ||||
|       $atmedia_model =~ s/\//_/g; | ||||
|       return $atmedia_model; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'atmedia'; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Atmedia - SNMP Interface to atmedia encryptors | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Netdisco Developers | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $atmedia = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myhub', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class = $atmedia->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Provides abstraction to information obtainable from a atmedia encryptor | ||||
| through SNMP. See inherited classes' documentation for inherited methods. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $atmedia->vendor() | ||||
|  | ||||
| Returns 'atmedia' | ||||
|  | ||||
| =item $atmedia->os() | ||||
|  | ||||
| Returns 'Atmedia-OS' | ||||
|  | ||||
| =item $atmedia->os_ver() | ||||
|  | ||||
| (C<acSoftVersion>) | ||||
|  | ||||
| =item $atmedia->model() | ||||
|  | ||||
| (C<acDescr>) | ||||
|  | ||||
| =item $atmedia->serial() | ||||
|  | ||||
| (C<acSerialNumber>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Baystack | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # All rights reserved. | ||||
| @@ -31,38 +30,38 @@ | ||||
| package SNMP::Info::Layer2::Baystack; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::SONMP; | ||||
| use SNMP::Info::NortelStack; | ||||
| use SNMP::Info::RapidCity; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::Layer3; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::Baystack::ISA | ||||
|     = qw/SNMP::Info::SONMP SNMP::Info::NortelStack | ||||
|     SNMP::Info::RapidCity SNMP::Info::LLDP | ||||
|     SNMP::Info::RapidCity | ||||
|     SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer2::Baystack::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS,    %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS, | ||||
|     %SNMP::Info::SONMP::MIBS, | ||||
|     'BAY-STACK-PETH-EXT-MIB' => 'bspePethPsePortExtMeasuredPower', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS,    %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::RapidCity::GLOBALS, %SNMP::Info::NortelStack::GLOBALS, | ||||
|     %SNMP::Info::SONMP::GLOBALS, | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS,    %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS, | ||||
|     %SNMP::Info::SONMP::FUNCS, | ||||
|     'peth_port_power' => 'bspePethPsePortExtMeasuredPower', | ||||
| @@ -74,7 +73,7 @@ $SNMP::Info::SPEED_MAP{200_000_000}   = '100 Mbps'; | ||||
| $SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps'; | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE,    %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::RapidCity::MUNGE, %SNMP::Info::NortelStack::MUNGE, | ||||
|     %SNMP::Info::SONMP::MUNGE, | ||||
| ); | ||||
| @@ -136,7 +135,7 @@ sub model { | ||||
|     return '303' if ( defined $descr and $descr =~ /\D303\D/ ); | ||||
|     return '304' if ( defined $descr and $descr =~ /\D304\D/ ); | ||||
|     return 'BPS' if ( $model =~ /BPS2000/i ); | ||||
|      | ||||
| 
 | ||||
|     # Pull sreg- from all | ||||
|     $model =~ s/^sreg-//; | ||||
|     # Strip ES/ERS/BayStack etc. from those families | ||||
| @@ -229,7 +228,7 @@ sub index_factor { | ||||
|         if ( ( $model =~ /(470)/ ) | ||||
|         or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) ); | ||||
|     $index_factor = 128 | ||||
|         if ( ( $model =~ /(5[56]\d\d)|VSP/ ) | ||||
|         if ( ( $model =~ /(5[56]\d\d)|VSP|4950|59100/ ) | ||||
|         and ( $os_ver >= 6 ) ); | ||||
| 
 | ||||
|     return $index_factor; | ||||
| @@ -341,6 +340,60 @@ sub peth_port_ifindex { | ||||
|     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__ | ||||
| @@ -363,7 +416,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|   or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $baystack->class(); | ||||
| @@ -373,12 +426,7 @@ Eric Miller | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from an | ||||
| Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series | ||||
| through SNMP.  | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
| my $baystack = new SNMP::Info::Layer2::Baystack(...); | ||||
| through SNMP. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| @@ -390,8 +438,6 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...); | ||||
| 
 | ||||
| =item SNMP::Info::RapidCity | ||||
| 
 | ||||
| =item SNMP::Info::LLDP | ||||
| 
 | ||||
| =item SNMP::Info::Layer3 | ||||
| 
 | ||||
| =back | ||||
| @@ -400,7 +446,7 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...); | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item F<BAY-STACK-PETH-EXT-MIBB> | ||||
| =item F<BAY-STACK-PETH-EXT-MIB> | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -412,8 +458,6 @@ See L<SNMP::Info::NortelStack/"Required MIBs"> for its MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::RapidCity/"Required MIBs"> for its MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements. | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| @@ -444,6 +488,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 | ||||
| @@ -475,10 +527,6 @@ See L<SNMP::Info::NortelStack/"GLOBALS"> for details. | ||||
| 
 | ||||
| See L<SNMP::Info::RapidCity/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::LLDP | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
| 
 | ||||
| See L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| @@ -498,21 +546,17 @@ Returns reference to the map between IID and physical Port. | ||||
| 
 | ||||
|   Slot and port numbers on the Baystack switches are determined by the | ||||
|   formula: | ||||
|    | ||||
| 
 | ||||
|   port = (Interface index % Index factor) | ||||
|   slot = (int(Interface index / Index factor)) + Slot offset | ||||
|   | ||||
| 
 | ||||
|   The physical port name is returned as slot.port. | ||||
| 
 | ||||
| =item $baystack->i_ignore() | ||||
| 
 | ||||
| Returns reference to hash of IIDs to ignore. | ||||
| 
 | ||||
| =item $baystack->i_mac() | ||||
| 
 | ||||
| Returns the C<ifPhysAddress> table entries.  | ||||
| Returns the C<ifPhysAddress> table entries. | ||||
| 
 | ||||
| Removes all entries matching '00:00:00:00:00:00' -- Certain  | ||||
| Removes all entries matching '00:00:00:00:00:00' -- Certain | ||||
| revisions of Baystack firmware report all zeros for each port mac. | ||||
| 
 | ||||
| =item $baystack->i_name() | ||||
| @@ -540,66 +584,92 @@ L<SNMP::Info::NortelStack/"TABLE METHODS"> for details on ns_e_* methods. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $baystack->e_index()  | ||||
| =item $baystack->e_index() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalDescr>, this will try ns_e_index(). | ||||
| Note that this is based on C<entPhysicalDescr> due to implementation | ||||
| details of SNMP::Info::Entity::e_index(). | ||||
| 
 | ||||
| =item $baystack->e_class()  | ||||
| =item $baystack->e_class() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalClass>, this will try ns_e_class(). | ||||
| 
 | ||||
| =item $baystack->e_descr()  | ||||
| =item $baystack->e_descr() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalDescr>, this will try ns_e_descr(). | ||||
| 
 | ||||
| =item $baystack->e_name()  | ||||
| =item $baystack->e_name() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalName>, this will try ns_e_name(). | ||||
| 
 | ||||
| =item $baystack->e_fwver()  | ||||
| =item $baystack->e_fwver() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalFirmwareRev>, this will try | ||||
| ns_e_fwver(). | ||||
| 
 | ||||
| =item $baystack->e_hwver()  | ||||
| =item $baystack->e_hwver() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalHardwareRev>, this will try | ||||
| ns_e_hwver(). | ||||
| 
 | ||||
| =item $baystack->e_parent()  | ||||
| =item $baystack->e_parent() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalContainedIn>, this will try | ||||
| ns_e_parent(). | ||||
| 
 | ||||
| =item $baystack->e_pos()  | ||||
| =item $baystack->e_pos() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalParentRelPos>, this will try | ||||
| ns_e_pos(). | ||||
| 
 | ||||
| =item $baystack->e_serial()  | ||||
| =item $baystack->e_serial() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalSerialNum>, this will try | ||||
| ns_e_serial(). | ||||
| 
 | ||||
| =item $baystack->e_swver()  | ||||
| =item $baystack->e_swver() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalSoftwareRev>, this will try | ||||
| ns_e_swver(). | ||||
| 
 | ||||
| =item $baystack->e_type()  | ||||
| =item $baystack->e_type() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalVendorType>, this will try | ||||
| ns_e_type(). | ||||
| 
 | ||||
| =item $baystack->e_vendor()  | ||||
| =item $baystack->e_vendor() | ||||
| 
 | ||||
| If the device doesn't support C<entPhysicalMfgName>, this will try | ||||
| ns_e_vendor(). | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Layer 2 Forwarding Database | ||||
| 
 | ||||
| These methods try to obtain the layer 2 forwarding database entries via the | ||||
| normal bridge methods as well as SPBM entries via rapid city methods. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $baystack->fw_mac() | ||||
| 
 | ||||
| Returns reference to hash of forwarding table MAC Addresses | ||||
| 
 | ||||
| =item $baystack->fw_port() | ||||
| 
 | ||||
| Returns reference to hash of forwarding table entries port interface | ||||
| identifier (iid) | ||||
| 
 | ||||
| =item $baystack->qb_fw_vlan() | ||||
| 
 | ||||
| Returns reference to hash of forwarding table entries VLAN ID | ||||
| 
 | ||||
| =item $baystack->fw_status() | ||||
| 
 | ||||
| Returns reference to hash of forwarding table entries status | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::SONMP | ||||
| 
 | ||||
| See L<SNMP::Info::SONMP/"TABLE METHODS"> for details. | ||||
| @@ -612,10 +682,6 @@ See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| See L<SNMP::Info::RapidCity/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
| 
 | ||||
| See L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::C1900 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,6 +32,7 @@ | ||||
| package SNMP::Info::Layer2::C1900; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::CDP; | ||||
| use SNMP::Info::CiscoStats; | ||||
| @@ -46,9 +46,9 @@ use SNMP::Info::Layer2; | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer2::C1900::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
| @@ -200,6 +200,8 @@ sub set_i_duplex_admin { | ||||
| 
 | ||||
|     my $iid = $c1900->c1900_p_ifindex($port); | ||||
| 
 | ||||
|     return 0 unless $iid->{$port}; | ||||
| 
 | ||||
|     $duplex = lc($duplex); | ||||
| 
 | ||||
|     return 0 unless defined $duplexes{$duplex}; | ||||
| @@ -212,17 +214,17 @@ sub i_vlan { | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     # Overlap allows more than one VLAN per port.  Unable to determine default | ||||
|     my $overlap  | ||||
|     my $overlap | ||||
|         = $c1900->bridgeGroupAllowMembershipOverlap() | ||||
|         || $c1900->vlanAllowMembershipOverlap() | ||||
|         || 'disabled'; | ||||
| 
 | ||||
|     if ( $overlap eq 'enabled' ) { | ||||
|         return; | ||||
|         return {}; | ||||
|     } | ||||
| 
 | ||||
|     my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup() | ||||
|         || $c1900->vlanMemberPortOfVlan(); | ||||
|         || $c1900->vlanMemberPortOfVlan() || {}; | ||||
| 
 | ||||
|     my $i_pvid = {}; | ||||
|     foreach my $idx ( keys %$member_of ) { | ||||
| @@ -244,7 +246,7 @@ sub i_vlan_membership { | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup() | ||||
|         || $c1900->vlanMemberPortOfVlan(); | ||||
|         || $c1900->vlanMemberPortOfVlan() || {}; | ||||
| 
 | ||||
|     my $i_vlan_membership = {}; | ||||
|     foreach my $idx ( keys %$member_of ) { | ||||
| @@ -261,6 +263,8 @@ sub i_vlan_membership { | ||||
|     return $i_vlan_membership; | ||||
| } | ||||
| 
 | ||||
| sub i_vlan_membership_untagged { return {}; } | ||||
| 
 | ||||
| sub bp_index { | ||||
|     my $c1900   = shift; | ||||
|     my $partial = shift; | ||||
| @@ -287,14 +291,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $c1900 = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $c1900->class(); | ||||
| @@ -307,11 +311,6 @@ Catalyst 1900 device through SNMP.  See SNMP::Info for full documentation | ||||
| 
 | ||||
| Note that most of these devices only talk SNMP version 1, but not all. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
|  my $c1900 = new SNMP::Info::Layer2::C1900(...); | ||||
| 
 | ||||
| =head2 Inherited classes | ||||
| 
 | ||||
| =over | ||||
| @@ -338,8 +337,6 @@ after determining a more specific class using the method above. | ||||
| 
 | ||||
| F<ESSWITCH-MIB> is included in the Version 1 MIBs from Cisco. | ||||
| 
 | ||||
| They can be found at ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Inherited MIBs | ||||
| @@ -375,14 +372,14 @@ Returns 'catalyst' | ||||
| 
 | ||||
| =item $c1900->os_ver() | ||||
| 
 | ||||
| Returns CatOS version if obtainable.  First tries to use  | ||||
| SNMP::Info::CiscoStats->os_ver() .  If that fails then it  | ||||
| Returns CatOS version if obtainable.  First tries to use | ||||
| SNMP::Info::CiscoStats->os_ver() .  If that fails then it | ||||
| checks for the presence of $c1900->c1900_flash_status() and culls | ||||
| the version from there. | ||||
| 
 | ||||
| =item $c1900->vendor() | ||||
| 
 | ||||
| Returns 'cisco' :) | ||||
| Returns 'cisco' | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -416,10 +413,6 @@ See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details. | ||||
| 
 | ||||
| See L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::CiscoAgg | ||||
| 
 | ||||
| See L<SNMP::Info::CiscoAgg/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| See L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| @@ -463,13 +456,16 @@ bridge group IDs. | ||||
|   Example: | ||||
|   my $interfaces = $c1900->interfaces(); | ||||
|   my $vlans      = $c1900->i_vlan_membership(); | ||||
|    | ||||
| 
 | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
|     print "Port: $port VLAN: $vlan\n"; | ||||
|   } | ||||
| 
 | ||||
| =item $c1900->i_vlan_membership_untagged() | ||||
| 
 | ||||
| Unsupported, returns nothing. | ||||
| 
 | ||||
| =item $c1900->bp_index() | ||||
| 
 | ||||
| @@ -503,7 +499,7 @@ Gives admin setting for Duplex Info | ||||
| 
 | ||||
| =item $c1900->c1900_p_name() | ||||
| 
 | ||||
| Gives human set name for port  | ||||
| Gives human set name for port | ||||
| 
 | ||||
| (C<swPortName>) | ||||
| 
 | ||||
| @@ -556,7 +552,7 @@ See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -567,7 +563,7 @@ choices are 'auto', 'half', 'full'. | ||||
| 
 | ||||
|   Example: | ||||
|   my %if_map = reverse %{$c1900->interfaces()}; | ||||
|   $c1900->set_i_duplex_admin('auto', $if_map{'1'})  | ||||
|   $c1900->set_i_duplex_admin('auto', $if_map{'1'}) | ||||
|     or die "Couldn't change port duplex. ",$c1900->error(1); | ||||
| 
 | ||||
| =back | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::C2900 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Layer2::C2900; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2::Cisco; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::Layer2::Cisco Exporter/; | ||||
| @SNMP::Info::Layer2::C2900::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::Cisco::GLOBALS, | ||||
| @@ -128,25 +128,24 @@ sub i_speed_admin { | ||||
|     my $c2900   = shift; | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     my %i_speed_admin; | ||||
|     my $p_port        = $c2900->p_port() || {}; | ||||
|     my $interfaces    = $c2900->interfaces($partial); | ||||
|     my $c2900_p_index = $c2900->c2900_p_index() || {}; | ||||
|     my $c2900_p_admin = $c2900->c2900_p_speed_admin(); | ||||
| 
 | ||||
|     my %reverse_2900 = reverse %$c2900_p_index; | ||||
|     my $c2900_p_speed | ||||
|         = $c2900->c2900_p_speed_admin( $reverse_2900{$partial} ); | ||||
| 
 | ||||
|     my %speeds = ( | ||||
|         'autoDetect' => 'auto', | ||||
|         's10000000'  => '10 Mbps', | ||||
|         's100000000' => '100 Mbps', | ||||
|     ); | ||||
| 
 | ||||
|     %i_speed_admin | ||||
|         = map { $c2900_p_index->{$_} => $speeds{ $c2900_p_speed->{$_} } } | ||||
|         keys %$c2900_p_index; | ||||
|     my %i_speed_admin; | ||||
|     foreach my $if ( keys %$interfaces ) { | ||||
|         my $port_2900 = $reverse_2900{$if}; | ||||
|         next unless defined $port_2900; | ||||
|         my $speed = $c2900_p_admin->{$port_2900}; | ||||
|         next unless defined $speed; | ||||
| 
 | ||||
|         $speed = 'auto' if $speed eq 'autoDetect'; | ||||
|         $speed = '10 Mbps' if $speed eq 's10000000'; | ||||
|         $speed = '100 Mbps' if $speed eq 's100000000'; | ||||
|         $i_speed_admin{$if} = $speed; | ||||
|     } | ||||
|     return \%i_speed_admin; | ||||
| } | ||||
| 
 | ||||
| @@ -190,7 +189,7 @@ sub set_i_duplex_admin { | ||||
|     return $c2900->set_c2900_p_duplex_admin( $duplexes{$duplex}, $iid ); | ||||
| } | ||||
| 
 | ||||
| # Use i_descritption for port key, cuz i_name can be manually entered. | ||||
| # Use i_description for port key, cuz i_name can be manually entered. | ||||
| sub interfaces { | ||||
|     my $c2900   = shift; | ||||
|     my $partial = shift; | ||||
| @@ -226,7 +225,7 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $c2900 = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -234,7 +233,7 @@ Max Baker | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $c2900->class(); | ||||
| @@ -242,13 +241,8 @@ Max Baker | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| C2900 device through SNMP.  | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
|  my $c2900 = new SNMP::Info::Layer2::C2900(...); | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| C2900 device through SNMP. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| @@ -282,7 +276,7 @@ These are methods that return scalar value from SNMP | ||||
| 
 | ||||
| =item $c2900->vendor() | ||||
| 
 | ||||
| Returns 'cisco' :) | ||||
| Returns 'cisco' | ||||
| 
 | ||||
| =item $c2900->cisco_comm_indexing() | ||||
| 
 | ||||
| @@ -310,8 +304,8 @@ Returns reference to the map between IID and physical Port. | ||||
| On the 2900 devices i_name isn't reliable, so we override to just the | ||||
| description. | ||||
| 
 | ||||
| Next all dots are changed for forward slashes so that the physical port name  | ||||
| is the same as the broad-casted CDP port name.  | ||||
| Next all dots are changed for forward slashes so that the physical port name | ||||
| is the same as the broad-casted CDP port name. | ||||
|     (Ethernet0.1 -> Ethernet0/1) | ||||
| 
 | ||||
| Also, any weird characters are removed, as I saw a few pop up. | ||||
| @@ -334,7 +328,7 @@ Returns reference to hash of IIDs to admin speed setting. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 F<C2900-MIB> Port Entry Table  | ||||
| =head2 F<C2900-MIB> Port Entry Table | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -358,7 +352,7 @@ Gives admin setting for Duplex Info | ||||
| 
 | ||||
| =item $c2900->c2900_p_speed_admin() | ||||
| 
 | ||||
| Gives Admin speed of port  | ||||
| Gives Admin speed of port | ||||
| 
 | ||||
| (C<c2900PortAdminSpeed>) | ||||
| 
 | ||||
| @@ -373,7 +367,7 @@ See L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -388,7 +382,7 @@ port C<ifIndex>. | ||||
| 
 | ||||
|     Example: | ||||
|     my %if_map = reverse %{$c2900->interfaces()}; | ||||
|     $c2900->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})  | ||||
|     $c2900->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'}) | ||||
|         or die "Couldn't change port speed. ",$c2900->error(1); | ||||
| 
 | ||||
| =item $c2900->set_i_duplex_admin(duplex, ifIndex) | ||||
| @@ -402,7 +396,7 @@ port C<ifIndex>. | ||||
| 
 | ||||
|     Example: | ||||
|     my %if_map = reverse %{$c2900->interfaces()}; | ||||
|     $c2900->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})  | ||||
|     $c2900->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'}) | ||||
|         or die "Couldn't change port duplex. ",$c2900->error(1); | ||||
| 
 | ||||
| =back | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Catalyst | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2002,2003 Regents of the University of California | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond | ||||
| @@ -32,6 +31,7 @@ | ||||
| package SNMP::Info::Layer2::Catalyst; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::CiscoStack; | ||||
| use SNMP::Info::Layer2::Cisco; | ||||
| @@ -40,9 +40,9 @@ use SNMP::Info::Layer2::Cisco; | ||||
|     = qw/SNMP::Info::CiscoStack SNMP::Info::Layer2::Cisco Exporter/; | ||||
| @SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::Cisco::MIBS, | ||||
| @@ -64,13 +64,13 @@ $VERSION = '3.19'; | ||||
|     %SNMP::Info::CiscoStack::MUNGE, | ||||
| ); | ||||
| 
 | ||||
| # Overidden Methods | ||||
| # Overridden Methods | ||||
| 
 | ||||
| # i_physical sets a hash entry as true if the iid is a physical port | ||||
| sub i_physical { | ||||
|     my $cat = shift; | ||||
| 
 | ||||
|     my $p_port = $cat->p_port(); | ||||
|     my $p_port = $cat->p_port() || {}; | ||||
| 
 | ||||
|     my %i_physical; | ||||
|     foreach my $port ( keys %$p_port ) { | ||||
| @@ -104,8 +104,8 @@ sub os_ver { | ||||
| # Workaround for incomplete bp_index | ||||
| sub bp_index { | ||||
|     my $cat     = shift; | ||||
|     my $p_index = $cat->p_port(); | ||||
|     my $b_index = $cat->p_oidx(); | ||||
|     my $p_index = $cat->p_port() || {}; | ||||
|     my $b_index = $cat->p_oidx() || {}; | ||||
| 
 | ||||
|     my %bp_index; | ||||
|     foreach my $iid ( keys %$p_index ) { | ||||
| @@ -173,14 +173,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $cat = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $cat->class(); | ||||
| @@ -206,7 +206,7 @@ Note:  Some older Catalyst switches will only talk SNMP version 1.  Some | ||||
| newer ones will not return all their data if connected via Version 1. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
| 
 | ||||
|  my $cat = new SNMP::Info::Layer2::Catalyst(...); | ||||
| 
 | ||||
| @@ -246,7 +246,7 @@ Returns 'catalyst' | ||||
| 
 | ||||
| =item $cat->os_ver() | ||||
| 
 | ||||
| Tries to use the value from SNMP::Info::CiscoStats->os_ver() and if it fails  | ||||
| Tries to use the value from SNMP::Info::CiscoStats->os_ver() and if it fails | ||||
| it grabs $cat->m_swver()->{1} and uses that. | ||||
| 
 | ||||
| =item $cat->vendor() | ||||
| @@ -279,11 +279,11 @@ to a hash. | ||||
| =item $cat->interfaces() | ||||
| 
 | ||||
| Returns the map between SNMP Interface Identifier (iid) and physical port | ||||
| name.  | ||||
| name. | ||||
| 
 | ||||
| =item $cat->i_name() | ||||
| 
 | ||||
| Returns reference to hash of iid to human set name.  | ||||
| Returns reference to hash of iid to human set name. | ||||
| 
 | ||||
| C<portName> | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Centillion | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,9 +30,9 @@ | ||||
| package SNMP::Info::Layer2::Centillion; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::NortelStack; | ||||
| use SNMP::Info::SONMP; | ||||
| 
 | ||||
| @@ -41,9 +40,9 @@ use SNMP::Info::SONMP; | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/; | ||||
| @SNMP::Info::Layer2::Centillion::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
| @@ -274,14 +273,14 @@ Eric Miller | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $centillion = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $centillion->class(); | ||||
| @@ -289,14 +288,9 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Centillion device through SNMP.  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Centillion device through SNMP. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
|  my $centillion = new SNMP::Info::Layer2::centillion(...); | ||||
|   | ||||
| Note:  This class supports version 4.X and 5.X which are VLAN based rather | ||||
| than bridge group based. | ||||
| 
 | ||||
| @@ -328,7 +322,7 @@ than bridge group based. | ||||
| 
 | ||||
| =item Inherited Classes' MIBs | ||||
| 
 | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
| See L<SNMP::Info/"REQUIREMENTS"> for its own MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| @@ -346,7 +340,7 @@ These are methods that return scalar value from SNMP | ||||
| 
 | ||||
| =item $centillion->vendor() | ||||
| 
 | ||||
| Returns 'Nortel' | ||||
| Returns 'nortel' | ||||
| 
 | ||||
| =item $centillion->model() | ||||
| 
 | ||||
| @@ -357,7 +351,7 @@ Removes C<sreg-> from the model name | ||||
| 
 | ||||
| =item $centillion->os() | ||||
| 
 | ||||
| Returns 'Centillion' | ||||
| Returns 'centillion' | ||||
| 
 | ||||
| =item $centillion->tftp_action() | ||||
| 
 | ||||
| @@ -399,7 +393,7 @@ start at 0.  Returns 0. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| @@ -430,7 +424,7 @@ to a hash. | ||||
|     formula: | ||||
|       port = index % 256 | ||||
|       slot = int(index / 256) | ||||
|   | ||||
| 
 | ||||
|     The physical port name is returned as slot.port. | ||||
| 
 | ||||
| =item $centillion->i_duplex() | ||||
| @@ -469,13 +463,13 @@ Returns a mapping between C<ifIndex> and the VLAN. | ||||
| 
 | ||||
| =item $centillion->centillion_p_index() | ||||
| 
 | ||||
| Returns reference to hash.  Maps table IIDs to Interface IIDs  | ||||
| Returns reference to hash.  Maps table IIDs to Interface IIDs | ||||
| 
 | ||||
| (C<cnDot3ExtnIfIndex>) | ||||
| 
 | ||||
| =item $centillion->centillion_p_duplex() | ||||
| 
 | ||||
| Returns reference to hash.  Maps port operational duplexes to IIDs  | ||||
| Returns reference to hash.  Maps port operational duplexes to IIDs | ||||
| 
 | ||||
| (C<cnDot3ExtnIfOperConnectionType>) | ||||
| 
 | ||||
| @@ -493,19 +487,19 @@ Returns reference to hash.  Maps port admin duplexes to IIDs | ||||
| 
 | ||||
| =item $centillion->centillion_i_vlan_index() | ||||
| 
 | ||||
| Returns reference to hash.  Key: Table entry, Value: Index  | ||||
| Returns reference to hash.  Key: Table entry, Value: Index | ||||
| 
 | ||||
| (C<cnVlanPortMemberIfIndex>) | ||||
| 
 | ||||
| =item $centillion->centillion_i_vlan() | ||||
| 
 | ||||
| Returns reference to hash.  Key: Table entry, Value: VLAN ID  | ||||
| Returns reference to hash.  Key: Table entry, Value: VLAN ID | ||||
| 
 | ||||
| (C<cnVlanPortMemberVID>) | ||||
| 
 | ||||
| =item $centillion->centillion_i_vlan_type() | ||||
| 
 | ||||
| Returns reference to hash.  Key: Table entry, Value: VLAN Type  | ||||
| Returns reference to hash.  Key: Table entry, Value: VLAN Type | ||||
| 
 | ||||
| (C<cnVlanPortMemberIngressType>) | ||||
| 
 | ||||
| @@ -513,7 +507,7 @@ Returns reference to hash.  Key: Table entry, Value: VLAN Type | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info/"USAGE"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Cisco | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -31,6 +30,7 @@ | ||||
| package SNMP::Info::Layer2::Cisco; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::CiscoVTP; | ||||
| use SNMP::Info::CDP; | ||||
| @@ -50,9 +50,9 @@ use SNMP::Info::Layer2; | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -117,7 +117,7 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $cisco = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -125,7 +125,7 @@ Max Baker | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $cisco->class(); | ||||
| @@ -194,7 +194,7 @@ These are methods that return scalar value from SNMP | ||||
| 
 | ||||
| =item $cisco->vendor() | ||||
| 
 | ||||
|     Returns 'cisco' | ||||
| Returns 'cisco' | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -226,10 +226,6 @@ See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details. | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::CiscoAgg | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::CiscoAgg/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::CiscoSB | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2013 Nic Bernstein | ||||
| # | ||||
| @@ -35,69 +34,68 @@ | ||||
| package SNMP::Info::Layer2::CiscoSB; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::Entity; | ||||
| use SNMP::Info::EtherLike; | ||||
| use SNMP::Info::CiscoStats; | ||||
| use SNMP::Info::CiscoConfig; | ||||
| use SNMP::Info::CDP; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::CiscoSB::ISA | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::EtherLike | ||||
|     SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/; | ||||
| @SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| 
 | ||||
| # This will be filled in with the device's index into the EntPhysicalEntry | ||||
| # table by the serial() function. | ||||
| our $index = undef; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::Entity::GLOBALS, | ||||
|     %SNMP::Info::EtherLike::GLOBALS, | ||||
|     %SNMP::Info::CiscoStats::GLOBALS, | ||||
|     %SNMP::Info::CiscoConfig::GLOBALS, | ||||
|     %SNMP::Info::CDP::GLOBALS, | ||||
|     'descr'  => 'sysDescr' | ||||
|     'descr'  => 'sysDescr', | ||||
|     'mac'    => 'rndBasePhysicalAddress', | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::Entity::FUNCS, | ||||
|     %SNMP::Info::EtherLike::FUNCS, | ||||
|     %SNMP::Info::CiscoStats::FUNCS, | ||||
|     %SNMP::Info::CiscoConfig::FUNCS, | ||||
|     %SNMP::Info::CDP::FUNCS, | ||||
|     'peth_port_power' => 'rlPethPsePortOutputPower', | ||||
| ); | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::Entity::MIBS, | ||||
|     %SNMP::Info::EtherLike::MIBS, | ||||
|     %SNMP::Info::CiscoStats::MIBS, | ||||
|     %SNMP::Info::CiscoConfig::MIBS, | ||||
|     %SNMP::Info::CDP::MIBS, | ||||
|     'CISCOSB-POE-MIB'          => 'rlPethPsePortOutputPower', | ||||
|     'CISCOSB-DEVICEPARAMS-MIB' => 'rndBasePhysicalAddress', | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     %SNMP::Info::Entity::MUNGE, | ||||
|     %SNMP::Info::EtherLike::MUNGE, | ||||
|     %SNMP::Info::CiscoStats::MUNGE, | ||||
|     %SNMP::Info::CiscoConfig::MUNGE, | ||||
|     %SNMP::Info::CDP::MUNGE, | ||||
| ); | ||||
| 
 | ||||
| 
 | ||||
| sub vendor { | ||||
|     return 'cisco'; | ||||
| } | ||||
| 
 | ||||
| sub os { | ||||
|     return 'ros'; | ||||
| } | ||||
| 
 | ||||
| # Walk the entPhysicalSerialNum table and return the first serial found | ||||
| sub serial { | ||||
|     my $ciscosb  = shift; | ||||
| @@ -113,24 +111,51 @@ sub serial { | ||||
| 
 | ||||
| sub os_ver { | ||||
|     my $ciscosb = shift; | ||||
|     my $os_ver  = $ciscosb->e_swver(); | ||||
|     my $e_swver  = $ciscosb->e_swver(); | ||||
| 
 | ||||
|     return $os_ver->{$index} if defined $index; | ||||
|     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_model = $ciscosb->e_model(); | ||||
|     my $e_hwver = $ciscosb->e_hwver(); | ||||
| 
 | ||||
|     if (defined ($index)) { | ||||
|         my $model = "$e_model->{$index} $e_hwver->{$index}"; | ||||
|         return $model; | ||||
|     foreach my $e ( sort keys %$e_model ) { | ||||
|         if (defined $e_model->{$e} and $e_model->{$e} !~ /^\s*$/) { | ||||
|             return $e_model->{$e}; | ||||
|             #my $model = "$e_model->{$e} $e_hwver->{$e}"; | ||||
|             #return $model; | ||||
|         } | ||||
|     } | ||||
|     return $ciscosb->description(); | ||||
| } | ||||
| 
 | ||||
| # CISCOSBinterfaces.mib also contains duplex info if needed | ||||
| sub i_duplex { | ||||
|     my $ciscosb = shift; | ||||
|     my $partial = shift; | ||||
| 
 | ||||
|     my $el_duplex = $ciscosb->el_duplex($partial); | ||||
| 
 | ||||
|     if ( defined $el_duplex and scalar( keys %$el_duplex ) ) { | ||||
|         my %i_duplex; | ||||
|         foreach my $el_port ( keys %$el_duplex ) { | ||||
|             my $duplex = $el_duplex->{$el_port}; | ||||
|             next unless defined $duplex; | ||||
| 
 | ||||
|             $i_duplex{$el_port} = 'half' if $duplex =~ /half/i; | ||||
|             $i_duplex{$el_port} = 'full' if $duplex =~ /full/i; | ||||
|         } | ||||
|         return \%i_duplex; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| # ifDescr is the same for all interfaces in a class, but the ifName is | ||||
| # unique, so let's use that for port name. | ||||
| sub interfaces { | ||||
| @@ -142,7 +167,6 @@ sub interfaces { | ||||
|     return $interfaces; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
| __END__ | ||||
| 
 | ||||
| @@ -156,14 +180,14 @@ Nic Bernstein (shamelessly stolen from Max Baker's Aironet code) | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # 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(); | ||||
| @@ -178,15 +202,15 @@ managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises( | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item SNMP::Info::Layer2 | ||||
| =item SNMP::Info::CDP | ||||
| 
 | ||||
| =item SNMP::Info::Entity | ||||
| 
 | ||||
| =item SNMP::Info::EtherLike | ||||
| =item SNMP::Info::CiscoConfig | ||||
| 
 | ||||
| =item SNMP::Info::CiscoStats | ||||
| 
 | ||||
| =item SNMP::Info::CiscoConfig | ||||
| =item SNMP::Info::EtherLike | ||||
| 
 | ||||
| =item SNMP::Info::Layer2 | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -194,6 +218,10 @@ managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises( | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item F<CISCOSB-DEVICEPARAMS-MIB> | ||||
| 
 | ||||
| =item F<CISCOSB-POE-MIB> | ||||
| 
 | ||||
| =item Inherited Classes | ||||
| 
 | ||||
| MIBs required by the inherited classes listed above. | ||||
| @@ -202,13 +230,13 @@ MIBs required by the inherited classes listed above. | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar value from SNMP | ||||
| These are methods that return scalar value from SNMP. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $ciscosb->vendor() | ||||
| =item $ciscosb->mac() | ||||
| 
 | ||||
| Returns 'cisco' | ||||
| Returns mac from (C<rndBasePhysicalAddress>) | ||||
| 
 | ||||
| =item $ciscosb->os_ver() | ||||
| 
 | ||||
| @@ -225,20 +253,43 @@ Returns model and hardware revision of unit | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Overrides | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $ciscosb->vendor() | ||||
| 
 | ||||
| Returns 'cisco'. | ||||
| 
 | ||||
| =item $ciscosb->os() | ||||
| 
 | ||||
| Returns 'ros'. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Entity | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::EtherLike | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head1 TABLE METHODS | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $ciscosb->peth_port_power() | ||||
| 
 | ||||
| Power supplied by PoE ports, in milliwatts. | ||||
| (C<rlPethPsePortOutputPower>) | ||||
| 
 | ||||
| =item $ciscosb->i_duplex() | ||||
| 
 | ||||
| Return duplex based upon the result of EtherLike->el_duplex(). | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Overrides | ||||
| 
 | ||||
| =over | ||||
| @@ -253,10 +304,6 @@ Uses the i_name() field. | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Entity | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::EtherLike | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details. | ||||
							
								
								
									
										201
									
								
								lib/SNMP/Info/Layer2/Exinda.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								lib/SNMP/Info/Layer2/Exinda.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
| # SNMP::Info::Layer2::Exinda | ||||
| # | ||||
| # Copyright (c) 2018 nick nauwelaerts | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Exinda; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
|  | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Exinda::ISA = qw/ | ||||
|     SNMP::Info::Layer2 | ||||
|     Exporter | ||||
| /; | ||||
| @SNMP::Info::Layer2::Exinda::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'EXINDA-MIB' => 'systemVersion', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     # EXINDA-MIB | ||||
|     'exinda_model' => 'hardwareSeries', | ||||
|     'serial1'      => 'systemHostId', | ||||
|     'uptime'       => 'systemUptime', | ||||
|     'os_ver'       => 'systemVersion', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
| ); | ||||
|  | ||||
|  | ||||
| # layer 2: bridged shaping and failopen interfaces | ||||
| # layer 3/4: ip and layer 4 protocol fiddling and accell | ||||
| # layer 7: wccp support | ||||
| sub layers { | ||||
|     return '01001110'; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'exinda'; | ||||
| } | ||||
|  | ||||
| # overwrite l2->model, hardwareSeries returns a plain string | ||||
| sub model { | ||||
|     my $exinda = shift; | ||||
|     return $exinda->exinda_model; | ||||
| } | ||||
|  | ||||
| # systemHostId (and thus serial1) is actually also a mac address | ||||
| sub mac { | ||||
|     my $exinda = shift; | ||||
|     my $exinda_mac = $exinda->serial1; | ||||
|  | ||||
|     return unless (defined $exinda_mac && (length $exinda_mac) == 12); | ||||
|     return join(":", $exinda_mac =~ m/\w{2}/g); | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'exos'; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Exinda - SNMP Interface to exinda / gfi traffic shapers. | ||||
|  | ||||
| =head1 AUTHORS | ||||
|  | ||||
| nick nauwelaerts | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|     # Let SNMP::Info determine the correct subclass for you. | ||||
|     my $exinda = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|     my $class      = $exinda->class(); | ||||
|     print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for exinda / gfi network orchestrator traffic shapers. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<EXINDA-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $exinda->layers() | ||||
|  | ||||
| Returns '01001110'. | ||||
|  | ||||
| =item $exinda->mac() | ||||
|  | ||||
| Returns a mac address extracted from C<systemHostId>. | ||||
|  | ||||
| =item $exinda->model() | ||||
|  | ||||
| Returns C<hardwareSeries>. | ||||
|  | ||||
| =item $exinda->os() | ||||
|  | ||||
| Returns 'exos'. | ||||
|  | ||||
| =item $exinda->os_ver() | ||||
|  | ||||
| Returns C<systemVersion>. | ||||
|  | ||||
| =item $exinda->uptime() | ||||
|  | ||||
| Returns the uptime extracted from C<systemUptime>. | ||||
|  | ||||
| =item $exinda->vendor() | ||||
|  | ||||
| Returns 'exinda'. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Global Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE ENTRIES | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::HP - SNMP Interface to HP ProCurve Switches | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,48 +32,47 @@ | ||||
| package SNMP::Info::Layer2::HP; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::MAU; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::CDP; | ||||
| use SNMP::Info::Aggregate; | ||||
| use SNMP::Info::Aggregate 'agg_ports_ifstack'; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::HP::ISA = qw/ | ||||
|     SNMP::Info::Aggregate | ||||
|     SNMP::Info::Layer3  | ||||
|     SNMP::Info::MAU  | ||||
|     SNMP::Info::LLDP | ||||
|     SNMP::Info::CDP  | ||||
|     SNMP::Info::Layer3 | ||||
|     SNMP::Info::MAU | ||||
|     SNMP::Info::CDP | ||||
|     Exporter | ||||
| /; | ||||
| @SNMP::Info::Layer2::HP::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MODEL_MAP, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %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', | ||||
|     'NETSWITCH-MIB'  => 'hpMsgBufFree', | ||||
|     'CONFIG-MIB'     => 'hpSwitchConfig', | ||||
|     'HP-ICF-CHASSIS' => 'hpicfSensorObjectId', | ||||
|     'HP-ICF-BRIDGE'  => 'hpicfBridgeRstpForceVersion', | ||||
|     'HP-ICF-POE-MIB' => 'hpicfPoePethPsePortCurrent', | ||||
|     'SEMI-MIB'       => 'hpHttpMgSerialNumber', | ||||
|     'RFC1271-MIB'            => 'logDescription', | ||||
|     'HP-ICF-OID'             => 'hpSwitch4000', | ||||
|     'STATISTICS-MIB'         => 'hpSwitchCpuStat', | ||||
|     'NETSWITCH-MIB'          => 'hpMsgBufFree', | ||||
|     'CONFIG-MIB'             => 'hpSwitchConfig', | ||||
|     'HP-ICF-CHASSIS'         => 'hpicfSensorObjectId', | ||||
|     'HP-ICF-BRIDGE'          => 'hpicfBridgeRstpForceVersion', | ||||
|     'HP-ICF-POE-MIB'         => 'hpicfPoePethPsePortCurrent', | ||||
|     'SEMI-MIB'               => 'hpHttpMgSerialNumber', | ||||
|     'HP-SWITCH-PL-MIB'       => 'hpSwitchProliant', | ||||
|     'BLADETYPE4-NETWORK-MIB' => 'hpProLiant-GbE2c-InterconnectSwitch', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::MAU::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::CDP::GLOBALS, | ||||
|     %SNMP::Info::Aggregate::GLOBALS, | ||||
|     'serial1'      => 'entPhysicalSerialNum.1', | ||||
| @@ -93,7 +91,6 @@ $VERSION = '3.19'; | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::MAU::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::CDP::FUNCS, | ||||
|     %SNMP::Info::Aggregate::FUNCS, | ||||
|     'i_type2'   => 'ifType', | ||||
| @@ -110,7 +107,7 @@ $VERSION = '3.19'; | ||||
|     'hp_s_oid'    => 'hpicfSensorObjectId', | ||||
|     'hp_s_name'   => 'hpicfSensorDescr', | ||||
|     'hp_s_status' => 'hpicfSensorStatus', | ||||
|      | ||||
| 
 | ||||
|     # HP-ICF-POE-MIB | ||||
|     'peth_port_power'   => 'hpicfPoePethPsePortPower', | ||||
| ); | ||||
| @@ -119,7 +116,6 @@ $VERSION = '3.19'; | ||||
|     # 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, | ||||
| @@ -127,10 +123,12 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
| 
 | ||||
| # Model map, reverse sorted by common model name (sort -k2 -r) | ||||
| # Potential sources for model information: http://www.hp.com/rnd/software/switches.htm or HP-ICF-OID MIB  | ||||
| # Potential sources for model information: http://www.hp.com/rnd/software/switches.htm or HP-ICF-OID MIB | ||||
| %MODEL_MAP = ( | ||||
|     'J8131A' => 'WAP-420-WW', | ||||
|     'J8130A' => 'WAP-420-NA', | ||||
|     'J9833A' => 'PS1810-8G', | ||||
|     'J9834A' => 'PS1810-24G', | ||||
|     'J8133A' => 'AP520WL', | ||||
|     'J8680A' => '9408sl', | ||||
|     'J9091A' => '8212zl', | ||||
| @@ -145,8 +143,10 @@ $VERSION = '3.19'; | ||||
|     'J8992A' => '6200yl-24G', | ||||
|     'J4902A' => '6108', | ||||
|     'J8698A' => '5412zl', | ||||
|     'J9851A' => '5412R-zl2', | ||||
|     'J8719A' => '5408yl', | ||||
|     'J8697A' => '5406zl', | ||||
|     'J9850A' => '5406R-zl2', | ||||
|     'J8718A' => '5404yl', | ||||
|     'J4819A' => '5308XL', | ||||
|     'J4850A' => '5304XL', | ||||
| @@ -158,6 +158,12 @@ $VERSION = '3.19'; | ||||
|     'J8771A' => '4202vl-48G', | ||||
|     'J4865A' => '4108GL', | ||||
|     'J4887A' => '4104GL', | ||||
|     'JL074A' => '3810M-48G-PoE+', | ||||
|     'JL072A' => '3810M-48G', | ||||
|     'JL076A' => '3810M-40G-8SR-PoE+', | ||||
|     'JL073A' => '3810M-24G-PoE+', | ||||
|     'JL071A' => '3810M-24G', | ||||
|     'JL075A' => '3810M-16SFP+', | ||||
|     'J9588A' => '3800-48G-PoE+-4XG', | ||||
|     'J9574A' => '3800-48G-PoE+-4SFP+', | ||||
|     'J9586A' => '3800-48G-4XG', | ||||
| @@ -177,9 +183,30 @@ $VERSION = '3.19'; | ||||
|     'J4905A' => '3400cl-24G', | ||||
|     'J4815A' => '3324XL', | ||||
|     'J4851A' => '3124', | ||||
|     'JL322A' => '2930M-48G-PoE+', | ||||
|     'JL321A' => '2930M-48G', | ||||
|     'JL323A' => '2930M-40G-8SR-PoE+', | ||||
|     'JL320A' => '2930M-24G-PoE+', | ||||
|     'JL324A' => '2930M-24G-8SR-PoE+', | ||||
|     'JL319A' => '2930M-24G', | ||||
|     'JL258A' => '2930F-8G-PoE+-2SFP+', | ||||
|     'JL558A' => '2930F-48G-PoE+-4SFP+-740W', | ||||
|     'JL557A' => '2930F-48G-PoE+-4SFP-740W', | ||||
|     'JL256A' => '2930F-48G-PoE+-4SFP+', | ||||
|     'JL262A' => '2930F-48G-PoE+-4SFP', | ||||
|     'JL254A' => '2930F-48G-4SFP+', | ||||
|     'JL260A' => '2930F-48G-4SFP', | ||||
|     'JL255A' => '2930F-24G-PoE+-4SFP+', | ||||
|     'JL261A' => '2930F-24G-PoE+-4SFP', | ||||
|     'JL253A' => '2930F-24G-4SFP+', | ||||
|     'JL259A' => '2930F-24G-4SFP', | ||||
|     'J9729A' => '2920-48G-PoE+', | ||||
|     'J9729A' => '2920-48G-PoE+', | ||||
|     'J9728A' => '2920-48G', | ||||
|     'J9728A' => '2920-48G', | ||||
|     'J9727A' => '2920-24G-PoE+', | ||||
|     'J9727A' => '2920-24G-PoE+', | ||||
|     'J9726A' => '2920-24G', | ||||
|     'J9726A' => '2920-24G', | ||||
|     'J9562A' => '2915-8G-PoE', | ||||
|     'J9148A' => '2910al-48G-PoE+', | ||||
| @@ -192,30 +219,47 @@ $VERSION = '3.19'; | ||||
|     'J4903A' => '2824', | ||||
|     'J9022A' => '2810-48G', | ||||
|     'J9021A' => '2810-24G', | ||||
|     'J4899C' => '2650C', | ||||
|     'J8165A' => '2650-PWR', | ||||
|     'J4899B' => '2650-CR', | ||||
|     'J4899C' => '2650C', | ||||
|     'J4899A' => '2650', | ||||
|     'J4900C' => '2626C', | ||||
|     'J8164A' => '2626-PWR', | ||||
|     'J4900B' => '2626-CR', | ||||
|     'J4900C' => '2626C', | ||||
|     'J4900A' => '2626', | ||||
|     'J9627A' => '2620-48-PoE+', | ||||
|     'J9626A' => '2620-48', | ||||
|     'J9625A' => '2620-24-PoE+', | ||||
|     'J9624A' => '2620-24-PPoE+', | ||||
|     'J9625A' => '2620-24-PoE+', | ||||
|     'J9623A' => '2620-24', | ||||
|     'J9565A' => '2615-8-PoE', | ||||
|     'J9089A' => '2610-48-PWR', | ||||
|     'J9088A' => '2610-48', | ||||
|     'J9086A' => '2610-24/12PWR', | ||||
|     'J9087A' => '2610-24-PWR', | ||||
|     'J9086A' => '2610-24/12PWR', | ||||
|     'J9085A' => '2610-24', | ||||
|     'J8762A' => '2600-8-PWR', | ||||
|     'JL357A' => '2540-48G-PoE+-4SFP+', | ||||
|     'JL355A' => '2540-48G-4SFP+', | ||||
|     'JL356A' => '2540-24G-PoE+-4SFP+', | ||||
|     'JL354A' => '2540-24G-4SFP+', | ||||
|     'JL070A' => '2530-8-PoE+ Internal PS', | ||||
|     'J9780A' => '2530-8-PoE+', | ||||
|     'J9774A' => '2530-8G-PoEP', | ||||
|     'J9777A' => '2530-8G', | ||||
|     'J9783A' => '2530-8', | ||||
|     'J9778A' => '2530-48-PoE+', | ||||
|     'J9853A' => '2530-48G-PoE+-2SFP+', | ||||
|     'J9772A' => '2530-48G-PoE+', | ||||
|     'J9855A' => '2530-48G-2SFP+', | ||||
|     'J9775A' => '2530-48G', | ||||
|     'J9781A' => '2530-48', | ||||
|     'J9779A' => '2530-24-PoE+', | ||||
|     'J9854A' => '2530-24G-PoE+-2SFP+', | ||||
|     'J9773A' => '2530-24G-PoE+', | ||||
|     'J9856A' => '2530-24G-2SFP+', | ||||
|     'J9776A' => '2530-24G', | ||||
|     'J9782A' => '2530-24', | ||||
|     'J4813A' => '2524', | ||||
|     'J9298A' => '2520G-8-PoE', | ||||
|     'J9299A' => '2520G-24-PoE', | ||||
| @@ -231,6 +275,8 @@ $VERSION = '3.19'; | ||||
|     'J4817A' => '2312', | ||||
|     'J9449A' => '1810G-8', | ||||
|     'J9450A' => '1810G-24', | ||||
|     'J9802A' => '1810-8G', | ||||
|     'J9803A' => '1810-24G', | ||||
|     'J9029A' => '1800-8G', | ||||
|     'J9028A' => '1800-24G', | ||||
| ); | ||||
| @@ -269,7 +315,7 @@ sub os_ver { | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| # Regular managed ProCurve switches have the serial num in entity mib,  | ||||
| # Regular managed ProCurve switches have the serial num in entity mib, | ||||
| # the web-managed models in the semi mib (hphttpmanageable). | ||||
| sub serial { | ||||
|     my $hp = shift; | ||||
| @@ -287,7 +333,7 @@ sub model { | ||||
|     my $model = &SNMP::translateObj($id); | ||||
|     return $id unless defined $model; | ||||
| 
 | ||||
|     $model =~ s/^hpswitch//i; | ||||
|     $model =~ s/^(hp|aruba)switch//i; | ||||
| 
 | ||||
|     return defined $MODEL_MAP{$model} ? $MODEL_MAP{$model} : $model; | ||||
| } | ||||
| @@ -536,30 +582,6 @@ sub set_i_vlan_tagged { | ||||
| 
 | ||||
| sub agg_ports { return agg_ports_ifstack(@_) } | ||||
| 
 | ||||
| sub qb_fw_vlan { | ||||
|     my $hp = shift; | ||||
|     my $partial = shift; | ||||
|     my $qb_fw_vlan = $hp->SUPER::qb_fw_vlan($partial); | ||||
| 
 | ||||
|     my $fdb_to_dot1q = {}; | ||||
|     my $fdb_id = $hp->dot1qVlanFdbId(0); | ||||
|     foreach my $fdb_entry (keys %$fdb_id) { | ||||
|         my ($timemark, $vlan_id) = split(/\./, $fdb_entry); | ||||
|         $fdb_to_dot1q->{$fdb_id->{$fdb_entry}} = $vlan_id; | ||||
|     } | ||||
|     foreach my $learn (keys %$qb_fw_vlan) { | ||||
|         my $fdb_idx = $qb_fw_vlan->{$learn}; | ||||
|         if (exists $fdb_to_dot1q->{$fdb_idx}) { | ||||
|             $qb_fw_vlan->{$learn} = $fdb_to_dot1q->{$fdb_idx};  | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return $qb_fw_vlan; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 1; | ||||
| __END__ | ||||
| 
 | ||||
| @@ -573,14 +595,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $hp = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $hp->class(); | ||||
| @@ -588,15 +610,15 @@ Max Baker | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| HP ProCurve Switch via SNMP.  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| HP ProCurve Switch via SNMP. | ||||
| 
 | ||||
| Note:  Some HP Switches will connect via SNMP version 1, but a lot of config | ||||
| data will not be available.  Make sure you try and connect with Version 2 | ||||
| first, and then fail back to version 1. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
| 
 | ||||
|  my $hp = new SNMP::Info::Layer2::HP(...); | ||||
| 
 | ||||
| @@ -606,8 +628,6 @@ after determining a more specific class using the method above. | ||||
| 
 | ||||
| =item SNMP::Info::Layer2 | ||||
| 
 | ||||
| =item SNMP::Info::LLDP | ||||
| 
 | ||||
| =item SNMP::Info::MAU | ||||
| 
 | ||||
| =back | ||||
| @@ -634,6 +654,14 @@ Included in V2 mibs from Cisco | ||||
| 
 | ||||
| =item F<HP-ICF-POE-MIB> | ||||
| 
 | ||||
| =item F<HP-ICF-CHASSIS> | ||||
| 
 | ||||
| =item F<SEMI-MIB> | ||||
| 
 | ||||
| =item F<HP-SWITCH-PL-MIB> | ||||
| 
 | ||||
| =item F<BLADETYPE4-NETWORK-MIB> | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| The last four MIBs listed are from HP and can be found at | ||||
| @@ -827,22 +855,12 @@ Power supplied by PoE ports, in milliwatts | ||||
| Returns what version of STP the device is running. | ||||
| (C<hpicfBridgeRstpForceVersion> with fallback to inherited stp_ver()) | ||||
| 
 | ||||
| =item $hp->qb_fw_vlan() | ||||
| 
 | ||||
| Returns reference to hash of forwarding table entries VLAN ID | ||||
| 
 | ||||
| (C<dot1qFdbId>), (C<rcBridgeTpFdbVlanId>) | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| 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. | ||||
| @@ -856,7 +874,7 @@ to a hash. | ||||
| 
 | ||||
| =over 4 | ||||
| 
 | ||||
| =item $hp->interfaces()  | ||||
| =item $hp->interfaces() | ||||
| 
 | ||||
| Uses $hp->i_description() | ||||
| 
 | ||||
| @@ -894,10 +912,6 @@ ifIndex of the corresponding master ports. | ||||
| 
 | ||||
| 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. | ||||
| @@ -917,7 +931,7 @@ Munge for c_id which handles CDP and LLDP. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -32,6 +32,7 @@ | ||||
| package SNMP::Info::Layer2::HP4000; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::MAU; | ||||
| @@ -42,14 +43,13 @@ use SNMP::Info::CDP; | ||||
|     SNMP::Info::CDP Exporter/; | ||||
| @SNMP::Info::Layer2::HP4000::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MODEL_MAP, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::CDP::MIBS, | ||||
|     'RFC1271-MIB'    => 'logDescription', | ||||
|     'HP-ICF-OID'     => 'hpSwitch4000', | ||||
| @@ -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; | ||||
| @@ -413,7 +427,7 @@ sub set_i_vlan { | ||||
|                     $hp->error_throw("Error removing previous untagged vlan from port, should never happen...\n") unless defined $rv; | ||||
|                 } | ||||
|             } else { | ||||
|                 # If vlan change was not succesful, try to revert to the old situation. | ||||
|                 # If vlan change was not successful, try to revert to the old situation. | ||||
|                 if (defined $old_untagged) { | ||||
|                     $rv = $hp->set_hp_v_if_tag(2, $old_untagged) if defined $old_untagged; | ||||
|                     if (defined $rv) { | ||||
| @@ -468,14 +482,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $hp = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $hp->class(); | ||||
| @@ -483,18 +497,13 @@ Max Baker | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| HP ProCurve Switch via SNMP.  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| HP ProCurve Switch via SNMP. | ||||
| 
 | ||||
| Note:  Some HP Switches will connect via SNMP version 1, but a lot of config | ||||
| data will not be available.  Make sure you try and connect with Version 2 | ||||
| first, and then fail back to version 1. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
|  my $hp = new SNMP::Info::Layer2::HP4000(...); | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| @@ -569,7 +578,7 @@ Returns bytes of used memory | ||||
| Returns the model number of the HP Switch.  Will translate between the HP Part | ||||
| number and the common model number with this map : | ||||
| 
 | ||||
|  %MODEL_MAP = (  | ||||
|  %MODEL_MAP = ( | ||||
|                 'J4093A' => '2424M', | ||||
|                 'J4110A' => '8000M', | ||||
|                 'J4120A' => '1600M', | ||||
| @@ -638,7 +647,7 @@ to a hash. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $hp->interfaces()  | ||||
| =item $hp->interfaces() | ||||
| 
 | ||||
| Uses $hp->i_description() | ||||
| 
 | ||||
| @@ -673,13 +682,19 @@ It is the union of tagged, untagged, and auto ports. | ||||
|   Example: | ||||
|   my $interfaces = $hp->interfaces(); | ||||
|   my $vlans      = $hp->i_vlan_membership(); | ||||
|    | ||||
| 
 | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
|     print "Port: $port VLAN: $vlan\n"; | ||||
|   } | ||||
| 
 | ||||
| =item $hp->i_vlan_membership_untagged() | ||||
| 
 | ||||
| Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN | ||||
| IDs.  These are the VLANs which are members of the untagged egress list for | ||||
| the port. | ||||
| 
 | ||||
| =item $hp->v_index() | ||||
| 
 | ||||
| Returns VLAN IDs | ||||
| @@ -711,7 +726,7 @@ See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| @@ -31,21 +31,20 @@ | ||||
| package SNMP::Info::Layer2::HPVC; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::LLDP; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::HPVC::ISA | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::LLDP Exporter/; | ||||
|     = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'HPVC-MIB'       => 'vcDomainName', | ||||
|     'CPQSINFO-MIB'   => 'cpqSiSysSerialNum', | ||||
|     'HPVCMODULE-MIB' => 'vcModuleDomainName', | ||||
| @@ -53,7 +52,6 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'serial1'      => 'cpqSiSysSerialNum.0', | ||||
|     'os_ver'       => 'cpqHoSWRunningVersion.1', | ||||
|     'os_bin'       => 'cpqHoFwVerVersion.1', | ||||
| @@ -62,17 +60,13 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|      | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     # Inherit all the built in munging | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| ); | ||||
| 
 | ||||
| 
 | ||||
| # Method Overrides | ||||
| 
 | ||||
| sub os { | ||||
| @@ -102,14 +96,14 @@ Jeroen van Ingen | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $hp = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $hp->class(); | ||||
| @@ -117,13 +111,8 @@ Jeroen van Ingen | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| HP Virtual Connect Switch via SNMP.  | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
|  my $hp = new SNMP::Info::Layer2::HPVC(...); | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| HP Virtual Connect Switch via SNMP. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| @@ -188,27 +177,15 @@ See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
| 
 | ||||
| =head2 Overrides | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head1 MUNGES | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 SET METHODS | ||||
| 
 | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations.  | ||||
| operations. | ||||
| 
 | ||||
| =cut | ||||
| @@ -28,15 +28,16 @@ package SNMP::Info::Layer2::Kentrox; | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::Kentrox::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Kentrox::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
| @@ -57,36 +58,38 @@ $VERSION = '3.19'; | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, ); | ||||
| 
 | ||||
| sub os { | ||||
|     return 'Kentrox'; | ||||
|     return 'kentrox'; | ||||
| } | ||||
| 
 | ||||
| sub os_ver { | ||||
|     my $dsver = shift; | ||||
|     my $descr = $dsver->description(); | ||||
|     if ( $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){ | ||||
|     if ( defined ($descr) && $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){ | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub serial { | ||||
|     my $dsserial = shift; | ||||
|     my $serial = $dsserial->ds_sysinfo(); | ||||
|     if ( $serial =~ /SERIAL\s(\S+)/){ | ||||
|     if ( defined ($serial) && $serial =~ /SERIAL\s(\S+)/){ | ||||
|         my $str = substr($1,8,10); | ||||
|         return $str; | ||||
|     } | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| sub vendor { | ||||
|     return 'Kentrox'; | ||||
|     return 'kentrox'; | ||||
| } | ||||
| 
 | ||||
| sub model { | ||||
|     my $dsmodel = shift; | ||||
|     my $descr = $dsmodel->description(); | ||||
|     if ( $descr =~ /^(\S+\s\S+)/){ | ||||
|     if ( defined ($descr) && $descr =~ /^(\S+\s\S+)/){ | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
| @@ -108,7 +111,7 @@ phishphreek@gmail.com | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -166,12 +169,6 @@ See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
| 
 | ||||
| =head2 Overrides | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::N2270 | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,38 +30,42 @@ | ||||
| package SNMP::Info::Layer2::N2270; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::SONMP; | ||||
| use SNMP::Info::Airespace; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::N2270::ISA | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::SONMP SNMP::Info::Airespace Exporter/; | ||||
|     = qw/SNMP::Info::Layer2 SNMP::Info::SONMP SNMP::Info::Airespace Exporter/; | ||||
| @SNMP::Info::Layer2::N2270::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD, $INIT, $DEBUG); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS,        %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::SONMP::MIBS, %SNMP::Info::Airespace::MIBS, | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::SONMP::MIBS, | ||||
|     %SNMP::Info::Airespace::MIBS, | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS,        %SNMP::Info::Bridge::GLOBALS, | ||||
|     %SNMP::Info::SONMP::GLOBALS, %SNMP::Info::Airespace::GLOBALS, | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     %SNMP::Info::SONMP::GLOBALS, | ||||
|     %SNMP::Info::Airespace::GLOBALS, | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS,        %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::SONMP::FUNCS, %SNMP::Info::Airespace::FUNCS, | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::SONMP::FUNCS, | ||||
|     %SNMP::Info::Airespace::FUNCS, | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::MUNGE,        %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::SONMP::MUNGE, %SNMP::Info::Airespace::MUNGE, | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     %SNMP::Info::SONMP::MUNGE, | ||||
|     %SNMP::Info::Airespace::MUNGE, | ||||
| ); | ||||
| 
 | ||||
| sub os { | ||||
| @@ -114,7 +117,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
| 
 | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -123,21 +126,14 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Nortel 2270 Series Wireless Switch through SNMP. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
| my $n2270 = new SNMP::Info::Layer2::N2270(...); | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item SNMP::Info | ||||
| 
 | ||||
| =item SNMP::Info::Bridge | ||||
| =item SNMP::Info::Layer2 | ||||
| 
 | ||||
| =item SNMP::Info::SONMP | ||||
| 
 | ||||
| @@ -151,9 +147,7 @@ my $n2270 = new SNMP::Info::Layer2::N2270(...); | ||||
| 
 | ||||
| =item Inherited Classes' MIBs | ||||
| 
 | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements. | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| @@ -200,13 +194,9 @@ start at 0.  Returns 0. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details. | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Global Methods imported from SNMP::Info::SONMP | ||||
| 
 | ||||
| @@ -229,13 +219,9 @@ to a hash. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::SONMP | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::NAP222x | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,6 +30,7 @@ | ||||
| package SNMP::Info::Layer2::NAP222x; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::SONMP; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
| @@ -40,9 +40,9 @@ use SNMP::Info::Layer2; | ||||
|     = qw/SNMP::Info::SONMP SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::NAP222x::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS, | ||||
| @@ -375,14 +375,14 @@ Eric Miller | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $nap222x = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $nap222x->class(); | ||||
| @@ -391,12 +391,7 @@ Eric Miller | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a Nortel | ||||
| 2220 series wireless Access Points through SNMP.  | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
|  my $nap222x = new SNMP::Info::Layer2::NAP222x(...); | ||||
| 2220 series wireless Access Points through SNMP. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| @@ -526,7 +521,7 @@ to a hash. | ||||
| 
 | ||||
| =item $nap222x->interfaces() | ||||
| 
 | ||||
| Returns reference to map of IIDs to physical ports.  | ||||
| Returns reference to map of IIDs to physical ports. | ||||
| 
 | ||||
| =item $nap222x->i_duplex() | ||||
| 
 | ||||
| @@ -548,7 +543,7 @@ Returns a human name based upon port description. | ||||
| 
 | ||||
| Returns a mapping between C<ifIndex> and the Bridge Table.  This does not | ||||
| exist in the MIB and bridge port index is not the same as C<ifIndex> so it is | ||||
| created.  | ||||
| created. | ||||
| 
 | ||||
| =item $nap222x->i_ssidlist() | ||||
| 
 | ||||
| @@ -29,39 +29,37 @@ | ||||
| package SNMP::Info::Layer2::NWSS2300; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::Layer2; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::NWSS2300::ISA | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge Exporter/; | ||||
|     = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::NWSS2300::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|     %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'NTWS-REGISTRATION-DEVICES-MIB' => 'ntwsSwitch2380', | ||||
|     'NTWS-AP-STATUS-MIB'            => 'ntwsApStatNumAps', | ||||
|     'NTWS-CLIENT-SESSION-MIB'       => 'ntwsClSessTotalSessions', | ||||
|     'NTWS-SYSTEM-MIB'               => 'ntwsSysCpuAverageLoad', | ||||
|     'NTWS-BASIC-MIB'                => 'ntwsVersionString', | ||||
|     'NTWS-AP-CONFIG-MIB'            => 'ntwsApConfServProfBeaconEnabled', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     %SNMP::Info::Bridge::GLOBALS, | ||||
|     'os_ver' => 'ntwsVersionString', | ||||
|     'serial' => 'ntwsSerialNumber', | ||||
|     'mac'    => 'dot1dBaseBridgeAddress', | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     'os_ver'     => 'ntwsVersionString', | ||||
|     'nws_serial' => 'ntwsSerialNumber', | ||||
|     'mac'        => 'dot1dBaseBridgeAddress', | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS, | ||||
|     %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
| 
 | ||||
|     # NTWS-AP-STATUS-MIB::ntwsApStatApStatusTable | ||||
|     'nwss2300_ap_mac'      => 'ntwsApStatApStatusBaseMac', | ||||
| @@ -124,8 +122,7 @@ $VERSION = '3.19'; | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::MUNGE, | ||||
|     %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     'nwss2300_apif_mac'      => \&SNMP::Info::munge_mac, | ||||
|     'nwss2300_apif_bssid'    => \&SNMP::Info::munge_mac, | ||||
| ); | ||||
| @@ -142,6 +139,14 @@ sub vendor { | ||||
|     return 'avaya'; | ||||
| } | ||||
| 
 | ||||
| sub serial { | ||||
|     my $nwss2300 = shift; | ||||
|     my $ser = $nwss2300->ntwsSerialNumber(); | ||||
| #    my $ser = $nwss2300->nws_serial(); | ||||
| 
 | ||||
|     return $ser; | ||||
| } | ||||
| 
 | ||||
| sub model { | ||||
|     my $nwss2300 = shift; | ||||
|     my $id = $nwss2300->id(); | ||||
| @@ -158,7 +163,7 @@ sub model { | ||||
|     return $id unless defined $model; | ||||
| 
 | ||||
|     $model =~ s/^ntwsSwitch//i; | ||||
|     return $model;     | ||||
|     return $model; | ||||
| } | ||||
| 
 | ||||
| sub _ap_serial { | ||||
| @@ -388,7 +393,7 @@ sub bp_index { | ||||
| sub fw_mac { | ||||
|     my $nwss2300 = shift; | ||||
|     my $partial  = shift; | ||||
|      | ||||
| 
 | ||||
|     my $serials = $nwss2300->nwss2300_sta_serial($partial) || {}; | ||||
| 
 | ||||
|     my %fw_mac; | ||||
| @@ -400,7 +405,7 @@ sub fw_mac { | ||||
| 	 | ||||
|         $fw_mac{$iid} = $mac; | ||||
|     } | ||||
|     return \%fw_mac;     | ||||
|     return \%fw_mac; | ||||
| } | ||||
| 
 | ||||
| sub fw_port { | ||||
| @@ -493,7 +498,7 @@ sub dot11_cur_tx_pwr_mw { | ||||
|     my $partial  = shift; | ||||
| 
 | ||||
|     my $cur = $nwss2300->nwss2300_apif_power($partial); | ||||
|      | ||||
| 
 | ||||
|     my $dot11_cur_tx_pwr_mw = {}; | ||||
|     foreach my $idx ( keys %$cur ) { | ||||
|         my $pwr_dbm = $cur->{$idx}; | ||||
| @@ -501,7 +506,7 @@ sub dot11_cur_tx_pwr_mw { | ||||
| 	#Convert to milliWatts = 10(dBm/10) | ||||
|         my $pwr = int (10 ** ($pwr_dbm / 10)); | ||||
| 	 | ||||
|         $dot11_cur_tx_pwr_mw->{$idx} = $pwr;  | ||||
|         $dot11_cur_tx_pwr_mw->{$idx} = $pwr; | ||||
|     } | ||||
|     return $dot11_cur_tx_pwr_mw; | ||||
| } | ||||
| @@ -513,7 +518,7 @@ sub e_index { | ||||
| 
 | ||||
|     # Try new first, fall back to depreciated | ||||
|     my $ap_num = $nwss2300->nwss2300_ap_num() || $nwss2300->nwss2300_ap_dapnum() || {}; | ||||
|    | ||||
| 
 | ||||
|     my %e_index; | ||||
| 
 | ||||
|     # Chassis | ||||
| @@ -657,7 +662,7 @@ sub e_serial { | ||||
|     my %e_serial; | ||||
| 
 | ||||
|     # Chassis | ||||
|     $e_serial{1} = $nwss2300->serial(); | ||||
|     $e_serial{1} = $nwss2300->serial()  || ''; | ||||
| 
 | ||||
|     # APs | ||||
|     foreach my $iid ( keys %$ap_serial ) { | ||||
| @@ -796,7 +801,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
| 
 | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -805,25 +810,18 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from  | ||||
| Provides abstraction to the configuration information obtainable from | ||||
| Avaya (Trapeze) Wireless Controllers through SNMP. | ||||
| 
 | ||||
| This class emulates bridge functionality for the wireless switch. This enables | ||||
| end station MAC addresses collection and correlation to the thin access point | ||||
| the end station is using for communication. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
| my $nwss2300 = new SNMP::Info::Layer2::NWSS2300(...); | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item SNMP::Info | ||||
| 
 | ||||
| =item SNMP::Info::Bridge | ||||
| =item SNMP::Info::Layer2 | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -845,9 +843,7 @@ my $nwss2300 = new SNMP::Info::Layer2::NWSS2300(...); | ||||
| 
 | ||||
| =head2 Inherited Classes' MIBs | ||||
| 
 | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements. | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| @@ -894,20 +890,16 @@ proprietary MIBs. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Global Methods imported from SNMP::Info | ||||
| =head2 Global Methods imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details. | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head1 TABLE METHODS | ||||
| 
 | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
| 
 | ||||
| =over  | ||||
| =over | ||||
| 
 | ||||
| =item $nwss2300->i_ssidlist() | ||||
| 
 | ||||
| @@ -1138,15 +1130,11 @@ These emulate the F<CISCO-DOT11-MIB> | ||||
| 
 | ||||
| (C<ntwsClSessClientSessStatsUniPktOut>) | ||||
| 
 | ||||
| =back  | ||||
| =back | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Overrides | ||||
| 
 | ||||
| @@ -1154,14 +1142,14 @@ See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =item $nwss2300->i_index() | ||||
| 
 | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
| 
 | ||||
| Extends C<ifIndex> to support thin APs and WLAN virtual interfaces as device | ||||
| interfaces. | ||||
| 
 | ||||
| =item $nwss2300->interfaces() | ||||
| 
 | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device  | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device | ||||
| interfaces.  The thin AP MAC address and Slot ID nwss2300_apif_slot() are | ||||
| used as the port identifier. | ||||
| 
 | ||||
| @@ -1206,7 +1194,7 @@ the interface iid. | ||||
| =item $nwss2300->fw_port() | ||||
| 
 | ||||
| Returns reference to a hash, value being mac and | ||||
| nwss2300_sta_slot() combined to match the interface iid.   | ||||
| nwss2300_sta_slot() combined to match the interface iid. | ||||
| 
 | ||||
| =item $nwss2300->fw_mac() | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Netgear | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bill Fenner | ||||
| # All rights reserved. | ||||
| @@ -31,33 +30,33 @@ | ||||
| package SNMP::Info::Layer2::Netgear; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| use SNMP::Info::LLDP; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::Netgear::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Netgear::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| # This will be filled in with the device's index into the EntPhysicalEntry | ||||
| # table by the serial() function. | ||||
| our $index = undef; | ||||
| 
 | ||||
| %MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::LLDP::MIBS, ); | ||||
| %MIBS = ( %SNMP::Info::Layer2::MIBS, ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::LLDP::GLOBALS, | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     ng_fsosver   => '.1.3.6.1.4.1.4526.11.11.1.0', | ||||
|     ng_gsmserial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0', | ||||
|     ng_gsmosver  => '.1.3.6.1.4.1.4526.10.1.1.1.13.0', | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::LLDP::FUNCS, ); | ||||
| %FUNCS = ( %SNMP::Info::Layer2::FUNCS, ); | ||||
| 
 | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, ); | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, ); | ||||
| 
 | ||||
| sub vendor { | ||||
|     return 'netgear'; | ||||
| @@ -74,7 +73,7 @@ sub os { | ||||
| sub serial { | ||||
|     my $netgear = shift; | ||||
|     my $serial = undef; | ||||
|      | ||||
| 
 | ||||
|     my $e_serial = $netgear->e_serial(); | ||||
|     if (defined($e_serial)) { # This unit sports the Entity-MIB | ||||
|         # Find entity table entry for this unit | ||||
| @@ -87,9 +86,9 @@ sub serial { | ||||
|         return $e_serial->{$index} if defined $index; | ||||
|     } | ||||
| 
 | ||||
|     # Without Enitity-MIB, we've got to work our way through a bunch of | ||||
|     # Without Entity-MIB, we've got to work our way through a bunch of | ||||
|     # different locales... | ||||
|     return $netgear->ng_gsmserial() if defined $netgear->model and $netgear->model =~ m/GSM\d/i;; | ||||
|     return $netgear->ng_gsmserial() if defined $netgear->model and $netgear->model =~ m/[FG]SM\d/i;; | ||||
|     return 'none'; | ||||
| } | ||||
| 
 | ||||
| @@ -108,8 +107,8 @@ sub model { | ||||
| } | ||||
| 
 | ||||
| # ifDescr is the same for all interfaces in a class, but the ifName is | ||||
| # unique, so let's use that for port name.  If all else fails,  | ||||
| # concatentate ifDesc and ifIndex. | ||||
| # unique, so let's use that for port name.  If all else fails, | ||||
| # concatenate ifDesc and ifIndex. | ||||
| sub interfaces { | ||||
|     my $netgear = shift; | ||||
|     my $partial = shift; | ||||
| @@ -139,7 +138,7 @@ sub interfaces { | ||||
|     return $interfaces; | ||||
| } | ||||
| 
 | ||||
| # these seem to work for GSM models but not GS | ||||
| # these seem to work for GSM/FSM models but not GS | ||||
| # https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529 | ||||
| sub os_ver { | ||||
|     my $netgear = shift; | ||||
| @@ -148,7 +147,7 @@ sub os_ver { | ||||
|         my $os_ver  = $netgear->e_swver(); | ||||
|         return $os_ver->{$index} if defined $os_ver; | ||||
|     } | ||||
|     return $netgear->ng_gsmosver() if defined  $netgear->model and $netgear->model =~ m/GSM\d/i; | ||||
|     return $netgear->ng_gsmosver() if defined  $netgear->model and $netgear->model =~ m/[FG]SM\d/i; | ||||
|     return $netgear->ng_fsosver() if defined  $netgear->model and $netgear->model =~ m/FS\d/i; | ||||
| } | ||||
| 
 | ||||
| @@ -162,20 +161,20 @@ SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches | ||||
| 
 | ||||
| =head1 AUTHOR | ||||
| 
 | ||||
|  Bill Fenner and Zoltan Erszenyi,  | ||||
|  Hacked in LLDP support from Baystack.pm by  | ||||
|  Bill Fenner and Zoltan Erszenyi, | ||||
|  Hacked in LLDP support from Baystack.pm by | ||||
|  Nic Bernstein <nic@onlight.com> | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $netgear = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $netgear->class(); | ||||
| @@ -183,8 +182,8 @@ SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| Netgear device through SNMP. See inherited classes' documentation for  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| Netgear device through SNMP. See inherited classes' documentation for | ||||
| inherited methods. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| @@ -192,8 +191,6 @@ inherited methods. | ||||
| =over | ||||
| 
 | ||||
| =item SNMP::Info::Layer2 | ||||
| =item SNMP::Info::Entity | ||||
| =item SNMP::Info::LLDP | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -206,10 +203,6 @@ inherited methods. | ||||
| MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited | ||||
| classes. | ||||
| 
 | ||||
| See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| @@ -226,11 +219,11 @@ Returns 'netgear' | ||||
| 
 | ||||
| =item $netgear->os() | ||||
| 
 | ||||
| Returns 'netgear'  | ||||
| Returns 'netgear' | ||||
| 
 | ||||
| =item $netgear->model() | ||||
| 
 | ||||
| Returns concatenation of $e_model and $e_hwver if Entity MIB present,  | ||||
| Returns concatenation of $e_model and $e_hwver if Entity MIB present, | ||||
| otherwise returns description() | ||||
| 
 | ||||
| =item $netgear->os_ver() | ||||
| @@ -248,14 +241,6 @@ serial number). | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Entity | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::LLDP | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head1 TABLE METHODS | ||||
| 
 | ||||
| These are methods that return tables of information in the form of | ||||
| @@ -275,12 +260,4 @@ Uses the i_name() field. | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Entity | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =cut | ||||
							
								
								
									
										249
									
								
								lib/SNMP/Info/Layer2/Nexans.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										249
									
								
								lib/SNMP/Info/Layer2/Nexans.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,249 @@ | ||||
| # SNMP::Info::Layer2::Nexans | ||||
| # | ||||
| # Copyright (c) 2018 Christoph Neuhaus | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Nexans; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Nexans::ISA = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Nexans::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'NEXANS-MIB'    => 'nexansANS', | ||||
|     'NEXANS-BM-MIB' => 'infoDescr', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     'mac'   => 'adminAgentPhysAddress.0', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     'i_duplex'          => 'portLinkState', #NEXANS-BM-MIB | ||||
|     'i_duplex_admin'    => 'portSpeedDuplexSetup', #NEXANS-BM-MIB | ||||
|     'nexans_i_name'     => 'ifAlias', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     'i_duplex'          => \&munge_i_duplex, | ||||
|     'i_duplex_admin'    => \&munge_i_duplex_admin, | ||||
| ); | ||||
|  | ||||
| sub munge_i_duplex { | ||||
|     my $duplex   = shift; | ||||
|     return unless defined $duplex; | ||||
|     $duplex = 'half' if $duplex =~/Hdx/; | ||||
|     $duplex = 'full' if $duplex =~/Fdx/; | ||||
|     return $duplex; | ||||
| } | ||||
|  | ||||
| sub munge_i_duplex_admin { | ||||
|     my $duplex_admin    = shift; | ||||
|     return unless defined $duplex_admin; | ||||
|     $duplex_admin = 'full' if $duplex_admin =~/Fdx/; | ||||
|     $duplex_admin = 'half' if $duplex_admin =~/Hdx/; | ||||
|     $duplex_admin = 'auto' if $duplex_admin =~/autoneg/; | ||||
|     return $duplex_admin; | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'nexans'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $nexans  = shift; | ||||
|     my $id      = $nexans->id() || ''; | ||||
|     my $model   = &SNMP::translateObj($id); | ||||
|     return $id unless defined $model; | ||||
|     return $model; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return 'nexanos'; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $nexans  = shift; | ||||
|     my $ver     = $nexans->infoMgmtFirmwareVersion() || ''; | ||||
|     return $ver; | ||||
| } | ||||
|  | ||||
| sub serial { | ||||
|     my $nexans = shift; | ||||
|     return $nexans->infoSeriesNo(); | ||||
| } | ||||
|  | ||||
| sub i_name { | ||||
|     my $nexans  = shift; | ||||
|     my $return  = $nexans->nexans_i_name(); | ||||
|     # replace i_name where possible | ||||
|     foreach my $iid ( keys %$return ) { | ||||
|         next unless $return->{$iid} eq ""; | ||||
|         $return->{$iid} = $iid; | ||||
|     } | ||||
|     return \%$return; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Nexans - SNMP Interface to Nexans network devices. | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Christoph Neuhaus | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
| # Let SNMP::Info determine the correct subclass for you. | ||||
|  | ||||
|     my $nexans = new SNMP::Info( | ||||
|                             AutoSpecify => 1, | ||||
|                             Debug       => 1, | ||||
|                             DestHost    => 'myswitch', | ||||
|                             Community   => 'public', | ||||
|                             Version     => 2 | ||||
|                             ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|     my $class = $nexans->class(); | ||||
|     print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Abstraction subclass for Nexans network devices. | ||||
|  | ||||
| tested devices: | ||||
|  | ||||
|     fiberSwitch100BmPlus version 3.61 | ||||
|     gigaSwitch641DeskSfpTp version 3.68, 4.14W | ||||
|     gigaSwitchV3d2SfpSfp version 3.68, 4.02, 4.02B, 4.10C, 4,14W | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<NEXANS> | ||||
|  | ||||
| =item F<NEXANS-BM> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $nexans->vendor() | ||||
|  | ||||
| Returns 'nexans' | ||||
|  | ||||
| =item $nexans->model() | ||||
|  | ||||
| Returns the chassis model. | ||||
|  | ||||
| =item $nexans->os() | ||||
|  | ||||
| Returns 'nexanos' | ||||
|  | ||||
| =item $nexans->os_ver() | ||||
|  | ||||
| Returns the software version. | ||||
|  | ||||
| =item $nexans->serial() | ||||
|  | ||||
| Returns the chassis serial number. | ||||
|  | ||||
| (C<infoSeriesNo>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $nexans->i_name() | ||||
|  | ||||
| Returns reference to map of IIDs to human-set port name. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head1 Data Munging Callback Subroutines | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item munge_i_duplex() | ||||
|  | ||||
| Converts duplex returned by C<portLinkState> to either 'full' or 'half'. | ||||
|  | ||||
| =item munge_i_duplex_admin() | ||||
|  | ||||
| Converts duplex returned by C<portSpeedDuplexSetup> to either 'full', 'half', | ||||
| or 'auto'. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::Orinoco | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,6 +30,7 @@ | ||||
| package SNMP::Info::Layer2::Orinoco; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
| use SNMP::Info::Layer2; | ||||
| @@ -39,15 +39,13 @@ use SNMP::Info::Layer2; | ||||
|     = qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Orinoco::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     %SNMP::Info::IEEE802dot11::MIBS, | ||||
| 
 | ||||
|     #'ORiNOCO-MIB' => 'orinoco', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS | ||||
| @@ -56,12 +54,6 @@ $VERSION = '3.19'; | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     %SNMP::Info::IEEE802dot11::FUNCS, | ||||
| 
 | ||||
|     # ORiNOCO-MIB:oriWirelessIfPropertiesTable | ||||
|     #'ori_ssid'       => 'oriWirelessIfNetworkName', | ||||
|     #'ori_channel'    => 'oriWirelessIfChannel', | ||||
|     #'ori_closed_sys' => 'oriWirelessIfClosedSystem', | ||||
|     # ORiNOCO-MIB:oriSystemInvMgmtComponentTable | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, ); | ||||
| @@ -165,22 +157,6 @@ sub interfaces { | ||||
|     return \%interfaces; | ||||
| } | ||||
| 
 | ||||
| #sub i_ssidbcast { | ||||
| #    my $orinoco = shift; | ||||
| #    my $partial = shift; | ||||
| # | ||||
| #    my $bcast = $orinoco->ori_closed_sys($partial) || {}; | ||||
| # | ||||
| #    my %i_ssidbcast; | ||||
| #    foreach my $iid (keys %$bcast){ | ||||
| #        my $bc   = $bcast->{$iid}; | ||||
| #        next unless defined $bc; | ||||
| # | ||||
| #        $i_ssidbcast{$iid} = $bc; | ||||
| #    } | ||||
| #    return \%i_ssidbcast; | ||||
| #} | ||||
| 
 | ||||
| 1; | ||||
| __END__ | ||||
| 
 | ||||
| @@ -194,14 +170,14 @@ Eric Miller | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $orinoco = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $orinoco->class(); | ||||
| @@ -213,11 +189,6 @@ Provides abstraction to the configuration information obtainable from | ||||
| Orinoco Access Point through SNMP.  Orinoco devices have been manufactured | ||||
| by Proxim, Agere, and Lucent. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
|  my $orinoco = new SNMP::Info::Layer2::Orinoco(...); | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| @@ -258,7 +229,7 @@ Returns the model extracted from C<sysDescr>. | ||||
| 
 | ||||
| =item $orinoco->os() | ||||
| 
 | ||||
| Returns 'Orinoco' | ||||
| Returns 'orinoco' | ||||
| 
 | ||||
| =item $orinoco->os_ver() | ||||
| 
 | ||||
| @@ -293,7 +264,7 @@ to a hash. | ||||
| 
 | ||||
| =item $orinoco->interfaces() | ||||
| 
 | ||||
| Returns reference to map of IIDs to physical ports.  | ||||
| Returns reference to map of IIDs to physical ports. | ||||
| 
 | ||||
| =item $orinoco->i_ignore() | ||||
| 
 | ||||
							
								
								
									
										178
									
								
								lib/SNMP/Info/Layer2/Sixnet.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								lib/SNMP/Info/Layer2/Sixnet.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,178 @@ | ||||
| # SNMP::Info::Layer2::Sixnet | ||||
| # | ||||
| # Copyright (c) 2018 Eric Miller | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Sixnet; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
|  | ||||
| @SNMP::Info::Layer2::Sixnet::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Sixnet::EXPORT_OK = qw//; | ||||
|  | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %MIBS = (%SNMP::Info::Layer2::MIBS, 'SIXNET-MIB' => 'sxid',); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|   %SNMP::Info::Layer2::GLOBALS, | ||||
|   'os_ver'     => 'firmwareRevision', | ||||
|   's_model'    => 'sxid', | ||||
|   'ps1_status' => 'p1status', | ||||
|   'ps2_status' => 'p2status', | ||||
| ); | ||||
|  | ||||
| %FUNCS = (%SNMP::Info::Layer2::FUNCS,); | ||||
|  | ||||
| %MUNGE = (%SNMP::Info::Layer2::MUNGE,); | ||||
|  | ||||
|  | ||||
| sub vendor { | ||||
|   return 'sixnet'; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|   return 'sixnet'; | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|   my $sixnet = shift; | ||||
|  | ||||
|   my $s_model = $sixnet->s_model(); | ||||
|   return $s_model if defined $s_model; | ||||
|  | ||||
|   my $id = $sixnet->id(); | ||||
|   return unless defined $id; | ||||
|  | ||||
|   my $model = SNMP::translateObj($id); | ||||
|   return $model ? $model : $id; | ||||
| } | ||||
|  | ||||
| 1; | ||||
|  | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer2::Sixnet - SNMP Interface to Sixnet industrial switches | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| Eric Miller | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|     my $sixnet = new SNMP::Info( | ||||
|               AutoSpecify => 1, | ||||
|               Debug       => 1, | ||||
|               DestHost    => 'myswitch', | ||||
|               Community   => 'public', | ||||
|               Version     => 2 | ||||
|             ) | ||||
|  | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|     my $class = $sixnet->class(); | ||||
|     print " Using device sub class : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| SNMP::Info::Layer2::Sixnet is a subclass of SNMP::Info that provides an | ||||
| interface to Sixnet industrial switches. | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer2 | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<SIXNET-MIB> | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Inherited MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements. | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $sixnet->vendor() | ||||
|  | ||||
| Returns 'sixnet' | ||||
|  | ||||
| =item $sixnet->os() | ||||
|  | ||||
| Returns 'sixnet' | ||||
|  | ||||
| =item $sixnet->os_ver() | ||||
|  | ||||
| Returns the software version returned by C<firmwareRevision> | ||||
|  | ||||
| =item $sixnet->model() | ||||
|  | ||||
| Returns model type. Returns C<sxid> if it exists, otherwise cross references | ||||
| $sixnet->id() with the F<SIXNET-MIB>. | ||||
|  | ||||
| =item $sixnet->ps1_status() | ||||
|  | ||||
| (C<p1status>) | ||||
|  | ||||
| =item $sixnet->ps2_status() | ||||
|  | ||||
| (C<p2status>) | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
|  | ||||
| =head1 TABLE METHODS | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -29,43 +29,37 @@ | ||||
| package SNMP::Info::Layer2::Trapeze; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::Layer2; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::Trapeze::ISA | ||||
|     = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::LLDP Exporter/; | ||||
|     = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::Trapeze::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|     %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::Layer2::MIBS, | ||||
|     'TRAPEZE-NETWORKS-REGISTRATION-DEVICES-MIB' => 'wirelessLANController', | ||||
|     'TRAPEZE-NETWORKS-AP-STATUS-MIB'            => 'trpzApStatNumAps', | ||||
|     'TRAPEZE-NETWORKS-CLIENT-SESSION-MIB'       => 'trpzClSessTotalSessions', | ||||
|     'TRAPEZE-NETWORKS-SYSTEM-MIB'               => 'trpzSysCpuAverageLoad', | ||||
|     'TRAPEZE-NETWORKS-BASIC-MIB'                => 'trpzVersionString', | ||||
|     'TRAPEZE-NETWORKS-AP-CONFIG-MIB'  => 'trpzApConfServProfBeaconEnabled', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     %SNMP::Info::Bridge::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'os_ver' => 'trpzVersionString', | ||||
|     'serial' => 'trpzSerialNumber', | ||||
|     'mac'    => 'dot1dBaseBridgeAddress', | ||||
|     %SNMP::Info::Layer2::GLOBALS, | ||||
|     'os_ver'    => 'trpzVersionString', | ||||
|     'tr_serial' => 'trpzSerialNumber', | ||||
|     'mac'       => 'dot1dBaseBridgeAddress', | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS, | ||||
|     %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     # TRAPEZE-NETWORKS-AP-STATUS-MIB::trpzApStatApStatusTable | ||||
|     'trapeze_ap_mac'      => 'trpzApStatApStatusBaseMac', | ||||
|     'trapeze_ap_name'     => 'trpzApStatApStatusApName', | ||||
| @@ -127,9 +121,7 @@ $VERSION = '3.19'; | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::MUNGE, | ||||
|     %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     %SNMP::Info::Layer2::MUNGE, | ||||
|     'trapeze_apif_mac'      => \&SNMP::Info::munge_mac, | ||||
|     'trapeze_apif_bssid'    => \&SNMP::Info::munge_mac, | ||||
| ); | ||||
| @@ -146,6 +138,14 @@ sub vendor { | ||||
|     return 'juniper'; | ||||
| } | ||||
| 
 | ||||
| sub serial { | ||||
|     my $trapeze = shift; | ||||
|     my $ser = $trapeze->trpzSerialNumber(); | ||||
| #    my $ser = $trapeze->tr_serial(); | ||||
| 
 | ||||
|     return $ser; | ||||
| } | ||||
| 
 | ||||
| sub model { | ||||
|     my $trapeze = shift; | ||||
|     my $id = $trapeze->id(); | ||||
| @@ -162,7 +162,7 @@ sub model { | ||||
|     return $id unless defined $model; | ||||
| 
 | ||||
|     $model =~ s/^wirelessLANController//i; | ||||
|     return $model;     | ||||
|     return $model; | ||||
| } | ||||
| 
 | ||||
| sub _ap_serial { | ||||
| @@ -392,7 +392,7 @@ sub bp_index { | ||||
| sub fw_mac { | ||||
|     my $trapeze = shift; | ||||
|     my $partial  = shift; | ||||
|      | ||||
| 
 | ||||
|     my $serials = $trapeze->trapeze_sta_serial($partial) || {}; | ||||
| 
 | ||||
|     my %fw_mac; | ||||
| @@ -404,7 +404,7 @@ sub fw_mac { | ||||
| 	 | ||||
|         $fw_mac{$iid} = $mac; | ||||
|     } | ||||
|     return \%fw_mac;     | ||||
|     return \%fw_mac; | ||||
| } | ||||
| 
 | ||||
| sub fw_port { | ||||
| @@ -497,7 +497,7 @@ sub dot11_cur_tx_pwr_mw { | ||||
|     my $partial  = shift; | ||||
| 
 | ||||
|     my $cur = $trapeze->trapeze_apif_power($partial); | ||||
|      | ||||
| 
 | ||||
|     my $dot11_cur_tx_pwr_mw = {}; | ||||
|     foreach my $idx ( keys %$cur ) { | ||||
|         my $pwr_dbm = $cur->{$idx}; | ||||
| @@ -505,7 +505,7 @@ sub dot11_cur_tx_pwr_mw { | ||||
| 	#Convert to milliWatts = 10(dBm/10) | ||||
|         my $pwr = int (10 ** ($pwr_dbm / 10)); | ||||
| 	 | ||||
|         $dot11_cur_tx_pwr_mw->{$idx} = $pwr;  | ||||
|         $dot11_cur_tx_pwr_mw->{$idx} = $pwr; | ||||
|     } | ||||
|     return $dot11_cur_tx_pwr_mw; | ||||
| } | ||||
| @@ -517,7 +517,7 @@ sub e_index { | ||||
| 
 | ||||
|     # Try new first, fall back to depreciated | ||||
|     my $ap_num = $trapeze->trapeze_ap_num() || $trapeze->trapeze_ap_dapnum() || {}; | ||||
|    | ||||
| 
 | ||||
|     my %e_index; | ||||
| 
 | ||||
|     # Chassis | ||||
| @@ -661,7 +661,7 @@ sub e_serial { | ||||
|     my %e_serial; | ||||
| 
 | ||||
|     # Chassis | ||||
|     $e_serial{1} = $trapeze->serial(); | ||||
|     $e_serial{1} = $trapeze->serial() || ''; | ||||
| 
 | ||||
|     # APs | ||||
|     foreach my $iid ( keys %$ap_serial ) { | ||||
| @@ -800,7 +800,7 @@ Eric Miller | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
| 
 | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -809,25 +809,18 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from  | ||||
| Provides abstraction to the configuration information obtainable from | ||||
| Juniper (Trapeze) Wireless Controllers through SNMP. | ||||
| 
 | ||||
| This class emulates bridge functionality for the wireless switch. This enables | ||||
| end station MAC addresses collection and correlation to the thin access point | ||||
| the end station is using for communication. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
| my $trapeze = new SNMP::Info::Layer2::Trapeze(...); | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item SNMP::Info | ||||
| 
 | ||||
| =item SNMP::Info::Bridge | ||||
| =item SNMP::Info::Layer2 | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -849,9 +842,7 @@ my $trapeze = new SNMP::Info::Layer2::Trapeze(...); | ||||
| 
 | ||||
| =head2 Inherited Classes' MIBs | ||||
| 
 | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements. | ||||
| See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| @@ -898,20 +889,16 @@ proprietary MIBs. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Global Methods imported from SNMP::Info | ||||
| =head2 Global Methods imported from SNMP::Info::Layer2 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details. | ||||
| See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head1 TABLE METHODS | ||||
| 
 | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
| 
 | ||||
| =over  | ||||
| =over | ||||
| 
 | ||||
| =item $trapeze->i_ssidlist() | ||||
| 
 | ||||
| @@ -1142,15 +1129,11 @@ These emulate the F<CISCO-DOT11-MIB> | ||||
| 
 | ||||
| (C<trpzClSessClientSessStatsUniPktOut>) | ||||
| 
 | ||||
| =back  | ||||
| =back | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
| See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Overrides | ||||
| 
 | ||||
| @@ -1158,14 +1141,14 @@ See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =item $trapeze->i_index() | ||||
| 
 | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
| 
 | ||||
| Extends C<ifIndex> to support thin APs and WLAN virtual interfaces as device | ||||
| interfaces. | ||||
| 
 | ||||
| =item $trapeze->interfaces() | ||||
| 
 | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device  | ||||
| Returns reference to map of IIDs to ports.  Thin APs are implemented as device | ||||
| interfaces.  The thin AP MAC address and Slot ID trapeze_apif_slot() are | ||||
| used as the port identifier. | ||||
| 
 | ||||
| @@ -1210,7 +1193,7 @@ the interface iid. | ||||
| =item $trapeze->fw_port() | ||||
| 
 | ||||
| Returns reference to a hash, value being mac and | ||||
| trapeze_sta_slot() combined to match the interface iid.   | ||||
| trapeze_sta_slot() combined to match the interface iid. | ||||
| 
 | ||||
| =item $trapeze->fw_mac() | ||||
| 
 | ||||
							
								
								
									
										418
									
								
								lib/SNMP/Info/Layer2/Ubiquiti.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										418
									
								
								lib/SNMP/Info/Layer2/Ubiquiti.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,418 @@ | ||||
| # SNMP::Info::Layer2::Ubiquiti - SNMP Interface to Ubiquiti Devices | ||||
| # | ||||
| # Copyright (c) 2019 by The Netdisco Developer Team. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer2::Ubiquiti; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::IEEE802dot11; | ||||
| use SNMP::Info::Layer2; | ||||
| 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//; | ||||
|  | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %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 $ubnt = shift; | ||||
|  | ||||
|     my $versions = $ubnt->dot11_prod_ver(); | ||||
|  | ||||
|     foreach my $iid ( keys %$versions ) { | ||||
|         my $ver = $versions->{$iid}; | ||||
|         next unless defined $ver; | ||||
|         my $os = $ubnt->os; | ||||
|         if($os == 'AirOS'){ | ||||
|             ## pretty up the version reporting for AirOS to include hardware (XW, XM, etc) and three major groups of firmware | ||||
|             my @firmware =  split(/v/, $ver); | ||||
|             my @firmwareSplit = split(/\./, $firmware[1]); | ||||
|             my @prefix = split(/\./, $ver); | ||||
|             $ver = $prefix[0] . '-v' . join('.', @firmwareSplit[0,1,2]); | ||||
|         } | ||||
|         return $ver; | ||||
|         ## Not sure what this function does, it seems to be extraneous being in the same code block after a return statement? | ||||
|         #if ( $ver =~ /([\d\.]+)/ ) { | ||||
|         #    return $1; | ||||
|         #} | ||||
|     } | ||||
|  | ||||
|     my $ver = $ubnt->description() || ''; | ||||
|     if((lc $ver) =~ /^edgeswitch/){ | ||||
|         ## EdgeSwitch OS version is second field split by comma and bootcode version is last | ||||
|         my @myver = split(/, /, $ver); | ||||
|         my @firmware = split(/\./, $myver[1]); | ||||
|         my @bootcode = split(/\./, $myver[-1]); | ||||
|  | ||||
|         ## Return only three major version groupings and include bootcode version | ||||
|         return join('.', @firmware[0,1,2]) . '.-b' . join('.', @bootcode[0,1,2]); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     ## EdgeRouter OS version is second field split by space | ||||
|     my @myver = split(/ /, $ver); | ||||
|     my @firmware = split(/\./, $myver[1]); | ||||
|  | ||||
|     if($firmware[2] =~ /hotfix$/){ | ||||
|         # edge case where EdgeOS has hotfix versions in format "EdgeOS v1.9.7+hotfix.4.5024004.171005.0403" | ||||
|         $firmware[2] = $firmware[2] . '.' . $firmware[3] | ||||
|     } | ||||
|     ## Return only three major version groupings | ||||
|     return join('.', @firmware[0,1,2]); | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     return 'ubiquiti'; | ||||
| } | ||||
|  | ||||
| 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 model 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" | ||||
|         }if($ethCount eq 12){ | ||||
|             ## ER-12 | ||||
|             return "EdgeRouter 12-Port" | ||||
|         }elsif($ethCount eq 5 and $cpuCount eq 4){ | ||||
|             ## Could be ER-X or ER-X-SFP | ||||
|             return "EdgeRouter X 5-Port" | ||||
|         }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; | ||||
|     my $erModel = $ubnt->model; | ||||
|  | ||||
|     foreach my $iid ( keys %$ifDescs ) { | ||||
|         my $ifDesc = $ifDescs->{$iid}; | ||||
|         next unless defined $ifDesc; | ||||
|         ## CPU Interface will have the primary MAC for EdgeSwitch | ||||
|         ## eth0 will have primary MAC for linux-based UBNT devices, except ER-12 which is eth11 | ||||
|         if($ifDesc =~ /CPU/ or ($ifDesc eq 'eth0' and !($erModel =~ /EdgeRouter 12/)) or ($ifDesc eq 'eth11' and ($erModel =~ /EdgeRouter 12/))){ | ||||
|             my $mac = $ubnt->ifPhysAddress->{$iid}; | ||||
|  | ||||
|             # syntax stolen from sub munge_mac in SNMP::Info | ||||
|             $mac = lc join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $mac ) ); | ||||
|             return $mac if $mac =~ /^([0-9A-F][0-9A-F]:){5}[0-9A-F][0-9A-F]$/i; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     # MAC malformed or missing | ||||
|     return; | ||||
| } | ||||
|  | ||||
| sub interfaces { | ||||
|     my $ubnt = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $ubnt->i_index($partial)       || {}; | ||||
|     my $i_descr    = $ubnt->i_description($partial) || {}; | ||||
|     my $return = {}; | ||||
|  | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|         # Slot: 0 Port: 4 Gigabit - Level | ||||
|         if ($i_descr->{$iid} =~ m/([0-9]+)[^0-9]+([0-9]+)/) { | ||||
|             $return->{$iid} = $1 .'/'. $2; | ||||
|             next; | ||||
|         } | ||||
|         # Link Aggregate 4 | ||||
|         if ($i_descr->{$iid} =~ m/Link Aggregate (\d+)/) { | ||||
|             $return->{$iid} = '3/'. $1; | ||||
|             next; | ||||
|         } | ||||
|         # else | ||||
|         $return->{$iid} = $i_descr->{$iid}; | ||||
|     } | ||||
|  | ||||
|     return $return; | ||||
| } | ||||
|  | ||||
| sub i_ignore { | ||||
|     my $l2      = shift; | ||||
|     my $partial = shift; | ||||
|  | ||||
|     my $interfaces = $l2->interfaces($partial) || {}; | ||||
|     my $i_descr    = $l2->i_description($partial) || {}; | ||||
|  | ||||
|     my %i_ignore; | ||||
|     foreach my $if ( keys %$interfaces ) { | ||||
|  | ||||
|         # CPU Interface | ||||
|         if ( $i_descr->{$if} =~ /CPU Interface/i ) { | ||||
|             $i_ignore{$if}++; | ||||
|         } | ||||
|     } | ||||
|     return \%i_ignore; | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __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. | ||||
|  | ||||
| =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' | ||||
|  | ||||
| =item $ubnt->model() | ||||
|  | ||||
| Returns the model extracted from C<dot11manufacturerProductName>, with fallback to some complex logic for EdgeMax devices | ||||
|  | ||||
| =item $ubnt->serial() | ||||
|  | ||||
| Serial Number. | ||||
|  | ||||
| =item $ubnt->mac() | ||||
|  | ||||
| Bridge MAC address. | ||||
|  | ||||
| =item $ubnt->os() | ||||
|  | ||||
| Returns C<AirOS>, C<UniFi> or C<EdgeOS> depending on model. | ||||
|  | ||||
| =item $ubnt->os_ver() | ||||
|  | ||||
| Returns the software version extracted from C<dot11manufacturerProductVersion>, with fallback 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 $ubnt->interfaces() | ||||
|  | ||||
| Uses the i_name() field. | ||||
|  | ||||
| =item $ubnt->i_ignore() | ||||
|  | ||||
| Ignores interfaces with "CPU Interface" in them. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::Layer2 | ||||
|  | ||||
| See L<SNMP::Info::Layer2/"TABLE METHODS"> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::IEEE802dot11 | ||||
|  | ||||
| See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer2::ZyXEL_DSLAM | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker | ||||
| # All rights reserved. | ||||
| @@ -31,22 +30,23 @@ | ||||
| package SNMP::Info::Layer2::ZyXEL_DSLAM; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer2; | ||||
| 
 | ||||
| @SNMP::Info::Layer2::ZyXEL_DSLAM::ISA       = qw/SNMP::Info::Layer2 Exporter/; | ||||
| @SNMP::Info::Layer2::ZyXEL_DSLAM::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| # Set for No CDP | ||||
| %GLOBALS = ( %SNMP::Info::Layer2::GLOBALS ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer2::FUNCS, | ||||
|     'ip_adresses'   => 'ipAdEntAddr', | ||||
|     'ip_addresses'  => 'ipAdEntAddr', | ||||
|     'i_name'        => 'ifDescr', | ||||
|     'i_description' => 'adslLineConfProfile', | ||||
| ); | ||||
| @@ -58,7 +58,7 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
| sub layers { | ||||
|     my $zyxel  = shift; | ||||
|     my $layers = $zyxel->layers(); | ||||
|     my $layers = $zyxel->SUPER::layers(); | ||||
|     return $layers if defined $layers; | ||||
| 
 | ||||
|     # If these don't claim to have any layers, so we'll give them 1+2 | ||||
| @@ -77,7 +77,7 @@ sub os_ver { | ||||
|     my $zyxel = shift; | ||||
|     my $descr = $zyxel->description(); | ||||
| 
 | ||||
|     if ( $descr =~ m/version (\S+) / ) { | ||||
|     if ( defined ($descr) && $descr =~ m/version (\S+) / ) { | ||||
|         return $1; | ||||
|     } | ||||
|     return; | ||||
| @@ -88,11 +88,13 @@ sub model { | ||||
| 
 | ||||
|     my $desc = $zyxel->description(); | ||||
| 
 | ||||
|     if ( $desc =~ /8-port ADSL Module\(Annex A\)/ ) { | ||||
|     if (defined $desc) { | ||||
|       if ($desc =~ /8-port ADSL Module\(Annex A\)/) { | ||||
|         return "AAM1008-61"; | ||||
|     } | ||||
|     elsif ( $desc =~ /8-port ADSL Module\(Annex B\)/ ) { | ||||
|       } | ||||
|       elsif ($desc =~ /8-port ADSL Module\(Annex B\)/) { | ||||
|         return "AAM1008-63"; | ||||
|       } | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| @@ -102,7 +104,9 @@ sub ip { | ||||
|     my $ip_hash = $zyxel->ip_addresses(); | ||||
|     my $found_ip; | ||||
| 
 | ||||
|     foreach my $ip ( keys %{$ip_hash} ) { | ||||
|     # Since hashes are random add sort so we get the same address each time | ||||
|     # if there happens to be more than one. Will return highest numbered address | ||||
|     foreach my $ip ( sort keys %{$ip_hash} ) { | ||||
|         $found_ip = $ip | ||||
|             if ( defined $ip | ||||
|             and $ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ ); | ||||
| @@ -122,23 +126,23 @@ Dmitry Sergienko (C<dmitry@trifle.net>) | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $zyxel = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myhub', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $l2->class(); | ||||
|  my $class      = $zyxel->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Provides abstraction to the configuration information obtainable from a  | ||||
| ZyXEL device through SNMP. See inherited classes' documentation for  | ||||
| Provides abstraction to the configuration information obtainable from a | ||||
| ZyXEL device through SNMP. See inherited classes' documentation for | ||||
| inherited methods. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| @@ -172,11 +176,11 @@ These are methods that return scalar value from SNMP | ||||
| 
 | ||||
| =item $zyxel->vendor() | ||||
| 
 | ||||
| Returns 'ZyXEL' :) | ||||
| Returns 'zyxel' | ||||
| 
 | ||||
| =item $zyxel->os() | ||||
| 
 | ||||
| Returns 'ZyXEL'  | ||||
| Returns 'zyxel' | ||||
| 
 | ||||
| =item $zyxel->os_ver() | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3 - SNMP Interface to Layer3 devices | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on | ||||
| # | ||||
| @@ -33,6 +32,7 @@ | ||||
| package SNMP::Info::Layer3; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Bridge; | ||||
| @@ -41,28 +41,34 @@ use SNMP::Info::Entity; | ||||
| use SNMP::Info::PowerEthernet; | ||||
| use SNMP::Info::IPv6; | ||||
| use SNMP::Info::AdslLine; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::DocsisHE; | ||||
| 
 | ||||
| @SNMP::Info::Layer3::ISA = qw/ | ||||
|     SNMP::Info::PowerEthernet SNMP::Info::IPv6 | ||||
|     SNMP::Info::Entity SNMP::Info::EtherLike | ||||
|     SNMP::Info::Bridge SNMP::Info::AdslLine | ||||
|     SNMP::Info::LLDP SNMP::Info::DocsisHE | ||||
|     SNMP::Info Exporter/; | ||||
| @SNMP::Info::Layer3::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|     %SNMP::Info::AdslLine::MIBS, | ||||
|     %SNMP::Info::Bridge::MIBS, | ||||
|     %SNMP::Info::DocsisHE::MIBS, | ||||
|     %SNMP::Info::EtherLike::MIBS, | ||||
|     %SNMP::Info::Entity::MIBS, | ||||
|     %SNMP::Info::PowerEthernet::MIBS, | ||||
|     %SNMP::Info::IPv6::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'IP-MIB'   => 'ipNetToMediaIfIndex', | ||||
|     'OSPF-MIB' => 'ospfRouterId', | ||||
|     'ISIS-MIB' => 'isisSysID', | ||||
|     'BGP4-MIB' => 'bgpIdentifier', | ||||
| ); | ||||
| 
 | ||||
| @@ -72,10 +78,12 @@ $VERSION = '3.19'; | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     %SNMP::Info::AdslLine::GLOBALS, | ||||
|     %SNMP::Info::Bridge::GLOBALS, | ||||
|     %SNMP::Info::DocsisHE::GLOBALS, | ||||
|     %SNMP::Info::EtherLike::GLOBALS, | ||||
|     %SNMP::Info::Entity::GLOBALS, | ||||
|     %SNMP::Info::PowerEthernet::GLOBALS, | ||||
|     %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 | ||||
| @@ -88,10 +96,12 @@ $VERSION = '3.19'; | ||||
|     %SNMP::Info::FUNCS, | ||||
|     %SNMP::Info::AdslLine::FUNCS, | ||||
|     %SNMP::Info::Bridge::FUNCS, | ||||
|     %SNMP::Info::DocsisHE::FUNCS, | ||||
|     %SNMP::Info::EtherLike::FUNCS, | ||||
|     %SNMP::Info::Entity::FUNCS, | ||||
|     %SNMP::Info::PowerEthernet::FUNCS, | ||||
|     %SNMP::Info::IPv6::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
| 
 | ||||
|     # Obsolete Address Translation Table (ARP Cache) | ||||
|     'old_at_index'   => 'atIfIndex', | ||||
| @@ -118,6 +128,20 @@ $VERSION = '3.19'; | ||||
|     'ospf_peer_id'    => 'ospfNbrRtrId', | ||||
|     'ospf_peer_state' => 'ospfNbrState', | ||||
| 
 | ||||
|     # ISIS-MIB::isisCircTable | ||||
|     'isis_circ_if_idx'      => 'isisCircIfIndex' , | ||||
|     'isis_circ_admin'       => 'isisCircAdminState', | ||||
|     'isis_circ_type'        => 'isisCircType', | ||||
|     'isis_circ_level_type'  => 'isisCircLevelType', | ||||
| 
 | ||||
|     # ISIS-MIB::isisISAdjTable | ||||
|     'isis_adj_state'   => 'isisISAdjState', | ||||
|     'isis_adj_type'    => 'isisISAdjNeighSysType', | ||||
|     'isis_adj_usage'   => 'isisISAdjUsage', | ||||
|     'isis_adj_id'      => 'isisISAdjNeighSysID', | ||||
|     'isis_adj_ip_type' => 'isisISAdjIPAddrType', | ||||
|     'isis_adj'         => 'isisISAdjIPAddrAddress', | ||||
| 
 | ||||
|     # BGP4-MIB::bgpPeerTable | ||||
|     'bgp_peers'               => 'bgpPeerLocalAddr', | ||||
|     'bgp_peer_id'             => 'bgpPeerIdentifier', | ||||
| @@ -147,14 +171,42 @@ $VERSION = '3.19'; | ||||
|     %SNMP::Info::AdslLine::MUNGE, | ||||
|     %SNMP::Info::Bridge::MUNGE, | ||||
|     %SNMP::Info::EtherLike::MUNGE, | ||||
|     %SNMP::Info::DocsisHE::MUNGE, | ||||
|     %SNMP::Info::Entity::MUNGE, | ||||
|     %SNMP::Info::PowerEthernet::MUNGE, | ||||
|     %SNMP::Info::IPv6::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     'old_at_paddr' => \&SNMP::Info::munge_mac, | ||||
|     'at_paddr'     => \&SNMP::Info::munge_mac, | ||||
|     'n2p_paddr'    => \&SNMP::Info::munge_mac, | ||||
| ); | ||||
| 
 | ||||
| sub isis_peers { | ||||
|     my $l3 = shift; | ||||
| 
 | ||||
|     my $isis_peers = {}; | ||||
| 
 | ||||
|     # Returns hexstrings. Need to convert to IPv4 dotted or IPv6 hex notation | ||||
|     my $adjacencies = $l3->isis_adj(); | ||||
|     foreach my $key (keys %$adjacencies) { | ||||
|         my $hexstr = $adjacencies->{$key}; | ||||
|         my $l = length $hexstr; | ||||
|         my $ip; | ||||
|         # 4 bytes = IPv4 | ||||
|         if ($l == 4) { | ||||
|             $ip = join(".", unpack("C*", $hexstr)); | ||||
|             $isis_peers->{$key} = $ip; | ||||
|         } | ||||
|         # 16 bytes = IPv6 | ||||
|         elsif ($l == 16) { | ||||
|             $ip = unpack("H*", $hexstr); | ||||
|             $ip =~ s/....(?=.)\K/:/sg ; | ||||
|             $isis_peers->{$key} = $ip; | ||||
|         } | ||||
|     } | ||||
|     return $isis_peers; | ||||
| } | ||||
| 
 | ||||
| # Method OverRides | ||||
| 
 | ||||
| sub root_ip { | ||||
| @@ -185,49 +237,21 @@ sub root_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_parent = $l3->e_parent() || {}; | ||||
| 
 | ||||
|     foreach my $iid ( keys %$e_parent ) { | ||||
|         my $parent = $e_parent->{$iid}; | ||||
|         if ( $parent eq '0' ) { | ||||
|             my $serial = $l3->e_serial($iid); | ||||
|             if ( $serial ) { | ||||
|                 return $serial->{$iid}; | ||||
|             } | ||||
|             else { | ||||
|                 my $descr = $l3->e_descr($iid); | ||||
|                 if ( $descr and $descr =~ /serial#?:\s*([a-z0-9]+)/i ) | ||||
|                 { | ||||
|                     return $1; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     my $entity_serial = $l3->entity_derived_serial(); | ||||
|     if ( defined $entity_serial and $entity_serial !~ /^\s*$/ ){ | ||||
|         return $entity_serial; | ||||
|     } | ||||
| 
 | ||||
|     return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ ); | ||||
|     my $serial1 = $l3->serial1(); | ||||
|     if ( defined $serial1 and $serial1 !~ /^\s*$/ ) { | ||||
|         return $serial1; | ||||
|     } | ||||
| 
 | ||||
|     return; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| # $l3->model() - the sysObjectID returns an IID to an entry in | ||||
| @@ -253,6 +277,30 @@ sub model { | ||||
|     return $model; | ||||
| } | ||||
| 
 | ||||
| sub i_subinterfaces { | ||||
|   my $dev = shift; | ||||
|   my $partial = shift; | ||||
| 
 | ||||
|   my $ifstack = $dev->i_stack_status() || {}; | ||||
|   # TODO: if we want to do partial, we need to use inverse status | ||||
|   my $iftype = $dev->i_type() || {}; | ||||
| 
 | ||||
|   my $ret = $dev->SUPER::i_subinterfaces() || {}; | ||||
| 
 | ||||
|   foreach my $idx ( keys %$ifstack ) { | ||||
|       next unless $ifstack->{$idx} eq 'active'; | ||||
| 
 | ||||
|       my ( $higher, $lower ) = split /\./, $idx; | ||||
|       next if ( $higher == 0 or $lower == 0 ); | ||||
| 
 | ||||
|       if ( $iftype->{ $higher } eq 'l2vlan' or $iftype->{ $higher } eq 'l3ipvlan') { | ||||
|           push @{ $ret->{ $lower } }, $higher; | ||||
|       } | ||||
|   } | ||||
| 
 | ||||
|   return $ret; | ||||
| } | ||||
| 
 | ||||
| sub i_name { | ||||
|     my $l3      = shift; | ||||
|     my $partial = shift; | ||||
| @@ -306,15 +354,25 @@ sub interfaces { | ||||
| 
 | ||||
|     # Check for duplicates in ifDescr, if so uniquely identify by adding | ||||
|     # ifIndex to repeated values | ||||
|     my %seen; | ||||
|     foreach my $iid ( keys %$i_descr ) { | ||||
|     my (%seen, %first_seen_as); | ||||
|     foreach my $iid ( sort keys %$i_descr ) { | ||||
|         my $port = $i_descr->{$iid}; | ||||
|         next unless defined $port; | ||||
| 
 | ||||
|         $port = SNMP::Info::munge_null($port); | ||||
|         $port =~ s/^\s+//; $port =~ s/\s+$//; | ||||
|         next unless length $port; | ||||
| 
 | ||||
|         if ( $seen{$port}++ ) { | ||||
|             # (#320) also fixup the port this is a duplicate of | ||||
|             $interfaces->{ $first_seen_as{$port} } | ||||
|               = sprintf( "%s (%d)", $port, $first_seen_as{$port} ); | ||||
| 
 | ||||
|             $interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid ); | ||||
|         } | ||||
|         else { | ||||
|             $interfaces->{$iid} = $port; | ||||
|             $first_seen_as{$port} = $iid; | ||||
|         } | ||||
|     } | ||||
|     return $interfaces; | ||||
| @@ -323,8 +381,8 @@ sub interfaces { | ||||
| sub vendor { | ||||
|     my $l3 = shift; | ||||
| 
 | ||||
|     my $descr = $l3->description(); | ||||
|     my $id    = $l3->id(); | ||||
|     my $descr = $l3->description() || ''; | ||||
|     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 | ||||
| @@ -373,14 +431,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $l3 = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class = $l3->class(); | ||||
| @@ -403,11 +461,11 @@ This class is usually used as a superclass for more specific device classes | ||||
| listed under SNMP::Info::Layer3::*   Please read all docs under SNMP::Info | ||||
| first. | ||||
| 
 | ||||
| Provides generic methods for accessing SNMP data for Layer 3 network devices.  | ||||
| Includes support for Layer2+3 devices.  | ||||
| Provides generic methods for accessing SNMP data for Layer 3 network devices. | ||||
| Includes support for Layer2+3 devices. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
| 
 | ||||
|  my $l3 = new SNMP::Info::Layer3(...); | ||||
| 
 | ||||
| @@ -427,6 +485,12 @@ after determining a more specific class using the method above. | ||||
| 
 | ||||
| =item SNMP::Info::IPv6 | ||||
| 
 | ||||
| =item SNMP::Info::LLDP | ||||
| 
 | ||||
| =item SNMP::Info::DocsisHE | ||||
| 
 | ||||
| =item SNMP::Info::AdslLine | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Required MIBs | ||||
| @@ -435,6 +499,8 @@ after determining a more specific class using the method above. | ||||
| 
 | ||||
| =item F<IP-MIB> | ||||
| 
 | ||||
| =item F<ISIS-MIB> | ||||
| 
 | ||||
| =item F<OSPF-MIB> | ||||
| 
 | ||||
| =item F<BGP4-MIB> | ||||
| @@ -443,7 +509,7 @@ after determining a more specific class using the method above. | ||||
| 
 | ||||
| =head2 Inherited MIBs | ||||
| 
 | ||||
| See L<SNMP::Info/"Required MIBs"> for its MIB requirements. | ||||
| See L<SNMP::Info/"REQUIREMENTS"> for its MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its MIB requirements. | ||||
| 
 | ||||
| @@ -455,6 +521,12 @@ 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. | ||||
| 
 | ||||
| See L<SNMP::Info::DocsisHE/"Required MIBs"> for its MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::AdslLine/"Required MIBs"> for its MIB requirements. | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar value from SNMP | ||||
| @@ -479,7 +551,7 @@ Returns the BGP identifier of the local system | ||||
| 
 | ||||
| =item $l3->bgp_local_as() | ||||
| 
 | ||||
| Returns the local autonomous system number  | ||||
| Returns the local autonomous system number | ||||
| 
 | ||||
| (C<bgpLocalAs.0>) | ||||
| 
 | ||||
| @@ -497,8 +569,7 @@ Removes 'cisco'  from cisco devices for readability. | ||||
| 
 | ||||
| =item $l3->serial() | ||||
| 
 | ||||
| Tries to cull a serial number from F<ENTITY-MIB>, description, and | ||||
| F<OLD-CISCO->... MIB. | ||||
| Returns a serial number if found from F<ENTITY-MIB> and F<OLD-CISCO->... MIB. | ||||
| 
 | ||||
| =item $l3->vendor() | ||||
| 
 | ||||
| @@ -514,7 +585,7 @@ found:  OSPF Router ID (C<ospfRouterId>) or any OSPF Host IP Address | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info | ||||
| 
 | ||||
| See L<SNMP::Info/"GLOBALS"> for details. | ||||
| See L<SNMP::Info/"USAGE"> for details. | ||||
| 
 | ||||
| =head2 Global Methods imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| @@ -528,6 +599,26 @@ 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. | ||||
| 
 | ||||
| =head2 Global Methods imported from SNMP::Info::DocsisHE | ||||
| 
 | ||||
| See L<SNMP::Info::DocsisHE/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Global Methods imported from SNMP::Info::AdslLine | ||||
| 
 | ||||
| See L<SNMP::Info::AdslLine/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head1 TABLE METHODS | ||||
| 
 | ||||
| These are methods that return tables of information in the form of a reference | ||||
| @@ -540,19 +631,29 @@ to a hash. | ||||
| =item $l3->interfaces() | ||||
| 
 | ||||
| Returns the map between SNMP Interface Identifier (iid) and physical port | ||||
| name.  | ||||
| name. | ||||
| 
 | ||||
| Only returns those iids that have a description listed in $l3->i_description() | ||||
| 
 | ||||
| =item $l3->i_ignore() | ||||
| =item $l3->i_subinterfaces() | ||||
| 
 | ||||
| Returns reference to hash.  Creates a key for each IID that should be ignored. | ||||
| Returns reference to hash of arrays: key = C<ifIndex>, value = array of | ||||
| C<ifIndex>. These are the VLAN subinterfaces (C<l2vlan> type) for the parent | ||||
| (C<ethernetCsmacd> type) interface. | ||||
| 
 | ||||
| Currently looks for tunnel,loopback,lo,null from $l3->interfaces() | ||||
|   Example: | ||||
|   my $interfaces = $l3->interfaces(); | ||||
|   my $i_subs     = $l3->i_subinterfaces(); | ||||
| 
 | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $subs = join(',', sort(map {$interfaces->{$_}} @{$i_subs->{$iid}})); | ||||
|     print "Port: $port has subinterfaces: $subs\n"; | ||||
|   } | ||||
| 
 | ||||
| =item $l3->i_name() | ||||
| 
 | ||||
| Returns reference to hash of iid to human set name.  | ||||
| Returns reference to hash of iid to human set name. | ||||
| 
 | ||||
| Defaults to C<ifName>, but checks for an C<ifAlias> | ||||
| 
 | ||||
| @@ -560,10 +661,10 @@ Defaults to C<ifName>, but checks for an C<ifAlias> | ||||
| 
 | ||||
| Returns reference to hash of iid to current link duplex setting. | ||||
| 
 | ||||
| Maps $l3->el_index() to $l3->el_duplex, then culls out  | ||||
| full,half, or auto and sets the map to that value.  | ||||
| Maps $l3->el_index() to $l3->el_duplex, then culls out | ||||
| full,half, or auto and sets the map to that value. | ||||
| 
 | ||||
| See L<SNMP::Info::Etherlike> for the el_index() and el_duplex() methods. | ||||
| See L<SNMP::Info::EtherLike> for the el_index() and el_duplex() methods. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| @@ -573,7 +674,7 @@ See L<SNMP::Info::Etherlike> for the el_index() and el_duplex() methods. | ||||
| 
 | ||||
| =item $l3->at_index() | ||||
| 
 | ||||
| Returns reference to hash.  Maps ARP table entries to Interface IIDs  | ||||
| Returns reference to hash.  Maps ARP table entries to Interface IIDs | ||||
| 
 | ||||
| (C<ipNetToMediaIfIndex>) | ||||
| 
 | ||||
| @@ -582,7 +683,7 @@ the deprecated C<atIfIndex>. | ||||
| 
 | ||||
| =item $l3->at_paddr() | ||||
| 
 | ||||
| Returns reference to hash.  Maps ARP table entries to MAC addresses.  | ||||
| Returns reference to hash.  Maps ARP table entries to MAC addresses. | ||||
| 
 | ||||
| (C<ipNetToMediaPhysAddress>) | ||||
| 
 | ||||
| @@ -591,7 +692,7 @@ the deprecated C<atPhysAddress>. | ||||
| 
 | ||||
| =item $l3->at_netaddr() | ||||
| 
 | ||||
| Returns reference to hash.  Maps ARP table entries to IP addresses.  | ||||
| Returns reference to hash.  Maps ARP table entries to IP addresses. | ||||
| 
 | ||||
| (C<ipNetToMediaNetAddress>) | ||||
| 
 | ||||
| @@ -779,9 +880,85 @@ routers | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 IS-IS Circuit Table | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $l3->isis_circ_if_idx() | ||||
| 
 | ||||
| Returns reference to hash of the interface index associated with the IS-IS | ||||
| circuit | ||||
| (C<isisCircIfIndex>) | ||||
| 
 | ||||
| =item $l3->isis_circ_admin() | ||||
| 
 | ||||
| Returns reference to hash of the IS-IS circuit's admin status | ||||
| 
 | ||||
| (C<isisCircAdminState>) | ||||
| 
 | ||||
| =item $l3->isis_circ_type() | ||||
| 
 | ||||
| Returns reference to hash of the IS-IS circuit's type | ||||
| 
 | ||||
| (C<isisCircType>) | ||||
| 
 | ||||
| =item $l3->isis_circ_level_type() | ||||
| 
 | ||||
| Returns reference to hash of the IS-IS circuit's level | ||||
| 
 | ||||
| (C<isisCircLevelType>) | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 IS-IS Adjacency Table | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item $l3->isis_adj_id() | ||||
| 
 | ||||
| Returns reference to hash of the peer id of adjacencies. | ||||
| 
 | ||||
| (C<isisISAdjNeighSysID>) | ||||
| 
 | ||||
| =item $l3->isis_adj_type() | ||||
| 
 | ||||
| Returns reference to hash of the type of adjacencies (Level 1 | ||||
| Intermediate System, Level 2 Intermediate System, Level 1+2 | ||||
| Intermediate System, unknown) | ||||
| 
 | ||||
| (C<isisISAdjNeighSysType>) | ||||
| 
 | ||||
| =item $l3->isis_adj_usage() | ||||
| 
 | ||||
| Returns reference to hash of the type of adjacencies in use | ||||
| (undefined, Level 1, Level 2, Level1+2) | ||||
| 
 | ||||
| (C<isisISAdjNeighUsage>) | ||||
| 
 | ||||
| =item $l3->isis_adj_ip_type() | ||||
| 
 | ||||
| Returns reference to hash of type of address (IPv4, IPv6, etc) on adjacencies. | ||||
| 
 | ||||
| (C<isisISAdjIPAddrType>) | ||||
| 
 | ||||
| =item $l3->isis_adj() | ||||
| 
 | ||||
| Returns reference to hash of addresses (IPv4, IPv6, etc) on adjacencies. | ||||
| Note this returns hash-strings, for IPs, use $l3->isis_peers() | ||||
| 
 | ||||
| (C<isisISAdjIPAddrAddress>) | ||||
| 
 | ||||
| =item $l3->isis_peers() | ||||
| 
 | ||||
| Returns reference to hash of addresses (IPv4, IPv6) on adjacencies. | ||||
| Convert hash strings from isis_adj to proper | ||||
| IP (v4 and v6) formatting. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
| 
 | ||||
| See L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| See L<SNMP::Info/"USAGE"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| @@ -803,4 +980,16 @@ 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. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::DocsisHE | ||||
| 
 | ||||
| See L<SNMP::Info::DocsisHE/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::AdslLine | ||||
| 
 | ||||
| See L<SNMP::Info::AdslLine/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::Aironet | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. | ||||
| # | ||||
| @@ -33,15 +32,16 @@ | ||||
| package SNMP::Info::Layer3::Aironet; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| 
 | ||||
| @SNMP::Info::Layer3::Aironet::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Aironet::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; | ||||
| our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -69,8 +69,8 @@ $VERSION = '3.19'; | ||||
|     'bp_index2' => 'dot1dBasePortIfIndex', | ||||
| 
 | ||||
|     # AWC Interface Table (awcIfTable) | ||||
|     'awc_default_mac' => 'awcIfDefaultPhyAddress', | ||||
|     'awc_mac'         => 'awcIfPhyAddress', | ||||
|     'awc_default_mac' => 'awcIfDefaultPhysAddress', | ||||
|     'awc_mac'         => 'awcIfPhysAddress', | ||||
|     'awc_ip'          => 'awcIfIpAddress', | ||||
|     'awc_netmask'     => 'awcIfIpNetMask', | ||||
|     'awc_msdu'        => 'awcIfMSDUMaxLength', | ||||
| @@ -224,14 +224,14 @@ Max Baker | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $aironet = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $aironet->class(); | ||||
| @@ -257,7 +257,7 @@ This class is for devices running Cisco IOS software (newer) | ||||
| =back | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| after determining a more specific class using the method above. | ||||
| 
 | ||||
|  my $aironet = new SNMP::Info::Layer3::Aironet(...); | ||||
| 
 | ||||
| @@ -279,9 +279,6 @@ after determining a more specific class using the method above. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| These MIBs are now included in the v2.tar.gz archive available from | ||||
| ftp.cisco.com.  Make sure you have a current version.  | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| 
 | ||||
| These are methods that return scalar value from SNMP | ||||
| @@ -296,7 +293,7 @@ C<awcEtherDuplex.0> | ||||
| 
 | ||||
| =item $aironet->mac() | ||||
| 
 | ||||
| Gives the MAC Address of the wireless side  | ||||
| Gives the MAC Address of the wireless side | ||||
| 
 | ||||
| C<dot11StationID.2> | ||||
| 
 | ||||
| @@ -364,13 +361,13 @@ Ignores ports that are of type ``rptr'' and ``lo''. | ||||
| 
 | ||||
| Gives the default MAC address of each interface. | ||||
| 
 | ||||
| C<awcIfDefaultPhyAddress> | ||||
| C<awcIfDefaultPhysAddress> | ||||
| 
 | ||||
| =item $aironet->awc_mac() | ||||
| 
 | ||||
| Gives the actual MAC address of each interface. | ||||
| 
 | ||||
| C<awcIfPhyAddress> | ||||
| C<awcIfPhysAddress> | ||||
| 
 | ||||
| =item $aironet->awc_ip() | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::AlcatelLucent | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Bill Fenner | ||||
| # | ||||
| @@ -30,6 +29,7 @@ | ||||
| package SNMP::Info::Layer3::AlcatelLucent; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| 
 | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| @@ -47,9 +47,9 @@ use SNMP::Info::LLDP; | ||||
|     SNMP::Info::MAU SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::AlcatelLucent::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -112,15 +112,15 @@ sub vendor { | ||||
| } | ||||
| 
 | ||||
| sub os_ver { | ||||
|     my $alu = shift; | ||||
|    my $alu = shift; | ||||
| 
 | ||||
|     my $descr = $alu->description(); | ||||
|     if ( $descr =~ m/^(\S+)/ ) { | ||||
|         return $1; | ||||
|     } | ||||
|    my $descr = $alu->description(); | ||||
|    if (defined ($descr)) { | ||||
|      return $1 if $descr =~ m/\b(\d[\.\d]+R\d+) (?:GA|Service Release), /; | ||||
|    } | ||||
| 
 | ||||
|     # No clue what this will try but hey | ||||
|     return $alu->SUPER::os_ver(); | ||||
|    # No clue what this will try but hey | ||||
|    return $alu->SUPER::os_ver(); | ||||
| } | ||||
| 
 | ||||
| # ps1_type, ps1_status, ps2_type, ps2_status: | ||||
| @@ -308,7 +308,7 @@ Bill Fenner | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $alu = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -316,7 +316,7 @@ Bill Fenner | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $alu->class(); | ||||
| @@ -372,7 +372,7 @@ These are methods that return scalar value from SNMP | ||||
| 
 | ||||
| =item $alu->vendor() | ||||
| 
 | ||||
|     Returns 'alcatel-lucent' | ||||
| Returns 'alcatel-lucent' | ||||
| 
 | ||||
| =item $alu->model() | ||||
| 
 | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::AlteonAD | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All Rights Reserved | ||||
| @@ -31,15 +30,16 @@ | ||||
| package SNMP::Info::Layer3::AlteonAD; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| 
 | ||||
| @SNMP::Info::Layer3::AlteonAD::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::AlteonAD::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
| @@ -163,14 +163,14 @@ sub ps1_status { | ||||
|     my $alteon = shift; | ||||
|     my $old_ps = $alteon->old_ps1_stat(); | ||||
|     my $new_ps = $alteon->new_ps_stat(); | ||||
|      | ||||
| 
 | ||||
|     return $old_ps if $old_ps; | ||||
|      | ||||
| 
 | ||||
|     if ($new_ps) { | ||||
|         return 'ok' if ($new_ps eq 'singlePowerSupplyOk'); | ||||
|         return 'failed' if ($new_ps eq 'firstPowerSupplyFailed'); | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| @@ -178,9 +178,9 @@ sub ps2_status { | ||||
|     my $alteon = shift; | ||||
|     my $old_ps = $alteon->old_ps2_stat(); | ||||
|     my $new_ps = $alteon->new_ps_stat(); | ||||
|      | ||||
| 
 | ||||
|     return $old_ps if $old_ps; | ||||
|      | ||||
| 
 | ||||
|     if ($new_ps) { | ||||
|         return 'ok' if ($new_ps eq 'doublePowerSupplyOk'); | ||||
|         return 'failed' if ($new_ps eq 'secondPowerSupplyFailed'); | ||||
| @@ -242,19 +242,19 @@ sub i_duplex { | ||||
| sub i_duplex_admin { | ||||
|     my $alteon = shift; | ||||
| 
 | ||||
|     my $ag_pref  | ||||
|     my $ag_pref | ||||
|         = $alteon->new_ag_p_cfg_pref() | ||||
|         || $alteon->old_ag_p_cfg_pref() | ||||
|         || {}; | ||||
|     my $ag_fe_auto  | ||||
|     my $ag_fe_auto | ||||
|         = $alteon->new_ag_p_cfg_fe_auto() | ||||
|         || $alteon->old_ag_p_cfg_fe_auto() | ||||
|         || {}; | ||||
|     my $ag_fe_mode  | ||||
|     my $ag_fe_mode | ||||
|         = $alteon->new_ag_p_cfg_fe_mode() | ||||
|         || $alteon->old_ag_p_cfg_fe_mode() | ||||
|         || {}; | ||||
|     my $ag_ge_auto  | ||||
|     my $ag_ge_auto | ||||
|         = $alteon->new_ag_p_cfg_ge_auto() | ||||
|         || $alteon->old_ag_p_cfg_ge_auto() | ||||
|         || {}; | ||||
| @@ -385,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 { | ||||
| @@ -418,14 +432,14 @@ Eric Miller | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $alteon = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $alteon->class(); | ||||
| @@ -436,11 +450,6 @@ Eric Miller | ||||
| Abstraction subclass for Radware Alteon Series ADC switches and | ||||
| Nortel BladeCenter Layer2-3 GbE Switch Modules. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
|  my $alteon = new SNMP::Info::Layer3::AlteonAD(...); | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| @@ -567,13 +576,19 @@ IDs.  These are the VLANs which are members of the egress list for the port. | ||||
|   Example: | ||||
|   my $interfaces = $alteon->interfaces(); | ||||
|   my $vlans      = $alteon->i_vlan_membership(); | ||||
|    | ||||
| 
 | ||||
|   foreach my $iid (sort keys %$interfaces) { | ||||
|     my $port = $interfaces->{$iid}; | ||||
|     my $vlan = join(',', sort(@{$vlans->{$iid}})); | ||||
|     print "Port: $port VLAN: $vlan\n"; | ||||
|   } | ||||
| 
 | ||||
| =item $alteon->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 | ||||
| @@ -1,23 +1,22 @@ | ||||
| # SNMP::Info::Layer3::Altiga | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Jeroen van Ingen Schenau | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without  | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| #  | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the  | ||||
| #       names of its contributors may be used to endorse or promote products  | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| #  | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE   | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| @@ -31,22 +30,23 @@ | ||||
| package SNMP::Info::Layer3::Altiga; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| 
 | ||||
| @SNMP::Info::Layer3::Altiga::ISA = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Altiga::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE  | ||||
|             $int_include_vpn $fake_idx $type_class/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE, | ||||
|             $int_include_vpn, $fake_idx, $type_class); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|             %SNMP::Info::Layer3::MIBS, | ||||
|             'ALTIGA-VERSION-STATS-MIB'  => 'alVersionString', | ||||
|             'ALTIGA-SESSION-STATS-MIB'  => 'alActiveSessionCount', | ||||
|             'ALTIGA-HARDWARE-STATS-MIB' => 'alHardwarePs1Type',   | ||||
|             'ALTIGA-HARDWARE-STATS-MIB' => 'alHardwarePs1Type', | ||||
|     ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
| @@ -70,7 +70,7 @@ $VERSION = '3.19'; | ||||
|             'fan1_alarm'      => 'alHardwareFan1RpmAlarm', | ||||
|             'fan2_alarm'      => 'alHardwareFan2RpmAlarm', | ||||
|             'fan3_alarm'      => 'alHardwareFan3RpmAlarm', | ||||
|              | ||||
| 
 | ||||
|        ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
| @@ -189,7 +189,7 @@ sub interfaces { | ||||
|     if ($int_include_vpn) { | ||||
|         my $tun_type = $altiga->vpn_sess_protocol(); | ||||
|         my $peer = $altiga->vpn_sess_peer_ip(); | ||||
|         my $remote = $altiga->vpn_sess_rem_ip();  | ||||
|         my $remote = $altiga->vpn_sess_rem_ip(); | ||||
|         my $group = $altiga->vpn_sess_gid(); | ||||
|         foreach my $tunnel (keys %$tun_type) { | ||||
|             if ($type_class->{$tun_type->{$tunnel}} eq 1) { | ||||
| @@ -197,7 +197,7 @@ sub interfaces { | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|              | ||||
| 
 | ||||
|     return \%interfaces; | ||||
| } | ||||
| 
 | ||||
| @@ -275,14 +275,14 @@ Jeroen van Ingen Schenau | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $altiga = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'my_vpn_host', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 1 | ||||
|                         )  | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $altiga->class(); | ||||
| @@ -304,6 +304,12 @@ Subclass for Cisco (formerly Altiga) VPN concentrators | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item F<ALTIGA-VERSION-STATS-MIB> | ||||
| 
 | ||||
| =item F<ALTIGA-SESSION-STATS-MIB> | ||||
| 
 | ||||
| =item F<ALTIGA-HARDWARE-STATS-MIB> | ||||
| 
 | ||||
| =item Inherited Classes' MIBs | ||||
| 
 | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
| @@ -366,7 +372,7 @@ to a hash. | ||||
| =item $altiga->interfaces() | ||||
| 
 | ||||
| This method overrides the interfaces() method inherited from SNMP::Info. | ||||
| It provides a mapping between the Interface Table Index (iid) and the physical  | ||||
| It provides a mapping between the Interface Table Index (iid) and the physical | ||||
| port name, adding a port number to the port name to prevent duplicate names. | ||||
| 
 | ||||
| =item $altiga->i_lastchange() | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::Arista | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Arista Networks, Inc. | ||||
| # All rights reserved. | ||||
| @@ -31,49 +30,44 @@ | ||||
| package SNMP::Info::Layer3::Arista; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| 
 | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::MAU; | ||||
| use SNMP::Info::LLDP; | ||||
| use SNMP::Info::Aggregate; | ||||
| use SNMP::Info::Aggregate 'agg_ports_ifstack'; | ||||
| 
 | ||||
| @SNMP::Info::Layer3::Arista::ISA = qw/ | ||||
|     SNMP::Info::Aggregate | ||||
|     SNMP::Info::LLDP | ||||
|     SNMP::Info::MAU | ||||
|     SNMP::Info::Layer3 Exporter | ||||
|     SNMP::Info::Layer3 | ||||
|     Exporter | ||||
| /; | ||||
| @SNMP::Info::Layer3::Arista::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/; | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::MAU::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     %SNMP::Info::Aggregate::MIBS, | ||||
|     'ARISTA-PRODUCTS-MIB' => 'aristaProducts', | ||||
|     'ARISTA-PRODUCTS-MIB' => 'aristaDCS7124S', | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::MAU::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::MAU::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::MAU::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
| ); | ||||
| 
 | ||||
| # use MAU-MIB for admin. duplex and admin. speed | ||||
| @@ -92,11 +86,14 @@ sub os { | ||||
| 
 | ||||
| sub os_ver { | ||||
|     my $arista = shift; | ||||
|     my $descr   = $arista->description(); | ||||
|     my $os_ver  = undef; | ||||
|     my $descr  = $arista->description(); | ||||
| 
 | ||||
|     $os_ver = $1 if ( $descr =~ /\s+EOS\s+version\s+(\S+)\s+/ ); | ||||
|     return $os_ver; | ||||
|     if (defined ($descr)) { | ||||
|       my $os_ver = undef; | ||||
|       $os_ver = $1 if ($descr =~ /\s+EOS\s+version\s+(\S+)\s+/); | ||||
|       return $os_ver; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub model { | ||||
| @@ -131,6 +128,11 @@ sub lldp_if { | ||||
|     return $lldp_if; | ||||
| } | ||||
| 
 | ||||
| sub set_i_vlan { | ||||
|     my ($arista, $vlan, $iid) = @_; | ||||
|     return $arista->set_qb_i_vlan($vlan, $iid); | ||||
| } | ||||
| 
 | ||||
| sub agg_ports { return agg_ports_ifstack(@_) } | ||||
| 
 | ||||
| 1; | ||||
| @@ -146,7 +148,7 @@ Bill Fenner | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $arista = new SNMP::Info( | ||||
|                         AutoSpecify => 1, | ||||
|                         Debug       => 1, | ||||
| @@ -154,7 +156,7 @@ Bill Fenner | ||||
|                         DestHost    => 'myswitch', | ||||
|                         Community   => 'public', | ||||
|                         Version     => 2 | ||||
|                         )  | ||||
| 		 	) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $arista->class(); | ||||
| @@ -174,8 +176,6 @@ Subclass for Arista Networks EOS-based devices | ||||
| 
 | ||||
| =item SNMP::Info::MAU | ||||
| 
 | ||||
| =item SNMP::Info::LLDP | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Required MIBs | ||||
| @@ -192,8 +192,6 @@ See L<SNMP::Info::Aggregate/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| @@ -204,7 +202,7 @@ These are methods that return scalar values from SNMP | ||||
| 
 | ||||
| =item $arista->vendor() | ||||
| 
 | ||||
|     Returns 'Arista Networks, Inc.' | ||||
| Returns 'arista' | ||||
| 
 | ||||
| =item $arista->model() | ||||
| 
 | ||||
| @@ -230,10 +228,6 @@ See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Global Methods imported from SNMP::Info::Layer3 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head1 TABLE METHODS | ||||
| 
 | ||||
| These are methods that return tables of information in the form of a reference | ||||
| @@ -269,8 +263,17 @@ See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::LLDP | ||||
| =head1 SET METHODS | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details. | ||||
| These are methods that provide SNMP set functionality for overridden methods | ||||
| or provide a simpler interface to complex set operations.  See | ||||
| L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set | ||||
| operations. | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item set_i_vlan() | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::Aruba | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2013 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,20 +30,19 @@ | ||||
| package SNMP::Info::Layer3::Aruba; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::LLDP; | ||||
| 
 | ||||
| @SNMP::Info::Layer3::Aruba::ISA       = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Aruba::ISA       = qw/SNMP::Info::Layer3 Exporter/; | ||||
| @SNMP::Info::Layer3::Aruba::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/; | ||||
| our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::LLDP::MIBS, | ||||
|     'WLSR-AP-MIB'        => 'wlsrHideSSID', | ||||
|     'WLSX-IFEXT-MIB'     => 'ifExtVlanName', | ||||
|     'WLSX-POE-MIB'       => 'wlsxPseSlotPowerAvailable', | ||||
| @@ -58,7 +56,6 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::LLDP::GLOBALS, | ||||
|     'aruba_serial_old' => 'wlsxSwitchLicenseSerialNumber', | ||||
|     'aruba_serial_new' => 'wlsxSysExtLicenseSerialNumber', | ||||
|     'aruba_model'      => 'wlsxModelName', | ||||
| @@ -67,7 +64,6 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::LLDP::FUNCS, | ||||
| 
 | ||||
|     # WLSR-AP-MIB::wlsrConfigTable | ||||
|     'aruba_ap_ssidbcast' => 'wlsrHideSSID', | ||||
| @@ -124,6 +120,8 @@ $VERSION = '3.19'; | ||||
|     'aruba_ap_model'  => 'wlanAPModelName', | ||||
|     'aruba_ap_name'   => 'wlanAPName', | ||||
|     'aruba_ap_ip'     => 'wlanAPIpAddress', | ||||
|     'aruba_ap_hw_ver' => 'wlanAPHwVersion', | ||||
|     'aruba_ap_sw_ver' => 'wlanAPSwVersion', | ||||
| 
 | ||||
|     # WLSX-WLAN-MIB::wlsxWlanESSIDVlanPoolTable | ||||
|     'aruba_ssid_vlan' => 'wlanESSIDVlanPoolStatus', | ||||
| @@ -141,7 +139,6 @@ $VERSION = '3.19'; | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::LLDP::MUNGE, | ||||
|     'aruba_ap_fqln'       => \&munge_aruba_fqln, | ||||
|     'aruba_ap_type'       => \&SNMP::Info::munge_e_type, | ||||
|     'aruba_card_type'     => \&SNMP::Info::munge_e_type, | ||||
| @@ -168,10 +165,9 @@ sub vendor { | ||||
|     $id = $1 if ( defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/ ); | ||||
| 
 | ||||
|     if ( defined($id) and exists( $oidmap{$id} ) ) { | ||||
| 	return $oidmap{$id}; | ||||
|     } | ||||
|     else { | ||||
| 	return 'aruba'; | ||||
|       return $oidmap{$id}; | ||||
|     } else { | ||||
|       return 'aruba'; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @@ -181,7 +177,7 @@ sub os_ver { | ||||
|     return unless defined $descr; | ||||
| 
 | ||||
|     if ( $descr =~ m/Version\s+(\d+\.\d+\.\d+\.\d+)/ ) { | ||||
| 	return $1; | ||||
|       return $1; | ||||
|     } | ||||
| 
 | ||||
|     return; | ||||
| @@ -484,6 +480,7 @@ sub i_vlan { | ||||
| 	return $aruba->SUPER::i_vlan($partial) | ||||
| 		if keys %{ $aruba->SUPER::i_vlan($partial) }; | ||||
| 
 | ||||
| 	# If we don't have Q-BRIDGE-MIB, we're a wireless controller | ||||
| 	my $index = $aruba->aruba_if_idx(); | ||||
| 
 | ||||
| 	if ($partial) { | ||||
| @@ -512,6 +509,7 @@ sub i_vlan_membership { | ||||
| 	return $aruba->SUPER::i_vlan_membership($partial) | ||||
| 		if keys %{ $aruba->SUPER::i_vlan_membership($partial) }; | ||||
| 
 | ||||
| 	# If we don't have Q-BRIDGE-MIB, we're a wireless controller | ||||
| 	my $essid_ssid = $aruba->aruba_ap_bssid_ssid(); | ||||
| 	my $ssid_vlans = $aruba->aruba_ssid_vlan(); | ||||
| 	my $if_vlans   = $aruba->aruba_if_vlan_member(); | ||||
| @@ -555,6 +553,32 @@ sub i_vlan_membership { | ||||
| 	return $i_vlan_membership; | ||||
| } | ||||
| 
 | ||||
| sub i_vlan_membership_untagged { | ||||
| 	my $aruba   = shift; | ||||
| 	my $partial = shift; | ||||
| 
 | ||||
| 	return $aruba->SUPER::i_vlan_membership_untagged($partial) | ||||
| 		if keys %{ $aruba->SUPER::i_vlan_membership_untagged($partial) }; | ||||
| 
 | ||||
| 	# If we don't have Q-BRIDGE-MIB, we're a wireless controller | ||||
| 	# It is unclear if native VLAN is transmitted untagged | ||||
| 	# This assumes Cisco-like behavior on trunks that native VLAN is | ||||
| 	# transmitted untagged, if this needs to be changed we will need to | ||||
| 	# consider ifExtMode rather than just using i_vlan | ||||
| 	my $if_membership = $aruba->i_vlan_membership(); | ||||
| 	my $if_ = $aruba->i_vlan(); | ||||
| 	my $if_mode   = $aruba->aruba_if_mode(); | ||||
| 
 | ||||
|     my $vlans = $aruba->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 i_80211channel { | ||||
|     my $aruba   = shift; | ||||
|     my $partial = shift; | ||||
| @@ -995,8 +1019,9 @@ sub e_type { | ||||
| sub e_hwver { | ||||
|     my $aruba = shift; | ||||
| 
 | ||||
|     my $ap_hw   = $aruba->aruba_card_hw()   || {}; | ||||
|     my $ap_fpga = $aruba->aruba_card_fpga() || {}; | ||||
|     my $ap_hw     = $aruba->aruba_card_hw()   || {}; | ||||
|     my $ap_fpga   = $aruba->aruba_card_fpga() || {}; | ||||
|     my $ap_hw_ver = $aruba->aruba_ap_hw_ver() || {}; | ||||
| 
 | ||||
|     my %e_hwver; | ||||
| 
 | ||||
| @@ -1008,9 +1033,36 @@ sub e_hwver { | ||||
| 
 | ||||
| 	$e_hwver{$iid} = "$hw $fpga"; | ||||
|     } | ||||
| 
 | ||||
|     # APs | ||||
|     foreach my $idx ( keys %$ap_hw_ver ) { | ||||
| 	my $hw_ver = $ap_hw_ver->{$idx}; | ||||
| 	next unless defined $hw_ver; | ||||
| 
 | ||||
| 	$e_hwver{$idx} = "$hw_ver"; | ||||
|     } | ||||
| 
 | ||||
|     return \%e_hwver; | ||||
| } | ||||
| 
 | ||||
| sub e_swver { | ||||
|     my $aruba = shift; | ||||
| 
 | ||||
|     my $ap_sw_ver = $aruba->aruba_ap_hw_ver() || {}; | ||||
| 
 | ||||
|     my %e_swver; | ||||
| 
 | ||||
|     # APs | ||||
|     foreach my $idx ( keys %$ap_sw_ver ) { | ||||
| 	my $sw_ver = $ap_sw_ver->{$idx}; | ||||
| 	next unless defined $sw_ver; | ||||
| 
 | ||||
| 	$e_swver{$idx} = "$sw_ver"; | ||||
|     } | ||||
| 
 | ||||
|     return \%e_swver; | ||||
| } | ||||
| 
 | ||||
| sub e_vendor { | ||||
|     my $aruba = shift; | ||||
| 
 | ||||
| @@ -1345,7 +1397,7 @@ Eric Miller | ||||
| 			  DestHost    => 'myswitch', | ||||
| 			  Community   => 'public', | ||||
| 			  Version     => 2 | ||||
| 			)  | ||||
| 			) | ||||
| 
 | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
| @@ -1363,11 +1415,6 @@ This class emulates bridge functionality for the wireless switch. This enables | ||||
| end station MAC addresses collection and correlation to the thin access point | ||||
| the end station is using for communication. | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
|  my $aruba = new SNMP::Info::Layer3::Aruba(...); | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| @@ -1408,7 +1455,7 @@ These are methods that return scalar value from SNMP | ||||
| 
 | ||||
| =item $aruba->model() | ||||
| 
 | ||||
| Returns model type.  Cross references $aruba->id() with product IDs in the  | ||||
| Returns model type.  Cross references $aruba->id() with product IDs in the | ||||
| Aruba MIB. | ||||
| 
 | ||||
| =item $aruba->vendor() | ||||
| @@ -1482,7 +1529,7 @@ false. | ||||
| =item $aruba->i_ssidmac() | ||||
| 
 | ||||
| With the same keys as i_ssidlist, returns the Basic service set | ||||
| identification (BSSID), MAC address, the AP is using for the SSID.  | ||||
| identification (BSSID), MAC address, the AP is using for the SSID. | ||||
| 
 | ||||
| =item $aruba->cd11_mac() | ||||
| 
 | ||||
| @@ -1520,7 +1567,7 @@ Total packets transmitted by the wireless client. | ||||
| 
 | ||||
| =item $aruba->i_index() | ||||
| 
 | ||||
| Returns reference to map of IIDs to Interface index.  | ||||
| Returns reference to map of IIDs to Interface index. | ||||
| 
 | ||||
| Extends C<ifIndex> to support APs as device interfaces. | ||||
| 
 | ||||
| @@ -1556,7 +1603,7 @@ interfaces. | ||||
| =item $aruba->i_up_admin() | ||||
| 
 | ||||
| Returns reference to map of IIDs to administrative status of the interface. | ||||
| Returns C<ifAdminStatus> for Ethernet interfaces and C<wlanAPStatus>  | ||||
| Returns C<ifAdminStatus> for Ethernet interfaces and C<wlanAPStatus> | ||||
| for AP interfaces. | ||||
| 
 | ||||
| =item $aruba->i_mac() | ||||
| @@ -1586,6 +1633,12 @@ Returns reference to map of IIDs to VLAN ID of the interface. | ||||
| Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN | ||||
| IDs.  These are the VLANs for which the port is a member. | ||||
| 
 | ||||
| =item $aruba->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 $aruba->bp_index() | ||||
| 
 | ||||
| Augments the bridge MIB by returning reference to a hash containing the | ||||
| @@ -1648,6 +1701,10 @@ Returns reference to hash.  Key: IID, Value: Type of component. | ||||
| 
 | ||||
| Returns reference to hash.  Key: IID, Value: Hardware revision. | ||||
| 
 | ||||
| =item $aruba->e_swver() | ||||
| 
 | ||||
| Returns reference to hash.  Key: IID, Value: Software revision. | ||||
| 
 | ||||
| =item $aruba->e_vendor() | ||||
| 
 | ||||
| Returns reference to hash.  Key: IID, Value: aruba. | ||||
							
								
								
									
										340
									
								
								lib/SNMP/Info/Layer3/ArubaCX.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								lib/SNMP/Info/Layer3/ArubaCX.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,340 @@ | ||||
| # SNMP::Info::Layer3::ArubaCX | ||||
| # | ||||
| # Copyright (c) 2021 Jeroen van Ingen | ||||
| # All rights reserved. | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions are met: | ||||
| # | ||||
| #     * Redistributions of source code must retain the above copyright notice, | ||||
| #       this list of conditions and the following disclaimer. | ||||
| #     * Redistributions in binary form must reproduce the above copyright | ||||
| #       notice, this list of conditions and the following disclaimer in the | ||||
| #       documentation and/or other materials provided with the distribution. | ||||
| #     * Neither the name of the University of California, Santa Cruz nor the | ||||
| #       names of its contributors may be used to endorse or promote products | ||||
| #       derived from this software without specific prior written permission. | ||||
| # | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||||
| # LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
| package SNMP::Info::Layer3::ArubaCX; | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info::IEEE802dot3ad 'agg_ports_lag'; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::IEEE802_Bridge; | ||||
|  | ||||
| @SNMP::Info::Layer3::ArubaCX::ISA = qw/ | ||||
|   SNMP::Info::IEEE802dot3ad | ||||
|   SNMP::Info::Layer3 | ||||
|   SNMP::Info::IEEE802_Bridge | ||||
|   Exporter | ||||
| /; | ||||
| @SNMP::Info::Layer3::ArubaCX::EXPORT_OK = qw/ | ||||
|   agg_ports | ||||
| /; | ||||
|  | ||||
| our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE); | ||||
|  | ||||
| $VERSION = '3.88'; | ||||
|  | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::IEEE802dot3ad::MIBS, | ||||
|     %SNMP::Info::IEEE802_Bridge::MIBS, | ||||
|     'ARUBAWIRED-FAN-MIB' => 'arubaWiredFanName', | ||||
|     'ARUBAWIRED-VSF-MIB' => 'arubaWiredVsfTrapEnable', | ||||
|     'ARUBAWIRED-POWERSUPPLY-MIB' => 'arubaWiredPSUName', | ||||
| ); | ||||
|  | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::IEEE802_Bridge::GLOBALS, | ||||
|     'ps1_type' => 'arubaWiredPSUProductName.1.1', | ||||
|     'ps2_type' => 'arubaWiredPSUProductName.1.2', | ||||
|     'ps1_status' => 'arubaWiredPSUState.1.1', | ||||
|     'ps2_status' => 'arubaWiredPSUState.1.2', | ||||
|     'vsf_topology' => 'arubaWiredVsfTopology', | ||||
| ); | ||||
|  | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::IEEE802dot3ad::FUNCS, | ||||
|     %SNMP::Info::IEEE802_Bridge::FUNCS, | ||||
|     'fan_names' => 'arubaWiredFanName', | ||||
|     'fan_states' => 'arubaWiredFanState', | ||||
|     'psu_names' => 'arubaWiredPSUName', | ||||
|     'psu_types' => 'arubaWiredPSUProductName', | ||||
|     'psu_states' => 'arubaWiredPSUState', | ||||
|     'vsf_prod_names' => 'arubaWiredVsfMemberProductName', | ||||
| ); | ||||
|  | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::IEEE802dot3ad::MUNGE, | ||||
|     %SNMP::Info::IEEE802_Bridge::MUNGE, | ||||
| ); | ||||
|  | ||||
| sub _at_pbb_one { | ||||
|     my $in = shift // {}; | ||||
|     my $ret = {}; | ||||
|     foreach my $key (keys %$in) { | ||||
|         if ($key =~ /^1\.(\d+)$/) { | ||||
|             $ret->{$1} = $in->{$key}; | ||||
|         } | ||||
|     } | ||||
|     return $ret; | ||||
| } | ||||
|  | ||||
| sub fan { | ||||
|     my $cx = shift; | ||||
|     my $names = $cx->fan_names() || {}; | ||||
|     my $states = $cx->fan_states() || {}; | ||||
|     my @ary = (); | ||||
|     foreach my $idx (sort keys %$names) { | ||||
|         my $name = $names->{$idx} // 'n/a'; | ||||
|         my $state = $states->{$idx} // 'n/a'; | ||||
|         push @ary, sprintf("%s: %s", $name, $state); | ||||
|     } | ||||
|     return join (', ', @ary); | ||||
| } | ||||
|  | ||||
| sub vendor { | ||||
|     my $cx = shift; | ||||
|     my $mfg = $cx->entPhysicalMfgName(1) || {}; | ||||
|     my $vendor = $mfg->{1} || "aruba"; | ||||
|     return lc($vendor); | ||||
| } | ||||
|  | ||||
| sub stack_info { | ||||
|     my $cx = shift; | ||||
|     my $vsf_topo = $cx->vsf_topology(); | ||||
|     if (defined $vsf_topo and $vsf_topo ne 'standalone') { | ||||
|         my $member_prod_names = $cx->vsf_prod_names() || {}; | ||||
|         my $num_members = scalar keys %$member_prod_names; | ||||
|         my $fullname = (values %$member_prod_names)[0]; | ||||
|         my $modelname = ''; | ||||
|         if ($fullname =~ /^(\S+)/) { | ||||
|             $modelname = $1; | ||||
|         } | ||||
|         return sprintf("%s (stack of %d)", $modelname, $num_members); | ||||
|     } else { | ||||
|         return; | ||||
|     } | ||||
| } | ||||
|  | ||||
| sub model { | ||||
|     my $cx = shift; | ||||
|     my $model = $cx->entPhysicalModelName(1) || {}; | ||||
|     my $id = $cx->id(); | ||||
|     my $translated_id = &SNMP::translateObj($id) || $id; | ||||
|     $translated_id =~ s/arubaWiredSwitch//i; | ||||
|     return $cx->stack_info() || $model->{1} || $translated_id; | ||||
| } | ||||
|  | ||||
| sub os { | ||||
|     return "arubaos-cx"; | ||||
| } | ||||
|  | ||||
| sub os_ver { | ||||
|     my $cx = shift; | ||||
|     my $ver_release = $cx->entPhysicalSoftwareRev(1) || {}; | ||||
|     return $ver_release->{1}; | ||||
| } | ||||
|  | ||||
| sub agg_ports { return agg_ports_lag(@_) } | ||||
|  | ||||
| # Overrides for VLAN & forwarding table methods | ||||
| sub v_name { | ||||
|     my $cx = shift; | ||||
|     return _at_pbb_one($cx->iqb_v_name()) || $cx->SUPER::v_name(); | ||||
| } | ||||
| sub qb_i_vlan { | ||||
|     my $cx = shift; | ||||
|     return _at_pbb_one($cx->iqb_i_vlan()) || $cx->SUPER::qb_i_vlan(); | ||||
| } | ||||
| sub i_vlan_type { | ||||
|     my $cx = shift; | ||||
|     return _at_pbb_one($cx->iqb_i_vlan_type()) || $cx->SUPER::qb_i_vlan_type(); | ||||
| } | ||||
| sub qb_v_egress { | ||||
|     my $cx = shift; | ||||
|     return $cx->iqb_v_egress() || $cx->SUPER::qb_v_egress(); | ||||
| } | ||||
| sub qb_cv_egress { | ||||
|     my $cx = shift; | ||||
|     return $cx->iqb_cv_egress() || $cx->SUPER::qb_cv_egress(); | ||||
| } | ||||
| sub qb_v_untagged { | ||||
|     my $cx = shift; | ||||
|     return $cx->iqb_v_untagged() || $cx->SUPER::qb_v_untagged(); | ||||
| } | ||||
| sub qb_cv_untagged { | ||||
|     my $cx = shift; | ||||
|     return $cx->iqb_cv_untagged() || $cx->SUPER::qb_cv_untagged(); | ||||
| } | ||||
|  | ||||
| 1; | ||||
| __END__ | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| SNMP::Info::Layer3::ArubaCX - SNMP Interface to L3 Devices running ArubaOS-CX | ||||
|  | ||||
| =head1 AUTHORS | ||||
|  | ||||
| Jeroen van Ingen | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $cx = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myrouter', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
|  | ||||
|  my $class      = $cx->class(); | ||||
|  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| Subclass for devices running ArubaOS-CX | ||||
|  | ||||
| =head2 Inherited Classes | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item SNMP::Info::Layer3 | ||||
|  | ||||
| =item SNMP::Info::IEEE802_Bridge | ||||
|  | ||||
| =item SNMP::Info::IEEE802dot3ad | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Required MIBs | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item F<ARUBAWIRED-FAN-MIB> | ||||
| =item F<ARUBAWIRED-VSF-MIB> | ||||
| =item F<ARUBAWIRED-POWERSUPPLY-MIB> | ||||
|  | ||||
| =item Inherited Classes' MIBs | ||||
|  | ||||
| See L<SNMP::Info::Layer3> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::IEEE802_Bridge> for its own MIB requirements. | ||||
|  | ||||
| See L<SNMP::Info::IEEE802dot3ad> for its own MIB requirements. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head1 GLOBALS | ||||
|  | ||||
| These are methods that return scalar value from SNMP | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item $cx->stack_info() | ||||
|  | ||||
| If the device supports VSF stacking and is not in standalone mode, returns | ||||
| a string describing the switch family and the number of stack members. | ||||
| Example return value: '6300M (stack of 2)'. Will return undef when VSF is not | ||||
| supported or when the device is VSF standalone. | ||||
|  | ||||
| =item $cx->model() | ||||
|  | ||||
| Returns L<stack_info()> if defined, otherwise will fall back to returning the | ||||
| model from C<entPhysicalModelName.1>; if that's also not set, will use | ||||
| C<sysObjectID> as a last resort, stripping 'arubaWiredSwitch' from the value. | ||||
|  | ||||
| =item $cx->vendor() | ||||
|  | ||||
| Returns (lowercased) value for C<entPhysicalMfgName.1>, or 'aruba'. | ||||
|  | ||||
| =item $cx->os() | ||||
|  | ||||
| Returns 'arubaos-cx'. | ||||
|  | ||||
| =item $cx->os_ver() | ||||
|  | ||||
| Returns the software version. Either C<entPhysicalSoftwareRev.1> or | ||||
| extracted from C<sysDescr>. | ||||
|  | ||||
| =item $cx->fan() | ||||
|  | ||||
| Returns a string with status information for all fans listed in | ||||
| C<ARUBAWIRED-FAN-MIB>. | ||||
|  | ||||
| =back | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
|  | ||||
| See documentation in L<SNMP::Info::Layer3> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::IEEE802_Bridge | ||||
|  | ||||
| See documentation in L<SNMP::Info::IEEE802_Bridge> for details. | ||||
|  | ||||
| =head2 Globals imported from SNMP::Info::IEEE802dot3ad | ||||
|  | ||||
| See documentation in L<SNMP::Info::IEEE802dot3ad> for details. | ||||
|  | ||||
| =head1 TABLE ENTRIES | ||||
|  | ||||
| These are methods that return tables of information in the form of a reference | ||||
| to a hash. | ||||
|  | ||||
| =head2 Overrides | ||||
|  | ||||
| =over | ||||
|  | ||||
| =item 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<v_name> | ||||
| =item C<qb_i_vlan> | ||||
| =item C<i_vlan_type> | ||||
| =item C<qb_v_egress> | ||||
| =item C<qb_cv_egress> | ||||
| =item C<qb_v_untagged> | ||||
| =item C<qb_cv_untagged> | ||||
| All overridden to return the VLAN data structures that we'd expect for a | ||||
| device that implements C<Q-BRIDGE-MIB>, but with data from | ||||
| L<SNMP::Info::IEEE8021_Bridge> at PBB 1. | ||||
|  | ||||
| =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::IEEE802_Bridge | ||||
|  | ||||
| See documentation in L<SNMP::Info::IEEE802_Bridge> for details. | ||||
|  | ||||
| =head2 Table Methods imported from SNMP::Info::IEEE802dot3ad | ||||
|  | ||||
| See documentation in L<SNMP::Info::IEEE802dot3ad> for details. | ||||
|  | ||||
| =cut | ||||
| @@ -1,5 +1,4 @@ | ||||
| # SNMP::Info::Layer3::BayRS | ||||
| # $Id$ | ||||
| # | ||||
| # Copyright (c) 2008 Eric Miller | ||||
| # All rights reserved. | ||||
| @@ -31,24 +30,21 @@ | ||||
| package SNMP::Info::Layer3::BayRS; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| use Exporter; | ||||
| use SNMP::Info; | ||||
| use SNMP::Info::Layer3; | ||||
| use SNMP::Info::Bridge; | ||||
| 
 | ||||
| @SNMP::Info::Layer3::BayRS::ISA = qw/SNMP::Info SNMP::Info::Layer3 | ||||
|     SNMP::Info::Bridge Exporter/; | ||||
| @SNMP::Info::Layer3::BayRS::ISA = qw/SNMP::Info::Layer3 | ||||
|     Exporter/; | ||||
| @SNMP::Info::Layer3::BayRS::EXPORT_OK = qw//; | ||||
| 
 | ||||
| use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE %MODEL_MAP | ||||
|     %MODID_MAP %PROCID_MAP/; | ||||
| our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE, %MODEL_MAP, | ||||
|     %MODID_MAP, %PROCID_MAP); | ||||
| 
 | ||||
| $VERSION = '3.19'; | ||||
| $VERSION = '3.88'; | ||||
| 
 | ||||
| %MIBS = ( | ||||
|     %SNMP::Info::MIBS, | ||||
|     %SNMP::Info::Layer3::MIBS, | ||||
|     %SNMP::Info::Bridge::MIBS, | ||||
|     'Wellfleet-HARDWARE-MIB'        => 'wfHwBpIdOpt', | ||||
|     'Wellfleet-OSPF-MIB'            => 'wfOspfRouterId', | ||||
|     'Wellfleet-DOT1QTAG-CONFIG-MIB' => 'wfDot1qTagCfgVlanName', | ||||
| @@ -57,18 +53,14 @@ $VERSION = '3.19'; | ||||
| ); | ||||
| 
 | ||||
| %GLOBALS = ( | ||||
|     %SNMP::Info::GLOBALS, | ||||
|     %SNMP::Info::Layer3::GLOBALS, | ||||
|     %SNMP::Info::Bridge::GLOBALS, | ||||
|     'bp_id'       => 'wfHwBpIdOpt', | ||||
|     'bp_serial'   => 'wfHwBpSerialNumber', | ||||
|     'ospf_rtr_id' => 'wfOspfRouterId', | ||||
| ); | ||||
| 
 | ||||
| %FUNCS = ( | ||||
|     %SNMP::Info::FUNCS, | ||||
|     %SNMP::Info::Layer3::FUNCS, | ||||
|     %SNMP::Info::Bridge::FUNCS, | ||||
| 
 | ||||
|     # From Wellfleet-CSMACD-MIB::wfCSMACDTable | ||||
|     'wf_csmacd_cct'  => 'wfCSMACDCct', | ||||
| @@ -107,9 +99,7 @@ $VERSION = '3.19'; | ||||
| ); | ||||
| 
 | ||||
| %MUNGE = ( | ||||
|     %SNMP::Info::MUNGE, | ||||
|     %SNMP::Info::Layer3::MUNGE, | ||||
|     %SNMP::Info::Bridge::MUNGE, | ||||
|     'wf_hw_boot'     => \&munge_hw_rev, | ||||
|     'wf_hw_diag'     => \&munge_hw_rev, | ||||
|     'wf_hw_mobo_ser' => \&munge_wf_serial, | ||||
| @@ -541,7 +531,10 @@ sub model { | ||||
|     my $bayrs = shift; | ||||
|     my $bp_id = $bayrs->bp_id(); | ||||
| 
 | ||||
|     return defined $MODEL_MAP{$bp_id} ? $MODEL_MAP{$bp_id} : $bp_id; | ||||
|     if (defined $bp_id) { | ||||
|       return defined $MODEL_MAP{$bp_id} ? $MODEL_MAP{$bp_id} : $bp_id; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| sub vendor { | ||||
| @@ -732,6 +725,8 @@ sub i_vlan { | ||||
|     return \%i_vlan; | ||||
| } | ||||
| 
 | ||||
| sub i_pvid { goto &i_vlan } | ||||
| 
 | ||||
| sub root_ip { | ||||
|     my $bayrs = shift; | ||||
| 
 | ||||
| @@ -774,7 +769,7 @@ sub e_index { | ||||
|     my $bp_id = $bayrs->bp_id(); | ||||
| 
 | ||||
|     # Don't like polling all these columns to build the index, can't think of | ||||
|     # a better way right now.  Luckly all this data will be cached for the | ||||
|     # a better way right now.  Luckily all this data will be cached for the | ||||
|     # rest of the e_* methods | ||||
| 
 | ||||
|     # Using mib leafs so we don't have to define everything in FUNCS | ||||
| @@ -803,7 +798,7 @@ sub e_index { | ||||
|     my @slots = ( $wf_mb, $wf_db, $wf_bb, $wf_mod, $wf_mod1, $wf_mod2 ); | ||||
|     my @mods = ( $wf_mm, $wf_dm ); | ||||
| 
 | ||||
|     # We're going to hack an index: Slot/Module/Postion | ||||
|     # We're going to hack an index: Slot/Module/Position | ||||
|     my %wf_e_index; | ||||
| 
 | ||||
|     # Chassis on BN types | ||||
| @@ -1387,14 +1382,14 @@ Eric Miller | ||||
| 
 | ||||
| =head1 SYNOPSIS | ||||
| 
 | ||||
|  # Let SNMP::Info determine the correct subclass for you.  | ||||
|  # Let SNMP::Info determine the correct subclass for you. | ||||
|  my $bayrs = new SNMP::Info( | ||||
|                           AutoSpecify => 1, | ||||
|                           Debug       => 1, | ||||
|                           DestHost    => 'myswitch', | ||||
|                           Community   => 'public', | ||||
|                           Version     => 2 | ||||
|                         )  | ||||
|                         ) | ||||
|     or die "Can't connect to DestHost.\n"; | ||||
| 
 | ||||
|  my $class      = $bayrs->class(); | ||||
| @@ -1402,21 +1397,12 @@ Eric Miller | ||||
| 
 | ||||
| =head1 DESCRIPTION | ||||
| 
 | ||||
| Abstraction subclass for routers running Avaya/Nortel BayRS.   | ||||
| 
 | ||||
| For speed or debugging purposes you can call the subclass directly, but not | ||||
| after determining a more specific class using the method above.  | ||||
| 
 | ||||
|  my $bayrs = new SNMP::Info::Layer3::BayRS(...); | ||||
| Abstraction subclass for routers running Avaya/Nortel BayRS. | ||||
| 
 | ||||
| =head2 Inherited Classes | ||||
| 
 | ||||
| =over | ||||
| 
 | ||||
| =item SNMP::Info | ||||
| 
 | ||||
| =item SNMP::Info::Bridge | ||||
| 
 | ||||
| =item SNMP::Info::Layer3 | ||||
| 
 | ||||
| =back | ||||
| @@ -1439,10 +1425,6 @@ after determining a more specific class using the method above. | ||||
| 
 | ||||
| =head2 Inherited MIBs | ||||
| 
 | ||||
| See L<SNMP::Info/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements. | ||||
| 
 | ||||
| =head1 GLOBALS | ||||
| @@ -1456,7 +1438,7 @@ These are methods that return scalar value from SNMP | ||||
| Returns the model of the BayRS router.  Will translate between the MIB model | ||||
| and the common model with this map : | ||||
| 
 | ||||
|     C<%MODEL_MAP = (  | ||||
|     C<%MODEL_MAP = ( | ||||
|         'acefn'     => 'FN', | ||||
|         'aceln'     => 'LN', | ||||
|         'acecn'     => 'CN', | ||||
| @@ -1498,14 +1480,6 @@ undefined. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details. | ||||
| 
 | ||||
| =head2 Globals imported from SNMP::Info::Layer3 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details. | ||||
| @@ -1527,8 +1501,8 @@ passed but the entire table will be returned. | ||||
| Returns reference to the map between IID and physical Port. | ||||
| 
 | ||||
| The physical port name is stripped to letter and numbers to signify | ||||
| port type and slot port (S11) if the default platform naming was  | ||||
| maintained.  Otherwise the port is the interface description.  | ||||
| port type and slot port (S11) if the default platform naming was | ||||
| maintained.  Otherwise the port is the interface description. | ||||
| 
 | ||||
| =item $bayrs->i_name() | ||||
| 
 | ||||
| @@ -1538,7 +1512,7 @@ interfaces. | ||||
| =item $bayrs->i_duplex() | ||||
| 
 | ||||
| Returns reference to hash.  Maps port operational duplexes to IIDs for | ||||
| Ethernet interfaces.  | ||||
| Ethernet interfaces. | ||||
| 
 | ||||
| =item $bayrs->i_duplex_admin() | ||||
| 
 | ||||
| @@ -1549,6 +1523,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 | ||||
| @@ -1619,14 +1597,6 @@ is not contained in any other entity. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info | ||||
| 
 | ||||
| See documentation in L<SNMP::Info/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Bridge | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details. | ||||
| 
 | ||||
| =head2 Table Methods imported from SNMP::Info::Layer3 | ||||
| 
 | ||||
| See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details. | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user