Compare commits
1665 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 | ||
|
|
70bb263d79 | ||
|
|
536d7d6901 | ||
|
|
6ea34316b0 | ||
|
|
aeebe5c95c | ||
|
|
eb62f95636 | ||
|
|
c7ee746fe6 | ||
|
|
9a062499b3 | ||
|
|
0c876452d8 | ||
|
|
3b6088f454 | ||
|
|
719f14984b | ||
|
|
2e480dbec5 | ||
|
|
66910c7827 | ||
|
|
0f5319bc52 | ||
|
|
cd54b07e09 | ||
|
|
b197e9739b | ||
|
|
8dd32c0dd7 | ||
|
|
08e049eb31 | ||
|
|
d09e4a125c | ||
|
|
8353db2bc4 | ||
|
|
250d2a0c0a | ||
|
|
46b3127bb5 | ||
|
|
f1e9e3423d | ||
|
|
158ee40f1b | ||
|
|
713d052b64 | ||
|
|
0e28436086 | ||
|
|
3f7229f4e7 | ||
|
|
1ae7f8c8a2 | ||
|
|
8e63954c3f | ||
|
|
0fbcd5f8b1 | ||
|
|
71f84d48dc | ||
|
|
867a635ab8 | ||
|
|
3d2c9ceaf5 | ||
|
|
47736b08ce | ||
|
|
3f49e5f8ef | ||
|
|
7c8575bfa5 | ||
|
|
102a7e10cc | ||
|
|
9148764d20 | ||
|
|
ce619415de | ||
|
|
745807007f | ||
|
|
e85b3f70aa | ||
|
|
edc0fe4fbe | ||
|
|
3cceec9044 | ||
|
|
18602855da | ||
|
|
72c223f72e | ||
|
|
c6b3c45412 | ||
|
|
c60a04f530 | ||
|
|
f7430ab1a6 | ||
|
|
827398228c | ||
|
|
a264bb36cb | ||
|
|
c24e63ec4c | ||
|
|
6519570839 | ||
|
|
2c88544158 | ||
|
|
d0722d3677 | ||
|
|
d2b404763b | ||
|
|
88fb9e4df3 | ||
|
|
440ec276d3 | ||
|
|
6e91b90c48 | ||
|
|
0bfc8c5ed6 | ||
|
|
63547c2ea1 | ||
|
|
efecf1bbb7 | ||
|
|
682b8c2a9c | ||
|
|
88295e8c1e | ||
|
|
6764f15fd0 | ||
|
|
8b8ee8693e | ||
|
|
fe89001166 | ||
|
|
416a18377c | ||
|
|
8fda38184c | ||
|
|
280e9260f7 | ||
|
|
22642c1095 | ||
|
|
d68b2047b0 | ||
|
|
7240f034e5 | ||
|
|
97ce41e363 | ||
|
|
31a8abc3b8 | ||
|
|
6b49bfd4c4 | ||
|
|
985b4aab3f | ||
|
|
a4e7c3a61a | ||
|
|
d82d8781c4 | ||
|
|
b4c3f92ba3 | ||
|
|
1c57d2eab8 | ||
|
|
409de77b2c | ||
|
|
3e22e24dc9 | ||
|
|
17b1bdacfe | ||
|
|
b570fdbc89 | ||
|
|
cceb0f4e5e | ||
|
|
04f8c7f7e2 | ||
|
|
37aca89af7 | ||
|
|
5445a496db | ||
|
|
0ab93b142c | ||
|
|
d39dc76949 | ||
|
|
c6abd7b62b | ||
|
|
0e572db832 | ||
|
|
602bb15b47 | ||
|
|
b4882285c4 | ||
|
|
834b27bdad | ||
|
|
7db148a5a1 | ||
|
|
9e332095a2 | ||
|
|
7bf950026b | ||
|
|
f246444d89 | ||
|
|
8e84aea1bf | ||
|
|
d6a7a944cc | ||
|
|
fb478d3c7b | ||
|
|
24f8a8fdba | ||
|
|
28bbe0ee19 | ||
|
|
c21ca2062e | ||
|
|
e3e289a27c | ||
|
|
9540f6b9d3 | ||
|
|
539943fb0f | ||
|
|
7a8ebffd40 | ||
|
|
3d48f4e210 | ||
|
|
667cdbea13 | ||
|
|
f5fb4dd3b0 | ||
|
|
5a2722d049 | ||
|
|
f3b6cfbd01 | ||
|
|
e239a6057c | ||
|
|
9b1c439e15 | ||
|
|
074f2e7c8f | ||
|
|
4b1533e925 | ||
|
|
6812a60668 | ||
|
|
6f0cb846f0 | ||
|
|
c79307692b | ||
|
|
08b2f50ac7 | ||
|
|
3577fa1e42 | ||
|
|
cb6630582a | ||
|
|
ca5fff31a7 | ||
|
|
69b1f1e29e | ||
|
|
4e2b642ed1 | ||
|
|
3c26ce2a55 | ||
|
|
7d2cf97c06 | ||
|
|
cfce6296fb | ||
|
|
1601703ff2 | ||
|
|
905ad3e2b7 | ||
|
|
15b7e95545 | ||
|
|
247f6f038d | ||
|
|
7c6df7cce3 | ||
|
|
1a92306d51 | ||
|
|
59e9fae1d5 | ||
|
|
998094241d | ||
|
|
d6c3313138 | ||
|
|
b7e252b91a | ||
|
|
6071beb15d | ||
|
|
cda830686d | ||
|
|
a29b888620 | ||
|
|
ae5a4d413d | ||
|
|
03c4d1e81f | ||
|
|
4efa0fd509 | ||
|
|
c3a727ce10 | ||
|
|
afa97d845b | ||
|
|
8671f65bfd | ||
|
|
37737a6494 | ||
|
|
0ce8a55b88 | ||
|
|
22dd49c1dc | ||
|
|
fd5812aefc | ||
|
|
f4e37cdabe | ||
|
|
5324760463 | ||
|
|
27120045d2 | ||
|
|
abfd93ea1b | ||
|
|
070d911c60 | ||
|
|
8b14776c9a | ||
|
|
2d62372c7f | ||
|
|
3eae0b9d5c | ||
|
|
9a722bb2f8 | ||
|
|
d3e39a4132 | ||
|
|
d82d495dcf | ||
|
|
198df7cee4 | ||
|
|
46cdb4c166 | ||
|
|
62005c52d2 | ||
|
|
ca7651628d | ||
|
|
6358b7ad70 | ||
|
|
8aca1d97c0 | ||
|
|
275a533843 | ||
|
|
21bd4c662d | ||
|
|
47d9d091d1 | ||
|
|
da2ea09e84 | ||
|
|
9c71bdbcef | ||
|
|
318f9518b1 | ||
|
|
19e9fb5f67 | ||
|
|
41833c1f29 | ||
|
|
4e2f950e41 | ||
|
|
ebe3f39ea1 | ||
|
|
c6521d0b48 | ||
|
|
74b5c9f0e3 | ||
|
|
4bfebe1563 | ||
|
|
2ac4e65827 | ||
|
|
b7a135db10 | ||
|
|
d4c460fd3d | ||
|
|
8f0ac35381 | ||
|
|
a9a3229c22 | ||
|
|
5da622ff88 | ||
|
|
32f33f5150 | ||
|
|
242013f3b0 | ||
|
|
e46deb505f | ||
|
|
5d443fd1be | ||
|
|
d53152858c | ||
|
|
aefb31fb58 | ||
|
|
0be8219b9c | ||
|
|
cbb8bc5d77 | ||
|
|
6969dcbfec | ||
|
|
9e463ddddf | ||
|
|
5ec034c475 | ||
|
|
1694e648fc | ||
|
|
16aa96ebf4 | ||
|
|
43d06e184d | ||
|
|
3ff432034a | ||
|
|
0325bb1f25 | ||
|
|
b9aebf7e9e | ||
|
|
e1e693a7c8 | ||
|
|
c8c548fe97 | ||
|
|
ddf971ed54 | ||
|
|
61e8f47986 | ||
|
|
3ce9f403e6 | ||
|
|
3741010044 | ||
|
|
badfb12243 | ||
|
|
0713a6457c | ||
|
|
9abe744dac | ||
|
|
b4974aeacd | ||
|
|
688a0de498 | ||
|
|
7cef8465fa | ||
|
|
532279d2b8 | ||
|
|
d67ffc3a6c | ||
|
|
c6776b1755 | ||
|
|
49566977ad | ||
|
|
daf512e33e | ||
|
|
74816fc043 | ||
|
|
c88e37e9b5 | ||
|
|
c1c448f3df | ||
|
|
4f168a538b | ||
|
|
d94630af35 | ||
|
|
999dd1f468 | ||
|
|
c3d5631c3c | ||
|
|
9dae6b20d7 | ||
|
|
4005640a2b | ||
|
|
ca446faacf | ||
|
|
240539bd24 | ||
|
|
08e335f39c | ||
|
|
a9cc14b265 | ||
|
|
9505f119b3 | ||
|
|
683edf1668 | ||
|
|
d9c52c1a88 | ||
|
|
0f1a76a564 | ||
|
|
15cd354bae | ||
|
|
91d67ed0ae | ||
|
|
0740a7bd5e | ||
|
|
84493a99b4 | ||
|
|
f730fa3325 | ||
|
|
4b1007cb66 | ||
|
|
436f7442b6 | ||
|
|
3af05ebba5 | ||
|
|
c7db0371aa | ||
|
|
53860aaa46 | ||
|
|
829a4bf16a | ||
|
|
a83bc1bcb2 | ||
|
|
af65bb3a2b | ||
|
|
f2d9f6be27 | ||
|
|
ecea4ef4a4 | ||
|
|
e4e099510a | ||
|
|
de28ff96c2 | ||
|
|
6692ddcf1f | ||
|
|
ba7a105eb1 | ||
|
|
b9fb232859 | ||
|
|
6f54cb429e | ||
|
|
ae3398b11a | ||
|
|
e97693d12d | ||
|
|
435bb7dbe2 | ||
|
|
70bc5e78e9 | ||
|
|
a163e5b82c | ||
|
|
5eb66fe442 | ||
|
|
b6cf462b16 | ||
|
|
ead15a1cde | ||
|
|
9c19c70029 | ||
|
|
0862047241 | ||
|
|
6cfce1916d | ||
|
|
1e37bfa8ce | ||
|
|
87197067a0 | ||
|
|
8264f68f6c | ||
|
|
3e21357e8d | ||
|
|
ee5953d743 | ||
|
|
46f941b416 | ||
|
|
225e12e979 | ||
|
|
912ba274a6 | ||
|
|
18f59db2b9 | ||
|
|
f0ca1a5fa3 | ||
|
|
446e5a13f7 | ||
|
|
e8a9d18445 | ||
|
|
6256f33079 | ||
|
|
b5c4bd99bf | ||
|
|
56dae91c8a | ||
|
|
0661b1307a | ||
|
|
cd112f4925 | ||
|
|
14bf6b84d3 | ||
|
|
5c22a29e40 | ||
|
|
f1806f227b | ||
|
|
025e7b72b5 | ||
|
|
97b398051f | ||
|
|
e21d8516fb | ||
|
|
2972c70177 | ||
|
|
50b4274f68 | ||
|
|
75dc93f2c0 | ||
|
|
73fd627815 | ||
|
|
9e84141983 | ||
|
|
bd6591db7b | ||
|
|
515e876491 | ||
|
|
6105046ae9 | ||
|
|
f0eb0a9ded | ||
|
|
a227db586b | ||
|
|
04eafd3e61 | ||
|
|
3b25711e1f | ||
|
|
63687b5f8f | ||
|
|
cac2224fa1 | ||
|
|
44da7544b7 | ||
|
|
13478343cd | ||
|
|
a7aeae0aa2 | ||
|
|
876fb9946b | ||
|
|
e5853962b5 | ||
|
|
3eaa2ae230 | ||
|
|
cd1acd023e | ||
|
|
e2a314b553 | ||
|
|
102a2a03e8 | ||
|
|
8be0f9e06f | ||
|
|
40239ea078 | ||
|
|
47032cbb4a | ||
|
|
11dbeb2741 | ||
|
|
5242d16e02 | ||
|
|
428c007543 | ||
|
|
d0fbfdea86 | ||
|
|
b3fb18eee6 | ||
|
|
7d470fd0e8 | ||
|
|
295e6fb283 | ||
|
|
9e545e8cf8 | ||
|
|
182589745f | ||
|
|
bdfc430564 | ||
|
|
2da37f06ea | ||
|
|
eb5a492eb9 | ||
|
|
e79f031cb7 | ||
|
|
86909ae236 | ||
|
|
69861e7660 | ||
|
|
5054b1b5b5 | ||
|
|
a2496a536d | ||
|
|
f4ebe6a102 | ||
|
|
b10b922aa0 | ||
|
|
a8673cc076 | ||
|
|
2dd1cdc281 | ||
|
|
ccd03ae6d2 | ||
|
|
7e0771e065 | ||
|
|
e9fd3731a9 | ||
|
|
a5f242c28f | ||
|
|
43d1718618 | ||
|
|
d64f0d4a5e | ||
|
|
4a13ee8991 | ||
|
|
8764916086 | ||
|
|
78b0b77e38 | ||
|
|
8a7376f6df | ||
|
|
c9a36f12e6 | ||
|
|
8199e2a973 | ||
|
|
e1f3fb3a44 | ||
|
|
52275e92af | ||
|
|
5d9eec0992 | ||
|
|
cd9c637ba5 | ||
|
|
0bc405792a | ||
|
|
8fb36625bc | ||
|
|
674eca23b9 | ||
|
|
cfc1ead848 | ||
|
|
c41ffdfd2d | ||
|
|
df4708383b | ||
|
|
497c81a0c6 | ||
|
|
2c2f4a9ea1 | ||
|
|
feffa6d47e | ||
|
|
3bb33fa8d4 | ||
|
|
30a73c035a | ||
|
|
5c44fc0b28 | ||
|
|
a54b446dae | ||
|
|
631010ed3f | ||
|
|
8506638e5c | ||
|
|
c0f3a8eb2b | ||
|
|
662d870ad7 | ||
|
|
08746d6b10 | ||
|
|
bc8c8a6061 | ||
|
|
d09e5de229 | ||
|
|
1df1bda641 | ||
|
|
e8612e3779 | ||
|
|
a58d060310 | ||
|
|
a77c539f38 | ||
|
|
b5107b5634 | ||
|
|
6c880bb7b3 | ||
|
|
9297c70d11 | ||
|
|
bfafdc99d9 | ||
|
|
ab111a8e93 | ||
|
|
c2ce3d81e1 | ||
|
|
fb9813af51 | ||
|
|
4fb63d8a7b | ||
|
|
77982188bd | ||
|
|
8748932460 | ||
|
|
6c88df1ac0 | ||
|
|
cacb0777b7 | ||
|
|
bdf5a80868 | ||
|
|
ad1f1933e2 | ||
|
|
d7fe49a028 | ||
|
|
e802ccdc6e | ||
|
|
af2a881142 | ||
|
|
0ccf5409ca | ||
|
|
2529305803 | ||
|
|
bb8fb9d01a | ||
|
|
665f33a482 | ||
|
|
e5f948acda | ||
|
|
c28bbd5728 | ||
|
|
262fa5a3cd | ||
|
|
a58b774443 | ||
|
|
6deceb6bd1 | ||
|
|
808d3fd5c6 | ||
|
|
b82d3b82d9 | ||
|
|
cb8d780d70 | ||
|
|
01cd78c75d | ||
|
|
e7b289c399 | ||
|
|
a9b28c2270 | ||
|
|
5b059e6286 | ||
|
|
2c84636b7f | ||
|
|
2aba8dd8f1 | ||
|
|
41d68936b0 | ||
|
|
cb750624f9 | ||
|
|
bf3a37195b | ||
|
|
1e37f80368 | ||
|
|
5f9c2d3e62 | ||
|
|
c88449151e | ||
|
|
9c4f031581 | ||
|
|
3cac59adf4 | ||
|
|
77bcf720d3 | ||
|
|
e6b4c607e0 | ||
|
|
cbeb41c728 | ||
|
|
101aaa0a68 | ||
|
|
2233511fad | ||
|
|
8efa868ca3 | ||
|
|
e738d502ef | ||
|
|
2a7d5b51d9 | ||
|
|
67c4f160aa | ||
|
|
6d87313283 | ||
|
|
98e07690be | ||
|
|
c0bc769be9 | ||
|
|
01d9b0f291 | ||
|
|
2539692016 | ||
|
|
3a3fc548ca | ||
|
|
84d6cd18fb | ||
|
|
2d7b94e5a7 | ||
|
|
98eceb7c57 | ||
|
|
be92ec0379 | ||
|
|
34d4ec66a3 | ||
|
|
35c8ed6038 | ||
|
|
dd10a88ee2 | ||
|
|
71f0947988 | ||
|
|
d7cd3ff9e7 | ||
|
|
2567d6a5c9 | ||
|
|
5831d9e4ae | ||
|
|
690bc6bfa0 | ||
|
|
5f0e73bcb4 | ||
|
|
b1a7b67ae7 | ||
|
|
f0539d51ff | ||
|
|
1af34e3e25 | ||
|
|
0510dbfafc | ||
|
|
ca35689475 | ||
|
|
2ac1cc2308 | ||
|
|
0eebef47b0 | ||
|
|
29ef1301fb | ||
|
|
cfd5c5d9d7 | ||
|
|
347e1f9f59 | ||
|
|
2575320ec5 | ||
|
|
6c8ec356ec | ||
|
|
6e0712b189 | ||
|
|
906b1cb52f | ||
|
|
1eff8f8224 | ||
|
|
6a1f6d43cf | ||
|
|
8ab37354ff | ||
|
|
64340bf92e | ||
|
|
f0d490539e | ||
|
|
808464a7d0 | ||
|
|
3b8b70f760 | ||
|
|
cb58701af2 | ||
|
|
f05fbae8fc | ||
|
|
f1589d2ffe | ||
|
|
2d1df6c0e4 | ||
|
|
158596cede | ||
|
|
6c7df418af | ||
|
|
4e666d63b3 | ||
|
|
d1674dade2 | ||
|
|
ecb26a8b68 | ||
|
|
03785c4365 | ||
|
|
58c1d01b4a | ||
|
|
dc48aa08ba | ||
|
|
53f9cc8c3d | ||
|
|
0db888ef88 | ||
|
|
2ee8817103 | ||
|
|
71b0e7c60f | ||
|
|
740707539e | ||
|
|
ba088bf717 | ||
|
|
aa58a2ba56 | ||
|
|
ca9caf6e12 | ||
|
|
5a983c9600 | ||
|
|
d02c6ab450 | ||
|
|
4284cb8ea0 | ||
|
|
0743d4bce9 | ||
|
|
66ce0da9bc | ||
|
|
3e4f700a70 | ||
|
|
7518408d89 | ||
|
|
c5caffc75e | ||
|
|
086fea0349 | ||
|
|
f436c9f69c | ||
|
|
a153913d29 | ||
|
|
5189871fde | ||
|
|
daa0162639 | ||
|
|
4e6a452c87 | ||
|
|
a70a895a29 | ||
|
|
84bc3f5269 | ||
|
|
27f2bd1b26 | ||
|
|
38c63a3086 | ||
|
|
2c5301b676 | ||
|
|
1b85820314 | ||
|
|
3855c92564 | ||
|
|
ba85dc670b | ||
|
|
6221228d1f | ||
|
|
a901d9a61c | ||
|
|
0a0fac4ddb | ||
|
|
0e16cfecf6 | ||
|
|
838eb71a15 | ||
|
|
e373b1f74e | ||
|
|
b03e292d95 | ||
|
|
2139cb0212 | ||
|
|
35392a8c5c | ||
|
|
b7fab49da2 | ||
|
|
d0061b4ec9 | ||
|
|
2ffa82aff9 | ||
|
|
1c33f38323 | ||
|
|
4bb41fc368 | ||
|
|
c666fe30d8 | ||
|
|
1813e60cec | ||
|
|
4ae8f31c8f | ||
|
|
df466ac2eb | ||
|
|
846b3201b7 | ||
|
|
a2ab73c24a | ||
|
|
98e6693525 | ||
|
|
fed85592cb | ||
|
|
2b4a296128 | ||
|
|
c1b0e81b6c | ||
|
|
9a0915f3a1 | ||
|
|
a9481c86d2 | ||
|
|
5f0148dd72 | ||
|
|
dedefde79f | ||
|
|
8c421d333a | ||
|
|
97fbd36c6a | ||
|
|
e81344c357 | ||
|
|
33450039c7 | ||
|
|
5849f4ce3d | ||
|
|
70f20d2330 | ||
|
|
48e9b0b030 | ||
|
|
11db00b66c | ||
|
|
89dc775392 | ||
|
|
6d5f27fd3a | ||
|
|
e1ab8a43ba | ||
|
|
081325c68d | ||
|
|
004de3d29b | ||
|
|
8b5ba1e959 | ||
|
|
149e97c2d6 | ||
|
|
60cb2b8c20 | ||
|
|
a714c46fba | ||
|
|
692ccd0e97 | ||
|
|
e0aa0835cd | ||
|
|
845a0c4121 | ||
|
|
57a6ec56e3 | ||
|
|
4d53aa41e2 | ||
|
|
214534b211 | ||
|
|
5ac0d946a7 | ||
|
|
bd908a6952 | ||
|
|
400e94ea27 | ||
|
|
1d286d8388 | ||
|
|
bf79dd333f | ||
|
|
c882e63dad | ||
|
|
710e7afbe6 | ||
|
|
e51c9c1da2 | ||
|
|
b17f04e762 | ||
|
|
a6d16bdfc9 | ||
|
|
b6377596f8 | ||
|
|
b5d1210f72 | ||
|
|
af038c491b | ||
|
|
4af016ea4f | ||
|
|
a2d94315c3 | ||
|
|
e87e076b6a | ||
|
|
dfbc7cfd07 | ||
|
|
696efaad82 | ||
|
|
b435382a5e | ||
|
|
ea65ed57af | ||
|
|
f3058e4e9c | ||
|
|
75b570af95 | ||
|
|
840d8a48ba | ||
|
|
b5fec8dbde | ||
|
|
123dc84f05 | ||
|
|
98ceee3212 | ||
|
|
ab08aa1de1 | ||
|
|
e8c0a78e67 | ||
|
|
0c583b7838 | ||
|
|
7515cb0ab0 | ||
|
|
fc4d9cac24 | ||
|
|
8d496beceb | ||
|
|
ce1fac9e86 | ||
|
|
659d38b0db | ||
|
|
56a4238632 | ||
|
|
4c9f9d9876 | ||
|
|
533104ce55 | ||
|
|
06fd442dce | ||
|
|
8955e25c4f | ||
|
|
f543768c7b | ||
|
|
4c33cfecff | ||
|
|
2070f9b9e0 | ||
|
|
069695f570 | ||
|
|
ad300684c3 | ||
|
|
98d120717a | ||
|
|
1ebe34ce90 | ||
|
|
9565c908c6 | ||
|
|
85f36d3831 | ||
|
|
77aca4b628 | ||
|
|
7602c30d96 | ||
|
|
c5b2894d23 | ||
|
|
508a86b563 | ||
|
|
01faf96ccb | ||
|
|
3edb813da7 | ||
|
|
8cae0c74fb | ||
|
|
feefe2dcee | ||
|
|
7a40aa02ed | ||
|
|
5d9ac88750 | ||
|
|
93c54da5ba | ||
|
|
d9c87bdfbd | ||
|
|
6bbc902c75 | ||
|
|
79a4a55265 | ||
|
|
67081eed26 | ||
|
|
be37a24fc9 | ||
|
|
269d2b7be9 | ||
|
|
749ad55af1 | ||
|
|
866d28a36d | ||
|
|
1a3b3ae009 | ||
|
|
b5edc85a56 | ||
|
|
bb9e6f5101 | ||
|
|
9d37614f66 | ||
|
|
669989434c | ||
|
|
fb44b0b4b1 | ||
|
|
09f80eeed7 | ||
|
|
e5c81896aa | ||
|
|
7ad7d1e338 | ||
|
|
1b0c212a95 | ||
|
|
0dc9174c83 | ||
|
|
70197f35ee | ||
|
|
5c0cefefba | ||
|
|
54633a7b99 | ||
|
|
cde34cfc99 | ||
|
|
41dac34246 | ||
|
|
b1e0261216 | ||
|
|
84b1160c23 | ||
|
|
0cededc7ba | ||
|
|
0b932064ed | ||
|
|
c4c0cbb597 | ||
|
|
24662f2352 | ||
|
|
d460c5a473 | ||
|
|
87063bc4d3 | ||
|
|
948921930b | ||
|
|
dc494ff038 | ||
|
|
a98e163c7c | ||
|
|
e6428abc0b | ||
|
|
9597095b50 | ||
|
|
905272a3bc | ||
|
|
5da4035b03 | ||
|
|
435af3cf82 | ||
|
|
afc53b176b | ||
|
|
8624b0d63a | ||
|
|
1ac5cdd110 | ||
|
|
1be0292e78 | ||
|
|
523deb988a | ||
|
|
4ae815c6f9 | ||
|
|
d46b124674 | ||
|
|
df9a335052 | ||
|
|
038a6c7714 | ||
|
|
301d14acf0 | ||
|
|
c5a0e40065 | ||
|
|
b8c03fa9c1 | ||
|
|
3da742fa1d | ||
|
|
a1199f6ff0 | ||
|
|
4dc43891df | ||
|
|
7aede0a35e | ||
|
|
8b0239fdde | ||
|
|
ab632849bf | ||
|
|
cec6e00384 | ||
|
|
3656c6e42a | ||
|
|
b93278fa93 | ||
|
|
ff37bab36d | ||
|
|
f3783daf05 | ||
|
|
8c01484a5d | ||
|
|
d8994dc737 | ||
|
|
88890649bf | ||
|
|
d46842bd8e | ||
|
|
c240cfc854 | ||
|
|
81f5534a6a | ||
|
|
e60a1a6931 | ||
|
|
72e8f46633 | ||
|
|
d7c0959d27 | ||
|
|
862e8b6006 | ||
|
|
c9b47de8d1 | ||
|
|
0dd90a24dd | ||
|
|
9cfc0bcd64 | ||
|
|
1820299dcf | ||
|
|
acbfa7484b | ||
|
|
67fd776431 | ||
|
|
c04dd5b3b5 | ||
|
|
b8b2d337d5 | ||
|
|
8b0ffdf079 | ||
|
|
eb8328c36d | ||
|
|
2ab9bb0053 | ||
|
|
fae8e8396f | ||
|
|
cdccde0c7d | ||
|
|
ee829539c2 | ||
|
|
832679ac4f | ||
|
|
45af60459f | ||
|
|
2586fc9309 | ||
|
|
01cafebf89 | ||
|
|
9d530e2a62 | ||
|
|
c130b9a49e | ||
|
|
c10bf98500 | ||
|
|
83fb73389a | ||
|
|
f9933dcb4f | ||
|
|
74ccc599fe | ||
|
|
362acb9217 | ||
|
|
a3038adbd0 | ||
|
|
8015e59161 | ||
|
|
7a94ddcc26 | ||
|
|
4e73ff2bae | ||
|
|
257eb48e70 | ||
|
|
cf1564d598 | ||
|
|
e83380c7c5 | ||
|
|
799a06b63a | ||
|
|
b55e15a568 | ||
|
|
6b3edc3232 | ||
|
|
f65332f9cc | ||
|
|
3416928233 | ||
|
|
4d262872c8 | ||
|
|
795ae41d68 | ||
|
|
2e17b5c64a | ||
|
|
ddca296e2a | ||
|
|
af5d1d6c03 | ||
|
|
2f07667560 | ||
|
|
1fac4cb13c | ||
|
|
aa8c86ddcd | ||
|
|
83751acf91 | ||
|
|
01dc21e338 | ||
|
|
0b8f6db97a | ||
|
|
23dd87c294 | ||
|
|
9a19d3a6f6 | ||
|
|
ba6e02ea5e | ||
|
|
1426f7656d | ||
|
|
53ebeacc09 | ||
|
|
bd6cc8d7f4 | ||
|
|
19018f364e | ||
|
|
be0391bfa8 | ||
|
|
bfc36df82b | ||
|
|
5134f4163c | ||
|
|
4939a18a6c | ||
|
|
8aee915872 | ||
|
|
eeac8fd9a2 | ||
|
|
07db467827 | ||
|
|
8bed2081b9 | ||
|
|
f0e0b9063c | ||
|
|
41907297f8 | ||
|
|
2e0392a6db | ||
|
|
3c4b8911f5 | ||
|
|
3db7164f9f | ||
|
|
cfe3c34ab6 | ||
|
|
ceac50e33e | ||
|
|
b71ba01d32 | ||
|
|
5cc00d443c | ||
|
|
4edb3115e5 | ||
|
|
33435d89e4 | ||
|
|
f5c93b3413 | ||
|
|
59fbe71c56 | ||
|
|
4f6b5f0883 | ||
|
|
23eb3b596d | ||
|
|
55b2a27f40 | ||
|
|
5e46120b52 | ||
|
|
4b70bfa7c8 | ||
|
|
c530e25e02 | ||
|
|
409065375e | ||
|
|
32ccc2857f | ||
|
|
c1025cb76f | ||
|
|
1f6a738cda | ||
|
|
8f10a4f16e | ||
|
|
50d9fdefb3 | ||
|
|
d777d98396 | ||
|
|
75e7b0c6b0 | ||
|
|
9fc965d095 | ||
|
|
10b4611e81 | ||
|
|
f416f7cc49 | ||
|
|
50d9070f36 | ||
|
|
14db80441c | ||
|
|
6193e661f5 | ||
|
|
3e69394cca | ||
|
|
88cdcebe2d | ||
|
|
20024f8c50 | ||
|
|
40caf6cc0e | ||
|
|
2d3b28b973 | ||
|
|
325b087bd1 | ||
|
|
0703a5f777 | ||
|
|
c4a4749bcf | ||
|
|
1fd0facbe0 | ||
|
|
bc9ab17f2d | ||
|
|
22fd4f73a9 | ||
|
|
4de346fa39 | ||
|
|
e14c749f66 | ||
|
|
c0f1872f04 | ||
|
|
70944f0589 | ||
|
|
d2b4c85d37 | ||
|
|
a4cc2f5514 | ||
|
|
fa8f91d508 | ||
|
|
7966400cf2 | ||
|
|
3227540322 | ||
|
|
183f8bde3a | ||
|
|
62133dfedf | ||
|
|
eb833c69e3 | ||
|
|
53d96a2e32 | ||
|
|
efc1682877 | ||
|
|
8846bb2f0f | ||
|
|
558c80aa84 | ||
|
|
f905638e5b | ||
|
|
d1636f0fe9 | ||
|
|
1d1193c459 | ||
|
|
4a2e62be2d | ||
|
|
137cc84ca6 | ||
|
|
e744df1dca | ||
|
|
378dc6bc19 | ||
|
|
3f2f722dab | ||
|
|
25f57d65a5 | ||
|
|
f5dba96839 | ||
|
|
3a1d04eb38 | ||
|
|
adac25b3dd | ||
|
|
9b2229e3eb | ||
|
|
bf040dffa9 | ||
|
|
86a12cd2a6 | ||
|
|
bfcb56f06d | ||
|
|
9a4a336c78 | ||
|
|
6696eeeb9d | ||
|
|
4da90c4f9b | ||
|
|
88f31110a7 | ||
|
|
afab6191b2 | ||
|
|
7ce87ebd3d | ||
|
|
d8e1e932ae | ||
|
|
089430de17 | ||
|
|
dce0a40ebb | ||
|
|
2347edad82 | ||
|
|
0ab5eb2bf1 | ||
|
|
d314ffe897 | ||
|
|
1162dc3a7b | ||
|
|
0967634043 | ||
|
|
133355bc9d | ||
|
|
76c734dc01 | ||
|
|
3128e3e5f6 | ||
|
|
c9ebd5ae28 | ||
|
|
b6efcd86dd | ||
|
|
a0323aacd2 | ||
|
|
258b7551ff | ||
|
|
7a023554eb | ||
|
|
b557c9d890 | ||
|
|
8dae0aad96 | ||
|
|
902383cab7 | ||
|
|
a1eb6e5831 | ||
|
|
3656d4c514 | ||
|
|
e899f76249 | ||
|
|
d38bfcbbf7 | ||
|
|
0f654f5aaa | ||
|
|
6cab3ad6b3 | ||
|
|
6685e4dd77 | ||
|
|
2b42f25d1e | ||
|
|
85359ddf59 | ||
|
|
1e198a8d8e | ||
|
|
6bd545d307 | ||
|
|
bc53167731 | ||
|
|
9a5135b9e1 | ||
|
|
8193143459 | ||
|
|
61ac00d7fb | ||
|
|
7944613d42 | ||
|
|
ff07325a05 | ||
|
|
afe5436749 | ||
|
|
ade9d7ef32 | ||
|
|
6a397d7c72 | ||
|
|
933bbaf00b | ||
|
|
1bd53dda51 | ||
|
|
5595fea427 | ||
|
|
31661b1374 | ||
|
|
780965728e | ||
|
|
a7570d9e58 | ||
|
|
b6989e8ada | ||
|
|
f9f4daea94 | ||
|
|
ab175a747c | ||
|
|
2a10991980 | ||
|
|
95d3d45e66 | ||
|
|
d808fc1e6f | ||
|
|
e8f81b17fa | ||
|
|
db871c590c | ||
|
|
de464b2e6a | ||
|
|
e0acc5ce90 | ||
|
|
a1f913d91e | ||
|
|
d19b71073d | ||
|
|
ed66350c27 | ||
|
|
51d57b39f5 | ||
|
|
68524eb337 | ||
|
|
58f8ed29c7 | ||
|
|
3b96232e13 | ||
|
|
19b5d34c10 | ||
|
|
5bb4252cf0 | ||
|
|
8191d5f957 | ||
|
|
1c458c9ca9 | ||
|
|
36f84e357e | ||
|
|
c1b7d7dfc0 | ||
|
|
bbd45f82ab | ||
|
|
02f3e91c5d | ||
|
|
d5afa9f592 | ||
|
|
dceec4f537 | ||
|
|
51b09605df | ||
|
|
dc00c7d907 | ||
|
|
c6df2928a1 | ||
|
|
86bf9fd360 | ||
|
|
505de8c6dc | ||
|
|
70744f3df2 | ||
|
|
96393d5781 | ||
|
|
598c075670 | ||
|
|
ac8eef8f73 | ||
|
|
f5eb4e8bb6 | ||
|
|
abb7fe7f3c | ||
|
|
440bb002b6 | ||
|
|
6dd3f4b21a | ||
|
|
1278117b05 | ||
|
|
5c6c75b42e | ||
|
|
d78e5d6656 | ||
|
|
094c2d548d | ||
|
|
4913ac6cdd | ||
|
|
ac9efcf8ba | ||
|
|
6b4444d97a | ||
|
|
607d5f04bd | ||
|
|
b46aa416a0 | ||
|
|
800aa0b4f0 | ||
|
|
a0e0be2d68 | ||
|
|
3fa47dc2e6 | ||
|
|
25141d3c8e | ||
|
|
1f02aeaec4 | ||
|
|
5d4aada8f5 | ||
|
|
3bd7f78277 | ||
|
|
3994706465 | ||
|
|
12bf18ac02 | ||
|
|
5c6a8f3c45 | ||
|
|
ddddb703aa | ||
|
|
5ef4c78f8a | ||
|
|
05a7f104a4 | ||
|
|
da1183b4fa | ||
|
|
a51ad7ee88 | ||
|
|
df3e0e3b3a | ||
|
|
c156584417 | ||
|
|
74e649a033 | ||
|
|
342a45a424 | ||
|
|
7076c236ea | ||
|
|
0d90383ea3 | ||
|
|
fe59f88dd3 | ||
|
|
2f4704b18d | ||
|
|
c8c94bbd8b | ||
|
|
054e27e827 | ||
|
|
766f14d2bf | ||
|
|
4e52756a41 | ||
|
|
55fc398ddf | ||
|
|
a5e8e6c7cd | ||
|
|
bb8762835f | ||
|
|
7c8b1a8853 | ||
|
|
be8140a142 | ||
|
|
f7c57860b7 | ||
|
|
c44fc3ddbe | ||
|
|
c2fd3bd3a4 | ||
|
|
dfff2624ac | ||
|
|
91c40fddb6 | ||
|
|
cafeb36418 | ||
|
|
fa56c7b332 | ||
|
|
a52f1f3d37 | ||
|
|
476053c539 | ||
|
|
0530c5d9e9 | ||
|
|
b982e95c42 | ||
|
|
de286cbfa0 | ||
|
|
a94c685c6d | ||
|
|
58feb21dec | ||
|
|
81f0b821e3 | ||
|
|
ea8275677b | ||
|
|
c0891ec8c0 | ||
|
|
9dd38845a6 | ||
|
|
0d8aa25e63 | ||
|
|
f57c9333da | ||
|
|
f060b67b4a | ||
|
|
c59e13ac35 | ||
|
|
a49d1522b0 | ||
|
|
39e618f761 | ||
|
|
3d812e0eae | ||
|
|
4f1ac32865 | ||
|
|
d176570b1d | ||
|
|
393fb71b1a | ||
|
|
bd1be7e258 | ||
|
|
e296e93b23 | ||
|
|
bd457307ff | ||
|
|
f988cecc4d | ||
|
|
d2f67b2db2 | ||
|
|
c4a4c3d5e6 | ||
|
|
fa38fdbc2b | ||
|
|
2e03e3faca | ||
|
|
e448915e0b | ||
|
|
37836bedac | ||
|
|
a60663b238 |
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
|
||||
|
||||
14
.gitignore
vendored
Normal file
14
.gitignore
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
*.swp
|
||||
*.pid
|
||||
test.pl
|
||||
MYMETA.*
|
||||
*.tar.gz
|
||||
MANIFEST.*
|
||||
*.komodo*
|
||||
Makefile*
|
||||
Build
|
||||
_build
|
||||
blib
|
||||
cover_db
|
||||
.idea
|
||||
.vscode
|
||||
18
.perltidyrc
Normal file
18
.perltidyrc
Normal file
@@ -0,0 +1,18 @@
|
||||
# .perltidyrc - PBP perltidy configuration file for SNMP::Info
|
||||
# $Id$
|
||||
|
||||
-l=78 # Max line width is 78 cols
|
||||
-i=4 # Indent level is 4 cols
|
||||
-ci=4 # Continuation indent is 4 cols
|
||||
-nst # Output to STDOUT
|
||||
-se # Errors to STDERR
|
||||
-vt=2 # Maximal vertical tightness
|
||||
-cti=0 # No extra indentation for closing brackets
|
||||
-pt=1 # Medium parenthesis tightness
|
||||
-bt=1 # Medium brace tightness
|
||||
-sbt=1 # Medium square bracket tightness
|
||||
-bbt=1 # Medium block brace tightness
|
||||
-nsfs # No space before semicolons
|
||||
-nolq # Don't outdent long quoted strings
|
||||
-wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= && += -= /= |= >>= ||= .= %= ^= x=" # Break before all operators
|
||||
|
||||
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;
|
||||
61
ChangeLog
61
ChangeLog
@@ -1,61 +0,0 @@
|
||||
SNMP::Info - Perl5 OO Interface to Network Devices and SNMP MIBs
|
||||
ChangeLog $Id$
|
||||
|
||||
version 0.4 (04/29/03)
|
||||
* BIG CHANGE ! Internal Data structure has changed.
|
||||
* Added clear_cache() method
|
||||
* Added NO_SUCH support for snmpget (TABLE) calls to get SNMP MIB II data
|
||||
from SNMP Version 1 devices.
|
||||
* Methods load_all() and all() have changed their return value. Sorry but the API had to change.
|
||||
* New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch() to make it more OO happy.
|
||||
* Globals are now cached
|
||||
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
|
||||
detected in device_type()
|
||||
* New method specify() returns a new subclass object
|
||||
* Subclasses are automatically loaded when specify or autospecify is used!
|
||||
* Added methods for Interface statistics (ifInOctets ...)
|
||||
* Added methods for Memory and CPU statistics
|
||||
* Added SNMP::Info::Entity, moved out of L2-HP
|
||||
* Added SNMP::Info::Layer2::Aironet
|
||||
|
||||
version 0.3 (03/06/03)
|
||||
* Fixed HP model() warning
|
||||
* Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE in _global
|
||||
and _load_attr
|
||||
* Added more debugging
|
||||
* Added info and munging for c_capabilities in SNMP::Info::CD
|
||||
Thanks to Martin Lorensen <martin@lorensen.dk>
|
||||
* Removed requirement for SNMP in the Makefile.PL and moved it to t/prereq.t
|
||||
so that the Module will install via CPAN without trying to install the old
|
||||
4.2.0 version of SNMP on CPAN. Will now fail in the test phase.
|
||||
Thanks again to Martin Lorensen <martin@lorensen.dk>
|
||||
* Moved tests from test.pl to t/*
|
||||
|
||||
version 0.2 (02/19/03)
|
||||
* Added put_() methods and support for SNMP put commands
|
||||
* Added SNMP::Info::Layer3::C3550 class for Cisco Catalyst 3550
|
||||
* Fixed HP Detection in device_type()
|
||||
* Added Spanning Tree Protocol (STP) methods to SNMP::Info::Bridge
|
||||
* Removed HP Specific MIBS in SNMP::Info::Layer2 and cleaned up model()
|
||||
* Added poke for Bay 450 Switches
|
||||
* Mapped HP Part Numbers to model numbers J4812A => 2512 in SNMP::Info::Layer2::HP
|
||||
|
||||
version 0.1 (12/30/02)
|
||||
* Initial Release
|
||||
* SubClasses Included:
|
||||
* SNMP::Info::Bridge
|
||||
* SNMP::Info::CDP
|
||||
* SNMP::Info::EtherLike
|
||||
* SNMP::Info::MAU
|
||||
* SNMP::Info::Layer1
|
||||
o SNMP::Info::Layer1::Allied
|
||||
o SNMP::Info::Layer1::Asante
|
||||
* SNMP::Info::Layer2
|
||||
o SNMP::Info::Layer2::Bay
|
||||
o SNMP::Info::Layer2::C1900
|
||||
o SNMP::Info::Layer2::C2900
|
||||
o SNMP::Info::Layer2::Catalyst
|
||||
o SNMP::Info::Layer2::HP
|
||||
* SNMP::Info::Layer3
|
||||
o SNMP::Info::Layer3::Aironet
|
||||
o SNMP::Info::Layer3::Foundry
|
||||
337
Info/Bridge.pm
337
Info/Bridge.pm
@@ -1,337 +0,0 @@
|
||||
# SNMP::Info::Bridge
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Bridge;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::Bridge::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Bridge::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
|
||||
$INIT = 0;
|
||||
|
||||
%MIBS = ('BRIDGE-MIB' => 'dot1dBaseBridgeAddress');
|
||||
|
||||
%GLOBALS = (
|
||||
'b_mac' => 'dot1dBaseBridgeAddress',
|
||||
'b_ports' => 'dot1dBaseNumPorts',
|
||||
'b_type' => 'dot1dBaseType',
|
||||
# Spanning Tree Protocol
|
||||
'stp_ver' => 'dot1dStpProtocolSpecification',
|
||||
'stp_time' => 'dot1dStpTimeSinceTopologyChange',
|
||||
'stp_root' => 'dot1dStpDesignatedRoot',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
# Forwarding Table: Dot1dTpFdbEntry
|
||||
'fw_mac' => 'dot1dTpFdbAddress',
|
||||
'fw_port' => 'dot1dTpFdbPort',
|
||||
'fw_status' => 'dot1dTpFdbStatus',
|
||||
# Bridge Port Table: Dot1dBasePortEntry
|
||||
'bp_index' => 'dot1dBasePortIfIndex',
|
||||
'bp_port' => 'dot1dBasePortCircuit ',
|
||||
# Bridge Static (Destination-Address Filtering) Database
|
||||
'bs_mac' => 'dot1dStaticAddress',
|
||||
'bs_port' => 'dot1dStaticReceivePort',
|
||||
'bs_to' => 'dot1dStaticAllowedToGoTo',
|
||||
'bs_status' => 'dot1dStaticStatus',
|
||||
# Spanning Tree Protocol Table : dot1dStpPortTable
|
||||
'stp_p_id' => 'dot1dStpPort',
|
||||
'stp_p_priority' => 'dot1dStpPortPriority',
|
||||
'stp_p_state' => 'dot1dStpPortState',
|
||||
'stp_p_cost' => 'dot1dStpPortPathCost',
|
||||
'stp_p_root' => 'dot1dStpPortDesignatedRoot',
|
||||
'stp_p_bridge' => 'dot1dStpPortDesignatedBridge',
|
||||
'stp_p_port' => 'dot1dStpPortDesignatedPort',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
# Add ones for our class
|
||||
'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_p_root' => \&SNMP::Info::munge_mac,
|
||||
'stp_p_bridge' => \&SNMP::Info::munge_mac,
|
||||
'stp_p_port' => \&SNMP::Info::munge_mac
|
||||
);
|
||||
|
||||
|
||||
sub i_stp_state {
|
||||
my $bridge = shift;
|
||||
my $bp_index = $bridge->bp_index();
|
||||
my $stp_p_state = $bridge->stp_p_state();
|
||||
|
||||
my %i_stp_state;
|
||||
|
||||
foreach my $index (keys %$stp_p_state){
|
||||
my $state = $stp_p_state->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $state;
|
||||
$i_stp_state{$iid}=$state;
|
||||
}
|
||||
|
||||
return \%i_stp_state;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Bridge - Perl5 Interface to SNMP data available through the BRIDGE-MIB (RFC1493)
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $bridge = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'switch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $cdp->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_mac->{$fw_index};
|
||||
my $iid = $bp_index->{$bp_id};
|
||||
my $port = $interfaces->{$iid};
|
||||
|
||||
print "Port:$port forwarding to $mac\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
BRIDGE-MIB is used by most Layer 2 devices, and holds information like the MAC Forwarding Table and Spanning Tree Protocol info.
|
||||
|
||||
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::Bridge(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item BRIDGE-MIB
|
||||
|
||||
=back
|
||||
|
||||
BRIDGE-MIB needs to be extracted from ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
|
||||
|
||||
=head1 GLOBAL METHODS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $bridge->b_mac()
|
||||
|
||||
Returns the MAC Address of the root bridge port
|
||||
|
||||
(B<dot1dBaseBridgeAddress>)
|
||||
|
||||
=item $bridge->b_ports()
|
||||
|
||||
Returns the number of ports in device
|
||||
|
||||
(B<dot1dBaseNumPorts>)
|
||||
|
||||
=item $bridge->b_type()
|
||||
|
||||
Returns the type? of the device
|
||||
|
||||
(B<dot1dBaseType>)
|
||||
|
||||
=item $bridge->stp_ver()
|
||||
|
||||
Returns what version of STP the device is running. Either decLb100 or ieee8021d.
|
||||
|
||||
(B<dot1dStpProtocolSpecification>)
|
||||
|
||||
=item $bridge->stp_time()
|
||||
|
||||
Returns time since last topology change detected. (100ths/second)
|
||||
|
||||
(B<dot1dStpTimeSinceTopologyChange>)
|
||||
|
||||
=item $bridge->stp_root()
|
||||
|
||||
Returns root of STP.
|
||||
|
||||
(B<dot1dStpDesignatedRoot>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Forwarding Table (dot1dTpFdbEntry)
|
||||
|
||||
=over
|
||||
|
||||
=item $bridge->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses
|
||||
|
||||
(B<dot1dTpFdbAddress>)
|
||||
|
||||
=item $bridge->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface identifier (iid)
|
||||
|
||||
(B<dot1dTpFdbPort>)
|
||||
|
||||
=item $bridge->fw_status()
|
||||
|
||||
Returns reference to hash of forwading table entries status
|
||||
|
||||
(B<dot2dTpFdbStatus>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Bridge Port Table (dot1dBasePortEntry)
|
||||
|
||||
=over
|
||||
|
||||
=item $bridge->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface identifier (iid)
|
||||
|
||||
(B<dot1dBasePortIfIndex>)
|
||||
|
||||
=item $bridge->bp_port()
|
||||
|
||||
Returns reference to hash of bridge port table entries physical port name.
|
||||
|
||||
(B<dot1dBasePortCircuit>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Spanning Tree Protocol Table (dot1dStpPortTable)
|
||||
|
||||
Descriptions are lifted straight from F<BRIDGE-MIB.my>
|
||||
|
||||
=over
|
||||
|
||||
=item $bridge->stp_p_id()
|
||||
|
||||
"The port number of the port for which this entry contains Spanning Tree Protocol management
|
||||
information."
|
||||
|
||||
(B<dot1dStpPort>)
|
||||
|
||||
=item $bridge->stp_p_priority()
|
||||
|
||||
"The value of the priority field which is contained in the first (in network byte order)
|
||||
octet of the (2 octet long) Port ID. The other octet of the Port ID is given by the value of
|
||||
dot1dStpPort."
|
||||
|
||||
(B<dot1dStpPortPriority>)
|
||||
|
||||
=item $bridge->stp_p_state()
|
||||
|
||||
"The port's current state as defined by application of the Spanning Tree Protocol. This
|
||||
state controls what action a port takes on reception of a frame. If the bridge has detected
|
||||
a port that is malfunctioning it will place that port into the broken(6) state. For ports which
|
||||
are disabled (see dot1dStpPortEnable), this object will have a value of disabled(1)."
|
||||
|
||||
disabled(1)
|
||||
blocking(2)
|
||||
listening(3)
|
||||
learning(4)
|
||||
forwarding(5)
|
||||
broken(6)
|
||||
|
||||
(B<dot1dStpPortState>)
|
||||
|
||||
=item $bridge->stp_p_cost()
|
||||
|
||||
"The contribution of this port to the path cost of paths towards the spanning tree root which include
|
||||
this port. 802.1D-1990 recommends that the default value of this parameter be in inverse
|
||||
proportion to the speed of the attached LAN."
|
||||
|
||||
(B<dot1dStpPortPathCost>)
|
||||
|
||||
=item $bridge->stp_p_root()
|
||||
|
||||
"The unique Bridge Identifier of the Bridge recorded as the Root in the Configuration BPDUs
|
||||
transmitted by the Designated Bridge for the segment to which the port is attached."
|
||||
|
||||
(B<dot1dStpPortDesignatedRoot>)
|
||||
|
||||
=item $bridge->stp_p_bridge()
|
||||
|
||||
"The Bridge Identifier of the bridge which this port considers to be the Designated Bridge for
|
||||
this port's segment."
|
||||
|
||||
(B<dot1dStpPortDesignatedBridge>)
|
||||
|
||||
=item $bridge->stp_p_port()
|
||||
|
||||
(B<dot1dStpPortDesignatedPort>)
|
||||
|
||||
"The Port Identifier of the port on the Designated Bridge for this port's segment."
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
377
Info/CDP.pm
377
Info/CDP.pm
@@ -1,377 +0,0 @@
|
||||
# SNMP::Info::CDP
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CDP;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use Carp;
|
||||
|
||||
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CDP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MIBS_V1 %MUNGE $INIT/;
|
||||
# Debug
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
|
||||
# Five data structures required by SNMP::Info
|
||||
$INIT = 0;
|
||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
|
||||
%MIBS_V1 = ( 'CISCO-CDP-MIB-V1SMI' => 'cdpGlobalRun' );
|
||||
# Notice we dont inherit the default GLOBALS and FUNCS
|
||||
# only the default MUNGE.
|
||||
%GLOBALS = (
|
||||
'cdp_run' => 'cdpGlobalRun',
|
||||
'cdp_interval' => 'cdpGlobalMessageInterval',
|
||||
'cdp_holdtime' => 'cdpGlobalHoldTime',
|
||||
'cdp_id' => 'cdpGlobalDeviceId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
'c_index' => 'cdpCacheIfIndex',
|
||||
'c_proto' => 'cdpCacheAddressType',
|
||||
'c_ip' => 'cdpCacheAddress',
|
||||
'c_ver' => 'cdpCacheVersion',
|
||||
'c_id' => 'cdpCacheDeviceId',
|
||||
'c_port' => 'cdpCacheDevicePort',
|
||||
'c_platform' => 'cdpCachePlatform',
|
||||
'c_capabilities' => 'cdpCacheCapabilities',
|
||||
'c_domain' => 'cdpCacheVTPMgmtDomain',
|
||||
'c_vlan' => 'cdpCacheNativeVLAN',
|
||||
'c_duplex' => 'cdpCacheDuplex'
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'c_capabilities' => \&munge_caps,
|
||||
'c_ip' => \&SNMP::Info::munge_ip
|
||||
);
|
||||
|
||||
|
||||
sub munge_caps {
|
||||
my $caps = shift;
|
||||
return undef unless defined $caps;
|
||||
|
||||
my $bits = substr(unpack("B*",$caps),-7);
|
||||
return $bits;
|
||||
|
||||
|
||||
}
|
||||
sub hasCDP {
|
||||
my $cdp = shift;
|
||||
|
||||
my $ver = $cdp->{_version};
|
||||
|
||||
|
||||
# SNMP v1 clients dont have the globals
|
||||
if (defined $ver and $ver == 1){
|
||||
my $c_ip = $cdp->c_ip();
|
||||
# See if anything in cdp cache, if so we have cdp
|
||||
return 1 if (defined $c_ip and scalar(keys %$c_ip)) ;
|
||||
return undef;
|
||||
}
|
||||
|
||||
return $cdp->cdp_run();
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
my $cdp = shift;
|
||||
|
||||
# See if by some miracle Cisco implemented the cdpCacheIfIndex entry
|
||||
my $c_index = $cdp->c_index();
|
||||
return $c_index if defined $c_index;
|
||||
|
||||
# Nope, didn't think so. Now we fake it.
|
||||
my $c_ip = $cdp->c_ip();
|
||||
unless (defined $c_ip){
|
||||
$cdp->{error} = "SNMP::Info::CDP::c_if() - Device doesn't have c_ip() data. Can't fake c_index()";
|
||||
$DEBUG and carp($cdp->error(1));
|
||||
return undef;
|
||||
}
|
||||
|
||||
my %c_if;
|
||||
foreach my $key (keys %$c_ip){
|
||||
next unless defined $key;
|
||||
my $iid = $key;
|
||||
# Truncate .1 from cdp cache entry
|
||||
$iid =~ s/\.\d+$//;
|
||||
$c_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%c_if;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CDP - Perl5 Interface to Cisco Discovery Protocol (CDP) using SNMP
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $cdp = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $cdp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
$hascdp = $cdp->hasCDP() ? 'yes' : 'no';
|
||||
|
||||
# Print out a map of device ports with CDP neighbors:
|
||||
my $interfaces = $cdp->interfaces();
|
||||
my $c_if = $cdp->c_if();
|
||||
my $c_ip = $cdp->c_ip();
|
||||
my $c_port = $cdp->c_port();
|
||||
|
||||
foreach my $cdp_key (keys %$c_ip){
|
||||
my $iid = $c_if->{$cdp_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $c_ip->{$cdp_key};
|
||||
my $neighbor_port = $c_port->{$cdp_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to CDP information through SNMP.
|
||||
|
||||
CDP is a Layer 2 protocol that supplies topology information of devices that also speak CDP,
|
||||
mostly switches and routers. CDP is implemented in Cisco and some HP devices.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use directly.
|
||||
|
||||
Each device implements a subset of the global and cache entries.
|
||||
Check the return value to see if that data is held by the device.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-CDP-MIB
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBAL METHODS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cdp->hasCDP()
|
||||
|
||||
Is CDP is active in this device?
|
||||
|
||||
Accounts for SNMP version 1 devices which may have CDP but not cdp_run()
|
||||
|
||||
=item $cdp->cdp_run()
|
||||
|
||||
Is CDP enabled on this device? Note that a lot of Cisco devices that implement
|
||||
CDP don't implement this value. @#%$!
|
||||
|
||||
(B<cdpGlobalRun>)
|
||||
|
||||
=item $cdp->cdp_interval()
|
||||
|
||||
Interval in seconds at which CDP messages are generated.
|
||||
|
||||
(B<cdpGlobalMessageInterval>)
|
||||
|
||||
=item $cdp->cdp_holdtime()
|
||||
|
||||
Time in seconds that CDP messages are kept.
|
||||
|
||||
(B<cdpGlobalHoldTime>)
|
||||
|
||||
=item $cdp->cdp_id()
|
||||
|
||||
Returns CDP device ID.
|
||||
|
||||
This is the device id broadcast via CDP to other devices, and is what is retrieved from remote devices with $cdp->id().
|
||||
|
||||
(B<cdpGlobalDeviceId>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 CDP CACHE ENTRIES
|
||||
|
||||
=over
|
||||
|
||||
=item $cdp->c_capabilities()
|
||||
|
||||
Returns Device Functional Capabilities. Results are munged into an ascii
|
||||
binary string, 7 digits long, MSB. Each digit represents a bit from the
|
||||
table below.
|
||||
|
||||
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
|
||||
|
||||
(Bit) - Description
|
||||
|
||||
=over
|
||||
|
||||
=item (0x40) - Provides level 1 functionality.
|
||||
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on nonrouter ports.
|
||||
|
||||
=item (0x10) - Sends and receives packets for at least one network layer protocol. If the device is routing the protocol, this bit should not be set.
|
||||
|
||||
=item (0x08) - Performs level 2 switching. The difference between this bit and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This device is assumed to be deployed in a physical loop-free topology.
|
||||
|
||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge would set both this bit and bit 0x02.
|
||||
|
||||
=item (0x02) - Performs level 2 transparent bridging.
|
||||
|
||||
=item (0x01) - Performs level 3 routing for at least one network layer protocol.
|
||||
|
||||
=back
|
||||
|
||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this information.
|
||||
|
||||
(B<cdpCacheCapabilities>)
|
||||
|
||||
=item $cdp->c_domain()
|
||||
|
||||
Returns remote VTP Management Domain as defined in CISCO-VTP-MIB::managementDomainName
|
||||
|
||||
(B<cdpCacheVTPMgmtDomain>)
|
||||
|
||||
=item $cdp->c_duplex()
|
||||
|
||||
Returns the port duplex status from remote devices.
|
||||
|
||||
(B<cdpCacheDuplex>)
|
||||
|
||||
=item $cdp->c_id()
|
||||
|
||||
Returns remote device id string
|
||||
|
||||
(B<cdpCacheDeviceId>)
|
||||
|
||||
=item $cdp->c_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
Note that a lot devices don't implement $cdp->c_index(), So if it isn't around,
|
||||
we fake it.
|
||||
|
||||
In order to map the cdp table entry back to the interfaces() entry, we truncate the last number
|
||||
off of it :
|
||||
|
||||
# it exists, yay.
|
||||
my $c_index = $device->c_index();
|
||||
return $c_index if defined $c_index;
|
||||
|
||||
# if not, let's fake it
|
||||
my $c_ip = $device->c_ip();
|
||||
|
||||
my %c_if
|
||||
foreach my $key (keys %$c_ip){
|
||||
$iid = $key;
|
||||
## Truncate off .1 from cdp response
|
||||
$iid =~ s/\.\d+$//;
|
||||
$c_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%c_if;
|
||||
|
||||
|
||||
=item $cdp->c_index()
|
||||
|
||||
Returns the mapping to the SNMP2 Interface table for CDP Cache Entries.
|
||||
|
||||
Most devices don't implement this, so you probably want to use $cdp->c_if() instead.
|
||||
|
||||
See c_if() entry.
|
||||
|
||||
(B<cdpCacheIfIndex>)
|
||||
|
||||
=item $cdp->c_ip()
|
||||
|
||||
Returns remote IP address
|
||||
|
||||
(B<cdpCacheAddress>)
|
||||
|
||||
=item $cdp->c_platform()
|
||||
|
||||
Returns remote platform id
|
||||
|
||||
(B<cdpCachePlatform>)
|
||||
|
||||
=item $cdp->c_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
(B<cdpDevicePort>)
|
||||
|
||||
=item $cdp->c_proto()
|
||||
|
||||
Returns remote address type received. Usually IP.
|
||||
|
||||
(B<cdpCacheAddressType>)
|
||||
|
||||
=item $cdp->c_ver()
|
||||
|
||||
Returns remote hardware version
|
||||
|
||||
(B<cdpCacheVersion>)
|
||||
|
||||
=item $cdp->c_vlan()
|
||||
|
||||
Returns the remote interface native VLAN.
|
||||
|
||||
(B<cdpCacheNativeVLAN>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
@@ -1,269 +0,0 @@
|
||||
# SNMP::Info::CiscoStats
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoStats;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStats::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
|
||||
$INIT = 0;
|
||||
%MIBS = (
|
||||
'RFC1213-MIB' => 'sysDescr',
|
||||
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
|
||||
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed'
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
'description' => 'sysDescr',
|
||||
# We will use the numeric OID's so that we don't require people
|
||||
# to install v1 MIBs, which can conflict.
|
||||
# OLD-CISCO-CPU-MIB:avgBusyPer
|
||||
'ios_cpu' => '1.3.6.1.4.1.9.2.1.56.0',
|
||||
'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
|
||||
'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
|
||||
# CISCO-PROCESS-MIB
|
||||
'cat_cpu' => 'cpmCPUTotal5sec.9',
|
||||
'cat_cpu_1min' => 'cpmCPUTotal1min.9',
|
||||
'cat_cpu_5min' => 'cpmCPUTotal5min.9',
|
||||
# CISCO-MEMORY-POOL-MIB
|
||||
'mem_free' => 'ciscoMemoryPoolFree.1',
|
||||
'mem_used' => 'ciscoMemoryPoolUsed.1',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
);
|
||||
|
||||
sub os {
|
||||
my $l2 = shift;
|
||||
my $descr = $l2->description();
|
||||
|
||||
return 'catalyst' if ($descr =~ /catalyst/i);
|
||||
return 'ios' if ($descr =~ /IOS/);
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $l2 = shift;
|
||||
my $os = $l2->os();
|
||||
my $descr = $l2->description();
|
||||
|
||||
# Older Catalysts
|
||||
if ($os eq 'catalyst' and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/){
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Newer Catalysts and IOS devices
|
||||
if ($descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ ){
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub cpu {
|
||||
my $self = shift;
|
||||
my $ios_cpu = $self->ios_cpu();
|
||||
return $ios_cpu if defined $ios_cpu;
|
||||
my $cat_cpu = $self->cat_cpu();
|
||||
return $cat_cpu;
|
||||
}
|
||||
|
||||
sub cpu_1min {
|
||||
my $self = shift;
|
||||
my $ios_cpu_1min = $self->ios_cpu_1min();
|
||||
return $ios_cpu_1min if defined $ios_cpu_1min;
|
||||
my $cat_cpu_1min = $self->cat_cpu_1min();
|
||||
return $cat_cpu_1min;
|
||||
}
|
||||
|
||||
sub cpu_5min {
|
||||
my $self = shift;
|
||||
my $ios_cpu_5min = $self->ios_cpu_5min();
|
||||
return $ios_cpu_5min if defined $ios_cpu_5min;
|
||||
my $cat_cpu_5min = $self->cat_cpu_5min();
|
||||
return $cat_cpu_5min;
|
||||
}
|
||||
|
||||
sub mem_total {
|
||||
my $self = shift;
|
||||
my $mem_free = $self->mem_free();
|
||||
my $mem_used = $self->mem_used();
|
||||
return undef unless defined $mem_free and defined $mem_used;
|
||||
return $mem_free + $mem_used;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ciscostats = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ciscostats->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory, os and
|
||||
version information about Cisco Devices.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-PROCESS-MIB
|
||||
|
||||
=item CISCO-MEMORY-POOL-MIB
|
||||
|
||||
=item RFC1213-MIB
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscostats->cpu()
|
||||
|
||||
Returns ios_cpu() or cat_cpu(), whichever is available.
|
||||
|
||||
=item $ciscostats->cpu_1min()
|
||||
|
||||
Returns ios_cpu_1min() or cat_cpu1min(), whichever is available.
|
||||
|
||||
=item $ciscostats->cpu_5min()
|
||||
|
||||
Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
|
||||
|
||||
=item $ciscostats->mem_total()
|
||||
|
||||
Returns mem_free() + mem_used()
|
||||
|
||||
=item $ciscostats->os()
|
||||
|
||||
Trys to parse if device is running IOS or CatOS from description()
|
||||
|
||||
=item $ciscostats->os_ver()
|
||||
|
||||
Trys to parse device operating system version from description()
|
||||
|
||||
=item $ciscostats->ios_cpu()
|
||||
|
||||
Current CPU usage in percents of device.
|
||||
|
||||
B<1.3.6.1.4.1.9.2.1.56.0> =
|
||||
B<OLD-CISCO-CPU-MIB:avgBusyPer>
|
||||
|
||||
=item $ciscostats->ios_cpu_1min()
|
||||
|
||||
Average CPU Usage in percents of device over last minute.
|
||||
|
||||
B<1.3.6.1.4.1.9.2.1.57.0>
|
||||
|
||||
=item $ciscostats->ios_cpu_5min()
|
||||
|
||||
Average CPU Usage in percents of device over last 5 minutes.
|
||||
|
||||
B<1.3.6.1.4.1.9.2.1.58.0>
|
||||
|
||||
=item $ciscostats->cat_cpu()
|
||||
|
||||
Current CPU usage in percents of device.
|
||||
|
||||
B<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
|
||||
|
||||
=item $ciscostats->cat_cpu_1min()
|
||||
|
||||
Average CPU Usage in percents of device over last minute.
|
||||
|
||||
B<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
|
||||
|
||||
=item $ciscostats->cat_cpu_5min()
|
||||
|
||||
Average CPU Usage in percents of device over last 5 minutes.
|
||||
|
||||
B<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
|
||||
|
||||
=item $ciscostats->mem_free()
|
||||
|
||||
Main DRAM free in device. In bytes.
|
||||
|
||||
B<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree.1>
|
||||
|
||||
=item $ciscostats->mem_used()
|
||||
|
||||
Main DRAM used in device. In bytes.
|
||||
|
||||
B<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed.1>
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
None.
|
||||
|
||||
=cut
|
||||
198
Info/Entity.pm
198
Info/Entity.pm
@@ -1,198 +0,0 @@
|
||||
# SNMP::Info::Entity
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Entity;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Entity::EXPORT_OK = qw//;
|
||||
|
||||
$INIT = 0;
|
||||
%MIBS = ('ENTITY-MIB' => 'entPhysicalSerialNum');
|
||||
|
||||
%GLOBALS = (
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
'e_class' => 'entPhysicalClass',
|
||||
'e_descr' => 'entPhysicalDescr',
|
||||
'e_fwver' => 'entPhysicalFirmwareRev',
|
||||
'e_hwver' => 'entPhysicalHardwareRev',
|
||||
'e_map' => 'entAliasMappingIdentifier',
|
||||
'e_model' => 'entPhysicalModelName',
|
||||
'e_name' => 'entPhysicalName',
|
||||
'e_parent' => 'entPhysicalContainedIn',
|
||||
'e_serial' => 'entPhysicalSerialNum',
|
||||
'e_swver' => 'entPhysicalSoftwareRev',
|
||||
'e_type' => 'entPhysicalVendorType',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
);
|
||||
|
||||
sub e_port {
|
||||
my $entity = shift;
|
||||
my $e_map = $entity->e_map();
|
||||
|
||||
my %e_port;
|
||||
|
||||
foreach my $e_id (keys %$e_map) {
|
||||
my $id = $e_id;
|
||||
$id =~ s/\.0$//;
|
||||
|
||||
my $iid = $e_map->{$e_id};
|
||||
$iid =~ s/.*\.//;
|
||||
|
||||
$e_port{$id} = $iid;
|
||||
}
|
||||
|
||||
return \%e_port;
|
||||
}
|
||||
1;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Entity - Perl5 Interface to SNMP data stored in ENTITY-MIB.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $entity = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $entity->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
ENTITY-MIB is used by some Layer 2 devices like HP Switches and Aironet Access Points
|
||||
|
||||
Create or use a device subclass that inherit this class. Do not use directly.
|
||||
|
||||
For debugging purposes you can call this class directly as you would SNMP::Info
|
||||
|
||||
my $entity = new SNMP::Info::Entity (...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item ENTITY-MIB
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
none.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Entity Table
|
||||
|
||||
=over
|
||||
|
||||
=item $entity->e_class()
|
||||
|
||||
(C<entPhysicalClass>)
|
||||
|
||||
=item $entity->e_descr()
|
||||
|
||||
(C<entPhysicalClass>)
|
||||
|
||||
=item $entity->e_fwver()
|
||||
|
||||
(C<entPhysicalFirmwareRev>)
|
||||
|
||||
=item $entity->e_hwver()
|
||||
|
||||
(C<entPhysicalHardwareRev>)
|
||||
|
||||
=item $entity->e_map()
|
||||
|
||||
(C<entAliasMappingIdentifier>)
|
||||
|
||||
=item $entity->e_model()
|
||||
|
||||
(C<entPhysicalModelName>)
|
||||
|
||||
=item $entity->e_name()
|
||||
|
||||
(C<entPhysicalName>)
|
||||
|
||||
=item $entity->e_parent()
|
||||
|
||||
(C<entPhysicalContainedIn>)
|
||||
|
||||
=item $entity->e_port()
|
||||
|
||||
Maps EntityTable entries to the Interface Table (IfTable) using
|
||||
$entity->e_map()
|
||||
|
||||
=item $entity->e_serial()
|
||||
|
||||
(C<entPhysicalSerialNum>)
|
||||
|
||||
=item $entity->e_swver()
|
||||
|
||||
(C<entPhysicalSoftwareRev>)
|
||||
|
||||
=item $entity->e_type()
|
||||
|
||||
(C<entPhysicalVendorType>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
@@ -1,238 +0,0 @@
|
||||
# SNMP::Info::EtherLike
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::EtherLike;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::EtherLike::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::EtherLike::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
|
||||
$INIT = 0;
|
||||
|
||||
# Same info in both rfc1398 and this?
|
||||
%MIBS = ('ETHERLIKE-MIB' => 'etherMIB' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
# EtherLike StatsTable
|
||||
'el_chipset' => 'dot3StatsEtherChipSet',
|
||||
'el_coll_excess' => 'dot3StatsExcessiveCollisions',
|
||||
'el_coll_late' => 'dot3StatsLateCollisions',
|
||||
'el_coll_mult' => 'dot3StatsMultipleCollisionFrames',
|
||||
'el_coll_single' => 'dot3StatsSingleCollisionFrames',
|
||||
'el_duplex' => 'dot3StatsDuplexStatus',
|
||||
'el_error_alignment' => 'dot3StatsAlignmentErrors',
|
||||
'el_error_fcs' => 'dot3StatsFCSErrors',
|
||||
'el_error_cs' => 'dot3StatsCarrierSenseErrors',
|
||||
'el_error_frame' => 'dot3StatsFrameTooLongs',
|
||||
'el_error_mac_rec' => 'dot3StatsInternalMacReceiveErrors',
|
||||
'el_error_mac_xmit' => 'dot3StatsInternalMacTransmitErrors',
|
||||
'el_error_sqe' => 'dot3StatsSQETestErrors',
|
||||
'el_error_symbol' => 'dot3StatsSymbolErrors',
|
||||
'el_index' => 'dot3StatsIndex',
|
||||
'el_xmit_defer' => 'dot3StatsDeferredTransmissions',
|
||||
# Ethernet-like Collision Statistics Group
|
||||
'el_coll_count' => 'dot3CollCount',
|
||||
'el_coll_freq' => 'dot3CollFrequencies'
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::MUNGE );
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::EtherLike - Perl5 Interface to SNMP ETHERLIKE-MIB
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $el = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $cdp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
# Find the duplex setting for a port on a device that implements ETHERLIKE-MIB
|
||||
my $interfaces = $el->interfaces();
|
||||
my $el_index = $el->el_index();
|
||||
my $el_duplex = $el->el_duplex();
|
||||
|
||||
foreach my $el_port (keys %$el_duplex){
|
||||
my $duplex = $el_duplex->{$el_port};
|
||||
my $iid = $el_index->{$el_port};
|
||||
my $port = $interfaces->{$iid};
|
||||
|
||||
$duplex = 'half' if $duplex =~/half/i;
|
||||
$duplex = 'full' if $duplex =~/full/i;
|
||||
$duplex = 'auto' if $duplex =~/auto/i;
|
||||
|
||||
print "PORT:$port set to duplex:$duplex\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies
|
||||
access to the ETHERLIKE-MIB used by some Layer 3 Devices such as Cisco routers.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item ETHERLIKE-MIB
|
||||
|
||||
=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
|
||||
|
||||
=over
|
||||
|
||||
=item None
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 ETHERLIKE STATS TABLE (dot3StatsTable)
|
||||
|
||||
=over
|
||||
|
||||
=item $el->el_index()
|
||||
|
||||
Returns reference to hash. Indexes Stats Table to the interface index (iid).
|
||||
|
||||
(B<dot3StatsIndex>)
|
||||
|
||||
=item $el->el_duplex()
|
||||
|
||||
Returns reference to hash. Indexes Stats Table to Duplex Status of port.
|
||||
|
||||
(B<dot3StatsDuplexStatus>)
|
||||
|
||||
=item $el->el_chipset()
|
||||
|
||||
(B<dot3StatsEtherChipSet>)
|
||||
|
||||
=item $el->el_coll_excess()
|
||||
|
||||
(B<dot3StatsExcessiveCollisions>)
|
||||
|
||||
=item $el->el_coll_late()
|
||||
|
||||
(B<dot3StatsLateCollisions>)
|
||||
|
||||
=item $el->el_coll_mult()
|
||||
|
||||
(B<dot3StatsMultipleCollisionFrames>)
|
||||
|
||||
=item $el->el_coll_single()
|
||||
|
||||
(B<dot3StatsSingleCollisionFrames>)
|
||||
|
||||
=item $el->el_error_alignment()
|
||||
|
||||
(B<dot3StatsAlignmentErrors>)
|
||||
|
||||
=item $el->el_error_fcs()
|
||||
|
||||
(B<dot3StatsFCSErrors>)
|
||||
|
||||
=item $el->el_error_cs()
|
||||
|
||||
(B<dot3StatsCarrierSenseErrors>)
|
||||
|
||||
=item $el->el_error_frame()
|
||||
|
||||
(B<dot3StatsFrameTooLongs>)
|
||||
|
||||
=item $el->el_error_mac_rec()
|
||||
|
||||
(B<dot3StatsInternalMacReceiveErrors>)
|
||||
|
||||
=item $el->el_error_mac_xmit()
|
||||
|
||||
(B<dot3StatsInternalMacTransmitErrors>)
|
||||
|
||||
=item $el->el_error_sqe()
|
||||
|
||||
(B<dot3StatsSQETestErrors>)
|
||||
|
||||
=item $el->el_error_symbol()
|
||||
|
||||
(B<dot3StatsSymbolErrors>)
|
||||
|
||||
=item $el->el_xmit_defer()
|
||||
|
||||
(B<dot3StatsDeferredTransmissions>)
|
||||
|
||||
=item $el->el_coll_count()
|
||||
|
||||
(B<dot3CollCount>)
|
||||
|
||||
=item $el->el_coll_freq()
|
||||
|
||||
(B<dot3CollFrequencies>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
326
Info/Layer1.pm
326
Info/Layer1.pm
@@ -1,326 +0,0 @@
|
||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
|
||||
|
||||
@SNMP::Info::Layer1::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer1::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex'
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
'ports_managed' => 'ifNumber',
|
||||
'rptr_slots' => 'rptrGroupCapacity',
|
||||
'slots' => 'rptrGroupCapacity'
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
'i_up2' => 'ifOperStatus',
|
||||
'i_up_admin2' => 'ifAdminStatus',
|
||||
'rptr_ports' => 'rptrGroupPortCapacity',
|
||||
'rptr_port' => 'rptrPortIndex',
|
||||
'rptr_slot' => 'rptrPortGroupIndex',
|
||||
'rptr_up_admin' => 'rptrPortAdminStatus',
|
||||
'rptr_up' => 'rptrPortOperStatus',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
# assuming managed ports aren't in repeater ports?
|
||||
sub ports {
|
||||
my $l1 = shift;
|
||||
|
||||
my $ports = $l1->ports_managed();
|
||||
my $rptr_ports = $l1->rptr_ports();
|
||||
|
||||
foreach my $group (keys %$rptr_ports){
|
||||
$ports += $rptr_ports->{$group};
|
||||
}
|
||||
|
||||
return $ports;
|
||||
}
|
||||
|
||||
# $l1->model() - Looks at sysObjectID which gives the oid of the system
|
||||
# name, contained in a propriatry MIB.
|
||||
sub model {
|
||||
my $l1 = shift;
|
||||
my $id = $l1->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
# HP
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
# Cisco
|
||||
$model =~ s/sysid$//i;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l1 = shift;
|
||||
my $descr = $l1->description();
|
||||
|
||||
return 'hp' if ($descr =~ /hp/i);
|
||||
return 'cisco' if ($descr =~ /(catalyst|cisco|ios)/i);
|
||||
return 'allied' if ($descr =~ /allied/i);
|
||||
return 'asante' if ($descr =~ /asante/i);
|
||||
|
||||
}
|
||||
|
||||
# By Default we'll use the description field
|
||||
sub interfaces {
|
||||
my $l1 = shift;
|
||||
my $interfaces = $l1->i_index();
|
||||
my $rptr_port = $l1->rptr_port();
|
||||
|
||||
foreach my $port (keys %$rptr_port){
|
||||
$interfaces->{$port} = $port;
|
||||
}
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $l1 = shift;
|
||||
|
||||
my $i_up_admin = $l1->i_up_admin2();
|
||||
my $rptr_up_admin = $l1->rptr_up_admin();
|
||||
|
||||
foreach my $key (keys %$rptr_up_admin){
|
||||
my $up = $rptr_up_admin->{$key};
|
||||
$i_up_admin->{$key} = 'up' if $up =~ /enabled/;
|
||||
$i_up_admin->{$key} = 'down' if $up =~ /disabled/;
|
||||
}
|
||||
|
||||
return $i_up_admin;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $l1 = shift;
|
||||
my $i_up = $l1->i_up2();
|
||||
my $rptr_up = $l1->rptr_up();
|
||||
|
||||
foreach my $key (keys %$rptr_up){
|
||||
my $up = $rptr_up->{$key};
|
||||
$i_up->{$key} = 'up' if $up =~ /operational/;
|
||||
}
|
||||
|
||||
return $i_up;
|
||||
|
||||
}
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1 - Perl5 Interface to network devices serving Layer1 only.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $l1 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l1->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
my $interfaces = $l1->interfaces();
|
||||
my $i_up = $l1->i_up();
|
||||
my $i_speed = $l1->i_speed();
|
||||
|
||||
foreach my $iid (keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $up = $i_up->{$iid};
|
||||
my $speed = $i_speed->{$iid}
|
||||
print "Port $port is $up. Port runs at $speed.\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes listed under
|
||||
SNMP::Info::Layer1::* Please read all docs under SNMP::Info first.
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Layer1 device through SNMP. Information is stored in a number of MIBs.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
|
||||
my $l1 = new SNMP::Info::Layer1(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP-REPEATER-MIB
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required for SNMP::Info
|
||||
|
||||
=back
|
||||
|
||||
SNMP-REPEATER-MIB needs to be extracted from ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $l1->ports_managed()
|
||||
|
||||
Gets the number of ports under the interface mib
|
||||
|
||||
(B<ifNumber>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l1->vendor()
|
||||
|
||||
Trys to discover the vendor from $l1->model() and $l1->vendor()
|
||||
|
||||
=item $l1->ports()
|
||||
|
||||
Adds the values from rptr_ports() and ports_managed()
|
||||
|
||||
=item $l1->slots()
|
||||
|
||||
Number of 'groups' in the Repeater MIB
|
||||
|
||||
(B<rptrGroupCapacity>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info 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 $l1->interfaces()
|
||||
|
||||
=item $l1->i_up()
|
||||
|
||||
=item $l1->i_up_admin()
|
||||
|
||||
=back
|
||||
|
||||
=head2 Repeater MIB
|
||||
|
||||
=over
|
||||
|
||||
=item $l1->rptr_ports()
|
||||
|
||||
Number of ports in each group.
|
||||
|
||||
(B<rptrGroupPortCapacity>)
|
||||
|
||||
=item $l1->rptr_port()
|
||||
|
||||
Port number in Group
|
||||
|
||||
(B<rptrPortIndex>)
|
||||
|
||||
=item $l1->rptr_slot()
|
||||
|
||||
Group (slot) Number for given port.
|
||||
|
||||
(B<rptrPortGroupIndex>)
|
||||
|
||||
=item $l1->rptr_up_admin()
|
||||
|
||||
(B<rptrPortAdminStatus>)
|
||||
|
||||
=item $l1->rptr_up()
|
||||
|
||||
(B<rptrPortOperStatus>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
|
||||
=cut
|
||||
@@ -1,284 +0,0 @@
|
||||
# SNMP::Info::Layer1::Asante
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::Asante;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer1::Asante::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Asante::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer1::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer1::FUNCS,
|
||||
'i_speed2' => 'ifSpeed',
|
||||
'i_mac2' => 'ifPhysAddress',
|
||||
'i_descr2' => 'ifDescr',
|
||||
'i_name2' => 'ifName',
|
||||
'asante_port' => 'ePortIndex',
|
||||
'asante_group' => 'ePortGrpIndex',
|
||||
'i_type' => 'ePortStateType',
|
||||
'asante_up' => 'ePortStateLinkStatus',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer1::MIBS,
|
||||
'ASANTE-HUB1012-MIB' => 'asante'
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer1::MUNGE,
|
||||
'i_mac2' => \&SNMP::Info::munge_mac,
|
||||
'i_speed2' => \&SNMP::Info::munge_speed,
|
||||
);
|
||||
|
||||
sub interfaces {
|
||||
my $asante = shift;
|
||||
|
||||
my $rptr_port = $asante->rptr_port();
|
||||
|
||||
my %interfaces;
|
||||
|
||||
foreach my $port (keys %$rptr_port){
|
||||
$interfaces{$port} = $port;
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'asante';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $asante = shift;
|
||||
my $descr = $asante->description();
|
||||
|
||||
if ($descr =~ /software v(\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'asante';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $asante = shift;
|
||||
|
||||
my $id = $asante->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $asante = shift;
|
||||
|
||||
my $asante_up = $asante->asante_up();
|
||||
|
||||
my $i_up = {};
|
||||
foreach my $port (keys %$asante_up){
|
||||
my $up = $asante_up->{$port};
|
||||
$i_up->{$port} = 'down' if $up =~ /on/;
|
||||
$i_up->{$port} = 'up' if $up =~ /off/;
|
||||
}
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $asante = shift;
|
||||
|
||||
my $i_speed = $asante->i_speed2();
|
||||
|
||||
my %i_speed;
|
||||
|
||||
$i_speed{"1.2"} = $i_speed->{1};
|
||||
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $asante = shift;
|
||||
|
||||
my $i_mac = $asante->i_mac2();
|
||||
|
||||
my %i_mac;
|
||||
|
||||
$i_mac{"1.2"} = $i_mac->{1};
|
||||
|
||||
return \%i_mac;
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $asante = shift;
|
||||
|
||||
my $i_name = $asante->i_descr2();
|
||||
|
||||
my %i_name;
|
||||
|
||||
$i_name{"1.2"} = $i_name->{1};
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1::Asante - SNMP Interface to old Asante 1012 Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $asante = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $asante->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Asante device through SNMP.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer1
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item ASANTE-HUB1012-MIB
|
||||
|
||||
Download from http://www.mibdepot.com
|
||||
|
||||
=items MIBs listed in SNMP::Info::Layer1
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $asante->os()
|
||||
|
||||
Returns 'asante'
|
||||
|
||||
=item $asante->os_ver()
|
||||
|
||||
Culls software version from description()
|
||||
|
||||
=item $asante->vendor()
|
||||
|
||||
Returns 'asante' :)
|
||||
|
||||
=item $asante->root_ip()
|
||||
|
||||
Returns IP Address of Managed Hub.
|
||||
|
||||
(B<actualIpAddr>)
|
||||
|
||||
=item $asante->model()
|
||||
|
||||
Trys to cull out AT-nnnnX out of the description field.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals inherited from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $asante->i_name()
|
||||
|
||||
Returns reference to map of IIDs to human-set port name.
|
||||
|
||||
=item $asante->i_up()
|
||||
|
||||
Returns reference to map of IIDs to link status. Changes
|
||||
the values of ati_up() to 'up' and 'down'.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Asante MIB
|
||||
|
||||
=over
|
||||
|
||||
=item $asante->ati_p_name()
|
||||
|
||||
(B<portName>)
|
||||
|
||||
=item $asante->ati_up()
|
||||
|
||||
(B<linkTestLED>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
|
||||
=cut
|
||||
325
Info/Layer2.pm
325
Info/Layer2.pm
@@ -1,325 +0,0 @@
|
||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
|
||||
|
||||
@SNMP::Info::Layer2::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::CDP SNMP::Info::CiscoStats Exporter/;
|
||||
@SNMP::Info::Layer2::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
'CISCO-PRODUCTS-MIB' => 'sysName',
|
||||
'CISCO-STACK-MIB' => 'wsc1900sysID',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
# $l2->model() - Looks at sysObjectID which gives the oid of the system
|
||||
# name, contained in a propriatry MIB.
|
||||
sub model {
|
||||
my $l2 = shift;
|
||||
my $id = $l2->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
# HP
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
# Cisco
|
||||
$model =~ s/sysid$//i;
|
||||
$model =~ s/^(cisco|catalyst)//i;
|
||||
$model =~ s/^cat//i;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l2 = shift;
|
||||
my $model = $l2->model();
|
||||
my $descr = $l2->description();
|
||||
|
||||
if ($model =~ /hp/i or $descr =~ /hp/i) {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
if ($model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i) {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l2 = shift;
|
||||
|
||||
my $i_type = $l2->i_type();
|
||||
|
||||
my %i_ignore = ();
|
||||
|
||||
foreach my $if (keys %$i_type){
|
||||
my $type = $i_type->{$if};
|
||||
$i_ignore{$if}++
|
||||
if $type =~ /(loopback|propvirtual|other|cpu)/i;
|
||||
}
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
# By Default we'll use the description field
|
||||
sub interfaces {
|
||||
my $l2 = shift;
|
||||
my $interfaces = $l2->i_index();
|
||||
my $i_descr = $l2->i_description();
|
||||
my $i_name = $l2->i_name();
|
||||
|
||||
my %if;
|
||||
foreach my $iid (keys %$interfaces){
|
||||
my $port = $i_descr->{$iid};
|
||||
my $name = $i_name->{$iid};
|
||||
$port = $name if (defined $name and $name !~ /^\s*$/);
|
||||
next unless defined $port;
|
||||
|
||||
# Cisco 1900 has a space in some of its port descr.
|
||||
# get rid of any weird characters
|
||||
$port =~ s/[^\d\/,()\w]+//gi;
|
||||
|
||||
# Translate Cisco 2926,etc. from 1/5 to 1.5
|
||||
$port =~ s/\//\./ if ($port =~ /^\d+\/\d+$/);
|
||||
|
||||
$if{$iid} = $port;
|
||||
}
|
||||
|
||||
return \%if
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2 - Perl5 Interface to network devices serving Layer2 only.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $l2 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l2->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
my $interfaces = $l2->interfaces();
|
||||
my $i_up = $l2->i_up();
|
||||
my $i_speed = $l2->i_speed();
|
||||
foreach my $iid (keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $up = $i_up->{$iid};
|
||||
my $speed = $i_speed->{$iid}
|
||||
print "Port $port is $up. Port runs at $speed.\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes listed under
|
||||
SNMP::Info::Layer2::* Please read all docs under SNMP::Info first.
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Layer2 device through SNMP. Information is stored in a number of MIBs.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
|
||||
my $l2 = new SNMP::Info::Layer2(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-PRODUCTS-MIB
|
||||
|
||||
Needed for ID of Cisco Products
|
||||
|
||||
=item CISCO-STACK-MIB
|
||||
|
||||
Needed for ID of Cisco Products
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l2->model()
|
||||
|
||||
Cross references $l2->id() with product IDs in the
|
||||
Cisco MIBs.
|
||||
|
||||
For HP devices, removes 'hpswitch' from the name
|
||||
|
||||
For Cisco devices, removes 'sysid' from the name
|
||||
|
||||
=item $l2->vendor()
|
||||
|
||||
Trys to discover the vendor from $l2->model() and $l2->description()
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l2->interfaces()
|
||||
|
||||
Creates a map between the interface identifier (iid) and the physical port name.
|
||||
|
||||
Defaults to B<ifDescr> but checks and overrides with B<ifName>
|
||||
|
||||
=item $l2->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores ports with B<ifType> of loopback,propvirtual,other, and cpu
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
|
||||
=cut
|
||||
@@ -1,238 +0,0 @@
|
||||
# SNMP::Info::Layer2::Aironet
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Aironet;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::EtherLike;
|
||||
|
||||
@SNMP::Info::Layer2::Aironet::ISA = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike Exporter/;
|
||||
@SNMP::Info::Layer2::Aironet::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
'serial' => 'entPhysicalSerialNum.1',
|
||||
'descr' => 'sysDescr'
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE
|
||||
);
|
||||
|
||||
|
||||
sub vendor {
|
||||
# Sorry, but it's true.
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $aironet = shift;
|
||||
my $i_description = $aironet->i_description();
|
||||
|
||||
return $i_description;
|
||||
}
|
||||
|
||||
# Tag on e_descr.1
|
||||
sub description {
|
||||
my $aironet = shift;
|
||||
my $descr = $aironet->descr();
|
||||
my $e_descr = $aironet->e_descr();
|
||||
|
||||
$descr = "$e_descr->{1} $descr" if defined $e_descr->{1};
|
||||
|
||||
return $descr;
|
||||
}
|
||||
|
||||
# Fetch duplex from EtherLike
|
||||
sub i_duplex {
|
||||
my $aironet = shift;
|
||||
my $el_duplex = $aironet->el_duplex();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $d (keys %$el_duplex){
|
||||
my $val = $el_duplex->{$d};
|
||||
next unless defined $val;
|
||||
$i_duplex{$d} = 'full' if $val =~ /full/i;
|
||||
$i_duplex{$d} = 'half' if $val =~ /half/i;
|
||||
}
|
||||
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running IOS.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $aironet = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $aironet->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides interface to SNMP Data available on newer Aironet devices running Cisco IOS.
|
||||
|
||||
Note there are two classes for Aironet devices :
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3::Aironet
|
||||
|
||||
This class is for devices running Aironet software (older)
|
||||
|
||||
=item SNMP::Info::Layer2::Aironet
|
||||
|
||||
This class is for devices running Cisco IOS software (newer)
|
||||
|
||||
=back
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
|
||||
my $aironet = new SNMP::Info::Layer2::Aironet(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=item SNMP::Info::EtherLike
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->discription()
|
||||
|
||||
Adds info from method e_descr() from SNMP::Info::Entity
|
||||
|
||||
=item $aironet->vendor()
|
||||
|
||||
Returns 'cisco' :)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::Entity for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->interfaces()
|
||||
|
||||
Uses the i_description() field.
|
||||
|
||||
=item $aironet->i_duplex()
|
||||
|
||||
Crosses information from SNMP::Info::EtherLike to get duplex info for interfaces.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::Entity for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
|
||||
=cut
|
||||
@@ -1,479 +0,0 @@
|
||||
# SNMP::Info::Layer2::Bay
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Bay;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Bay::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Bay::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS,
|
||||
'cdp_id' => 's5EnMsTopIpAddr',
|
||||
'cdp_run' => 's5EnMsTopStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
'imac2' => 'ifPhysAddress',
|
||||
# S5-ETH-MULTISEG-TOPOLOGY-MIB::s5EnMsTopNmmTable
|
||||
'bay_topo_slot' => 's5EnMsTopNmmSlot',
|
||||
'bay_topo_port' => 's5EnMsTopNmmPort',
|
||||
'bay_topo_ip' => 's5EnMsTopNmmIpAddr',
|
||||
'bay_topo_seg' => 's5EnMsTopNmmSegId',
|
||||
'bay_topo_mac' => 's5EnMsTopNmmMacAddr',
|
||||
'bay_topo_platform' => 's5EnMsTopNmmChassisType',
|
||||
'bay_topo_localseg' => 's5EnMsTopNmmLocalSeg',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'SYNOPTICS-ROOT-MIB' => 'synoptics',
|
||||
'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop'
|
||||
);
|
||||
|
||||
delete $MIBS{'CISCO-CDP-MIB'};
|
||||
# 450's report full duplex as speed = 20mbps?!
|
||||
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
|
||||
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
'i_mac2' => \&SNMP::Info::munge_mac ,
|
||||
);
|
||||
|
||||
sub os {
|
||||
return 'bay';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $bay = shift;
|
||||
my $descr = $bay->description();
|
||||
|
||||
# 303 / 304
|
||||
if ($descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
|
||||
# 450
|
||||
if ($descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $bay = shift;
|
||||
my $descr = $bay->description();
|
||||
|
||||
# 303 / 304
|
||||
if ($descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/){
|
||||
return $1;
|
||||
}
|
||||
|
||||
# 450
|
||||
if ($descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
# or nortel, or synopsis?
|
||||
return 'bay';
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $bay = shift;
|
||||
my $descr = $bay->description();
|
||||
|
||||
my $i_type = $bay->i_type();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$i_type){
|
||||
my $type = $i_type->{$if};
|
||||
$i_ignore{$if}++ if $type =~ /(loopback|propvirtual|cpu)/i;
|
||||
}
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $bay = shift;
|
||||
my $i_index = $bay->i_index();
|
||||
|
||||
return $i_index;
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $bay = shift;
|
||||
my $i_mac = $bay->i_mac2();
|
||||
|
||||
# Bay 303's with a hw rev < 2.11.4.5 report the mac as all zeros
|
||||
foreach my $iid (keys %$i_mac){
|
||||
my $mac = $i_mac->{$iid};
|
||||
delete $i_mac->{$iid} if $mac eq '00:00:00:00:00:00';
|
||||
}
|
||||
return $i_mac;
|
||||
}
|
||||
|
||||
|
||||
sub model {
|
||||
my $bay = shift;
|
||||
my $id = $bay->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
$model =~ s/^sreg-//i;
|
||||
|
||||
my $descr = $bay->description();
|
||||
|
||||
return '303' if ($descr =~ /\D303\D/);
|
||||
return '304' if ($descr =~ /\D304\D/);
|
||||
return '450' if ($model =~ /BayStack450/);
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Hack in some CDP type stuff
|
||||
|
||||
sub c_if {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
|
||||
my %c_if;
|
||||
foreach my $entry (keys %$bay_topo_port){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if $port == 0;
|
||||
$c_if{"$port.1"} = $port;
|
||||
}
|
||||
return \%c_if;
|
||||
}
|
||||
|
||||
sub c_ip {
|
||||
my $bay = shift;
|
||||
my $bay_topo_ip = $bay->bay_topo_ip();
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $ip = $bay->cdp_ip();
|
||||
|
||||
# Count the number of devices seen on each port.
|
||||
# more than one device seen means connected to a non-bay
|
||||
# device, but other bay devices are squawking further away.
|
||||
my %ip_port;
|
||||
foreach my $entry (keys %$bay_topo_ip){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if $port == 0;
|
||||
my $ip = $bay_topo_ip->{$entry};
|
||||
push(@{$ip_port{$port}},$ip);
|
||||
}
|
||||
|
||||
my %c_ip;
|
||||
foreach my $port (keys %ip_port){
|
||||
my $ips = $ip_port{$port};
|
||||
if (scalar @$ips == 1) {
|
||||
$c_ip{"$port.1"} = $ips->[0];
|
||||
} else {
|
||||
$c_ip{"$port.1"} = $ips;
|
||||
}
|
||||
}
|
||||
|
||||
return \%c_ip;
|
||||
}
|
||||
|
||||
sub c_port {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $bay_topo_seg = $bay->bay_topo_seg();
|
||||
|
||||
my %c_port;
|
||||
foreach my $entry (keys %$bay_topo_seg){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if $port == 0;
|
||||
|
||||
# For fake remotes (multiple IPs for a c_ip), use first found
|
||||
next if defined $c_port{"$port.1"};
|
||||
|
||||
my $seg = $bay_topo_seg->{$entry};
|
||||
|
||||
# Segment id is (256 * remote slot_num) + (remote_port)
|
||||
my $remote_port = $seg % 256;
|
||||
|
||||
$c_port{"$port.1"} = $remote_port;
|
||||
}
|
||||
|
||||
return \%c_port;
|
||||
}
|
||||
|
||||
sub c_platform {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $bay_topo_platform = $bay->bay_topo_platform();
|
||||
|
||||
|
||||
my %c_platform;
|
||||
foreach my $entry (keys %$bay_topo_platform){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next if $port == 0;
|
||||
|
||||
# For fake remotes (multiple IPs for a c_ip), use first found
|
||||
next if defined $c_platform{"$port.1"};
|
||||
|
||||
my $platform = $bay_topo_platform->{$entry};
|
||||
|
||||
$c_platform{"$port.1"} = $platform;
|
||||
}
|
||||
|
||||
return \%c_platform;
|
||||
}
|
||||
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Bay - SNMP Interface to old Bay Network BayStack Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $bay = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $bay->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Bay device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
|
||||
my $bay = new SNMP::Info::Layer2::Bay(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item SYNOPTICS-ROOT-MIB
|
||||
|
||||
=item S5-ETH-MULTISEG-TOPOLOGY-MIB
|
||||
|
||||
=item Inherited classes
|
||||
|
||||
MIBs required by SNMP::Info::Layer2 and its superclasses.
|
||||
|
||||
=back
|
||||
|
||||
Bay MIBs can be found on the CD that came with your product.
|
||||
|
||||
Or, if you still have a service contract they can be downloaded at
|
||||
www.nortelnetworks.com
|
||||
|
||||
They have also been seen at : http://www.inotech.com/mibs/vendor/baynetworks/synoptics/synoptics.asp
|
||||
|
||||
Or http://www.oidview.com/mibs/detail.html under Synoptics. Check also www.mibdepot.com
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $bay->vendor()
|
||||
|
||||
Returns 'bay' :)
|
||||
|
||||
=item $bay->model()
|
||||
|
||||
Cross references $bay->id() to the SYNOPTICS-MIB and returns
|
||||
the results. 303s and 304s have the same ID, so we have a hack
|
||||
to return depending on which it is.
|
||||
|
||||
Removes sreg- from the model name
|
||||
|
||||
=item $bay->cdp_id()
|
||||
|
||||
Returns the IP that the device is sending out for its Nmm topology info.
|
||||
|
||||
(B<s5EnMsTopIpAddr>)
|
||||
|
||||
=item $bay->cdp_run()
|
||||
|
||||
Returns if the S5-ETH-MULTISEG-TOPOLOGY info is on for this device.
|
||||
|
||||
(B<s5EnMsTopStatus>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $bay->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to physical ports.
|
||||
|
||||
Currently simply returns the B<ifIndex>
|
||||
|
||||
=item $bay->i_ignore()
|
||||
|
||||
Returns reference to hash of IIDs to ignore.
|
||||
|
||||
Simply calls the SNMP::Info::Layer2::i_ignore() fn for this.
|
||||
|
||||
=item $bay->i_mac()
|
||||
|
||||
Returns the B<ifPhysAddress> table entries.
|
||||
|
||||
Removes all entries matching '00:00:00:00:00:00' -- Certain
|
||||
older revisions of Bay 303 and 304 firmware report all zeros
|
||||
for each port mac.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Psuedo CDP information
|
||||
|
||||
All entries with port=0 are local and ignored.
|
||||
|
||||
=over
|
||||
|
||||
=item $bay->c_if()
|
||||
|
||||
Returns referenece to hash. Key: port.1 Value: port (iid)
|
||||
|
||||
=item $bay->c_ip()
|
||||
|
||||
Returns referenece to hash. Key: port.1
|
||||
|
||||
The value of each hash entry can either be a scalar or an array.
|
||||
A scalar value is most likely a direct neighbor to that port.
|
||||
It is possible that there is a non-bay device in between this device and the remote device.
|
||||
|
||||
An array value represents a list of seen devices. The only time you will get an array
|
||||
of nieghbors, is if there is a non-bay device in between two or more devices.
|
||||
|
||||
Use the data from the Layer2 Topology Table below to dig deeper.
|
||||
|
||||
=item $bay->port()
|
||||
|
||||
Returns reference to hash. Key: port.1 Value: port
|
||||
|
||||
=item $bay->platform()
|
||||
|
||||
Returns reference to hash. Key: port.1 Value: Remote Device Type
|
||||
|
||||
=back
|
||||
|
||||
=head2 Layer2 Topology info (s5EnMsTopNmmTable)
|
||||
|
||||
=over
|
||||
|
||||
=item $bay->bay_topo_slot()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:slot number
|
||||
|
||||
(B<s5EnMsTopNmmSlot>)
|
||||
|
||||
=item $bay->bay_topo_port()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Port Number (interface iid)
|
||||
|
||||
(B<s5EnMsTopNmmPort>)
|
||||
|
||||
=item $bay->bay_topo_ip()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote IP address of entry
|
||||
|
||||
(B<s5EnMsTopNmmIpAddr>)
|
||||
|
||||
=item $bay->bay_topo_seg()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote Segment ID
|
||||
|
||||
(B<s5EnMsTopNmmSegId>)
|
||||
|
||||
=item $bay->bay_topo_mac
|
||||
(B<s5EnMsTopNmmMacAddr>)
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote MAC address
|
||||
|
||||
=item $bay->bay_topo_platform
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote Device Type
|
||||
|
||||
(B<s5EnMsTopNmmChassisType>)
|
||||
|
||||
=item $bay->bay_topo_localseg
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Boolean, if bay_topo_seg() is local
|
||||
|
||||
(B<s5EnMsTopNmmLocalSeg>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=cut
|
||||
@@ -1,372 +0,0 @@
|
||||
# SNMP::Info::Layer2::C1900
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::C1900;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
'c1900_flash_status' => 'upgradeFlashBankStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
'i_name2' => 'ifName',
|
||||
# ESSWITCH-MIB
|
||||
'c1900_p_index' => 'swPortIndex',
|
||||
'c1900_p_ifindex' => 'swPortIfIndex',
|
||||
'c1900_p_duplex' => 'swPortDuplexStatus',
|
||||
'c1900_p_duplex_admin' => 'swPortFullDuplex',
|
||||
'c1900_p_name' => 'swPortName',
|
||||
'c1900_p_up_admin' => 'swPortAdminStatus',
|
||||
'c1900_p_type' => 'swPortMediaCapability',
|
||||
'c1900_p_media' => 'swPortConnectorType',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
# Also known as the ESSWITCH-MIB
|
||||
'STAND-ALONE-ETHERNET-SWITCH-MIB' => 'series2000'
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
sub os {
|
||||
return 'catalyst';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $c1900 = shift;
|
||||
|
||||
# Check for superclass one
|
||||
my $os_ver = $c1900->SUPER::os_ver();
|
||||
return $os_ver if defined $os_ver;
|
||||
|
||||
my $c1900_flash_status = $c1900->c1900_flash_status();
|
||||
return undef unless defined $c1900_flash_status;
|
||||
|
||||
if ($c1900_flash_status =~ m/V(\d+\.\d+(\.\d+)?)/){
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $c1900 = shift;
|
||||
my $i_descr = $c1900->i_description();
|
||||
|
||||
foreach my $iid (keys %$i_descr){
|
||||
$i_descr->{$iid} =~ s/\s*$//;
|
||||
}
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $c1900 = shift;
|
||||
|
||||
my $interfaces = $c1900->interfaces();
|
||||
my $c1900_p_index = $c1900->c1900_p_index();
|
||||
my $c1900_p_duplex = $c1900->c1900_p_duplex();
|
||||
|
||||
|
||||
my %reverse_1900 = reverse %$c1900_p_index;
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if (keys %$interfaces){
|
||||
my $port_1900 = $reverse_1900{$if};
|
||||
next unless defined $port_1900;
|
||||
my $duplex = $c1900_p_duplex->{$port_1900};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$if}=$duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c1900 = shift;
|
||||
|
||||
my $interfaces = $c1900->interfaces();
|
||||
my $c1900_p_index = $c1900->c1900_p_index();
|
||||
my $c1900_p_admin = $c1900->c1900_p_duplex_admin();
|
||||
|
||||
|
||||
my %reverse_1900 = reverse %$c1900_p_index;
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if (keys %$interfaces){
|
||||
my $port_1900 = $reverse_1900{$if};
|
||||
next unless defined $port_1900;
|
||||
my $duplex = $c1900_p_admin->{$port_1900};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /disabled/i;
|
||||
$duplex = 'full' if $duplex =~ /flow control/i;
|
||||
$duplex = 'full' if $duplex =~ /enabled/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex_admin{$if}=$duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $c1900 = shift;
|
||||
|
||||
my $i_type = $c1900->i_type2();
|
||||
my $c1900_p_index = $c1900->c1900_p_index();
|
||||
my $c1900_p_type = $c1900->c1900_p_type();
|
||||
my $c1900_p_media = $c1900->c1900_p_media();
|
||||
|
||||
foreach my $p_iid (keys %$c1900_p_index){
|
||||
my $port = $c1900_p_index->{$p_iid};
|
||||
my $type = $c1900_p_type->{$p_iid};
|
||||
my $media = $c1900_p_media->{$p_iid};
|
||||
|
||||
next unless defined $port;
|
||||
next unless defined $type;
|
||||
next unless defined $media;
|
||||
|
||||
$i_type->{$port} = "$type $media";
|
||||
}
|
||||
|
||||
return $i_type;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $c1900 = shift;
|
||||
my $i_name = $c1900->i_name2();
|
||||
my $c1900_p_name = $c1900->c1900_p_name();
|
||||
|
||||
foreach my $port (keys %$c1900_p_name){
|
||||
my $name = $c1900_p_name->{$port};
|
||||
next unless defined $name;
|
||||
next unless $name !~ /^\s*$/;
|
||||
$i_name->{$port} = $name;
|
||||
}
|
||||
|
||||
return $i_name;
|
||||
}
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::C1900 - Perl5 Interface to SNMP data from Cisco Catlyst 1900 Network Switches running CatOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c1900 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $c1900->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a Catalyst 1900 device through SNMP.
|
||||
See SNMP::Info for full documentation
|
||||
|
||||
Note that most of these devices only talk SNMP version 1, but not all.
|
||||
|
||||
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
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)
|
||||
|
||||
ESSWITCH-MIB is included in the Version 1 MIBS from Cisco.
|
||||
|
||||
They can be found at ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
MIBs listed in SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->c1900_flash_status()
|
||||
|
||||
Usually contains the version of the software loaded in flash.
|
||||
Used by os_ver()
|
||||
|
||||
B<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
|
||||
|
||||
=item $c1900->os()
|
||||
|
||||
Returns 'catalyst'
|
||||
|
||||
=item $c1900->os_ver()
|
||||
|
||||
Returns CatOS version if obtainable. First tries to use
|
||||
SNMP::Info::CiscoStats->os_ver() . If that fails then it
|
||||
checks for the presence of $c1900->c1900_flash_status() and culls
|
||||
the version from there.
|
||||
|
||||
=item $c1900->vendor()
|
||||
|
||||
Returns 'cisco' :)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
|
||||
Crosses $c1900->c1900_p_index() with $c1900->c1900_p_duplex;
|
||||
|
||||
=item $c1900->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
Crosses $c1900->c1900_p_index() with $c1900->c1900_p_duplex_admin;
|
||||
|
||||
=item $c1900->i_name()
|
||||
|
||||
Crosses ifName with c1900_p_name() and returns the human set port name if exists.
|
||||
|
||||
=item $c1900->i_type()
|
||||
|
||||
Returns reference to hash of IID to port type
|
||||
|
||||
Takes the default ifType and overrides it with
|
||||
|
||||
c1900_p_type() and c1900_p_media() if they exist.
|
||||
|
||||
=back
|
||||
|
||||
=head2 STAND-ALONE-ETHERNET-SWITCH-MIB Switch Port Table Entries:
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->c1900_p_index()
|
||||
|
||||
Maps the Switch Port Table to the IID
|
||||
|
||||
B<swPortIfIndex>
|
||||
|
||||
=item $c1900->c1900_p_duplex()
|
||||
|
||||
Gives Port Duplex Info
|
||||
|
||||
B<swPortDuplexStatus>
|
||||
|
||||
=item $c1900->c1900_p_duplex_admin()
|
||||
|
||||
Gives admin setting for Duplex Info
|
||||
|
||||
B<swPortFullDuplex>
|
||||
|
||||
=item $c1900->c1900_p_name()
|
||||
|
||||
Gives human set name for port
|
||||
|
||||
B<swPortName>
|
||||
|
||||
=item $c1900->c1900_p_up_admin()
|
||||
|
||||
Gives Admin status of port enabled.
|
||||
|
||||
B<swPortAdminStatus>
|
||||
|
||||
=item $c1900->c1900_p_type()
|
||||
|
||||
Gives Type of port, ie. "general-ethernet"
|
||||
|
||||
B<swPortMediaCapability>
|
||||
|
||||
=item $c1900->c1900_p_media()
|
||||
|
||||
Gives the media of the port , ie "fiber-sc"
|
||||
|
||||
B<swPortConnectorType>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=cut
|
||||
@@ -1,280 +0,0 @@
|
||||
# SNMP::Info::Layer2::C2900
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::C2900;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
# C2900PortEntry
|
||||
'c2900_p_index' => 'c2900PortIfIndex',
|
||||
'c2900_p_duplex' => 'c2900PortDuplexStatus',
|
||||
'c2900_p_duplex_admin' => 'c2900PortDuplexState',
|
||||
'c2900_p_speed_admin' => 'c2900PortAdminSpeed',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'CISCO-C2900-MIB' => 'ciscoC2900MIB'
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $c2900 = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces();
|
||||
my $c2900_p_index = $c2900->c2900_p_index();
|
||||
my $c2900_p_duplex = $c2900->c2900_p_duplex();
|
||||
|
||||
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if (keys %$interfaces){
|
||||
my $port_2900 = $reverse_2900{$if};
|
||||
next unless defined $port_2900;
|
||||
my $duplex = $c2900_p_duplex->{$port_2900};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$if}=$duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c2900 = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces();
|
||||
my $c2900_p_index = $c2900->c2900_p_index();
|
||||
my $c2900_p_admin = $c2900->c2900_p_duplex_admin();
|
||||
|
||||
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if (keys %$interfaces){
|
||||
my $port_2900 = $reverse_2900{$if};
|
||||
next unless defined $port_2900;
|
||||
my $duplex = $c2900_p_admin->{$port_2900};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex_admin{$if}=$duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
# Use i_descritption for port key, cuz i_name can be manually entered.
|
||||
sub interfaces {
|
||||
my $c2900 = shift;
|
||||
my $interfaces = $c2900->i_index();
|
||||
my $i_descr = $c2900->i_description();
|
||||
|
||||
my %if;
|
||||
foreach my $iid (keys %$interfaces){
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$port =~ s/\./\//g if( $port =~ /\d+\.\d+$/);
|
||||
$port =~ s/[^\d\/,()\w]+//gi;
|
||||
|
||||
$if{$iid} = $port;
|
||||
}
|
||||
|
||||
return \%if
|
||||
}
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches running IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c2900 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $c2900->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
C2900 device through SNMP.
|
||||
|
||||
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(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-C2900-MIB
|
||||
|
||||
Part of the v2 MIBs from Cisco.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c2900->vendor()
|
||||
|
||||
Returns 'cisco' :)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c2900->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
On the 2900 devices i_name isn't reliable, so we override to just the description.
|
||||
|
||||
Next all dots are changed for forward slashes so that the physical port name
|
||||
is the same as the broadcasted CDP port name.
|
||||
(Ethernet0.1 -> Ethernet0/1)
|
||||
|
||||
Also, any weird characters are removed, as I saw a few pop up.
|
||||
|
||||
=item $c2900->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex;
|
||||
|
||||
=item $c2900->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin;
|
||||
|
||||
|
||||
=back
|
||||
|
||||
=head2 C2900-MIB Port Entry Table
|
||||
|
||||
=over
|
||||
|
||||
=item $c2900->c2900_p_index()
|
||||
|
||||
Maps the Switch Port Table to the IID
|
||||
|
||||
B<c2900PortIfIndex>
|
||||
|
||||
=item $c2900->c2900_p_duplex()
|
||||
|
||||
Gives Port Duplex Info
|
||||
|
||||
B<c2900PortDuplexStatus>
|
||||
|
||||
=item $c2900->c2900_p_duplex_admin()
|
||||
|
||||
Gives admin setting for Duplex Info
|
||||
|
||||
B<c2900PortDuplexState>
|
||||
|
||||
|
||||
=item $c2900->c2900_p_speed_admin()
|
||||
|
||||
Gives Admin speed of port
|
||||
|
||||
B<c2900PortAdminSpeed>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=cut
|
||||
@@ -1,590 +0,0 @@
|
||||
# SNMP::Info::Layer2::Catalyst
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Catalyst;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/ ;
|
||||
@SNMP::Info::Layer2::Catalyst::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS,
|
||||
'CISCO-STACK-MIB' => 'moduleType',
|
||||
'CISCO-VTP-MIB' => 'vtpVlanIndex'
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
# these are in CISCO-STACK-MIB
|
||||
'sysip' => 'sysIpAddr',
|
||||
'netmask' => 'sysNetMask',
|
||||
'broadcast' => 'sysBroadcast',
|
||||
'serial' => 'chassisSerialNumber',
|
||||
'model' => 'chassisModel',
|
||||
'ps1_type' => 'chassisPs1Type',
|
||||
'ps1_status' => 'chassisPs1Status',
|
||||
'ps2_type' => 'chassisPs2Type',
|
||||
'ps2_status' => 'chassisPs2Status',
|
||||
'slots' => 'chassisNumSlots',
|
||||
'fan' => 'chassisFanStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
# CISCO-STACK-MIB::moduleEntry
|
||||
# These are blades in a catalyst device
|
||||
'm_type' => 'moduleType',
|
||||
'm_model' => 'moduleModel',
|
||||
'm_serial' => 'moduleSerialNumber',
|
||||
'm_status' => 'moduleStatus',
|
||||
'm_name' => 'moduleName',
|
||||
'm_ports' => 'moduleNumPorts',
|
||||
'm_ports_status' => 'modulePortStatus',
|
||||
'm_hwver' => 'moduleHwVersion',
|
||||
'm_fwver' => 'moduleFwVersion',
|
||||
'm_swver' => 'moduleSwVersion',
|
||||
# Router Blades :
|
||||
'm_ip' => 'moduleIPAddress',
|
||||
'm_sub1' => 'moduleSubType',
|
||||
'm_sub2' => 'moduleSubType2',
|
||||
# CISCO-STACK-MIB::portEntry
|
||||
'p_name' => 'portName',
|
||||
'p_type' => 'portType',
|
||||
'p_status' => 'portOperStatus',
|
||||
'p_status2' => 'portAdditionalStatus',
|
||||
'p_speed' => 'portAdminSpeed',
|
||||
'p_duplex' => 'portDuplex',
|
||||
'p_port' => 'portIfIndex',
|
||||
# CISCO-STACK-MIB::PortCpbEntry
|
||||
'p_speed_admin' => 'portCpbSpeed',
|
||||
'p_duplex_admin' => 'portCpbDuplex',
|
||||
# CISCO-VTP-MIB::VtpVlanEntry
|
||||
'v_state' => 'vtpVlanState',
|
||||
'v_type' => 'vtpVlanType',
|
||||
'v_name' => 'vtpVlanName',
|
||||
'v_mtu' => 'vtpVlanMtu',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
'm_ports_status' => \&munge_port_status,
|
||||
'p_duplex_admin' => \&SNMP::Info::munge_bits,
|
||||
);
|
||||
|
||||
%PORTSTAT = (1 => 'other',
|
||||
2 => 'ok',
|
||||
3 => 'minorFault',
|
||||
4 => 'majorFault');
|
||||
|
||||
# Changes binary byte describing each port into ascii, and returns
|
||||
# an ascii list separated by spaces.
|
||||
sub munge_port_status {
|
||||
my $status = shift;
|
||||
my @vals = map($PORTSTAT{$_},unpack('C*',$status));
|
||||
return join(' ',@vals);
|
||||
}
|
||||
|
||||
# Overidden Methods
|
||||
|
||||
# i_physical sets a hash entry as true if the iid is a physical port
|
||||
sub i_physical {
|
||||
my $cat = shift;
|
||||
|
||||
my $p_port = $cat->p_port();
|
||||
|
||||
my %i_physical;
|
||||
foreach my $port (keys %$p_port) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_physical{$iid} = 1;
|
||||
}
|
||||
return \%i_physical;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $cat = shift;
|
||||
|
||||
my $p_port = $cat->p_port();
|
||||
my $p_type = $cat->p_type();
|
||||
|
||||
# Get more generic port types from IF-MIB
|
||||
my $i_type = $cat->i_type2();
|
||||
|
||||
# Now Override w/ port entries
|
||||
foreach my $port (keys %$p_type) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_type->{$iid} = $p_type->{$port};
|
||||
}
|
||||
|
||||
return $i_type;
|
||||
}
|
||||
|
||||
# p_* functions are indexed to physical port. let's index these
|
||||
# to snmp iid
|
||||
sub i_name {
|
||||
my $cat = shift;
|
||||
|
||||
my $p_port = $cat->p_port();
|
||||
my $p_name = $cat->p_name();
|
||||
|
||||
my %i_name;
|
||||
foreach my $port (keys %$p_name) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
$i_name{$iid} = $p_name->{$port};
|
||||
}
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $cat = shift;
|
||||
|
||||
my $p_port = $cat->p_port();
|
||||
my $p_duplex = $cat->p_duplex();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $port (keys %$p_duplex) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_duplex{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $cat = shift;
|
||||
|
||||
my $p_port = $cat->p_port();
|
||||
my $p_duplex_admin = $cat->p_duplex_admin();
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $port (keys %$p_duplex_admin) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
my $duplex = $p_duplex_admin->{$port};
|
||||
next unless defined $duplex;
|
||||
|
||||
my $string = 'other';
|
||||
# see CISCO-STACK-MIB for a description of the bits
|
||||
$string = 'half' if ($duplex =~ /001$/ or $duplex =~ /0100.$/);
|
||||
$string = 'full' if ($duplex =~ /010$/ or $duplex =~ /100.0$/);
|
||||
# we'll call it auto if both full and half are turned on, or if the
|
||||
# specifically 'auto' flag bit is set.
|
||||
$string = 'auto'
|
||||
if ($duplex =~ /1..$/ or $duplex =~ /110..$/ or $duplex =~ /..011$/);
|
||||
|
||||
$i_duplex_admin{$iid} = $string;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
# $cat->interfaces() - Maps the ifIndex table to a physical port
|
||||
sub interfaces {
|
||||
my $self = shift;
|
||||
my $interfaces = $self->i_index();
|
||||
my $portnames = $self->p_port();
|
||||
my %portmap = reverse %$portnames;
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid (keys %$interfaces) {
|
||||
my $if = $interfaces->{$iid};
|
||||
$interfaces{$if} = $portmap{$iid};
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'catalyst';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $cat = shift;
|
||||
my $os_ver = $cat->SUPER::os_ver();
|
||||
return $os_ver if defined $os_ver;
|
||||
|
||||
my $m_swver = $cat->m_swver();
|
||||
return undef unless defined $m_swver;
|
||||
|
||||
# assume .1 entry is the chassis and the sw version we want.
|
||||
return $m_swver->{1} if defined $m_swver->{1};
|
||||
return undef;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Catalyst - Perl5 Interface to Cisco devices running Catalyst OS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $cat = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $cat->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info subclass to provide information for Cisco Catalyst switches running CatOS.
|
||||
|
||||
This subclass is not for all devices that have the name Catalyst. Note that some Catalyst
|
||||
switches run IOS, like the 2900 and 3550 families. Cisco Catalyst 1900 switches use their
|
||||
own MIB and have a separate subclass. Use the method above to have SNMP::Info determine the
|
||||
appropriate subclass before using this class directly.
|
||||
|
||||
Note: Some older Catalyst switches will only talk SNMP version 1. Some newer ones will not
|
||||
return all their data if connected via Version 1.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
|
||||
my $cat = new SNMP::Info::Layer2::Catalyst(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-STACK-MIB
|
||||
|
||||
=item CISCO-VTP-MIB
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info::Layer2 for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
These MIBs are found in the standard v2 MIBs from Cisco.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->broadcast()
|
||||
|
||||
(B<sysBroadcast>)
|
||||
|
||||
=item $cat->fan()
|
||||
|
||||
(B<chassisFanStatus>)
|
||||
|
||||
=item $cat->model()
|
||||
|
||||
(B<chassisModel>)
|
||||
|
||||
=item $cat->netmask()
|
||||
|
||||
(B<sysNetMask>)
|
||||
|
||||
=item $cat->os()
|
||||
|
||||
Returns 'catalyst'
|
||||
|
||||
=item $cat->os_ver()
|
||||
|
||||
Tries to use the value from SNMP::Info::CiscoStats->os_ver() and if it fails
|
||||
it grabs $cat->m_swver()->{1} and uses that.
|
||||
|
||||
=item $cat->ps1_type()
|
||||
|
||||
(B<chassisPs1Type>)
|
||||
|
||||
=item $cat->ps2_type()
|
||||
|
||||
(B<chassisPs2Type>)
|
||||
|
||||
=item $cat->ps1_status()
|
||||
|
||||
(B<chassisPs1Status>)
|
||||
|
||||
=item $cat->ps2_status()
|
||||
|
||||
(B<chassisPs2Status>)
|
||||
|
||||
=item $cat->serial()
|
||||
|
||||
(B<chassisSerialNumberString>)
|
||||
|
||||
=item $cat->slots()
|
||||
|
||||
(B<chassisNumSlots>)
|
||||
|
||||
=item $cat->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->interfaces()
|
||||
|
||||
Crosses p_port() with i_index() to get physical names.
|
||||
|
||||
=item $cat->i_physical()
|
||||
|
||||
Returns a map to IID for ports that are physical ports, not vlans, etc.
|
||||
|
||||
=item $cat->i_type()
|
||||
|
||||
Crosses p_port() with p_type() and returns the results.
|
||||
|
||||
Overrides with ifType if p_type() isn't available.
|
||||
|
||||
=item $cat->i_name()
|
||||
|
||||
Crosses p_name with p_port and returns results.
|
||||
|
||||
=item $cat->i_duplex()
|
||||
|
||||
Crosses p_duplex with p_port and returns results.
|
||||
|
||||
=item $cat->i_duplex_admin()
|
||||
|
||||
Crosses p_duplex_admin with p_port.
|
||||
|
||||
Munges bit_string returned from p_duplex_admin to get duplex settings.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Module table
|
||||
|
||||
This table holds configuration information for each of the blades installed in
|
||||
the Catalyst device.
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->m_type()
|
||||
|
||||
(B<moduleType>)
|
||||
|
||||
=item $cat->m_model()
|
||||
|
||||
(B<moduleModel>)
|
||||
|
||||
=item $cat->m_serial()
|
||||
|
||||
(B<moduleSerialNumber>)
|
||||
|
||||
=item $cat->m_status()
|
||||
|
||||
(B<moduleStatus>)
|
||||
|
||||
=item $cat->m_name()
|
||||
|
||||
(B<moduleName>)
|
||||
|
||||
=item $cat->m_ports()
|
||||
|
||||
(B<moduleNumPorts>)
|
||||
|
||||
=item $cat->m_ports_status()
|
||||
|
||||
Returns a list of space separated status strings for the ports.
|
||||
|
||||
To see the status of port 4 :
|
||||
|
||||
@ports_status = split(' ', $cat->m_ports_status() );
|
||||
$port4 = $ports_status[3];
|
||||
|
||||
(B<modulePortStatus>)
|
||||
|
||||
=item $cat->m_ports_hwver()
|
||||
|
||||
(B<moduleHwVersion>)
|
||||
|
||||
=item $cat->m_ports_fwver()
|
||||
|
||||
(B<moduleFwVersion>)
|
||||
|
||||
=item $cat->m_ports_swver()
|
||||
|
||||
(B<moduleSwVersion>)
|
||||
|
||||
=item $cat->m_ports_ip()
|
||||
|
||||
(B<moduleIPAddress>)
|
||||
|
||||
=item $cat->m_ports_sub1()
|
||||
|
||||
(B<moduleSubType>)
|
||||
|
||||
=item $cat->m_ports_sub2()
|
||||
|
||||
(B<moduleSubType2>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Modules - Router Blades
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->m_ip()
|
||||
|
||||
(B<moduleIPAddress>)
|
||||
|
||||
=item $cat->m_sub1()
|
||||
|
||||
(B<moduleSubType>)
|
||||
|
||||
=item $cat->m_sub2()
|
||||
|
||||
(B<moduleSubType2>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Entry Table (CISCO-STACK-MIB::portTable)
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->p_name()
|
||||
|
||||
(B<portName>)
|
||||
|
||||
=item $cat->p_type()
|
||||
|
||||
(B<portType>)
|
||||
|
||||
=item $cat->p_status()
|
||||
|
||||
(B<portOperStatus>)
|
||||
|
||||
=item $cat->p_status2()
|
||||
|
||||
(B<portAdditionalStatus>)
|
||||
|
||||
=item $cat->p_speed()
|
||||
|
||||
(B<portAdminSpeed>)
|
||||
|
||||
=item $cat->p_duplex()
|
||||
|
||||
(B<portDuplex>)
|
||||
|
||||
=item $cat->p_port()
|
||||
|
||||
(B<portIfIndex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Capability Table (CISCO-STACK-MIB::portCpbTable)
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->p_speed_admin()
|
||||
|
||||
(B<portCpbSpeed>)
|
||||
|
||||
=item $cat->p_duplex_admin()
|
||||
|
||||
(B<portCpbDuplex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Entry Table
|
||||
|
||||
See ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-communityIndexing.html
|
||||
for a good treaty of how to connect to the VLANs
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->v_state()
|
||||
|
||||
(B<vtpVlanState>)
|
||||
|
||||
=item $cat->v_type()
|
||||
|
||||
(B<vtpVlanType>)
|
||||
|
||||
=item $cat->v_name()
|
||||
|
||||
(B<vtpVlanName>)
|
||||
|
||||
=item $cat->v_mtu()
|
||||
|
||||
(B<vtpVlanMtu>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=cut
|
||||
@@ -1,535 +0,0 @@
|
||||
# SNMP::Info::Layer2::HP - SNMP Interface to HP ProCurve Switches
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::HP;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::Entity;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE $INIT/ ;
|
||||
|
||||
@SNMP::Info::Layer2::HP::ISA = qw/SNMP::Info::Layer2 SNMP::Info::MAU SNMP::Info::Entity Exporter/;
|
||||
@SNMP::Info::Layer2::HP::EXPORT_OK = qw//;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and interworkings.
|
||||
$INIT = 0;
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
'RFC1271-MIB' => 'logDescription',
|
||||
'HP-ICF-OID' => 'hpSwitch4000',
|
||||
'STATISTICS-MIB' => 'hpSwitchCpuStat',
|
||||
'NETSWITCH-MIB' => 'hpMsgBufFree'
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
'serial1' => 'entPhysicalSerialNum.1',
|
||||
'hp_cpu' => 'hpSwitchCpuStat.0',
|
||||
'hp_mem_total' => 'hpGlobalMemTotalBytes.1',
|
||||
'mem_free' => 'hpGlobalMemFreeBytes.1',
|
||||
'mem_used' => 'hpGlobalMemAllocBytes.1',
|
||||
'os_version' => 'hpSwitchOsVersion.0',
|
||||
'os_bin' => 'hpSwitchRomVersion.0',
|
||||
'mac' => 'hpSwitchBaseMACAddress.0'
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
# RFC1271
|
||||
'l_descr' => 'logDescription'
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE
|
||||
);
|
||||
|
||||
%MODEL_MAP = (
|
||||
'J4812A' => '2512',
|
||||
'J4819A' => '5308XL',
|
||||
'J4813A' => '2524',
|
||||
'J4805A' => '5304XL',
|
||||
'J4815A' => '3324XL',
|
||||
'J4865A' => '4108GL',
|
||||
'J4887A' => '4104GL',
|
||||
'J4874A' => '9315',
|
||||
);
|
||||
|
||||
# Method Overrides
|
||||
|
||||
sub cpu {
|
||||
my $hp = shift;
|
||||
return $hp->hp_cpu();
|
||||
}
|
||||
|
||||
sub mem_total {
|
||||
my $hp = shift;
|
||||
return $hp->hp_mem_total();
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'hp';
|
||||
}
|
||||
sub os_ver {
|
||||
my $hp = shift;
|
||||
my $os_version = $hp->os_version();
|
||||
return $os_version if defined $os_version;
|
||||
# Some older ones don't have this value,so we cull it from the description
|
||||
my $descr = $hp->description();
|
||||
if ($descr =~ m/revision ([A-Z]{1}\.\d{2}\.\d{2})/) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
# Lookup model number, and translate the part number to the common number
|
||||
sub model {
|
||||
my $hp = shift;
|
||||
my $id = $hp->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
return defined $MODEL_MAP{$model} ? $MODEL_MAP{$model} : $model;
|
||||
}
|
||||
|
||||
# Some have the serial num in entity mib, some dont.
|
||||
sub serial {
|
||||
my $hp = shift;
|
||||
|
||||
# procurve 2xxx have this
|
||||
my $serial = $hp->serial1();
|
||||
|
||||
return undef unless defined $serial;
|
||||
# 4xxx dont
|
||||
return undef if $serial =~ /nosuchobject/i;
|
||||
|
||||
return $serial;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $hp = shift;
|
||||
my $interfaces = $hp->i_index();
|
||||
my $i_descr = $hp->i_description();
|
||||
|
||||
my %if;
|
||||
foreach my $iid (keys %$interfaces){
|
||||
my $descr = $i_descr->{$iid};
|
||||
next unless defined $descr;
|
||||
$if{$iid} = $descr if (defined $descr and length $descr);
|
||||
}
|
||||
|
||||
return \%if
|
||||
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $hp = shift;
|
||||
my $e_descr = $hp->e_descr();
|
||||
my $e_port = $hp->e_port();
|
||||
|
||||
# Grab default values to pass through
|
||||
my $i_type = $hp->i_type2();
|
||||
|
||||
# Now Stuff in the entity-table values
|
||||
foreach my $port (keys %$e_descr){
|
||||
my $iid = $e_port->{$port};
|
||||
next unless defined $iid;
|
||||
my $type = $e_descr->{$port};
|
||||
$type =~ s/^HP ?//;
|
||||
$i_type->{$iid} = $type;
|
||||
}
|
||||
|
||||
return $i_type;
|
||||
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $hp = shift;
|
||||
my $i_alias = $hp->i_alias();
|
||||
my $e_name = $hp->e_name();
|
||||
my $e_port = $hp->e_port();
|
||||
|
||||
my %i_name;
|
||||
|
||||
foreach my $port (keys %$e_name){
|
||||
my $iid = $e_port->{$port};
|
||||
next unless defined $iid;
|
||||
my $alias = $i_alias->{$iid};
|
||||
next unless defined $iid;
|
||||
$i_name{$iid} = $e_name->{$port};
|
||||
|
||||
# Check for alias
|
||||
$i_name{$iid} = $alias if (defined $alias and length($alias));
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub log {
|
||||
my $hp=shift;
|
||||
|
||||
my $log = $hp->l_descr();
|
||||
|
||||
my $logstring = undef;
|
||||
|
||||
foreach my $val (values %$log){
|
||||
next if $val =~ /^Link\s+(Up|Down)/;
|
||||
$logstring .= "$val\n";
|
||||
}
|
||||
|
||||
return $logstring;
|
||||
}
|
||||
|
||||
sub slots {
|
||||
my $hp=shift;
|
||||
|
||||
my $e_name = $hp->e_name();
|
||||
|
||||
return undef unless defined $e_name;
|
||||
|
||||
my $slots;
|
||||
foreach my $slot (keys %$e_name) {
|
||||
$slots++ if $e_name->{$slot} =~ /slot/i;
|
||||
}
|
||||
|
||||
return $slots;
|
||||
}
|
||||
|
||||
#sub fan {
|
||||
# my $hp = shift;
|
||||
#
|
||||
# my %ents = reverse %{$hp->e_name()};
|
||||
#
|
||||
# my $fan = $ents{'Fan'};
|
||||
#
|
||||
#}
|
||||
|
||||
sub i_duplex {
|
||||
my $hp = shift;
|
||||
|
||||
my $mau_index = $hp->mau_index();
|
||||
my $mau_link = $hp->mau_link();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $mau_port (keys %$mau_link){
|
||||
my $iid = $mau_index->{$mau_port};
|
||||
next unless defined $iid;
|
||||
|
||||
my $linkoid = $mau_link->{$mau_port};
|
||||
my $link = &SNMP::translateObj($linkoid);
|
||||
next unless defined $link;
|
||||
|
||||
my $duplex = undef;
|
||||
|
||||
if ($link =~ /fd$/i) {
|
||||
$duplex = 'full';
|
||||
} elsif ($link =~ /hd$/i){
|
||||
$duplex = 'half';
|
||||
}
|
||||
|
||||
$i_duplex{$iid} = $duplex if defined $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $hp = shift;
|
||||
|
||||
my $interfaces = $hp->interfaces();
|
||||
my $mau_index = $hp->mau_index();
|
||||
my $mau_auto = $hp->mau_auto();
|
||||
my $mau_autostat = $hp->mau_autostat();
|
||||
my $mau_typeadmin = $hp->mau_type_admin();
|
||||
my $mau_autosent = $hp->mau_autosent();
|
||||
|
||||
my %mau_reverse = reverse %$mau_index;
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $iid (keys %$interfaces){
|
||||
my $mau_index = $mau_reverse{$iid};
|
||||
next unless defined $mau_index;
|
||||
|
||||
my $autostat = $mau_autostat->{$mau_index};
|
||||
|
||||
# HP25xx has this value
|
||||
if (defined $autostat and $autostat =~ /enabled/i){
|
||||
$i_duplex_admin{$iid} = 'auto';
|
||||
next;
|
||||
}
|
||||
|
||||
my $type = $mau_autosent->{$mau_index};
|
||||
|
||||
next unless defined $type;
|
||||
|
||||
if ($type == 0) {
|
||||
$i_duplex_admin{$iid} = 'none';
|
||||
next;
|
||||
}
|
||||
|
||||
my $full = $hp->_isfullduplex($type);
|
||||
my $half = $hp->_ishalfduplex($type);
|
||||
|
||||
if ($full and !$half){
|
||||
$i_duplex_admin{$iid} = 'full';
|
||||
} elsif ($half) {
|
||||
$i_duplex_admin{$iid} = 'half';
|
||||
}
|
||||
}
|
||||
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::HP - SNMP Interface to HP Procurve Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $hp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $hp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
HP ProCurve Switch via SNMP.
|
||||
|
||||
Note: Some HP Switches will connect via SNMP version 1, but a lot of config data will
|
||||
not be available. Make sure you try and connect with Version 2 first, and then fail back
|
||||
to version 1.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
|
||||
my $hp = new SNMP::Info::Layer2::HP(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item RFC1271-MIB
|
||||
|
||||
Included in V2 mibs from Cisco
|
||||
|
||||
=item HP-ICF-OID
|
||||
|
||||
=item STATISTICS-MIB
|
||||
|
||||
=item NETSWITCH-MIB
|
||||
|
||||
=back
|
||||
|
||||
The last three MIBs listed are from HP and can be found at http://www.hp.com/rnd/software
|
||||
|
||||
=head1 ChangeLog
|
||||
|
||||
Version 0.4 - Removed ENTITY-MIB e_*() methods to separate sub-class - SNMP::Info::Entity
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->cpu()
|
||||
|
||||
Returns CPU Utilization in percentage.
|
||||
|
||||
=item $hp->log()
|
||||
|
||||
Returns all the log entries from the switch's log that are not Link up or down messages.
|
||||
|
||||
=item $hp->mem_free()
|
||||
|
||||
Returns bytes of free memory
|
||||
|
||||
=item $hp->mem_total()
|
||||
|
||||
Return bytes of total memory
|
||||
|
||||
=item $hp->mem_used()
|
||||
|
||||
Returns bytes of used memory
|
||||
|
||||
=item $hp->model()
|
||||
|
||||
Returns the model number of the HP Switch. Will translate between the HP Part number and
|
||||
the common model number with this map :
|
||||
|
||||
%MODEL_MAP = (
|
||||
'J4812A' => '2512',
|
||||
'J4819A' => '5308XL',
|
||||
'J4813A' => '2524',
|
||||
'J4805A' => '5304XL',
|
||||
'J4815A' => '3324XL',
|
||||
'J4865A' => '4108GL',
|
||||
'J4887A' => '4104GL',
|
||||
'J4874A' => '9315',
|
||||
);
|
||||
|
||||
=item $hp->os()
|
||||
|
||||
Returns hp
|
||||
|
||||
=item $hp->os_bin()
|
||||
|
||||
B<hpSwitchRomVersion.0>
|
||||
|
||||
=item $hp->os_ver()
|
||||
|
||||
Tries to use os_version() and if that fails will try and cull the version from
|
||||
the description field.
|
||||
|
||||
=item $hp->os_version()
|
||||
|
||||
B<hpSwitchOsVersion.0>
|
||||
|
||||
=item $hp->serial()
|
||||
|
||||
Returns serial number if available through SNMP
|
||||
|
||||
=item $hp->slots()
|
||||
|
||||
Returns number of entries in $hp->e_name that have 'slot' in them.
|
||||
|
||||
=item $hp->vendor()
|
||||
|
||||
hp
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::Entity for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in SNMP::Info::MAU for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->interfaces()
|
||||
|
||||
Uses $hp->i_description()
|
||||
|
||||
=item $hp->i_duplex()
|
||||
|
||||
Maps $hp->mau_index() with $hp->mau_link(). Methods inherited from
|
||||
SNMP::Info::MAU.
|
||||
|
||||
=item $hp->i_duplex_admin()
|
||||
|
||||
Maps $hp->mau_index() with $hp->mau_auto(), $hp->mau_autostat(),
|
||||
$hp->typeadmin(), and $mau_autosent(). Methods inherited from
|
||||
SNMP::Info::MAU.
|
||||
|
||||
=item $hp->i_name()
|
||||
|
||||
Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias()
|
||||
|
||||
=item $hp->i_type()
|
||||
|
||||
Crosses i_type() with $hp->e_descr() using $hp->e_port()
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::Entity for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in SNMP::Info::MAU for details.
|
||||
|
||||
=cut
|
||||
456
Info/Layer3.pm
456
Info/Layer3.pm
@@ -1,456 +0,0 @@
|
||||
# SNMP::Info::Layer3 - SNMP Interface to Layer3 devices
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::EtherLike;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
@SNMP::Info::Layer3::ISA = qw/SNMP::Info SNMP::Info::CDP SNMP::Info::Bridge
|
||||
SNMP::Info::EtherLike SNMP::Info::CiscoStats Exporter/;
|
||||
@SNMP::Info::Layer3::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
|
||||
$INIT = 0;
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
'ENTITY-MIB' => 'entPhysicalName',
|
||||
'CISCO-PRODUCTS-MIB' => 'sysName',
|
||||
'OSPF-MIB' => 'ospfRouterId',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
# Inherit the super class ones
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'chassis' => 'entPhysicalDescr.1',
|
||||
'router_ip' => 'ospfRouterId.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
# IFMIB
|
||||
'i_name2' => 'ifName',
|
||||
# Address Translation Table (ARP Cache)
|
||||
'at_index' => 'atIfIndex',
|
||||
'at_paddr' => 'atPhysAddress',
|
||||
'at_netaddr' => 'atNetAddress',
|
||||
'ospf_ip' => 'ospfHostIpAddress'
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
|
||||
# Method OverRides
|
||||
|
||||
sub root_ip {
|
||||
my $l3 = shift;
|
||||
|
||||
my $router_ip = $l3->router_ip();
|
||||
my $ospf_ip = $l3->ospf_ip();
|
||||
|
||||
# return the first one found here (should be only)
|
||||
if (defined $ospf_ip and scalar(keys %$ospf_ip)){
|
||||
foreach my $key (keys %$ospf_ip){
|
||||
my $ip = $ospf_ip->{$key};
|
||||
print " SNMP::Layer3::root_ip() using $ip\n" if $DEBUG;
|
||||
return $ip;
|
||||
}
|
||||
}
|
||||
|
||||
return $router_ip if defined $router_ip;
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$interfaces) {
|
||||
# lo -> cisco aironet 350 loopback
|
||||
if ($interfaces->{$if} =~ /(tunnel|loopback|lo|null)/i){
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $l3 = shift;
|
||||
|
||||
my $chassis = $l3->chassis();
|
||||
|
||||
return $1 if (defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i);
|
||||
|
||||
}
|
||||
|
||||
# $l3->model() - the sysObjectID returns an IID to an entry in
|
||||
# the CISCO-PRODUCT-MIB. Look it up and return it.
|
||||
sub model {
|
||||
my $l3 = shift;
|
||||
my $id = $l3->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
$model =~ s/^cisco//i;
|
||||
$model =~ s/^catalyst//;
|
||||
$model =~ s/^cat//;
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $l3 = shift;
|
||||
my $i_index = $l3->i_index();
|
||||
my $i_alias = $l3->i_alias();
|
||||
my $i_name2 = $l3->i_name2();
|
||||
|
||||
my %i_name;
|
||||
foreach my $iid (keys %$i_name2){
|
||||
my $name = $i_name2->{$iid};
|
||||
my $alias = $i_alias->{$iid};
|
||||
$i_name{$iid} = (defined $alias and $alias !~ /^\s*$/) ?
|
||||
$alias :
|
||||
$name;
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $l3 = shift;
|
||||
|
||||
my $el_index = $l3->el_index();
|
||||
my $el_duplex = $l3->el_duplex();
|
||||
|
||||
my %i_index;
|
||||
foreach my $el_port (keys %$el_duplex){
|
||||
my $iid = $el_index->{$el_port};
|
||||
next unless defined $iid;
|
||||
my $duplex = $el_duplex->{$el_port};
|
||||
next unless defined $duplex;
|
||||
|
||||
$i_index{$iid} = 'half' if $duplex =~ /half/i;
|
||||
$i_index{$iid} = 'full' if $duplex =~ /full/i;
|
||||
$i_index{$iid} = 'auto' if $duplex =~ /auto/i;
|
||||
}
|
||||
|
||||
return \%i_index;
|
||||
}
|
||||
|
||||
# $l3->interfaces() - Map the Interfaces to their physical names
|
||||
sub interfaces {
|
||||
my $l3 = shift;
|
||||
my $interfaces = $l3->i_index();
|
||||
my $descriptions = $l3->i_description();
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid (keys %$interfaces){
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
$interfaces{$iid} = $desc;
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l3 = shift;
|
||||
|
||||
my $descr = $l3->description();
|
||||
|
||||
return 'cisco' if ($descr =~ /(cisco|ios)/i);
|
||||
return 'foundry' if ($descr =~ /foundry/i);
|
||||
|
||||
}
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3 - Perl5 Interface to network devices serving Layer3 or Layers 2 & 3
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $l3 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l3->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
my $interfaces = $l3->interfaces();
|
||||
my $i_up = $l3->i_up();
|
||||
my $i_speed = $l3->i_speed();
|
||||
foreach my $iid (keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $up = $i_up->{$iid};
|
||||
my $speed = $i_speed->{$iid}
|
||||
print "Port $port is $up. Port runs at $speed.\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes listed under
|
||||
SNMP::Info::Layer3::* Please read all docs under SNMP::Info first.
|
||||
|
||||
Provides generic methods for accessing SNMP data for Layer 3 network devices.
|
||||
Includes support for Layer2+3 devices.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
|
||||
my $l3 = new SNMP::Info::Layer3(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::EtherLike
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-PRODUCTS-MIB
|
||||
|
||||
=item ENTITY-MIB
|
||||
|
||||
=item OSPF-MIB
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->chassis()
|
||||
|
||||
Returns Chassis type (model).
|
||||
|
||||
(B<entPhysicalDescr.1>)
|
||||
|
||||
=item $l3->mac()
|
||||
|
||||
Returns root port mac address
|
||||
|
||||
(B<ifPhysAddress.1>)
|
||||
|
||||
=item $l3->router_ip()
|
||||
|
||||
(B<ospfRouterId.0>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->model()
|
||||
|
||||
Trys to reference $l3->id() to one of the product MIBs listed above
|
||||
|
||||
Removes 'cisco' from cisco devices for readability.
|
||||
|
||||
=item $l3->serial()
|
||||
|
||||
Trys to cull a serial number from $l3->chassis()
|
||||
|
||||
=item $l3->vendor()
|
||||
|
||||
Trys to cull a Vendor name from B<sysDescr>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike 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 $l3->interfaces()
|
||||
|
||||
Returns the map between SNMP Interface Identifier (iid) and physical port name.
|
||||
|
||||
Only returns those iids that have a description listed in $l3->i_description()
|
||||
|
||||
=item $l3->i_ignore()
|
||||
|
||||
Returns reference to hash. Creates a key for each IID that should be ignored.
|
||||
|
||||
Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
|
||||
|
||||
=item $l3->i_name()
|
||||
|
||||
Returns reference to hash of iid to human set name.
|
||||
|
||||
Defaults to B<ifName>, but checks for an B<ifAlias>
|
||||
|
||||
=item $l3->i_duplex()
|
||||
|
||||
Returns reference to hash of iid to current link duplex setting.
|
||||
|
||||
Maps $l3->el_index() to $l3->el_duplex, then culls out
|
||||
full,half, or auto and sets the map to that value.
|
||||
|
||||
see SNMP::Info::Etherlike for the el_index() and el_duplex() methods.
|
||||
|
||||
=back
|
||||
|
||||
=head2 ARP Cache Entries
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->at_index()
|
||||
|
||||
Returns reference to map of IID to Arp Cache Entry
|
||||
|
||||
(B<atIfIndex>)
|
||||
|
||||
=item $l3->at_paddr()
|
||||
|
||||
Returns reference to hash of Arp Cache Entries to MAC address
|
||||
|
||||
(B<atPhysAddress>)
|
||||
|
||||
=item $l3->at_netaddr()
|
||||
|
||||
Returns reference to hash of Arp Cache Entries to IP Address
|
||||
|
||||
(B<atNetAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
|
||||
=cut
|
||||
@@ -1,403 +0,0 @@
|
||||
# SNMP::Info::Layer3::C3550
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2003, Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::C3550;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/ ;
|
||||
@SNMP::Info::Layer3::C3550::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'CISCO-STACK-MIB' => 'moduleType',
|
||||
'CISCO-VTP-MIB' => 'vtpVlanIndex'
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'ports2' => 'ifNumber',
|
||||
# these are in CISCO-STACK-MIB
|
||||
'serial' => 'chassisSerialNumberString',
|
||||
'ps1_type' => 'chassisPs1Type',
|
||||
'ps1_status' => 'chassisPs1Status',
|
||||
'ps2_type' => 'chassisPs2Type',
|
||||
'ps2_status' => 'chassisPs2Status',
|
||||
'fan' => 'chassisFanStatus'
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
# CISCO-STACK-MIB::portEntry
|
||||
'p_name' => 'portName',
|
||||
'p_type' => 'portType',
|
||||
'p_status' => 'portOperStatus',
|
||||
'p_status2' => 'portAdditionalStatus',
|
||||
'p_speed' => 'portAdminSpeed',
|
||||
'p_duplex' => 'portDuplex',
|
||||
'p_port' => 'portIfIndex',
|
||||
# CISCO-STACK-MIB::PortCpbEntry
|
||||
'p_speed_admin' => 'portCpbSpeed',
|
||||
'p_duplex_admin' => 'portCpbDuplex',
|
||||
# CISCO-VTP-MIB::VtpVlanEntry
|
||||
'v_state' => 'vtpVlanState',
|
||||
'v_type' => 'vtpVlanType',
|
||||
'v_name' => 'vtpVlanName',
|
||||
'v_mtu' => 'vtpVlanMtu',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
'm_ports_status' => \&munge_port_status,
|
||||
'p_duplex_admin' => \&SNMP::Info::munge_bits,
|
||||
);
|
||||
|
||||
%PORTSTAT = (1 => 'other',
|
||||
2 => 'ok',
|
||||
3 => 'minorFault',
|
||||
4 => 'majorFault');
|
||||
|
||||
# Changes binary byte describing each port into ascii, and returns
|
||||
# an ascii list separated by spaces.
|
||||
sub munge_port_status {
|
||||
my $status = shift;
|
||||
my @vals = map($PORTSTAT{$_},unpack('C*',$status));
|
||||
return join(' ',@vals);
|
||||
}
|
||||
|
||||
# Overidden Methods
|
||||
|
||||
sub i_type {
|
||||
my $c3550 = shift;
|
||||
|
||||
my $p_port = $c3550->p_port();
|
||||
my $p_type = $c3550->p_type();
|
||||
|
||||
# Get more generic port types from IF-MIB
|
||||
my $i_type = $c3550->i_type2();
|
||||
|
||||
# Now Override w/ port entries
|
||||
foreach my $port (keys %$p_type) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_type->{$iid} = $p_type->{$port};
|
||||
}
|
||||
|
||||
return $i_type;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $c3550 = shift;
|
||||
|
||||
my $p_port = $c3550->p_port();
|
||||
my $p_duplex = $c3550->p_duplex();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $port (keys %$p_duplex) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_duplex{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c3550 = shift;
|
||||
|
||||
my $p_port = $c3550->p_port();
|
||||
my $p_duplex_admin = $c3550->p_duplex_admin();
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $port (keys %$p_duplex_admin) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
my $duplex = $p_duplex_admin->{$port};
|
||||
next unless defined $duplex;
|
||||
|
||||
my $string = 'other';
|
||||
# see CISCO-STACK-MIB for a description of the bits
|
||||
$string = 'half' if ($duplex =~ /001$/ or $duplex =~ /0100.$/);
|
||||
$string = 'full' if ($duplex =~ /010$/ or $duplex =~ /100.0$/);
|
||||
# we'll call it auto if both full and half are turned on, or if the
|
||||
# specifically 'auto' flag bit is set.
|
||||
$string = 'auto'
|
||||
if ($duplex =~ /1..$/ or $duplex =~ /110..$/ or $duplex =~ /..011$/);
|
||||
|
||||
$i_duplex_admin{$iid} = $string;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $c3550 = shift;
|
||||
my $id = $c3550->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
$model =~ s/^catalyst//;
|
||||
$model =~ s/(24|48)$//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Ports is encoded into the model number
|
||||
sub ports {
|
||||
my $c3550 = shift;
|
||||
|
||||
my $ports2 = $c3550->ports2();
|
||||
|
||||
my $id = $c3550->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
if ($model =~ /(24|48)$/) {
|
||||
return $1;
|
||||
}
|
||||
return $ports2;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::C3550 - Perl5 Interface to Cisco Catalyst 3550 Layer 2/3 Switches running IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c3550 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $c3550->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Cisco Catalyst 3550 Layer 2/3 Switches.
|
||||
|
||||
These devices run IOS but have some of the same charactersitics as the Catalyst WS-C family (5xxx,6xxx).
|
||||
For example, forwarding tables are held in VLANs, and extened interface information
|
||||
is gleened from CISCO-SWITCH-MIB.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
|
||||
my $c3550 = new SNMP::Info::Layer3::C3550(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-STACK-MIB
|
||||
|
||||
=item CISCO-VTP-MIB
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $c3550->serial()
|
||||
(B<chassisSerialNumberString>)
|
||||
|
||||
=item $c3550->model()
|
||||
(B<chassisModel>)
|
||||
|
||||
=item $c3550->ps1_type()
|
||||
(B<chassisPs1Type>)
|
||||
|
||||
=item $c3550->ps2_type()
|
||||
(B<chassisPs2Type>)
|
||||
|
||||
=item $c3550->ps1_status()
|
||||
(B<chassisPs1Status>)
|
||||
|
||||
=item $c3550->ps2_status()
|
||||
(B<chassisPs2Status>)
|
||||
|
||||
=item $c3550->slots()
|
||||
(B<chassisNumSlots>)
|
||||
|
||||
=item $c3550->fan()
|
||||
(B<chassisFanStatus>)
|
||||
|
||||
=item $c3550->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c3550->i_type()
|
||||
|
||||
Crosses p_port() with p_type() and returns the results.
|
||||
|
||||
Overrides with ifType if p_type() isn't available.
|
||||
|
||||
=item $c3550->i_name()
|
||||
|
||||
Crosses p_name with p_port and returns results.
|
||||
|
||||
=item $c3550->i_duplex()
|
||||
|
||||
Crosses p_duplex with p_port and returns results.
|
||||
|
||||
=item $c3550->i_duplex_admin()
|
||||
|
||||
Crosses p_duplex_admin with p_port.
|
||||
|
||||
Munges bit_string returned from p_duplex_admin to get duplex settings.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Entry Table (CISCO-STACK-MIB::portTable)
|
||||
|
||||
=over
|
||||
|
||||
=item $c3550->p_name()
|
||||
|
||||
(B<portName>)
|
||||
|
||||
=item $c3550->p_type()
|
||||
|
||||
(B<portType>)
|
||||
|
||||
=item $c3550->p_status()
|
||||
|
||||
(B<portOperStatus>)
|
||||
|
||||
=item $c3550->p_status2()
|
||||
|
||||
(B<portAdditionalStatus>)
|
||||
|
||||
=item $c3550->p_speed()
|
||||
|
||||
(B<portAdminSpeed>)
|
||||
|
||||
=item $c3550->p_duplex()
|
||||
|
||||
(B<portDuplex>)
|
||||
|
||||
=item $c3550->p_port()
|
||||
|
||||
(B<portIfIndex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Capability Table (CISCO-STACK-MIB::portCpbTable)
|
||||
|
||||
=over
|
||||
|
||||
=item $c3550->p_speed_admin()
|
||||
|
||||
(B<portCpbSpeed>)
|
||||
|
||||
=item $c3550->p_duplex_admin()
|
||||
|
||||
(B<portCpbDuplex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Entry Table
|
||||
|
||||
See ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-communityIndexing.html
|
||||
for a good treaty of how to connect to the VLANs
|
||||
|
||||
=over
|
||||
|
||||
=item $c3550->v_state()
|
||||
|
||||
(B<vtpVlanState>)
|
||||
|
||||
=item $c3550->v_type()
|
||||
|
||||
(B<vtpVlanType>)
|
||||
|
||||
=item $c3550->v_name()
|
||||
|
||||
(B<vtpVlanName>)
|
||||
|
||||
=item $c3550->v_mtu()
|
||||
|
||||
(B<vtpVlanMtu>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
|
||||
=cut
|
||||
@@ -1,460 +0,0 @@
|
||||
# SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry devices
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Foundry;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info SNMP::Info::Bridge Exporter/;
|
||||
@SNMP::Info::Layer3::Foundry::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
|
||||
$INIT = 0;
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
|
||||
# IP-FORWARD-MIB
|
||||
# ETHERLIKE-MIB
|
||||
# RFC1398-MIB
|
||||
# RMON-MIB
|
||||
# IF-MIB
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
# Inherit the super class ones
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'chassis' => 'entPhysicalDescr.1',
|
||||
'serial' => 'snChasSerNum',
|
||||
'temp' => 'snChasActualTemperature',
|
||||
'ps1_type' => 'snChasPwrSupplyDescription.1',
|
||||
'ps1_status' => 'snChasPwrSupplyOperStatus.1',
|
||||
'fan' => 'snChasFanOperStatus.1',
|
||||
#'serial' => 'enterprises.1991.1.1.1.1.2.0',
|
||||
#'temp' => 'enterprises.1991.1.1.1.1.18.0',
|
||||
#'ps1_type' => 'enterprises.1991.1.1.1.2.1.1.2.1',
|
||||
#'ps1_status' => 'enterprises.1991.1.1.1.2.1.1.3.1',
|
||||
#'fan' => 'enterprises.1991.1.1.1.3.1.1.3.1'
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
'i_name2' => 'ifName',
|
||||
# From RFC1213-MIB
|
||||
'at_index' => 'ipNetToMediaIfIndex',
|
||||
'at_paddr' => 'ipNetToMediaPhysAddress',
|
||||
'at_netaddr' => 'ipNetToMediaNetAddress',
|
||||
# FOUNDRY-MIB
|
||||
# snSwPortInfoTable - Switch Port Information Group
|
||||
'sw_index' => 'snSwPortIfIndex',
|
||||
'sw_duplex' => 'snSwPortInfoChnMode',
|
||||
'sw_type' => 'snSwPortInfoMediaType',
|
||||
'sw_speed' => 'snSwPortInfoSpeed',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
|
||||
# Method OverRides
|
||||
|
||||
# Add our i_aliases if they are set (manually)
|
||||
sub i_name {
|
||||
my $foundry = shift;
|
||||
my $i_name = $foundry->i_name2();
|
||||
|
||||
my $i_alias = $foundry->i_alias();
|
||||
|
||||
foreach my $iid (keys %$i_name){
|
||||
my $alias = $i_alias->{$iid};
|
||||
next unless defined $alias;
|
||||
next unless length($alias);
|
||||
$i_name->{$iid} = $i_alias->{$iid};
|
||||
}
|
||||
|
||||
return $i_name;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $foundry = shift;
|
||||
|
||||
my $interfaces = $foundry->interfaces();
|
||||
my $i_descr = $foundry->i_descr();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$interfaces) {
|
||||
# lo -> cisco aironet 350 loopback
|
||||
if ($interfaces->{$if} =~ /(tunnel|loopback|lo|lb|null)/i){
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $foundry = shift;
|
||||
my $sw_index = $foundry->sw_index();
|
||||
my $sw_duplex= $foundry->sw_duplex();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $sw_port (keys %$sw_duplex){
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $duplex = $sw_duplex->{$sw_port};
|
||||
next if $duplex =~ /none/i;
|
||||
$i_duplex{$iid} = 'half' if $duplex =~ /half/i;
|
||||
$i_duplex{$iid} = 'full' if $duplex =~ /full/i;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $foundry = shift;
|
||||
my $sw_index = $foundry->sw_index();
|
||||
my $sw_type= $foundry->sw_type();
|
||||
|
||||
my %i_type;
|
||||
foreach my $sw_port (keys %$sw_type){
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $type = $sw_type->{$sw_port};
|
||||
next unless defined $type;
|
||||
$i_type{$iid} = $type;
|
||||
}
|
||||
return \%i_type;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $foundry = shift;
|
||||
my $sw_index = $foundry->sw_index();
|
||||
my $sw_speed= $foundry->sw_speed();
|
||||
|
||||
my %i_speed;
|
||||
foreach my $sw_port (keys %$sw_speed){
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $speed = $sw_speed->{$sw_port};
|
||||
next unless defined $speed;
|
||||
$speed = 'auto' if $speed =~ /auto/i;
|
||||
$speed = '10 Mbps' if $speed =~ /s10m/i;
|
||||
$speed = '100 Mbps' if $speed =~ /s100m/i;
|
||||
$speed = '1.0 Gbps' if $speed =~ /s1g/i;
|
||||
$speed = '45 Mbps' if $speed =~ /s45M/i;
|
||||
$speed = '155 Mbps' if $speed =~ /s155M/i;
|
||||
$i_speed{$iid} = $speed;
|
||||
}
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
# $foundry->model() - looks for xxnnnn in the description
|
||||
sub model {
|
||||
my $foundry = shift;
|
||||
my $id = $foundry->id();
|
||||
my $desc = $foundry->description();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
$model = $1 if $desc =~ /\s+([a-z]{2}\d{4})\D/i;
|
||||
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
# $foundry->interfaces() - Map the Interfaces to their physical names
|
||||
sub interfaces {
|
||||
my $foundry = shift;
|
||||
my $interfaces = $foundry->i_index();
|
||||
|
||||
my $descriptions = $foundry->i_description();
|
||||
|
||||
my %ifs = ();
|
||||
foreach my $iid (keys %$interfaces){
|
||||
$ifs{$iid} = $descriptions->{$iid};
|
||||
}
|
||||
|
||||
return \%ifs;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'foundry';
|
||||
}
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Foundry - Perl5 Interface to Foundry FastIron Network Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $foundry = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $foundry->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This subclass no longer supported.
|
||||
|
||||
This module provides limited functionality from older Foundry devices.
|
||||
|
||||
Specifically designed for a FI4802.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above. Turn off the AutoSpecify flag.
|
||||
|
||||
my $foundry = new SNMP::Info::Layer3::Foundry(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item FOUNDRY-SN-ROOT-MIB
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See classes listed above for their required MIBs.
|
||||
|
||||
=back
|
||||
|
||||
The Foundry MIBS can be downloaded from www.mibdepot.com and ??
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $foundry->model()
|
||||
|
||||
Returns model type. Checks $foundry->id() against the
|
||||
FOUNDRY-SN-ROOT-MIB and then parses out xxNNNN
|
||||
|
||||
=item $foundry->vendor()
|
||||
|
||||
Returns 'foundry' :)
|
||||
|
||||
=item $foundry->mac()
|
||||
|
||||
Returns MAC Address of root port.
|
||||
|
||||
(B<ifPhysAddress.1>)
|
||||
|
||||
=item $foundry->chassis()
|
||||
|
||||
Returns Chassis type.
|
||||
|
||||
(B<entPhysicalDescr.1>)
|
||||
|
||||
=item $foundry->serial()
|
||||
|
||||
Returns serial number of device.
|
||||
|
||||
(B<snChasSerNum>)
|
||||
|
||||
=item $foundry->temp()
|
||||
|
||||
Returns the chassis temperature
|
||||
|
||||
(B<snChasActualTemperature>)
|
||||
|
||||
=item $foundry->ps1_type()
|
||||
|
||||
Returns the Description for the power supply
|
||||
|
||||
(B<snChasPwrSupplyDescription.1>)
|
||||
|
||||
=item $foundry->ps1_status()
|
||||
|
||||
Returns the status of the power supply.
|
||||
|
||||
(B<snChasPwrSupplyOperStatus.1>)
|
||||
|
||||
=item $foundry->fan()
|
||||
|
||||
Returns the status of the chassis fan.
|
||||
|
||||
(B<snChasFanOperStatus.1>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge 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 $foundry->interfaces()
|
||||
|
||||
Returns reference to hash of interface names to iids.
|
||||
|
||||
Uses B<ifDescr>.
|
||||
|
||||
=item $foundry->i_name()
|
||||
|
||||
Returns reference to hash of interface names.
|
||||
Trys for B<ifAlias> and Defaults to B<ifName>
|
||||
|
||||
=item $foundry->i_ignore()
|
||||
|
||||
Returns reference to hash of interfaces to be ignored.
|
||||
|
||||
Ignores interfaces with descriptions of tunnel,loopback,null
|
||||
|
||||
=item $foundry->i_duplex()
|
||||
|
||||
Returns reference to hash of interface link duplex status.
|
||||
|
||||
Crosses $foundry->sw_duplex() with $foundry->sw_index()
|
||||
|
||||
=item $foundry->i_type()
|
||||
|
||||
Returns reference to hash of interface types.
|
||||
|
||||
Crosses $foundry->sw_type() with $foundry->sw_index()
|
||||
|
||||
=item $foundry->i_speed()
|
||||
|
||||
Returns reference to hash of interface speeds .
|
||||
|
||||
Crosses $foundry->sw_speeD() with $foundry->sw_index() and
|
||||
does a little munging.
|
||||
|
||||
=back
|
||||
|
||||
=head2 RFC1213 Arp Cache Table (B<ipNetToMediaTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $foundry->at_index()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to Interface IIDs
|
||||
|
||||
(B<ipNetToMediaIfIndex>)
|
||||
|
||||
=item $foundry->at_paddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to MAC addresses.
|
||||
|
||||
(B<ipNetToMediaPhysAddress>)
|
||||
|
||||
=item $foundry->at_netaddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to IPs
|
||||
|
||||
(B<ipNetToMediaNetAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Foundry Switch Port Information Table (B<snSwPortIfTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $foundry->sw_index()
|
||||
|
||||
Returns reference to hash. Maps Table to Interface IID.
|
||||
|
||||
(B<snSwPortIfIndex>)
|
||||
|
||||
=item $foundry->sw_duplex()
|
||||
|
||||
Returns reference to hash. Current duplex status for switch ports.
|
||||
|
||||
(B<snSwPortInfoChnMode>)
|
||||
|
||||
=item $foundry->sw_type()
|
||||
|
||||
Returns reference to hash. Current Port Type .
|
||||
|
||||
(B<snSwPortInfoMediaType>)
|
||||
|
||||
=item $foundry->sw_speed()
|
||||
|
||||
Returns reference to hash. Current Port Speed.
|
||||
|
||||
(B<snSwPortInfoSpeed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
|
||||
=cut
|
||||
274
Info/MAU.pm
274
Info/MAU.pm
@@ -1,274 +0,0 @@
|
||||
# SNMP::Info::MAU - Media Access Unit - RFC2668
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2002,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::MAU;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::MAU::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::MAU::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
|
||||
$INIT = 0;
|
||||
|
||||
%MIBS = ('MAU-MIB' => 'mauMod');
|
||||
|
||||
%GLOBALS = (
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
# Interface MAU Table
|
||||
'mau_index' => 'ifMauIfIndex',
|
||||
'mau_link' => 'ifMauType',
|
||||
'mau_status' => 'ifMauStatus',
|
||||
'mau_up' => 'ifMauMediaAvailable',
|
||||
'mau_type' => 'ifMauTypeList',
|
||||
'mau_type_admin' => 'ifMauDefaultType',
|
||||
# Interface Auto-Negotiation Table
|
||||
'mau_auto' => 'ifMauAutoNegSupported',
|
||||
'mau_autostat' => 'ifMauAutoNegAdminStatus',
|
||||
'mau_autosent' => 'ifMauAutoNegCapAdvertised',
|
||||
'mau_autorec' => 'ifMauAutoNegCapReceived',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
# Add ones for our class
|
||||
'mau_type' => \&munge_int2bin,
|
||||
'mau_autosent' => \&munge_int2bin,
|
||||
'mau_autorec' => \&munge_int2bin,
|
||||
);
|
||||
|
||||
|
||||
sub munge_int2bin {
|
||||
my $int = shift;
|
||||
return undef unless defined $int;
|
||||
return unpack("B32", pack("N", $int));
|
||||
}
|
||||
|
||||
sub _isfullduplex{
|
||||
my $mau = shift;
|
||||
my $mautype = shift;
|
||||
|
||||
my @full_types = qw/11 13 16 18 20/;
|
||||
foreach my $type ( @full_types ) {
|
||||
return 1 if (substr($mautype,32-$type,1) eq '1')
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub _ishalfduplex{
|
||||
my $mau = shift;
|
||||
my $mautype = shift;
|
||||
|
||||
my @half_types = qw/10 12 15 17 19/;
|
||||
foreach my $type ( @half_types ) {
|
||||
return 1 if (substr($mautype,32-$type,1) eq '1')
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::MAU - Perl5 Interface to Medium Access Unit (MAU) MIB (RFC2668) via SNMP
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $mau = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'hpswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $mau->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::MAU is a sublcass of SNMP::Info that supplies access to the
|
||||
MAU-MIB (RFC2668). This MIB is sometimes implemented on Layer 2 network devices like HP Switches.
|
||||
MAU = Media Access Unit.
|
||||
|
||||
The MAU table contains link and duplex info for the port itself and the device
|
||||
connected to that port.
|
||||
|
||||
Normally you use or create a subclass of SNMP::Info that inherits this one. Do not use directly.
|
||||
|
||||
For debugging purposes call the class directly as you would SNMP::Info
|
||||
|
||||
my $mau = new SNMP::Info::MAU(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item MAU-MIB
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item None
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 MAU INTERFACE TABLE ENTRIES
|
||||
|
||||
=over
|
||||
|
||||
=item $mau->mau_index() - Returns a list of interfaces
|
||||
and their index in the MAU IF Table.
|
||||
|
||||
(B<ifMauIfIndex>)
|
||||
|
||||
=item $mau->mau_link() - Returns the type of Media Access used.
|
||||
|
||||
This is essentially the type of link in use.
|
||||
eg. dot3MauType100BaseTXFD - 100BaseT at Full Duplex
|
||||
|
||||
(B<ifMauType>)
|
||||
|
||||
=item $mau->mau_status() - Returns the admin link condition as
|
||||
|
||||
1 - other
|
||||
2 - unknown
|
||||
3 - operational
|
||||
4 - standby
|
||||
5 - shutdown
|
||||
6 - reset
|
||||
|
||||
Use 5 and !5 to see if the link is up or down on the admin side.
|
||||
|
||||
(B<ifMauStatus>)
|
||||
|
||||
=item $mau->mau_up() - Returns the current link condition
|
||||
|
||||
(B<ifMauMediaAvailable>)
|
||||
|
||||
=item $mau->mau_type() - Returns a 32bit string reporting the capabilities
|
||||
of the port from a MAU POV.
|
||||
|
||||
Directly from the MAU-MIB :
|
||||
Bit Capability
|
||||
0 other or unknown
|
||||
1 AUI
|
||||
2 10BASE-5
|
||||
3 FOIRL
|
||||
4 10BASE-2
|
||||
5 10BASE-T duplex mode unknown
|
||||
6 10BASE-FP
|
||||
7 10BASE-FB
|
||||
8 10BASE-FL duplex mode unknown
|
||||
9 10BROAD36
|
||||
10 10BASE-T half duplex mode
|
||||
11 10BASE-T full duplex mode
|
||||
12 10BASE-FL half duplex mode
|
||||
13 10BASE-FL full duplex mode
|
||||
14 100BASE-T4
|
||||
15 100BASE-TX half duplex mode
|
||||
16 100BASE-TX full duplex mode
|
||||
17 100BASE-FX half duplex mode
|
||||
18 100BASE-FX full duplex mode
|
||||
19 100BASE-T2 half duplex mode
|
||||
20 100BASE-T2 full duplex mode
|
||||
|
||||
(B<ifMauTypeList>)
|
||||
|
||||
=item $mau->mau_auto() - Returns status of auto-negotiation mode for ports.
|
||||
|
||||
(B<ifMauAutoNegAdminStatus>)
|
||||
|
||||
=item $mau->mau_autosent() - Returns a 32 bit bit-string representing the
|
||||
capabilities we are broadcasting on that port
|
||||
|
||||
Uses the same decoder as $mau->mau_type().
|
||||
|
||||
(B<ifMauAutoNegCapAdvertised>)
|
||||
|
||||
|
||||
=item $mau->mau_autorec() - Returns a 32 bit bit-string representing the
|
||||
capabilities of the device on the other end.
|
||||
|
||||
Uses the same decoder as $mau->mau_type().
|
||||
|
||||
(B<ifMauAutoNegCapReceived>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 Utility Functions
|
||||
|
||||
=over
|
||||
|
||||
=item munge_int2bin() - Unpacks an integer into a 32bit bit string.
|
||||
|
||||
=item $mau->_isfullduplex(bitstring)
|
||||
|
||||
Boolean. Checks to see if any of the full_duplex types from mau_type() are
|
||||
high. Currently bits 11,13,16,18,20.
|
||||
|
||||
=item $mau->_ishalfduplex(bitstring)
|
||||
|
||||
Boolean. Checks to see if any of the half_duplex types from mau_type() are
|
||||
high. Currently bits 10,12,15,17,19.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
@@ -1,7 +1,12 @@
|
||||
All code from version 0.7 on
|
||||
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,
|
||||
@@ -9,17 +14,17 @@ modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of the University of California, Santa Cruz nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
* Neither the name of the University of California, Santa Cruz nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
327
MANIFEST
327
MANIFEST
@@ -1,26 +1,303 @@
|
||||
COPYRIGHT
|
||||
ChangeLog
|
||||
Info.pm
|
||||
Info/Bridge.pm
|
||||
Info/CDP.pm
|
||||
Info/CiscoStats.pm
|
||||
Info/Entity.pm
|
||||
Info/EtherLike.pm
|
||||
Info/Layer1.pm
|
||||
Info/Layer1/Allied.pm
|
||||
Info/Layer1/Asante.pm
|
||||
Info/Layer2.pm
|
||||
Info/Layer2/Bay.pm
|
||||
Info/Layer2/C1900.pm
|
||||
Info/Layer2/C2900.pm
|
||||
Info/Layer2/Catalyst.pm
|
||||
Info/Layer2/HP.pm
|
||||
Info/Layer3.pm
|
||||
Info/Layer3/Aironet.pm
|
||||
Info/Layer3/C3550.pm
|
||||
Info/Layer3/Foundry.pm
|
||||
Info/MAU.pm
|
||||
MANIFEST
|
||||
Makefile.PL
|
||||
.perltidyrc
|
||||
Build.PL
|
||||
Changes
|
||||
contrib/DEVELOP
|
||||
contrib/util/docmunge
|
||||
contrib/util/make_dev_matrix.pl
|
||||
contrib/util/make_snmpdata.pl
|
||||
contrib/util/push_ver
|
||||
contrib/util/run_test
|
||||
contrib/util/test_class.pl
|
||||
contrib/util/test_class_mocked.pl
|
||||
lib/SNMP/Info.pm
|
||||
lib/SNMP/Info/AdslLine.pm
|
||||
lib/SNMP/Info/Aggregate.pm
|
||||
lib/SNMP/Info/Airespace.pm
|
||||
lib/SNMP/Info/AMAP.pm
|
||||
lib/SNMP/Info/Bridge.pm
|
||||
lib/SNMP/Info/CDP.pm
|
||||
lib/SNMP/Info/CiscoAgg.pm
|
||||
lib/SNMP/Info/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/prereq.t
|
||||
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
|
||||
|
||||
73
MANIFEST.SKIP
Normal file
73
MANIFEST.SKIP
Normal file
@@ -0,0 +1,73 @@
|
||||
\.bak$
|
||||
\.pid$
|
||||
\.swp$
|
||||
|
||||
^SNMP-Info-
|
||||
|
||||
^MANIFEST\.
|
||||
|
||||
# Avoid version control files.
|
||||
\bRCS\b
|
||||
\bCVS\b
|
||||
\bSCCS\b
|
||||
,v$
|
||||
\B\.svn\b
|
||||
\B\.git\b
|
||||
\B\.gitignore\b
|
||||
\b_darcs\b
|
||||
\B\.cvsignore$
|
||||
|
||||
# Avoid VMS specific MakeMaker generated files
|
||||
\bDescrip.MMS$
|
||||
\bDESCRIP.MMS$
|
||||
\bdescrip.mms$
|
||||
|
||||
# Avoid Makemaker generated and utility files.
|
||||
\bMANIFEST\.bak
|
||||
\bMakefile$
|
||||
\bblib/
|
||||
\bMakeMaker-\d
|
||||
\bpm_to_blib\.ts$
|
||||
\bpm_to_blib$
|
||||
\bblibdirs\.ts$ # 6.18 through 6.25 generated this
|
||||
|
||||
# Avoid Module::Build generated and utility files.
|
||||
\bBuild$
|
||||
\b_build/
|
||||
\bBuild.bat$
|
||||
\bBuild.COM$
|
||||
\bBUILD.COM$
|
||||
\bbuild.com$
|
||||
|
||||
# Avoid temp and backup files.
|
||||
~$
|
||||
\.old$
|
||||
\#$
|
||||
\b\.#
|
||||
\.bak$
|
||||
\.tmp$
|
||||
\.#
|
||||
\.rej$
|
||||
|
||||
# Avoid OS-specific files/dirs
|
||||
# Mac OSX metadata
|
||||
\B\.DS_Store
|
||||
# Mac OSX SMB mount metadata files
|
||||
\B\._
|
||||
|
||||
# Avoid Devel::Cover and Devel::CoverX::Covered files.
|
||||
\bcover_db\b
|
||||
\bcovered\b
|
||||
|
||||
# Avoid MYMETA files
|
||||
^MYMETA\.
|
||||
|
||||
.github
|
||||
.travis
|
||||
README.md
|
||||
|
||||
# Avoid Komodo project file
|
||||
\.komodoproject$
|
||||
|
||||
# ignore intellij
|
||||
\B\.idea
|
||||
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'
|
||||
25
Makefile.PL
25
Makefile.PL
@@ -1,25 +0,0 @@
|
||||
# SNMP::Info - Makefile.PL
|
||||
# $Id$
|
||||
|
||||
use ExtUtils::MakeMaker;
|
||||
WriteMakefile(
|
||||
'NAME' => 'SNMP::Info',
|
||||
'VERSION_FROM' => 'Info.pm',
|
||||
'PREREQ_PM' => {
|
||||
'Math::BigInt' => 0
|
||||
# SNMP not available on CPAN .
|
||||
# Install with net-snmp.sourceforge.net
|
||||
# 'SNMP' => '4'
|
||||
},
|
||||
($] >= 5.005 ?
|
||||
(ABSTRACT_FROM => 'Info.pm',
|
||||
AUTHOR => 'Max Baker <max@warped.org>')
|
||||
: ()
|
||||
),
|
||||
'PMLIBDIRS' => ['Info','$(BASEEXT)'],
|
||||
);
|
||||
|
||||
sub MY::postamble { "
|
||||
.PHONY: readme
|
||||
readme:
|
||||
pod2text -l Info.pm > README" }
|
||||
33
contrib/DEVELOP
Normal file
33
contrib/DEVELOP
Normal file
@@ -0,0 +1,33 @@
|
||||
SNMP::Info Developer Guidelines
|
||||
|
||||
Coding Guidelines:
|
||||
- tab-width of 4, no tab characters
|
||||
- keep POD documentation up-to-date
|
||||
- always update ChangeLog before committing
|
||||
- check-in required mibs to netdisco-mibs and release new package if needed
|
||||
|
||||
Release and Testing Instructions:
|
||||
- for netdisco see:
|
||||
-> https://github.com/netdisco/netdisco/wiki/Developing
|
||||
-> https://metacpan.org/pod/App::Netdisco
|
||||
- for snmp::info see:
|
||||
-> https://github.com/netdisco/snmp-info/wiki/Release-Process
|
||||
-> https://metacpan.org/pod/SNMP::Info#EXTENDING-SNMP::INFO
|
||||
- for netdisco-mibs see:
|
||||
-> https://github.com/netdisco/netdisco-mibs/wiki
|
||||
|
||||
FAQ:
|
||||
- Do I have to update the version number and timestamp in modified files before committing?
|
||||
-> No. These are RCS tags that are automatically updated by CVS when you commit
|
||||
|
||||
- Should I add changes at the top of the ChangeLog?
|
||||
-> Yes. The changelog is created one commit at a time. If there isn't a
|
||||
section for the current version, then add one at the top and put your
|
||||
changes after. You can leave the date field for the release empty ().
|
||||
|
||||
- What should I change the $VERSION to?
|
||||
-> If you are the first person to get to a file after a release, update it
|
||||
to either release++ or "release++ dash cvs".
|
||||
Example: File is marked 2.01, change it to 2.02-cvs with your new changes.
|
||||
Example: File is marked 2.02-cvs, no change until packaging for release when the -cvs is removed.
|
||||
TODO: Is there still an odd/even scheme as introduced by Eric?
|
||||
35
contrib/util/docmunge
Executable file
35
contrib/util/docmunge
Executable file
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/perl -i.bak
|
||||
#
|
||||
# [Re-]write POD to create cross-links between Required MIBs, GLOBALS
|
||||
# and TABLE METHODS sections.
|
||||
# This is a horrible jumble of heuristics, but works with
|
||||
# all of the existing files. It has only one false positive: HP.pm's
|
||||
# mention of an SNMP::Info version number.
|
||||
#
|
||||
$section = undef;
|
||||
$waiting = 0;
|
||||
while (<>) {
|
||||
if (eof) {
|
||||
$section = undef;
|
||||
$waiting = 0;
|
||||
}
|
||||
if (/^=head(\d)/) {
|
||||
$sl = $1;
|
||||
if ($sl <= $level) {
|
||||
$section = undef;
|
||||
}
|
||||
if (/(TABLE METHODS|GLOBALS|Required MIBs)/) {
|
||||
$section = $1;
|
||||
$level = $sl;
|
||||
if ($section eq 'TABLE METHODS' || $section eq 'GLOBALS') {
|
||||
$waiting = 1;
|
||||
}
|
||||
}
|
||||
if ($waiting && /imported/i) {
|
||||
$waiting = 0;
|
||||
}
|
||||
} elsif (defined($section) && !$waiting && /^[^=]/ && /SNMP::Info/) {
|
||||
s,(?:L<)?(SNMP::Info[a-zA-Z0-9:]*)(?:/[^>]+)?(?:>)?,L<$1/"$section">,g;
|
||||
}
|
||||
print;
|
||||
}
|
||||
338
contrib/util/make_dev_matrix.pl
Executable file
338
contrib/util/make_dev_matrix.pl
Executable file
@@ -0,0 +1,338 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
# $Id$
|
||||
|
||||
$DevMatrix = '../DeviceMatrix.txt';
|
||||
$DevHTML = 'DeviceMatrix.html';
|
||||
$DevPNG = 'DeviceMatrix.png';
|
||||
$Attributes= {};
|
||||
|
||||
# Parse Data File
|
||||
$matrix = parse_data($DevMatrix);
|
||||
|
||||
# Graph it for fun
|
||||
eval "use GraphViz::Data::Structure;";
|
||||
if ($@) {
|
||||
print "GraphViz::Data::Structure not installed. $@\n";
|
||||
} else {
|
||||
my %graph = ();
|
||||
foreach my $vendor (sort sort_nocase keys %$matrix){
|
||||
$graph{$vendor} = {};
|
||||
foreach my $family (sort sort_nocase keys %{$matrix->{$vendor}->{families}} ){
|
||||
my @models;
|
||||
foreach my $mod (keys %{$matrix->{$vendor}->{families}->{$family}->{models}}){
|
||||
push(@models,split(/\s*,\s*/,$mod));
|
||||
}
|
||||
if (scalar @models){
|
||||
$graph{$vendor}->{$family}=\@models;
|
||||
} else {
|
||||
$graph{$vendor}->{$family}=[];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
my $now = scalar localtime;
|
||||
my $gvds = GraphViz::Data::Structure->new(\%graph,Orientation=>'vertical',
|
||||
Colors=> 'Deep',
|
||||
graph => {label=>"SNMP::Info and Netdisco Supported Devices \n $now",'fontpath'=>'/usr/local/netdisco','fontname'=>'lucon',concentrate=>'true','overlap'=>'false',spline=>'true',bgcolor=>'wheat'},
|
||||
node => {fontname=>'lucon'},
|
||||
);
|
||||
$gvds->graph()->as_png($DevPNG);
|
||||
}
|
||||
|
||||
print "Creating $DevHTML\n";
|
||||
open (HTML, "> $DevHTML") or die "Can't open $DevHTML. $!\n";
|
||||
$old_fh = select(HTML);
|
||||
&html_head;
|
||||
print_vendors($matrix);
|
||||
foreach my $vendor (sort sort_nocase keys %$matrix){
|
||||
print "<A NAME=\"$vendor\"><SPAN CLASS=\"vendor\"><B>$vendor</B></SPAN></A>\n";
|
||||
print "<DL>\n";
|
||||
|
||||
my $vendor_defaults = $matrix->{$vendor}->{defaults};
|
||||
print_notes($vendor_defaults,1);
|
||||
|
||||
my $families = $matrix->{$vendor}->{families};
|
||||
foreach my $family (sort sort_nocase keys %$families ) {
|
||||
print "<DT>$family Family\n";
|
||||
|
||||
my $family_defaults = $families->{$family}->{defaults};
|
||||
print_notes($family_defaults,2);
|
||||
|
||||
my $models = $families->{$family}->{models};
|
||||
foreach my $model (sort sort_nocase keys %$models ){
|
||||
my $model_defaults = $models->{$model}->{defaults};
|
||||
print "<DD>$model\n";
|
||||
print "<DL>\n";
|
||||
print_notes($model_defaults,3);
|
||||
|
||||
print "<DT><DD><TABLE BORDER=1>\n";
|
||||
print_headers();
|
||||
print "<TR>\n";
|
||||
foreach my $a (sort sort_nocase keys %$Attributes) {
|
||||
my $val;
|
||||
next if $a eq 'note';
|
||||
$val = ['-'];
|
||||
$class = 'none';
|
||||
if (defined $model_defaults->{$a}) {
|
||||
$val = $model_defaults->{$a};
|
||||
$class = 'model';
|
||||
} elsif (defined $family_defaults->{$a}){
|
||||
$val = $family_defaults->{$a};
|
||||
$class = 'family';
|
||||
} elsif (defined $vendor_defaults->{$a}){
|
||||
$val = $vendor_defaults->{$a};
|
||||
$class = 'vendor';
|
||||
}
|
||||
print " <TD CLASS='$class'>",join("<BR>\n",@$val),"</TD>\n";
|
||||
}
|
||||
print "</TR></TABLE>\n";
|
||||
print "</DL>\n";
|
||||
}
|
||||
}
|
||||
print "</DL>\n";
|
||||
}
|
||||
|
||||
|
||||
&html_tail;
|
||||
|
||||
select ($old_fh);
|
||||
close (HTML) or die "Can't write $DevHTML. $!\n";
|
||||
|
||||
# Data Structures
|
||||
|
||||
# Matrix =
|
||||
# ( vendor => { families => { family => family_hash },
|
||||
# defaults => { cmd => [values] },
|
||||
# }
|
||||
# )
|
||||
|
||||
# Family Hash
|
||||
# ( models => { model => model_hash },
|
||||
# defaults => { cmd => [values] }
|
||||
# )
|
||||
|
||||
# Model Hash
|
||||
# ( defaults => { cmd => [values] } )
|
||||
sub parse_data {
|
||||
my $file = shift;
|
||||
my %ignore = map { $_ => 1 } @_;
|
||||
my $Matrix;
|
||||
|
||||
my @Lines;
|
||||
open (DM, "< $file") or die "Can't open $file. $!\n";
|
||||
{
|
||||
@Lines = <DM>;
|
||||
}
|
||||
close (DM);
|
||||
|
||||
my ($device,$family,$vendor,$class);
|
||||
foreach my $line (@Lines){
|
||||
chomp($line);
|
||||
# Comments
|
||||
$line =~ s/#.*//;
|
||||
|
||||
# Blank Lines
|
||||
next if $line =~ /^\s*$/;
|
||||
|
||||
# Trim whitespace
|
||||
$line =~ s/^\s+//;
|
||||
$line =~ s/\s+$//;
|
||||
|
||||
my ($cmd,$value);
|
||||
if ($line =~ /^([a-z-_]+)\s*:\s*(.*)$/) {
|
||||
$cmd = $1; $value = $2;
|
||||
} else {
|
||||
print "What do i do with this line : $line \n";
|
||||
next;
|
||||
}
|
||||
|
||||
if (exists $ignore{$cmd}){
|
||||
print "Ignoring $cmd\n";
|
||||
}
|
||||
# Set Class {vendor,family,device}
|
||||
if ($cmd eq 'device-vendor'){
|
||||
$vendor = $value;
|
||||
$family = $model = undef;
|
||||
$Matrix->{$vendor} = {} unless defined $Matrix->{$vendor};
|
||||
$class = $Matrix->{$vendor};
|
||||
$class->{defaults}->{type}='vendor';
|
||||
next;
|
||||
}
|
||||
|
||||
if ($cmd eq 'device-family'){
|
||||
$family = $value;
|
||||
$model = undef;
|
||||
print "$family has no vendor.\n" unless defined $vendor;
|
||||
$Matrix->{$vendor}->{families}->{$family} = {}
|
||||
unless defined $Matrix->{$vendor}->{families}->{$family};
|
||||
$class = $Matrix->{$vendor}->{families}->{$family};
|
||||
$class->{defaults}->{type}='family';
|
||||
next;
|
||||
}
|
||||
|
||||
if ($cmd eq 'device') {
|
||||
$model = $value;
|
||||
print "$model has no family.\n" unless defined $family;
|
||||
print "$model has no vendor.\n" unless defined $vendor;
|
||||
$Matrix->{$vendor}->{families}->{$family}->{models}->{$model} = {}
|
||||
unless defined $Matrix->{$vendor}->{families}->{$family}->{models}->{$model};
|
||||
$class = $Matrix->{$vendor}->{families}->{$family}->{models}->{$model};
|
||||
$class->{defaults}->{type}='device';
|
||||
next;
|
||||
}
|
||||
|
||||
# Store attribute
|
||||
push (@{$class->{defaults}->{$cmd}} , $value);
|
||||
$Attributes->{$cmd}++;
|
||||
}
|
||||
|
||||
return $Matrix;
|
||||
}
|
||||
|
||||
sub sort_nocase {
|
||||
return lc($a) cmp lc($b);
|
||||
}
|
||||
|
||||
sub print_notes {
|
||||
my $defaults = shift;
|
||||
my $level = shift;
|
||||
my $notes = $defaults->{note} || [];
|
||||
foreach my $note (@$notes){
|
||||
if ($note =~ s/^!//){
|
||||
$note = '<SPAN CLASS="note">' . $note . '</SPAN>';
|
||||
}
|
||||
}
|
||||
if (scalar @$notes){
|
||||
print "<DT>\n";
|
||||
my $print_note = join("\n<LI>",@$notes);
|
||||
print "<UL TYPE='square'><LI>$print_note</UL>\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub print_vendors {
|
||||
my $matrix=shift;
|
||||
print "<h1>Device Vendors</h1>\n";
|
||||
foreach my $vendor (sort sort_nocase keys %$matrix){
|
||||
print "[<A HREF=\"#$vendor\">$vendor</A>]\n";
|
||||
}
|
||||
print "<HR>\n";
|
||||
}
|
||||
|
||||
sub html_head {
|
||||
print <<"end_head";
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>SNMP::Info - Device Compatibility Matrix</TITLE>
|
||||
<STYLE TYPE="text/css" MEDIA="screen">
|
||||
<!--
|
||||
BODY { font-family:arial,helvetica,sans-serif; font-size:12pt; }
|
||||
TD { font-family:arial,helvetica,sans-serif; font-size:10pt; }
|
||||
TH { font-family:arial,helvetica,sans-serif; font-size:10pt; background:#F0F0F0; }
|
||||
H1 { font-family:arial,helvetica,sans-serif; font-size:14pt; }
|
||||
.vendor { font-size:12pt; color:#777777; }
|
||||
.family { font-size:12pt; color:blue; }
|
||||
.model { font-size:12pt; color:red; }
|
||||
.note { color:red; }
|
||||
//-->
|
||||
</STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<h1>SNMP::Info - Device Compatibility Matrix</h1>
|
||||
<P>
|
||||
end_head
|
||||
}
|
||||
|
||||
sub html_tail {
|
||||
print <<'end_tail';
|
||||
<HR>
|
||||
<h1>Color Key</h1>
|
||||
[<SPAN CLASS="model">Model Attribute</SPAN>]
|
||||
[<SPAN CLASS="family">Family Attribute</SPAN>]
|
||||
[<SPAN CLASS="vendor">Vendor Attribute</SPAN>]
|
||||
<h1>Attribute Key</h1>
|
||||
A value of <B>-</B> signifies the information is not specified and can not
|
||||
be assumed working.
|
||||
<TABLE BORDER=1>
|
||||
<TR>
|
||||
<TD>Arpnip</TD>
|
||||
<TD>Ability to collect ARP tables for MAC to IP translation.</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Class</TD>
|
||||
<TD>SNMP::Info Class the the device currently uses. Devices using more generic
|
||||
interfaces like <tt>Layer2</tt> or <tt>Layer3</tt> may eventually get their
|
||||
own subclass.
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Duplex</TD>
|
||||
<TD>Ability to cull duplex settings from device.<BR>
|
||||
<UL>
|
||||
<LI><tt>no</tt> - Can't recover current or admin setting.
|
||||
<LI><tt>link</tt> - Can get current setting only.
|
||||
<LI><tt>both</tt> - Can get admin and link setting.
|
||||
<LI><tt>write</tt> - Can get admin and link setting and perform sets.
|
||||
</UL>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Macsuck</TD>
|
||||
<TD>Ability to get CAM tables for MAC to switch port mapping.<BR>
|
||||
<UL>
|
||||
<LI><TT>no</TT> - Have not found an SNMP method to get data yet.
|
||||
<LI><TT>yes</TT> - Can get through normal SWITCH-MIB method.
|
||||
<LI><TT>vlan</TT> - Have to re-connect to each VLAN and then fetch with normal
|
||||
method.
|
||||
</UL>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Modules</TD>
|
||||
<TD>Ability to gather hardware module information.</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Portmac</TD>
|
||||
<TD>Whether the device will list the MAC address of the switch port on each
|
||||
switch port when doing a Macsuck.
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Topo</TD>
|
||||
<TD>Ability to get Layer 2 Topology Information from device if the
|
||||
protocol is enabled. SNMP::Info supports querying Link Layer
|
||||
Discovery Protocol (LLDP), Cisco Discovery Protocol (CDP),
|
||||
SynOptics/Bay/Nortel/Avaya Network Management Protocol (SONMP),
|
||||
Foundry/Brocade Discovery Protocol (FDP), Extreme Discovery
|
||||
Protocol (EDP), and Alcatel Mapping Adjacency Protocol (AMAP).
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Ver</TD>
|
||||
<TD>SNMP Protocol Version the device has to use.</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Vlan</TD>
|
||||
<TD>Ability to get VLAN port assignments.<BR>
|
||||
<UL>
|
||||
<LI><TT>no</TT> - Have not found an SNMP method to get data yet.
|
||||
<LI><TT>yes</TT> - Can read information.
|
||||
<LI><TT>write</TT> - Can read and write (set).
|
||||
</UL>
|
||||
</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</BODY>
|
||||
</HTML>
|
||||
end_tail
|
||||
|
||||
}
|
||||
|
||||
sub print_headers {
|
||||
print "<TR>\n";
|
||||
foreach my $a (sort sort_nocase keys %$Attributes) {
|
||||
next if $a eq 'note';
|
||||
print " <TH>$a</TH>\n";
|
||||
}
|
||||
print "</TR>\n";
|
||||
}
|
||||
207
contrib/util/make_snmpdata.pl
Executable file
207
contrib/util/make_snmpdata.pl
Executable file
@@ -0,0 +1,207 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# make_snmpdata.pl
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Carp;
|
||||
use Getopt::Long;
|
||||
use Pod::Usage;
|
||||
use SNMP;
|
||||
|
||||
local $| = 1;
|
||||
|
||||
my $mibdirs = ['/usr/local/share/snmp/mibs'];
|
||||
my $comm = 'public';
|
||||
my $ver = '2c';
|
||||
my $dev;
|
||||
my $ignore = 0;
|
||||
my $help = 0;
|
||||
|
||||
GetOptions(
|
||||
'community=s' => \$comm,
|
||||
'device=s' => \$dev,
|
||||
'ignore' => \$ignore,
|
||||
'mibdir=s' => \$mibdirs,
|
||||
'version' => \$ver,
|
||||
'help|?' => sub { pod2usage(2); },
|
||||
) or pod2usage(2);
|
||||
|
||||
unless ( defined $dev && $ver =~ /[1|2c]/ ) {
|
||||
pod2usage(1);
|
||||
}
|
||||
|
||||
local $ENV{'SNMPCONFPATH'} = '' if $ignore;
|
||||
local $ENV{'MIBDIRS'} = "$mibdirs" if $ignore;
|
||||
|
||||
SNMP::addMibDirs($mibdirs);
|
||||
|
||||
# Connect to Device
|
||||
my $sess = SNMP::Session->new(
|
||||
'UseEnums' => 1,
|
||||
'RetryNoSuch' => 1,
|
||||
'DestHost' => $dev,
|
||||
'Community' => $comm,
|
||||
'Version' => $ver,
|
||||
'UseSprintValue' => 1
|
||||
);
|
||||
|
||||
my $sysdescr = $sess->get('sysDescr.0');
|
||||
unless ( defined $sysdescr ) {
|
||||
die "Couldn't connect to $dev via snmp.\n";
|
||||
}
|
||||
|
||||
SNMP::loadModules(@ARGV);
|
||||
|
||||
# Create a hash of MIB Modules for which we want results
|
||||
my %mib_hash = map {$_ => 1} @ARGV;
|
||||
# Add the common MIB Modules we always want
|
||||
my @common_mibs = ('SNMPv2-MIB', 'IF-MIB');
|
||||
foreach my $mib (@common_mibs) {
|
||||
$mib_hash{$mib} = 1;
|
||||
}
|
||||
|
||||
foreach my $key ( sort( keys %SNMP::MIB ) ) {
|
||||
my $module = $SNMP::MIB{$key}{moduleID} || '';
|
||||
# IMPORTS pulls in many modules we don't want to walk
|
||||
# Only walk those we've specified
|
||||
next unless (defined $mib_hash{$module});
|
||||
my $access = $SNMP::MIB{$key}{'access'} || '';
|
||||
next unless ( $access =~ /Read|Create/x );
|
||||
|
||||
my $label = SNMP::translateObj( $key, 0, 1 ) || '';
|
||||
snmpwalk($label);
|
||||
}
|
||||
|
||||
sub snmpwalk {
|
||||
return unless defined $sess;
|
||||
my $label = shift;
|
||||
my $var = SNMP::Varbind->new( [$label] );
|
||||
my $e = 0;
|
||||
my $last_iid = '';
|
||||
my %seen = ();
|
||||
while ( !$e ) {
|
||||
$sess->getnext($var);
|
||||
$e = $sess->{ErrorNum};
|
||||
|
||||
return if $var->[0] ne $label;
|
||||
my $iid = $var->[1];
|
||||
my $val = $var->[2];
|
||||
return unless defined $iid;
|
||||
|
||||
# Check to see if we've already seen this IID (looping)
|
||||
if ( defined $seen{$iid} and $seen{$iid} ) {
|
||||
warn "Looping on $label iid:$iid. Skipped.\n";
|
||||
return;
|
||||
}
|
||||
else { $seen{$iid}++; }
|
||||
|
||||
# why is it looping?
|
||||
return if $last_iid eq $iid;
|
||||
$last_iid = $iid;
|
||||
|
||||
my $line = "$label.$iid = $val";
|
||||
print "$line\n";
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
make_snmpdata.pl - Tool to get SNMP data for the SNMP::Info testing framework
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
make_snmpdata.pl [options] MIB-MODULE-1 MIB-MODULE-2
|
||||
|
||||
Options:
|
||||
|
||||
-community SNMP Community
|
||||
-device IP Address to query
|
||||
-ignore Ignore Net-SNMP configuration file
|
||||
-mibdir Directory containing MIB Files
|
||||
-version SNMP version to use
|
||||
-help Brief help message
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<-community>
|
||||
|
||||
SNMP Community, either 1 or 2c. Defaults to version 2c
|
||||
|
||||
-community 2c
|
||||
|
||||
=item B<-device>
|
||||
|
||||
IP Address to query for the SNMP data. No default and a mandatory option.
|
||||
|
||||
-device 127.0.0.1
|
||||
|
||||
=item B<-ignore >
|
||||
|
||||
Ignore Net-SNMP configuration file snmp.conf. If this used mibdirs must be
|
||||
provided
|
||||
|
||||
-ignore
|
||||
|
||||
=item B<-mibdir>
|
||||
|
||||
Directory containing MIB Files. Mutiple directories should be separated by a
|
||||
colon ':'. Defaults to /usr/local/share/snmp/mibs.
|
||||
|
||||
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
|
||||
|
||||
=item B<-version>
|
||||
|
||||
SNMP version to use. Only version 1 and 2c are supported. Defaults to 2c
|
||||
|
||||
-version 2c
|
||||
|
||||
=item B<-help>
|
||||
|
||||
Print help message and exits.
|
||||
|
||||
=back
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
B<make_snmpdata.pl> will gather SNMP data by walking specified MIB files and
|
||||
output the data to a file which can be used by the SNMP::Info testing
|
||||
framework.
|
||||
|
||||
=cut
|
||||
48
contrib/util/push_ver
Executable file
48
contrib/util/push_ver
Executable file
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/perl -w
|
||||
# $Id$
|
||||
|
||||
use File::Glob qw/bsd_glob/;
|
||||
|
||||
my @pms = glob_rec("./lib");
|
||||
|
||||
$new_version = shift @ARGV || die "missing new version\n";
|
||||
|
||||
foreach my $p (@pms) {
|
||||
print "$p\n";
|
||||
|
||||
rename($p,"$p.orig");
|
||||
open (O,"<$p.orig") or die;
|
||||
open (P,">$p") or die "Can't open $p for write. $!\n";
|
||||
|
||||
while (<O>) {
|
||||
s/^\s*\$VERSION\s+=\s*'[^']+'\s*;/\$VERSION = '$new_version';/;
|
||||
s/^SNMP::Info - Version [\d.]+$/SNMP::Info - Version $new_version/;
|
||||
print P;
|
||||
}
|
||||
|
||||
close O;
|
||||
close P or die "Can't write $p. $!\n";
|
||||
unlink("$p.orig");
|
||||
#last;
|
||||
}
|
||||
|
||||
sub glob_rec {
|
||||
my $dir = shift;
|
||||
|
||||
my @files = bsd_glob("$dir/*");
|
||||
|
||||
my @pms;
|
||||
|
||||
foreach my $f (@files) {
|
||||
next if $f eq '\.$';
|
||||
|
||||
if (-d $f) {
|
||||
push @pms, glob_rec($f);
|
||||
next;
|
||||
}
|
||||
|
||||
push @pms,$f if $f =~ /.pm$/;
|
||||
}
|
||||
|
||||
return @pms;
|
||||
}
|
||||
4
contrib/util/run_test
Executable file
4
contrib/util/run_test
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Run this from ../
|
||||
/usr/local/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/$1
|
||||
346
contrib/util/test_class.pl
Executable file
346
contrib/util/test_class.pl
Executable file
@@ -0,0 +1,346 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# test_class.pl
|
||||
#
|
||||
# Copyright (c) 2013 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Carp;
|
||||
use Getopt::Long;
|
||||
use Pod::Usage;
|
||||
use SNMP::Info;
|
||||
|
||||
my $EMPTY = q{};
|
||||
|
||||
# Default Values
|
||||
my $class = $EMPTY;
|
||||
my @dump = ();
|
||||
my $debug = 0;
|
||||
my $cache = 0;
|
||||
my $device = '';
|
||||
my $comm = '';
|
||||
my $ver = 2;
|
||||
my $ignore = 0;
|
||||
my $help = 0;
|
||||
my $nobulk = 0;
|
||||
my $mibdirs;
|
||||
my %dumped;
|
||||
|
||||
GetOptions(
|
||||
'c|class=s' => \$class,
|
||||
'd|dev=s' => \$device,
|
||||
's|comm=s' => \$comm,
|
||||
'v|ver=i' => \$ver,
|
||||
'i|ignore' => \$ignore,
|
||||
'p|print=s' => \@dump,
|
||||
'm|mibdir=s' => \$mibdirs,
|
||||
'n|nobulk' => \$nobulk,
|
||||
'x|debug+' => \$debug,
|
||||
'k|cache' => \$cache,
|
||||
'h|?|help' => sub { pod2usage(1); },
|
||||
);
|
||||
|
||||
unless ( $device and $comm ) {
|
||||
pod2usage(2);
|
||||
}
|
||||
|
||||
if ( $ignore && !defined $mibdirs ) {
|
||||
print "mibdirs must be provided if ignoring snmp.conf \n\n";
|
||||
pod2usage(1);
|
||||
}
|
||||
|
||||
local $ENV{'SNMPCONFPATH'} = $EMPTY if $ignore;
|
||||
local $ENV{'MIBDIRS'} = "$mibdirs" if $ignore;
|
||||
|
||||
if ( defined $mibdirs ) {
|
||||
SNMP::addMibDirs($mibdirs);
|
||||
}
|
||||
|
||||
$class = $class ? "SNMP::Info::$class" : 'SNMP::Info';
|
||||
|
||||
( my $mod = "$class.pm" )
|
||||
=~ s{::}{/}xg; # SNMP::Info::Layer3 => SNMP/Info/Layer3.pm
|
||||
if ( !eval { require $mod; 1; } ) {
|
||||
croak "Could not load $class. Error Message: $@\n";
|
||||
}
|
||||
|
||||
my $class_ver = $class->VERSION();
|
||||
|
||||
print
|
||||
"Class $class ($class_ver) loaded from SNMP::Info $SNMP::Info::VERSION.\n";
|
||||
|
||||
if ( scalar @dump ) { print 'Dumping : ', join( q{,}, @dump ), "\n" }
|
||||
|
||||
my %args = ();
|
||||
if ($nobulk) {
|
||||
$args{BulkWalk} = 0;
|
||||
}
|
||||
|
||||
my $dev = $class->new(
|
||||
'AutoSpecify' => 0,
|
||||
'AutoVerBack' => 0,
|
||||
'Debug' => $debug,
|
||||
'Version' => $ver,
|
||||
'DestHost' => $device,
|
||||
'Community' => $comm,
|
||||
%args
|
||||
) or die "\n";
|
||||
|
||||
print "Connected to $device.\n";
|
||||
print 'Detected Class: ', $dev->device_type(), "\n";
|
||||
print "Using Class: $class (-c to change)\n";
|
||||
|
||||
my $layers = $dev->layers();
|
||||
my $descr = $dev->description();
|
||||
|
||||
if ( !defined $layers || !defined $descr ) {
|
||||
die
|
||||
"Are you sure you got the right community string and version?\nCan't fetch layers or description.\n";
|
||||
}
|
||||
|
||||
print "\nFetching base info...\n\n";
|
||||
|
||||
my @base_fns = qw/vendor model os os_ver description contact location
|
||||
layers mac serial/;
|
||||
|
||||
foreach my $fn (@base_fns) {
|
||||
test_global( $dev, $fn );
|
||||
}
|
||||
|
||||
print "\nFetching interface info...\n\n";
|
||||
|
||||
my @fns = qw/interfaces i_type i_ignore i_description i_mtu i_speed i_mac i_up
|
||||
i_up_admin i_name i_duplex i_duplex_admin i_stp_state
|
||||
i_vlan i_pvid i_lastchange/;
|
||||
|
||||
foreach my $fn (@fns) {
|
||||
test_fn( $dev, $fn );
|
||||
}
|
||||
|
||||
print "\nFetching VLAN info...\n\n";
|
||||
|
||||
my @vlan = qw/v_index v_name/;
|
||||
|
||||
foreach my $fn (@vlan) {
|
||||
test_fn( $dev, $fn );
|
||||
}
|
||||
|
||||
print "\nFetching topology info...\n\n";
|
||||
|
||||
my @topo = qw/c_if c_ip c_port c_id c_platform/;
|
||||
|
||||
foreach my $fn (@topo) {
|
||||
test_fn( $dev, $fn );
|
||||
}
|
||||
|
||||
print "\nFetching module info...\n\n";
|
||||
|
||||
my @modules = qw/e_descr e_type e_parent e_name e_class e_pos e_hwver
|
||||
e_fwver e_swver e_model e_serial e_fru/;
|
||||
|
||||
foreach my $fn (@modules) {
|
||||
test_fn( $dev, $fn );
|
||||
}
|
||||
|
||||
foreach my $fn (@dump) {
|
||||
if ( !$dumped{$fn} ) { test_fn( $dev, $fn ) }
|
||||
}
|
||||
|
||||
if ($cache) {
|
||||
eval {
|
||||
require Data::Printer;
|
||||
} && eval {
|
||||
print "\nDumping cache...\n\n";
|
||||
Data::Printer::p $dev;
|
||||
};
|
||||
}
|
||||
|
||||
#--------------------------------
|
||||
|
||||
sub test_global {
|
||||
my $info = shift;
|
||||
my $method = shift;
|
||||
|
||||
my $value = $info->$method();
|
||||
|
||||
if ( !defined $value ) {
|
||||
printf "%-20s Does not exist.\n", $method;
|
||||
return 0;
|
||||
}
|
||||
$value =~ s/[[:cntrl:]]+/ /gx;
|
||||
if ( length $value > 60 ) {
|
||||
$value = substr $value, 0, 60;
|
||||
$value .= '...';
|
||||
}
|
||||
printf "%-20s %s \n", $method, $value;
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub test_fn {
|
||||
my $info = shift;
|
||||
my $method = shift;
|
||||
|
||||
my $results = $info->$method();
|
||||
|
||||
# If accidentally called on a global, pass it along nicely.
|
||||
if ( defined $results && !ref $results ) {
|
||||
return test_global( $dev, $method );
|
||||
}
|
||||
if ( !defined $results && !scalar keys %{$results} ) {
|
||||
printf "%-20s Empty Results.\n", $method;
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf "%-20s %d rows.\n", $method, scalar keys %{$results};
|
||||
if ( grep {/^$method$/x} @dump ) {
|
||||
$dumped{$method} = 1;
|
||||
foreach my $iid ( keys %{$results} ) {
|
||||
print " $iid : ";
|
||||
if ( ref( $results->{$iid} ) eq 'ARRAY' ) {
|
||||
print '[ ', join( ', ', @{ $results->{$iid} } ), ' ]';
|
||||
}
|
||||
else {
|
||||
print $results->{$iid};
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
test_class.pl - Test a device against an SNMP::Info class.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
test_class.pl [options]
|
||||
|
||||
Options:
|
||||
|
||||
-c|class SNMP::Info class to use, Layer2::Catalyst
|
||||
-d|dev Device
|
||||
-s|comm SNMP community
|
||||
-v|ver SNMP version
|
||||
-p|print Print values
|
||||
-i|ignore Ignore Net-SNMP configuration file
|
||||
-m|mibdir Directory containing MIB Files
|
||||
-n|nobulk Disable bulkwalk
|
||||
-x|debug Debugging flag
|
||||
-k|cache Dump cache (requires Data::Printer to be installed)
|
||||
-h|?|help Brief help message
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<-class>
|
||||
|
||||
Specific SNMP::Info class to use. Defaults to SNMP::Info if no specific
|
||||
class provided.
|
||||
|
||||
-class Layer2::Catalyst
|
||||
|
||||
=item B<-dev>
|
||||
|
||||
Device to test against. No default and a mandatory option.
|
||||
|
||||
-dev 1.2.3.4
|
||||
|
||||
=item B<-comm>
|
||||
|
||||
SNMP community string. No default and a mandatory option.
|
||||
|
||||
-comm public
|
||||
|
||||
=item B<-ver>
|
||||
|
||||
SNMP version. Default 2.
|
||||
|
||||
-ver 1
|
||||
|
||||
=item B<-print>
|
||||
|
||||
Print values of a class method rather than summarizing. May be repeated
|
||||
multiple times.
|
||||
|
||||
-print i_description -print i_type
|
||||
|
||||
=item B<-ignore >
|
||||
|
||||
Ignore Net-SNMP configuration file snmp.conf. If this used mibdirs must be
|
||||
provided.
|
||||
|
||||
-ignore
|
||||
|
||||
=item B<-mibdir>
|
||||
|
||||
Directory containing MIB Files. Multiple directories should be separated by a
|
||||
colon ':'.
|
||||
|
||||
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
|
||||
|
||||
=item B<-nobulk >
|
||||
|
||||
Disable SNMP bulkwalk. Default bulkwalk is on and utilized with version 2.
|
||||
|
||||
-nobulk
|
||||
|
||||
=item B<-debug>
|
||||
|
||||
Turns on SNMP::Info debug.
|
||||
|
||||
-debug
|
||||
|
||||
=item B<-cache>
|
||||
|
||||
Dumps the table and leaf cache at the end of running. Requires that the
|
||||
L<Data::Printer> module be installed, otherwise does nothing.
|
||||
|
||||
-cache
|
||||
|
||||
=item B<-help>
|
||||
|
||||
Print help message and exits.
|
||||
|
||||
=back
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
B<test_class.pl> will test a device against a specfied SNMP::Info class.
|
||||
This allows debugging and testing of live devices to include validating
|
||||
device support with existing classes.
|
||||
|
||||
=cut
|
||||
454
contrib/util/test_class_mocked.pl
Executable file
454
contrib/util/test_class_mocked.pl
Executable file
@@ -0,0 +1,454 @@
|
||||
#!/usr/bin/env perl
|
||||
#
|
||||
# test_class_mocked.pl
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Carp;
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin/../../lib";
|
||||
use File::Slurp qw(slurp);
|
||||
use Getopt::Long;
|
||||
use Pod::Usage;
|
||||
use SNMP::Info;
|
||||
use Test::MockObject::Extends;
|
||||
|
||||
my $EMPTY = q{};
|
||||
|
||||
# Default Values
|
||||
my $class = $EMPTY;
|
||||
my @dump = ();
|
||||
my $debug = 0;
|
||||
my $mibdirs;
|
||||
my $ignore = 0;
|
||||
my $help = 0;
|
||||
my $file;
|
||||
my %dumped;
|
||||
|
||||
GetOptions(
|
||||
'c|class=s' => \$class,
|
||||
'i|ignore' => \$ignore,
|
||||
'p|print=s' => \@dump,
|
||||
'x|debug+' => \$debug,
|
||||
'm|mibdir=s' => \$mibdirs,
|
||||
'file=s' => \$file,
|
||||
'h|?|help' => sub { pod2usage(1); },
|
||||
);
|
||||
|
||||
if ( !$file ) {
|
||||
pod2usage(1);
|
||||
}
|
||||
|
||||
if ( $ignore && !defined $mibdirs ) {
|
||||
print "mibdirs must be provided if ignoring snmp.conf \n\n";
|
||||
pod2usage(1);
|
||||
}
|
||||
|
||||
local $ENV{'SNMPCONFPATH'} = $EMPTY if $ignore;
|
||||
local $ENV{'MIBDIRS'} = "$mibdirs" if $ignore;
|
||||
|
||||
if ( defined $mibdirs ) {
|
||||
SNMP::addMibDirs($mibdirs);
|
||||
}
|
||||
|
||||
$class = $class ? "SNMP::Info::$class" : 'SNMP::Info';
|
||||
|
||||
( my $mod = "$class.pm" )
|
||||
=~ s{::}{/}g; # SNMP::Info::Layer3 => SNMP/Info/Layer3.pm
|
||||
if ( !eval { require $mod; 1; } ) {
|
||||
croak "Could not load $class. Error Message: $@\n";
|
||||
}
|
||||
|
||||
my $class_ver = $class->VERSION();
|
||||
|
||||
print
|
||||
"Class $class ($class_ver) loaded from SNMP::Info $SNMP::Info::VERSION.\n";
|
||||
|
||||
if ( scalar @dump ) { print 'Dumping : ', join( q{,}, @dump ), "\n" }
|
||||
|
||||
my $mocked = create_mock_session();
|
||||
|
||||
my $dev = $class->new(
|
||||
'AutoSpecify' => 0,
|
||||
'BulkWalk' => 0,
|
||||
'Debug' => $debug,
|
||||
'Session' => $mocked,
|
||||
) or die "\n";
|
||||
|
||||
print 'Detected Class: ', $dev->device_type(), "\n";
|
||||
print "Using Class: $class (-c to change)\n";
|
||||
|
||||
my $layers = $dev->layers();
|
||||
my $descr = $dev->description();
|
||||
|
||||
if ( !defined $layers || !defined $descr ) {
|
||||
die "Are you sure you specified a file created with make_snmpdata.pl ?\n";
|
||||
}
|
||||
|
||||
print "\nFetching base info...\n\n";
|
||||
|
||||
my @base_fns = qw/vendor model os os_ver description contact location
|
||||
layers mac serial/;
|
||||
|
||||
foreach my $fn (@base_fns) {
|
||||
test_global( $dev, $fn );
|
||||
}
|
||||
|
||||
print "\nFetching interface info...\n\n";
|
||||
|
||||
my @fns = qw/interfaces i_type i_ignore i_description i_mtu i_speed i_mac i_up
|
||||
i_up_admin i_name i_duplex i_duplex_admin i_stp_state
|
||||
i_vlan i_pvid i_lastchange/;
|
||||
|
||||
foreach my $fn (@fns) {
|
||||
test_fn( $dev, $fn );
|
||||
}
|
||||
|
||||
print "\nFetching VLAN info...\n\n";
|
||||
|
||||
my @vlan = qw/v_index v_name/;
|
||||
|
||||
foreach my $fn (@vlan) {
|
||||
test_fn( $dev, $fn );
|
||||
}
|
||||
|
||||
print "\nFetching topology info...\n\n";
|
||||
|
||||
my @topo = qw/c_if c_ip c_port c_id c_platform/;
|
||||
|
||||
foreach my $fn (@topo) {
|
||||
test_fn( $dev, $fn );
|
||||
}
|
||||
|
||||
print "\nFetching module info...\n\n";
|
||||
|
||||
my @modules = qw/e_descr e_type e_parent e_name e_class e_pos e_hwver
|
||||
e_fwver e_swver e_model e_serial e_fru/;
|
||||
|
||||
foreach my $fn (@modules) {
|
||||
test_fn( $dev, $fn );
|
||||
}
|
||||
|
||||
foreach my $fn (@dump) {
|
||||
if ( !$dumped{$fn} ) { test_fn( $dev, $fn ) }
|
||||
}
|
||||
|
||||
#--------------------------------
|
||||
|
||||
sub load_snmpdata {
|
||||
my $data_file = shift;
|
||||
|
||||
my @lines = slurp($data_file);
|
||||
|
||||
my $snmp_data = {};
|
||||
foreach my $line (@lines) {
|
||||
next if !$line;
|
||||
next if ( $line =~ /^#/ );
|
||||
if ( $line =~ /^(\S+::\w+)[.]?(\S+)*\s=\s(.*)$/ ) {
|
||||
my ( $leaf, $iid, $val ) = ( $1, $2, $3 );
|
||||
next if !$leaf;
|
||||
$iid ||= 0;
|
||||
$val =~ s/\"//g;
|
||||
$snmp_data->{$leaf}->{$iid} = $val;
|
||||
}
|
||||
}
|
||||
return $snmp_data;
|
||||
}
|
||||
|
||||
sub create_mock_session {
|
||||
|
||||
my $snmp_data = load_snmpdata($file);
|
||||
|
||||
my $session = SNMP::Session->new(
|
||||
UseEnums => 1,
|
||||
RetryNoSuch => 1,
|
||||
Data => $snmp_data,
|
||||
DestHost => '127.0.0.1',
|
||||
Community => 'public',
|
||||
Version => 2,
|
||||
);
|
||||
|
||||
my $mock_session = Test::MockObject::Extends->new($session);
|
||||
|
||||
mock_get($mock_session);
|
||||
mock_getnext($mock_session);
|
||||
|
||||
return $mock_session;
|
||||
}
|
||||
|
||||
sub mock_get {
|
||||
my $mock_session = shift;
|
||||
|
||||
$mock_session->mock(
|
||||
'get',
|
||||
sub {
|
||||
my $self = shift;
|
||||
my $vars = shift;
|
||||
my ( $leaf, $iid, $oid, $oid_name );
|
||||
my $c_data = $self->{Data};
|
||||
|
||||
# From SNMP::Info get will only be passed either an OID or
|
||||
# SNMP::Varbind with a fully qualified leaf and potentially
|
||||
# a partial
|
||||
if ( ref($vars) =~ /SNMP::Varbind/ ) {
|
||||
( $leaf, $iid ) = @{$vars};
|
||||
}
|
||||
else {
|
||||
$oid = $vars;
|
||||
$oid_name = SNMP::translateObj( $oid, 0, 1 ) || $EMPTY;
|
||||
( $leaf, $iid ) = $oid_name =~ /^(\S+::\w+)[.]?(\S+)*$/;
|
||||
}
|
||||
|
||||
$iid ||= 0;
|
||||
my $new_iid = $iid;
|
||||
my $val = $EMPTY;
|
||||
my $data = $c_data->{$leaf} || {};
|
||||
my $count = scalar keys %{$data} || 0;
|
||||
if ( $count > 1 ) {
|
||||
my $found = 0;
|
||||
foreach my $d_iid ( sort keys %{$data} ) {
|
||||
if ( $d_iid eq $iid ) {
|
||||
$val = $data->{$d_iid};
|
||||
$found = 1;
|
||||
next;
|
||||
}
|
||||
elsif ( $found == 1 ) {
|
||||
$new_iid = $d_iid;
|
||||
last;
|
||||
}
|
||||
}
|
||||
if ( $found && ( $new_iid eq $iid ) ) {
|
||||
$leaf = 'unknown';
|
||||
}
|
||||
}
|
||||
else {
|
||||
$val = $data->{$iid};
|
||||
$leaf = 'unknown';
|
||||
}
|
||||
|
||||
if ( ref $vars =~ /SNMP::Varbind/ ) {
|
||||
$vars->[0] = $leaf;
|
||||
$vars->[1] = $new_iid;
|
||||
$vars->[2] = $val;
|
||||
}
|
||||
return ( wantarray() ? $vars : $val );
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
sub mock_getnext {
|
||||
my $mock_session = shift;
|
||||
|
||||
$mock_session->mock(
|
||||
'getnext',
|
||||
sub {
|
||||
my $self = shift;
|
||||
my $vars = shift;
|
||||
my ( $leaf, $iid, $oid, $oid_name );
|
||||
my $c_data = $self->{Data};
|
||||
|
||||
# From SNMP::Info getnext will only be passed a SNMP::Varbind
|
||||
# with a fully qualified leaf and potentially a partial
|
||||
( $leaf, $iid ) = @{$vars};
|
||||
|
||||
unless (defined $iid) {
|
||||
$iid = -1;
|
||||
}
|
||||
my $new_iid = $iid;
|
||||
my $val = $EMPTY;
|
||||
my $data = $c_data->{$leaf};
|
||||
my $count = scalar keys %{$data} || 0;
|
||||
if ( $count ) {
|
||||
my $found = 0;
|
||||
foreach my $d_iid ( sort keys %{$data} ) {
|
||||
if ( $d_iid gt $iid && !$found ) {
|
||||
$val = $data->{$d_iid};
|
||||
$new_iid = $d_iid;
|
||||
$found = 1;
|
||||
next;
|
||||
}
|
||||
elsif ( $found == 1 ) {
|
||||
last;
|
||||
}
|
||||
}
|
||||
if ( $found && ( $new_iid eq $iid ) ) {
|
||||
$leaf = 'unknown';
|
||||
}
|
||||
}
|
||||
else {
|
||||
$val = $data->{$iid};
|
||||
$leaf = 'unknown';
|
||||
}
|
||||
|
||||
$vars->[0] = $leaf;
|
||||
$vars->[1] = $new_iid;
|
||||
$vars->[2] = $val;
|
||||
return ( wantarray() ? $vars : $val );
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
sub test_global {
|
||||
my $device = shift;
|
||||
my $method = shift;
|
||||
|
||||
my $value = $device->$method();
|
||||
|
||||
if ( !defined $value ) {
|
||||
printf "%-20s Does not exist.\n", $method;
|
||||
return 0;
|
||||
}
|
||||
$value =~ s/[[:cntrl:]]+/ /g;
|
||||
if ( length $value > 60 ) {
|
||||
$value = substr $value, 0, 60;
|
||||
$value .= '...';
|
||||
}
|
||||
printf "%-20s %s \n", $method, $value;
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub test_fn {
|
||||
my $device = shift;
|
||||
my $method = shift;
|
||||
|
||||
my $results = $device->$method();
|
||||
|
||||
# If accidentally called on a global, pass it along nicely.
|
||||
if ( defined $results && !ref $results ) {
|
||||
return test_global( $dev, $method );
|
||||
}
|
||||
if ( !defined $results && !scalar keys %{$results} ) {
|
||||
printf "%-20s Empty Results.\n", $method;
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf "%-20s %d rows.\n", $method, scalar keys %{$results};
|
||||
if ( grep {/^$method$/} @dump ) {
|
||||
$dumped{$method} = 1;
|
||||
foreach my $iid ( keys %{$results} ) {
|
||||
print " $iid : ";
|
||||
if ( ref( $results->{$iid} ) eq 'ARRAY' ) {
|
||||
print '[ ', join( ', ', @{ $results->{$iid} } ), ' ]';
|
||||
}
|
||||
else {
|
||||
print $results->{$iid};
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
test_class_mocked.pl - Test a device against an SNMP::Info class using
|
||||
output from make_snmpdata.pl stored in a text file.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
test_class_mocked.pl [options]
|
||||
|
||||
Options:
|
||||
|
||||
-class SNMP::Info class to use, Layer2::Catalyst
|
||||
-file File containing data gathered using make_snmpdata.pl
|
||||
-print Print values
|
||||
-debug Debugging flag
|
||||
-ignore Ignore Net-SNMP configuration file
|
||||
-mibdir Directory containing MIB Files
|
||||
-help Brief help message
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<-class>
|
||||
|
||||
Specific SNMP::Info class to use. Defaults to SNMP::Info if no specific
|
||||
class provided.
|
||||
|
||||
-class Layer2::Catalyst
|
||||
|
||||
=item B<-file>
|
||||
|
||||
File containing data gathered using make_snmpdata.pl. No default and a
|
||||
mandatory option.
|
||||
|
||||
-file /data/mydevice.txt
|
||||
|
||||
=item B<-print>
|
||||
|
||||
Print values of a class method rather than summarizing. May be repeated
|
||||
multiple times.
|
||||
|
||||
-print i_description -print i_type
|
||||
|
||||
=item B<-debug>
|
||||
|
||||
Turns on SNMP::Info debug.
|
||||
|
||||
-debug
|
||||
|
||||
=item B<-ignore >
|
||||
|
||||
Ignore Net-SNMP configuration file snmp.conf. If this used mibdirs must be
|
||||
provided.
|
||||
|
||||
-ignore
|
||||
|
||||
=item B<-mibdir>
|
||||
|
||||
Directory containing MIB Files. Multiple directories should be separated by a
|
||||
colon ':'.
|
||||
|
||||
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
|
||||
|
||||
=item B<-help>
|
||||
|
||||
Print help message and exits.
|
||||
|
||||
=back
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
B<test_class_mocked.pl> will test a device against an SNMP::Info class using
|
||||
snmpwalk output from the utility B<make_snmpdata.pl> stored in a text file.
|
||||
This allows debugging and testing without requiring network access to the
|
||||
device being tested.
|
||||
|
||||
=cut
|
||||
5254
lib/SNMP/Info.pm
Normal file
5254
lib/SNMP/Info.pm
Normal file
File diff suppressed because it is too large
Load Diff
342
lib/SNMP/Info/AMAP.pm
Normal file
342
lib/SNMP/Info/AMAP.pm
Normal file
@@ -0,0 +1,342 @@
|
||||
# SNMP::Info::AMAP
|
||||
#
|
||||
# Copyright (c) 2013 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::AMAP;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::AMAP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::AMAP::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
# ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB::aipAMAPRemHostname
|
||||
'amap_rem_sysname' => 'aipAMAPRemHostname',
|
||||
);
|
||||
|
||||
%MUNGE = ( 'amap_rem_sysname' => \&SNMP::Info::munge_null, );
|
||||
|
||||
sub hasAMAP {
|
||||
my $amap = shift;
|
||||
|
||||
my $amap_ip = $amap->aipAMAPIpAddr() || {};
|
||||
|
||||
return 1 if ( scalar( keys %$amap_ip ) );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
# Break up the aipAMAPhostsTable INDEX into MAC and IP address.
|
||||
sub _hosts_table_index {
|
||||
my $idx = shift;
|
||||
my @oids = split( /\./, $idx );
|
||||
my $mac = join( '.', splice( @oids, 0, 6 ) );
|
||||
|
||||
return ( $mac, join( '.', @oids ) );
|
||||
}
|
||||
|
||||
# Break up the aipAMAPportConnectionTable INDEX and return MAC
|
||||
sub _conn_table_mac {
|
||||
my $idx = shift;
|
||||
my @oids = split( /\./, $idx );
|
||||
my $local_idx = shift @oids;
|
||||
my $mac = join( '.', splice( @oids, 0, 6 ) );
|
||||
|
||||
return ($mac);
|
||||
}
|
||||
|
||||
# Since we need to get IP Addresses from the aipAMAPhostsTable which has
|
||||
# a different index (MAC, IP) than the aipAMAPportConnectionTable which holds
|
||||
# the remote device details we create a combined index and skip any
|
||||
# IPs which have an address of 0.0.0.0. Would like to include only one
|
||||
# address since they should all originate from the same device, but we don't
|
||||
# know if they would all be reachable from the network management application.
|
||||
#
|
||||
# We don't implement partials since this is private index function
|
||||
sub _amap_index {
|
||||
my $amap = shift;
|
||||
|
||||
my $amap_ip = $amap->aipAMAPIpAddr() || {};
|
||||
my $amap_rport = $amap->aipAMAPLocalPort() || {};
|
||||
|
||||
my %amap_index;
|
||||
foreach my $key ( keys %$amap_ip ) {
|
||||
my ( $mac, $ip ) = _hosts_table_index($key);
|
||||
|
||||
next if ( $ip eq '0.0.0.0' );
|
||||
next unless $ip;
|
||||
|
||||
foreach my $idx ( keys %$amap_rport ) {
|
||||
my $c_mac = _conn_table_mac($idx);
|
||||
|
||||
if ( $mac eq $c_mac ) {
|
||||
my $index = "$idx.$ip";
|
||||
$amap_index{$index} = $index;
|
||||
}
|
||||
}
|
||||
}
|
||||
return \%amap_index;
|
||||
}
|
||||
|
||||
# Break up _amap_index INDEX into local index, MAC, remote index, and
|
||||
# IP address
|
||||
sub _amap_index_parts {
|
||||
my $idx = shift;
|
||||
my @oids = split( /\./, $idx );
|
||||
my $local_idx = shift @oids;
|
||||
my $mac = join( '.', splice( @oids, 0, 6 ) );
|
||||
my $rem_idx = shift @oids;
|
||||
|
||||
return ( $local_idx, $mac, $rem_idx, join( '.', @oids ) );
|
||||
}
|
||||
|
||||
sub amap_if {
|
||||
my $amap = shift;
|
||||
|
||||
my $index = $amap->_amap_index() || {};
|
||||
my $if_idx = $amap->aipAMAPLocalIfindex() || {};
|
||||
|
||||
my %amap_if;
|
||||
foreach my $key ( keys %$index ) {
|
||||
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
|
||||
my $if_key = "$local_idx.$mac.$rem_idx";
|
||||
|
||||
if ( $key =~ /^$if_key/ ) {
|
||||
my $if = $if_idx->{$if_key};
|
||||
$amap_if{$key} = $if;
|
||||
}
|
||||
}
|
||||
|
||||
return \%amap_if;
|
||||
}
|
||||
|
||||
sub amap_ip {
|
||||
my $amap = shift;
|
||||
|
||||
my $index = $amap->_amap_index() || {};
|
||||
|
||||
my %amap_ip;
|
||||
foreach my $key ( keys %$index ) {
|
||||
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
|
||||
|
||||
# MIB says should only be IPv4
|
||||
next unless ( $ip =~ /\d+(\.\d+){3}/ );
|
||||
$amap_ip{$key} = $ip;
|
||||
}
|
||||
return \%amap_ip;
|
||||
}
|
||||
|
||||
sub amap_port {
|
||||
my $amap = shift;
|
||||
|
||||
my $index = $amap->_amap_index() || {};
|
||||
my $amap_rport = $amap->aipAMAPLocalPort() || {};
|
||||
my $amap_rslot = $amap->aipAMAPLocalSlot() || {};
|
||||
|
||||
my %amap_port;
|
||||
foreach my $key ( sort keys %$index ) {
|
||||
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
|
||||
my $p_key = "$local_idx.$mac.$rem_idx";
|
||||
|
||||
if ( $key =~ /^$p_key/ ) {
|
||||
my $port = $amap_rport->{$p_key};
|
||||
my $slot = $amap_rslot->{$p_key} || 0;
|
||||
next unless $port;
|
||||
$amap_port{$key} = defined $slot ? "$slot\/$port" : $port;
|
||||
}
|
||||
}
|
||||
return \%amap_port;
|
||||
}
|
||||
|
||||
sub amap_id {
|
||||
my $amap = shift;
|
||||
|
||||
my $index = $amap->_amap_index() || {};
|
||||
my $amap_name = $amap->amap_rem_sysname() || {};
|
||||
|
||||
my %amap_name;
|
||||
foreach my $key ( sort keys %$index ) {
|
||||
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
|
||||
my $id_key = "$local_idx.$mac.$rem_idx";
|
||||
|
||||
if ( $key =~ /^$id_key/ ) {
|
||||
my $name = $amap_name->{$id_key} || 0;
|
||||
next unless $name;
|
||||
$amap_name{$key} = $name;
|
||||
}
|
||||
}
|
||||
return \%amap_name;
|
||||
}
|
||||
|
||||
sub amap_platform {
|
||||
my $amap = shift;
|
||||
|
||||
my $index = $amap->_amap_index() || {};
|
||||
my $amap_topo_platform = $amap->aipAMAPRemDeviceType() || {};
|
||||
|
||||
my %amap_platform;
|
||||
foreach my $key ( keys %$index ) {
|
||||
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
|
||||
my $pf_key = "$local_idx.$mac.$rem_idx";
|
||||
|
||||
if ( $key =~ /^$pf_key/ ) {
|
||||
my $platform = $amap_topo_platform->{$pf_key};
|
||||
next unless $platform;
|
||||
$amap_platform{$key} = $platform;
|
||||
}
|
||||
}
|
||||
return \%amap_platform;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::AMAP - SNMP Interface to Alcatel Mapping Adjacency Protocol (AMAP)
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $amap = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $amap->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
$hasamap = $amap->hasAMAP() ? 'yes' : 'no';
|
||||
|
||||
# Print out a map of device ports with AMAP neighbors:
|
||||
my $interfaces = $amap->interfaces();
|
||||
my $amap_if = $amap->amap_if();
|
||||
my $amap_ip = $amap->amap_ip();
|
||||
my $amap_port = $amap->amap_port();
|
||||
|
||||
foreach my $amap_key (keys %$amap_ip){
|
||||
my $iid = $amap_if->{$amap_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $amap_ip->{$amap_key};
|
||||
my $neighbor_port = $amap_port->{$amap_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to Alcatel Mapping Adjacency Protocol (AMAP) information through
|
||||
SNMP.
|
||||
|
||||
AMAP is a Layer 2 protocol that allows a network device to advertise its
|
||||
identity and capabilities on the local network providing topology information.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $amap->hasAMAP()
|
||||
|
||||
Is AMAP is active in this device?
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $amap->amap_id()
|
||||
|
||||
Returns the string value used to identify the remote system.
|
||||
|
||||
=item $amap->amap_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
=item $amap->amap_ip()
|
||||
|
||||
Returns remote IPv4 addresses. Note: AMAP returns all IP addresses associated
|
||||
with the remote device. It would be preferable to include only one address
|
||||
since they should all originate from the same device, but amap_ip() can not
|
||||
determine if all addresses are reachable from the network management
|
||||
application therefore all addresses are returned and the calling application
|
||||
must determine which address to use and if they are in fact from the same
|
||||
device.
|
||||
|
||||
=item $amap->amap_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
=item $amap->amap_platform()
|
||||
|
||||
Returns remote platform ID
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
171
lib/SNMP/Info/AdslLine.pm
Normal file
171
lib/SNMP/Info/AdslLine.pm
Normal file
@@ -0,0 +1,171 @@
|
||||
# SNMP::Info::AdslLine
|
||||
#
|
||||
# Copyright (c) 2009 Alexander Hartmaier
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::AdslLine;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::AdslLine::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::AdslLine::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
# ADSL-LINE-MIB::adslAtucChanTable
|
||||
'adsl_atuc_interleave_delay' => 'adslAtucChanInterleaveDelay',
|
||||
'adsl_atuc_curr_tx_rate' => 'adslAtucChanCurrTxRate',
|
||||
'adsl_atuc_prev_tx_rate' => 'adslAtucChanPrevTxRate',
|
||||
'adsl_atuc_crc_block_len' => 'adslAtucChanCrcBlockLength',
|
||||
|
||||
# ADSL-LINE-MIB::adslAturChanTable
|
||||
'adsl_atur_interleave_delay' => 'adslAturChanInterleaveDelay',
|
||||
'adsl_atur_curr_tx_rate' => 'adslAturChanCurrTxRate',
|
||||
'adsl_atur_prev_tx_rate' => 'adslAturChanPrevTxRate',
|
||||
'adsl_atur_crc_block_len' => 'adslAturChanCrcBlockLength',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::AdslLine - SNMP Interface to the F<ADSL-LINE-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Alexander Hartmaier
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::AdslLine is a subclass of SNMP::Info that provides
|
||||
information about the adsl interfaces of a device.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ADSL-LINE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item none
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 ATUC channel table (C<adslAtucChanTable>)
|
||||
|
||||
This table provides one row for each ATUC channel.
|
||||
ADSL channel interfaces are those C<ifEntries> where C<ifType>
|
||||
is equal to adslInterleave(124) or adslFast(125).
|
||||
|
||||
=over
|
||||
|
||||
=item $info->adsl_atuc_interleave_delay()
|
||||
|
||||
(C<adslAtucChanInterleaveDelay>)
|
||||
|
||||
=item $info->adsl_atuc_curr_tx_rate()
|
||||
|
||||
(C<adslAtucChanCurrTxRate>)
|
||||
|
||||
=item $info->adsl_atuc_prev_tx_rate()
|
||||
|
||||
(C<adslAtucChanPrevTxRate>)
|
||||
|
||||
=item $info->adsl_atuc_crc_block_len()
|
||||
|
||||
(C<adslAtucChanCrcBlockLength>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 ATUR channel table (C<adslAturChanTable>)
|
||||
|
||||
This table provides one row for each ATUR channel.
|
||||
ADSL channel interfaces are those C<ifEntries> where C<ifType>
|
||||
is equal to adslInterleave(124) or adslFast(125).
|
||||
|
||||
=over
|
||||
|
||||
=item $info->adsl_atur_interleave_delay()
|
||||
|
||||
(C<adslAturChanInterleaveDelay>)
|
||||
|
||||
=item $info->adsl_atur_curr_tx_rate()
|
||||
|
||||
(C<adslAturChanCurrTxRate>)
|
||||
|
||||
=item $info->adsl_atur_prev_tx_rate()
|
||||
|
||||
(C<adslAturChanPrevTxRate>)
|
||||
|
||||
=item $info->adsl_atur_crc_block_len()
|
||||
|
||||
(C<adslAturChanCrcBlockLength>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
132
lib/SNMP/Info/Aggregate.pm
Normal file
132
lib/SNMP/Info/Aggregate.pm
Normal file
@@ -0,0 +1,132 @@
|
||||
# SNMP::Info::Aggregate
|
||||
#
|
||||
# Copyright (c) 2014 SNMP::Info Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Aggregate;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::Aggregate::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Aggregate::EXPORT_OK = qw/agg_ports_ifstack/;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
# Load MIB for leafs referenced within class
|
||||
%MIBS = ('IF-MIB' => 'ifIndex',);
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = ();
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub agg_ports_ifstack {
|
||||
my $dev = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ifStack = $dev->ifStackStatus();
|
||||
# TODO: if we want to do partial, we need to use inverse status
|
||||
my $ifType = $dev->ifType();
|
||||
|
||||
my $ret = {};
|
||||
|
||||
foreach my $idx ( keys %$ifStack ) {
|
||||
my ( $higher, $lower ) = split /\./, $idx;
|
||||
next if ( $higher == 0 or $lower == 0 );
|
||||
if ( $ifType->{ $higher } eq 'ieee8023adLag' or $ifType->{ $higher } eq 'propMultiplexor') {
|
||||
$ret->{ $lower } = $higher;
|
||||
}
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Aggregate - SNMP Interface to ifStackTable Aggregated Links
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
SNMP::Info Developers
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class provides access to Aggregated Links configuration on devices
|
||||
supporting C<ifStackTable>.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
L<SNMP::Info>
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<IF-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=over 4
|
||||
|
||||
=item C<agg_ports_ifstack>
|
||||
|
||||
Returns a HASH reference mapping from slave to master port for each member of
|
||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||
ifIndex of the corresponding master ports.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
1854
lib/SNMP/Info/Airespace.pm
Normal file
1854
lib/SNMP/Info/Airespace.pm
Normal file
File diff suppressed because it is too large
Load Diff
1067
lib/SNMP/Info/Bridge.pm
Normal file
1067
lib/SNMP/Info/Bridge.pm
Normal file
File diff suppressed because it is too large
Load Diff
535
lib/SNMP/Info/CDP.pm
Normal file
535
lib/SNMP/Info/CDP.pm
Normal file
@@ -0,0 +1,535 @@
|
||||
# SNMP::Info::CDP
|
||||
#
|
||||
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CDP;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CDP::EXPORT_OK = qw//;
|
||||
|
||||
our
|
||||
($VERSION, $DEBUG, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $INIT, %CDP_CAPABILITIES);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
# Five data structures required by SNMP::Info
|
||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
|
||||
|
||||
# Notice we dont inherit the default GLOBALS and FUNCS
|
||||
# only the default MUNGE.
|
||||
%GLOBALS = (
|
||||
'cdp_run' => 'cdpGlobalRun',
|
||||
'cdp_interval' => 'cdpGlobalMessageInterval',
|
||||
'cdp_holdtime' => 'cdpGlobalHoldTime',
|
||||
'cdp_gid' => 'cdpGlobalDeviceId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
'cdp_proto' => 'cdpCacheAddressType',
|
||||
'cdp_addr' => 'cdpCacheAddress',
|
||||
'cdp_ver' => 'cdpCacheVersion',
|
||||
'cdp_dev_id' => 'cdpCacheDeviceId',
|
||||
'cdp_dev_port' => 'cdpCacheDevicePort',
|
||||
'cdp_platform' => 'cdpCachePlatform',
|
||||
'cdp_capabilities' => 'cdpCacheCapabilities',
|
||||
'cdp_domain' => 'cdpCacheVTPMgmtDomain',
|
||||
'cdp_vlan' => 'cdpCacheNativeVLAN',
|
||||
'cdp_duplex' => 'cdpCacheDuplex',
|
||||
'cdp_power' => 'cdpCachePowerConsumption',
|
||||
'cdp_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
|
||||
'cdp_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
|
||||
'cdp_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
|
||||
'cdp_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'cdp_capabilities' => \&SNMP::Info::munge_bits,
|
||||
'cdp_platform' => \&SNMP::Info::munge_null,
|
||||
'cdp_domain' => \&SNMP::Info::munge_null,
|
||||
'cdp_ver' => \&SNMP::Info::munge_null,
|
||||
'cdp_ip' => \&SNMP::Info::munge_ip,
|
||||
'cdp_power' => \&munge_power,
|
||||
);
|
||||
|
||||
%CDP_CAPABILITIES = (
|
||||
'Router' => 0x001,
|
||||
'Trans-Bridge' => 0x002,
|
||||
'Source-Route-Bridge' => 0x004,
|
||||
'Switch' => 0x008,
|
||||
'Host' => 0x010,
|
||||
'IGMP' => 0x020,
|
||||
'Repeater' => 0x040,
|
||||
'VoIP-Phone' => 0x080,
|
||||
'Remotely-Managed-Device' => 0x100,
|
||||
'Supports-STP-Dispute' => 0x200,
|
||||
'Two-port Mac Relay' => 0x400,
|
||||
);
|
||||
|
||||
sub munge_power {
|
||||
my $power = shift;
|
||||
my $decimal = substr( $power, -3 );
|
||||
$power =~ s/$decimal$/\.$decimal/;
|
||||
return $power;
|
||||
}
|
||||
|
||||
sub hasCDP {
|
||||
my $cdp = shift;
|
||||
|
||||
# Check the global that is supposed to indicate CDP is running
|
||||
my $cdp_run = $cdp->cdp_run();
|
||||
return 1 if $cdp_run;
|
||||
|
||||
# SNMP v1 clients don't have the globals, fallback
|
||||
# by checking if it would report neighbors
|
||||
my $cdp_ip = $cdp->cdp_ip() || {};
|
||||
return 1 if scalar keys %$cdp_ip;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub cdp_if {
|
||||
my $cdp = shift;
|
||||
|
||||
my $cdp_ip = $cdp->cdp_ip();
|
||||
unless ( defined $cdp_ip ) {
|
||||
$cdp->error_throw(
|
||||
"SNMP::Info::CDP:cdp_if() - Device doesn't have cdp_ip() data. Can't fake cdp_index()"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
my %cdp_if;
|
||||
foreach my $key ( keys %$cdp_ip ) {
|
||||
next unless defined $key;
|
||||
my $iid = $key;
|
||||
|
||||
# Truncate .1 from cdp cache entry
|
||||
$iid =~ s/\.\d+$//;
|
||||
$cdp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%cdp_if;
|
||||
}
|
||||
|
||||
sub cdp_ip {
|
||||
my $cdp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $cdp_addr = $cdp->cdp_addr($partial) || {};
|
||||
my $cdp_proto = $cdp->cdp_proto($partial) || {};
|
||||
|
||||
my %cdp_ip;
|
||||
foreach my $key ( keys %$cdp_addr ) {
|
||||
my $addr = $cdp_addr->{$key};
|
||||
my $proto = $cdp_proto->{$key};
|
||||
next unless defined $addr;
|
||||
next if ( defined $proto and $proto ne 'ip' );
|
||||
|
||||
my $ip = join( '.', unpack( 'C4', $addr ) );
|
||||
$cdp_ip{$key} = $ip;
|
||||
}
|
||||
return \%cdp_ip;
|
||||
}
|
||||
|
||||
sub cdp_cap {
|
||||
my $cdp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Some devices return a hex-string, others return a space separated
|
||||
# string, we need the raw data to determine return value and
|
||||
# take appropriate action
|
||||
my $cdp_caps = $cdp->cdp_capabilities_raw($partial) || {};
|
||||
|
||||
my %cdp_cap;
|
||||
foreach my $key ( keys %$cdp_caps ) {
|
||||
my $cap_raw = $cdp_caps->{$key};
|
||||
next unless $cap_raw;
|
||||
|
||||
# Simple check, smallest single string is either Host or IGMP with a
|
||||
# space added on the end for a length of 5, hex string is normally
|
||||
# 4 bytes, but since only one byte was traditionally needed process
|
||||
# as hex for a length of 4 or less
|
||||
if ( length $cap_raw < 5 ) {
|
||||
my $cap_hex = join( '',
|
||||
map { sprintf "%x", $_ } unpack( 'C*', $cap_raw ) );
|
||||
foreach my $capability ( keys %CDP_CAPABILITIES ) {
|
||||
if ( ( hex $cap_hex ) & $CDP_CAPABILITIES{$capability} ) {
|
||||
push( @{ $cdp_cap{$key} }, $capability );
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
my @caps = split /\s/, $cap_raw;
|
||||
push( @{ $cdp_cap{$key} }, @caps );
|
||||
}
|
||||
}
|
||||
return \%cdp_cap;
|
||||
}
|
||||
|
||||
sub cdp_id {
|
||||
my $cdp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ch = $cdp->cdp_dev_id($partial) || {};
|
||||
|
||||
my %cdp_id;
|
||||
foreach my $key ( sort keys %$ch ) {
|
||||
my $id = $ch->{$key};
|
||||
next unless $id;
|
||||
$id = SNMP::Info::munge_mac($id) || SNMP::Info::munge_null($id);
|
||||
$cdp_id{$key} = $id;
|
||||
}
|
||||
return \%cdp_id;
|
||||
}
|
||||
|
||||
sub cdp_port {
|
||||
my $cdp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ch = $cdp->cdp_dev_port($partial) || {};
|
||||
|
||||
# most devices return a string with the interface name here (Port-ID TLV)
|
||||
# see https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/cdp/command/cdp-cr-book/cdp-cr-a1.html
|
||||
# it seems however that some devices report hex encoded mac addresses for this, see
|
||||
# https://github.com/netdisco/snmp-info/issues/252
|
||||
# once these bad devices get known we can figure out workarounds for them
|
||||
|
||||
my %cdp_port;
|
||||
foreach my $key ( sort keys %$ch ) {
|
||||
my $port = $ch->{$key};
|
||||
next unless $port;
|
||||
$port = SNMP::Info::munge_null($port);
|
||||
$cdp_port{$key} = $port;
|
||||
}
|
||||
return \%cdp_port;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CDP - SNMP Interface to Cisco Discovery Protocol (CDP) using SNMP
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $cdp = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $cdp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
$hascdp = $cdp->hasCDP() ? 'yes' : 'no';
|
||||
|
||||
# Print out a map of device ports with CDP neighbors:
|
||||
my $interfaces = $cdp->interfaces();
|
||||
my $cdp_if = $cdp->cdp_if();
|
||||
my $cdp_ip = $cdp->cdp_ip();
|
||||
my $cdp_port = $cdp->cdp_port();
|
||||
|
||||
foreach my $cdp_key (keys %$cdp_ip){
|
||||
my $iid = $cdp_if->{$cdp_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $cdp_ip->{$cdp_key};
|
||||
my $neighbor_port = $cdp_port->{$cdp_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to CDP information through SNMP.
|
||||
|
||||
CDP is a Layer 2 protocol that supplies topology information of devices that
|
||||
also speak CDP, mostly switches and routers. CDP is implemented by Cisco and
|
||||
several other vendors.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
Each device implements a subset of the global and cache entries.
|
||||
Check the return value to see if that data is held by the device.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-CDP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cdp->hasCDP()
|
||||
|
||||
Is CDP is active in this device?
|
||||
|
||||
Accounts for SNMP version 1 devices which may have CDP but not cdp_run()
|
||||
|
||||
=item $cdp->cdp_run()
|
||||
|
||||
Is CDP enabled on this device? Note that a lot of Cisco devices that
|
||||
implement CDP don't implement this value. @#%$!
|
||||
|
||||
(C<cdpGlobalRun>)
|
||||
|
||||
=item $cdp->cdp_interval()
|
||||
|
||||
Interval in seconds at which CDP messages are generated.
|
||||
|
||||
(C<cdpGlobalMessageInterval>)
|
||||
|
||||
=item $cdp->cdp_holdtime()
|
||||
|
||||
Time in seconds that CDP messages are kept.
|
||||
|
||||
(C<cdpGlobalHoldTime>)
|
||||
|
||||
=item $cdp->cdp_gid()
|
||||
|
||||
Returns CDP device ID.
|
||||
|
||||
This is the device id broadcast via CDP to other devices, and is what is
|
||||
retrieved from remote devices with $cdp->id().
|
||||
|
||||
(C<cdpGlobalDeviceId>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 CDP CACHE ENTRIES
|
||||
|
||||
=over
|
||||
|
||||
=item $cdp->cdp_capabilities()
|
||||
|
||||
Returns Device Functional Capabilities. Results are munged into an ascii
|
||||
binary string, MSB. Each digit represents a bit from the table below from
|
||||
the CDP Capabilities Mapping to Smartport Type table within the
|
||||
Cisco Small Business 200 Series Smart Switch Administration Guide,
|
||||
L<http://www.cisco.com/c/en/us/support/switches/small-business-200-series-smart-switches/products-maintenance-guides-list.html>:
|
||||
|
||||
(Bit) - Description
|
||||
|
||||
=over
|
||||
|
||||
=item (0x400) - Two-Port MAC Relay.
|
||||
|
||||
=item (0x200) - CAST Phone Port / CVTA / Supports-STP-Dispute depending
|
||||
upon platform.
|
||||
|
||||
=item (0x100) - Remotely-Managed Device.
|
||||
|
||||
=item (0x80) - VoIP Phone.
|
||||
|
||||
=item (0x40) - Provides level 1 functionality.
|
||||
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
|
||||
non router ports.
|
||||
|
||||
=item (0x10) - Sends and receives packets for at least one network layer
|
||||
protocol. If the device is routing the protocol, this bit should not be set.
|
||||
|
||||
=item (0x08) - Performs level 2 switching. The difference between this bit
|
||||
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
|
||||
device is assumed to be deployed in a physical loop-free topology.
|
||||
|
||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
|
||||
would set both this bit and bit 0x02.
|
||||
|
||||
=item (0x02) - Performs level 2 transparent bridging.
|
||||
|
||||
=item (0x01) - Performs level 3 routing for at least one network layer
|
||||
protocol.
|
||||
|
||||
=back
|
||||
|
||||
Thanks to Martin Lorensen for a pointer to the original information and
|
||||
CPAN user Alex for updates.
|
||||
|
||||
(C<cdpCacheCapabilities>)
|
||||
|
||||
=item $cdp->cdp_domain()
|
||||
|
||||
Returns remote VTP Management Domain as defined in
|
||||
C<CISCO-VTP-MIB::managementDomainName>
|
||||
|
||||
(C<cdpCacheVTPMgmtDomain>)
|
||||
|
||||
=item $cdp->cdp_duplex()
|
||||
|
||||
Returns the port duplex status from remote devices.
|
||||
|
||||
(C<cdpCacheDuplex>)
|
||||
|
||||
=item $cdp->cdp_id()
|
||||
|
||||
Returns remote device id string
|
||||
|
||||
(C<cdpCacheDeviceId>)
|
||||
|
||||
=item $cdp->cdp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
Note that a lot devices don't implement $cdp->cdp_index(), So if it isn't
|
||||
around, we fake it.
|
||||
|
||||
In order to map the cdp table entry back to the interfaces() entry, we
|
||||
truncate the last number off of it :
|
||||
|
||||
# it exists, yay.
|
||||
my $cdp_index = $device->cdp_index();
|
||||
return $cdp_index if defined $cdp_index;
|
||||
|
||||
# if not, let's fake it
|
||||
my $cdp_ip = $device->cdp_ip();
|
||||
|
||||
my %cdp_if
|
||||
foreach my $key (keys %$cdp_ip){
|
||||
$iid = $key;
|
||||
## Truncate off .1 from cdp response
|
||||
$iid =~ s/\.\d+$//;
|
||||
$cdp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%cdp_if;
|
||||
|
||||
|
||||
=item $cdp->cdp_index()
|
||||
|
||||
Returns the mapping to the SNMP2 Interface table for CDP Cache Entries.
|
||||
|
||||
Most devices don't implement this, so you probably want to use $cdp->cdp_if()
|
||||
instead.
|
||||
|
||||
See cdp_if() entry.
|
||||
|
||||
(C<cdpCacheIfIndex>)
|
||||
|
||||
=item $cdp->cdp_ip()
|
||||
|
||||
If $cdp->cdp_proto() is supported, returns remote IPV4 address only. Otherwise
|
||||
it will return all addresses.
|
||||
|
||||
(C<cdpCacheAddress>)
|
||||
|
||||
=item $cdp->cdp_addr()
|
||||
|
||||
Returns remote address
|
||||
|
||||
(C<cdpCacheAddress>)
|
||||
|
||||
=item $cdp->cdp_platform()
|
||||
|
||||
Returns remote platform id
|
||||
|
||||
(C<cdpCachePlatform>)
|
||||
|
||||
=item $cdp->cdp_port()
|
||||
|
||||
Returns remote Port-ID. Most of the time this is a string with the port name, but this
|
||||
is not guaranteed to be so.
|
||||
|
||||
(C<cdpCacheDevicePort>)
|
||||
|
||||
=item $cdp->cdp_proto()
|
||||
|
||||
Returns remote address type received. Usually IP.
|
||||
|
||||
(C<cdpCacheAddressType>)
|
||||
|
||||
=item $cdp->cdp_ver()
|
||||
|
||||
Returns remote hardware version
|
||||
|
||||
(C<cdpCacheVersion>)
|
||||
|
||||
=item $cdp->cdp_vlan()
|
||||
|
||||
Returns the remote interface native VLAN.
|
||||
|
||||
(C<cdpCacheNativeVLAN>)
|
||||
|
||||
=item $cdp->cdp_power()
|
||||
|
||||
Returns the amount of power consumed by remote device in milliwatts munged
|
||||
for decimal placement.
|
||||
|
||||
(C<cdpCachePowerConsumption>)
|
||||
|
||||
=item $cdp->cdp_cap()
|
||||
|
||||
Returns hash of arrays with each array containing the system capabilities
|
||||
supported by the remote system. Possible elements in the array are
|
||||
C<Router>, C<Trans-Bridge>, C<Source-Route-Bridge>, C<Switch>, C<Host>,
|
||||
C<IGMP>, C<Repeater>, C<VoIP-Phone>, C<Remotely-Managed-Device>,
|
||||
C<Supports-STP-Dispute>, and C<Two-port Mac Relay>.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $cdp->munge_power()
|
||||
|
||||
Inserts a decimal at the proper location.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
252
lib/SNMP/Info/CiscoAgg.pm
Normal file
252
lib/SNMP/Info/CiscoAgg.pm
Normal file
@@ -0,0 +1,252 @@
|
||||
# SNMP::Info::CiscoAgg
|
||||
#
|
||||
# Copyright (c) 2019 SNMP::Info Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoAgg;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::IEEE802dot3ad;
|
||||
|
||||
@SNMP::Info::CiscoAgg::ISA = qw/
|
||||
SNMP::Info::IEEE802dot3ad
|
||||
Exporter
|
||||
/;
|
||||
|
||||
@SNMP::Info::CiscoAgg::EXPORT_OK = qw/
|
||||
agg_ports
|
||||
agg_ports_cisco
|
||||
agg_ports_lag
|
||||
agg_ports_pagp
|
||||
/;
|
||||
|
||||
our ($DEBUG, $VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::IEEE802dot3ad::MIBS,
|
||||
'CISCO-PAGP-MIB' => 'pagpGroupIfIndex',
|
||||
'CISCO-LAG-MIB' => 'clagAggPortListPorts',
|
||||
'CISCO-IF-EXTENSION-MIB' => 'cieIfLastInTime',
|
||||
);
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::IEEE802dot3ad::FUNCS,
|
||||
'lag_ports' => 'clagAggPortListPorts',
|
||||
'lag_members' => 'clagAggPortListInterfaceIndexList',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::IEEE802dot3ad::MUNGE,
|
||||
'lag_ports' => \&SNMP::Info::munge_port_list,
|
||||
'lag_members' => \&munge_port_ifindex,
|
||||
);
|
||||
|
||||
sub munge_port_ifindex {
|
||||
my $plist = shift;
|
||||
return unless defined $plist;
|
||||
return unless length $plist;
|
||||
|
||||
my $list = [ map {sprintf "%d", hex($_)} unpack( "(A8)*", join( '' , map { sprintf "%02x", $_} unpack( "(C4)*", $plist ) )) ];
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
sub agg_ports_cisco {
|
||||
my $dev = shift;
|
||||
my $group = $dev->lag_members;
|
||||
|
||||
my $mapping = {};
|
||||
for my $master (keys %$group) {
|
||||
my $slaves = $group->{$master};
|
||||
for my $slave (@$slaves) {
|
||||
$mapping->{$slave} = $master;
|
||||
}
|
||||
}
|
||||
|
||||
return $mapping;
|
||||
}
|
||||
|
||||
sub agg_ports_pagp {
|
||||
my $dev = shift;
|
||||
|
||||
# Note that this mapping will miss any interfaces that are down during
|
||||
# polling. If one of the members is up, we could use
|
||||
# pagpAdminGroupCapability to figure things out, but if they're all
|
||||
# down, we're hosed. Since we could be hosed anyway, we skip the fancy
|
||||
# stuff.
|
||||
my $mapping = {};
|
||||
my $group = $dev->pagpGroupIfIndex;
|
||||
for my $slave (keys %$group) {
|
||||
my $master = $group->{$slave};
|
||||
next if($master == 0 || $slave == $master);
|
||||
|
||||
$mapping->{$slave} = $master;
|
||||
}
|
||||
|
||||
return $mapping;
|
||||
}
|
||||
|
||||
sub agg_ports_lag {
|
||||
my $dev = shift;
|
||||
|
||||
# same note as for agg_ports_pagp, it will miss mappings if interfaces
|
||||
# are down or lacp is not synced.
|
||||
|
||||
my $mapping = {};
|
||||
my $group = $dev->dot3adAggPortSelectedAggID;
|
||||
for my $slave (keys %$group) {
|
||||
my $master = $group->{$slave};
|
||||
next if($master == 0 || $slave == $master);
|
||||
|
||||
$mapping->{$slave} = $master;
|
||||
}
|
||||
|
||||
return $mapping;
|
||||
}
|
||||
|
||||
|
||||
# combine PAgP, LAG & Cisco proprietary data
|
||||
sub agg_ports {
|
||||
my $ret = {%{agg_ports_pagp(@_)}, %{agg_ports_lag(@_)}, %{agg_ports_cisco(@_)}};
|
||||
return $ret;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoAgg - SNMP Interface to Cisco Aggregated Links
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
SNMP::Info Developers
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class provides access to Aggregated Links configuration on Cisco devices.
|
||||
It combines Cisco PAgP, Cisco proprietary info and IEEE 802.3ad information.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
L<SNMP::Info::IEEE802dot3ad>
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-PAGP-MIB>
|
||||
|
||||
=item F<CISCO-LAG-MIB>
|
||||
|
||||
=item F<CISCO-IF-EXTENSION-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=over 4
|
||||
|
||||
=item C<agg_ports>
|
||||
|
||||
Returns a HASH reference mapping from slave to master port for each member of
|
||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||
ifIndex of the corresponding master ports.
|
||||
|
||||
=item C<agg_ports_cisco>
|
||||
|
||||
Implements the cisco LAG info retrieval. Merged into C<agg_ports> data
|
||||
automatically. Will fetch all members of C<clagAggPortListInterfaceIndexList>
|
||||
even if they are not running an aggregation protocol.
|
||||
|
||||
=item C<agg_ports_pagp>
|
||||
|
||||
Implements the PAgP LAG info retrieval. Merged into C<agg_ports> data
|
||||
automatically.
|
||||
|
||||
=item C<lag_members>
|
||||
|
||||
Mimics C<ad_lag_ports> from L<SNMP::Info::IEEE802dot3ad> but based on ifindex
|
||||
instead of instead of bp_index.
|
||||
|
||||
=back
|
||||
|
||||
=head2 OVERRIDES
|
||||
|
||||
=over
|
||||
|
||||
=item C<agg_ports_lag>
|
||||
|
||||
This will retrieve LAG ports based on C<dot3adAggPortSelectedAggID> data.
|
||||
It will be merged into C<agg_ports> data.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot3ad
|
||||
|
||||
=over
|
||||
|
||||
See documentation in L<SNMP::Info::IEEE802dot3ad> for details.
|
||||
|
||||
=back
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item C<munge_port_ifindex>
|
||||
|
||||
Takes C<clagAggPortListInterfaceIndexList>, uses the index as master port, then
|
||||
returns all members as ifindex. Works with single or multiple slaves to a master.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
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
|
||||
473
lib/SNMP/Info/CiscoConfig.pm
Normal file
473
lib/SNMP/Info/CiscoConfig.pm
Normal file
@@ -0,0 +1,473 @@
|
||||
# SNMP::Info::CiscoConfig
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoConfig;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoConfig::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoConfig::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
|
||||
'CISCO-FLASH-MIB' => 'ciscoFlashCopyTable',
|
||||
'OLD-CISCO-SYS-MIB' => 'writeMem',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
# OLD-CISCO-SYS-MIB
|
||||
'old_write_mem' => 'writeMem',
|
||||
'old_write_net' => 'writeNet',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-COPY-CONFIG-MIB::ccCopyTable
|
||||
'config_protocol' => 'ccCopyProtocol',
|
||||
'config_source_type' => 'ccCopySourceFileType',
|
||||
'config_dest_type' => 'ccCopyDestFileType',
|
||||
'config_server_addr' => 'ccCopyServerAddress',
|
||||
'config_filename' => 'ccCopyFileName',
|
||||
'config_username' => 'ccCopyUserName',
|
||||
'config_password' => 'ccCopyUserPassword',
|
||||
'config_notify_complete' => 'ccCopyNotificationOnCompletion',
|
||||
'config_copy_state' => 'ccCopyState',
|
||||
'config_copy_start_time' => 'ccCopyTimeStarted',
|
||||
'config_copy_complete_time' => 'ccCopyTimeCompleted',
|
||||
'config_fail_cause' => 'ccCopyFailCause',
|
||||
'config_row_status' => 'ccCopyEntryRowStatus',
|
||||
|
||||
# CISCO-FLASH-MIB::ciscoFlashCopyTable
|
||||
'flash_copy_cmd' => 'ciscoFlashCopyCommand',
|
||||
'flash_copy_protocol' => 'ciscoFlashCopyProtocol',
|
||||
'flash_copy_address' => 'ciscoFlashCopyServerAddress',
|
||||
'flash_copy_source' => 'ciscoFlashCopySourceName',
|
||||
'flash_copy_dest' => 'ciscoFlashCopyDestinationName',
|
||||
'flash_copy_row_status' => 'ciscoFlashCopyEntryStatus',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub copy_run_tftp {
|
||||
my $ciscoconfig = shift;
|
||||
my ( $tftphost, $tftpfile ) = @_;
|
||||
|
||||
srand( time() ^ ( $$ + ( $$ << 15 ) ) );
|
||||
my $rand = int( rand( 1 << 24 ) );
|
||||
|
||||
print "Saving running config to $tftphost as $tftpfile\n"
|
||||
if $ciscoconfig->debug();
|
||||
|
||||
#Try new method first fall back to old method
|
||||
if ( $ciscoconfig->set_config_protocol( 1, $rand ) ) {
|
||||
print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
|
||||
|
||||
#Check each set, delete created row if any fail
|
||||
unless ( $ciscoconfig->set_config_row_status( 5, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Initializing config copy instruction failed");
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Setting source type failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Setting source type failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_dest_type( 1, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Setting destination type failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Setting dest type failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_server_addr( $tftphost, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Setting tftp server failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Setting tftp server failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_filename( $tftpfile, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Setting file name failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Setting file name failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_row_status( 1, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Initiating transfer failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Initiating transfer failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
my $status = 0;
|
||||
my $timer = 0;
|
||||
|
||||
# Hard-coded timeout of approximately 5 minutes, we can wrap this in an
|
||||
# option later if needed
|
||||
my $timeout = 300;
|
||||
while ( $status !~ /successful|failed/ ) {
|
||||
my $t = $ciscoconfig->config_copy_state($rand);
|
||||
$status = $t->{$rand};
|
||||
last if $status =~ /successful|failed/;
|
||||
$timer += 1;
|
||||
if ( $timer >= $timeout ) {
|
||||
$status = 'failed';
|
||||
last;
|
||||
}
|
||||
sleep 1;
|
||||
}
|
||||
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
print "Failed deleting row, iid $rand\n" if $ciscoconfig->debug();
|
||||
}
|
||||
|
||||
if ( $status eq 'successful' ) {
|
||||
print "Save operation successful\n" if $ciscoconfig->debug();
|
||||
return 1;
|
||||
}
|
||||
if ( $status eq 'failed' ) {
|
||||
$ciscoconfig->error_throw("Save operation failed");
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
print "Using old method\n" if $ciscoconfig->debug();
|
||||
unless ( $ciscoconfig->set_old_write_net( $tftpfile, $tftphost ) ) {
|
||||
$ciscoconfig->error_throw("Save operation failed");
|
||||
return;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub copy_run_start {
|
||||
my $ciscoconfig = shift;
|
||||
|
||||
srand( time() ^ ( $$ + ( $$ << 15 ) ) );
|
||||
my $rand = int( rand( 1 << 24 ) );
|
||||
|
||||
print "Saving running config to memory\n" if $ciscoconfig->debug();
|
||||
|
||||
if ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
|
||||
print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
|
||||
|
||||
#Check each set, delete created row if any fail
|
||||
unless ( $ciscoconfig->set_config_dest_type( 3, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Setting dest type failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Setting dest type failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_row_status( 1, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Initiating save failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Initiating save failed and failed to delete row $rand");
|
||||
}
|
||||
return;
|
||||
}
|
||||
my $status = 0;
|
||||
my $timer = 0;
|
||||
|
||||
# Hard-coded timeout of approximately 5 minutes, we can wrap this in an
|
||||
# option later if needed
|
||||
my $timeout = 300;
|
||||
while ( $status !~ /successful|failed/ ) {
|
||||
my $t = $ciscoconfig->config_copy_state($rand);
|
||||
$status = $t->{$rand};
|
||||
last if $status =~ /successful|failed/;
|
||||
$timer += 1;
|
||||
if ( $timer >= $timeout ) {
|
||||
$status = 'failed';
|
||||
last;
|
||||
}
|
||||
sleep 1;
|
||||
}
|
||||
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
print "Failed deleting row, iid $rand\n" if $ciscoconfig->debug();
|
||||
}
|
||||
|
||||
if ( $status eq 'successful' ) {
|
||||
print "Save operation successful\n" if $ciscoconfig->debug();
|
||||
return 1;
|
||||
}
|
||||
if ( $status eq 'failed' ) {
|
||||
$ciscoconfig->error_throw("Save operation failed");
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
print "Using old method\n" if $ciscoconfig->debug();
|
||||
unless ( $ciscoconfig->set_old_write_mem(1) ) {
|
||||
$ciscoconfig->error_throw("Save operation failed");
|
||||
return;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoConfig - SNMP Interface to Cisco Configuration Files
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Justin Hunter, Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $ciscoconfig = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ciscoconfig->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoConfig is a subclass of SNMP::Info that provides an interface
|
||||
to F<CISCO-CONFIG-COPY-MIB>, F<CISCO-FLASH-MIB>, and F<OLD-CISCO-SYS-MIB>.
|
||||
These MIBs facilitate the writing of configuration files.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one.
|
||||
Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
None.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-CONFIG-COPY-MIB>
|
||||
|
||||
=item F<CISCO-FLASH-MIB>
|
||||
|
||||
=item F<OLD-CISCO-SYS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscoconfig->old_write_mem()
|
||||
|
||||
(C<writeMem>)
|
||||
|
||||
=item $ciscoconfig->old_write_net()
|
||||
|
||||
(C<writeNet>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Config Copy Request Table (C<ccCopyTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscoconfig->config_protocol()
|
||||
|
||||
(C<ccCopyProtocol>)
|
||||
|
||||
=item $ciscoconfig->config_source_type()
|
||||
|
||||
(C<ccCopySourceFileType>)
|
||||
|
||||
=item $ciscoconfig->config_dest_type()
|
||||
|
||||
(C<ccCopyDestFileType>)
|
||||
|
||||
=item $ciscoconfig->config_server_addr()
|
||||
|
||||
(C<ccCopyServerAddress>)
|
||||
|
||||
=item $ciscoconfig->config_filename()
|
||||
|
||||
(C<ccCopyFileName>)
|
||||
|
||||
=item $ciscoconfig->config_username()
|
||||
|
||||
(C<ccCopyUserName>)
|
||||
|
||||
=item $ciscoconfig->config_password()
|
||||
|
||||
(C<ccCopyUserPassword>)
|
||||
|
||||
=item $ciscoconfig->config_notify_complete()
|
||||
|
||||
(C<ccCopyNotificationOnCompletion>)
|
||||
|
||||
=item $ciscoconfig->config_copy_state()
|
||||
|
||||
(C<ccCopyState>)
|
||||
|
||||
=item $ciscoconfig->config_copy_start_time()
|
||||
|
||||
(C<ccCopyTimeStarted>)
|
||||
|
||||
=item $ciscoconfig->config_copy_complete_time()
|
||||
|
||||
(C<ccCopyTimeCompleted>)
|
||||
|
||||
=item $ciscoconfig->config_fail_cause()
|
||||
|
||||
(C<ccCopyFailCause>)
|
||||
|
||||
=item $ciscoconfig->config_row_status()
|
||||
|
||||
(C<ccCopyEntryRowStatus>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Flash Copy Table (C<ciscoFlashCopyTable>)
|
||||
|
||||
Table of Flash copy operation entries.
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscoconfig->flash_copy_cmd()
|
||||
|
||||
(C<ciscoFlashCopyCommand>)
|
||||
|
||||
=item $ciscoconfig->flash_copy_protocol()
|
||||
|
||||
(C<ciscoFlashCopyProtocol>)
|
||||
|
||||
=item $ciscoconfig->flash_copy_address()
|
||||
|
||||
(C<ciscoFlashCopyServerAddress>)
|
||||
|
||||
=item $ciscoconfig->flash_copy_source()
|
||||
|
||||
(C<ciscoFlashCopySourceName>)
|
||||
|
||||
=item $ciscoconfig->flash_copy_dest()
|
||||
|
||||
(C<ciscoFlashCopyDestinationName>)
|
||||
|
||||
=item $ciscoconfig->flash_copy_row_status()
|
||||
|
||||
(C<ciscoFlashCopyEntryStatus>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscoconfig->copy_run_tftp (tftpserver, tftpfilename )
|
||||
|
||||
Store the running configuration on a TFTP server. Equivalent to the CLI
|
||||
commands "copy running-config tftp" or "write net".
|
||||
|
||||
This method attempts to use newer "copy running-config tftp" procedure first
|
||||
and then the older "write net" procedure if that fails. The newer procedure
|
||||
is supported Cisco devices with the F<CISCO-CONFIG-COPY-MIB> available, Cisco
|
||||
IOS software release 12.0 or on some devices as early as release 11.2P. The
|
||||
older procedure has been depreciated by Cisco and is utilized only to support
|
||||
devices running older code revisions.
|
||||
|
||||
Example:
|
||||
$ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig')
|
||||
or die "Couldn't save config. ",$ciscoconfig->error(1);
|
||||
|
||||
=item $ciscoconfig->copy_run_start()
|
||||
|
||||
Copy the running configuration to the start up configuration. Equivalent to
|
||||
the CLI command C<"copy running-config startup-config"> or C<"write mem">.
|
||||
|
||||
This method attempts to use newer C<"copy running-config startup-config">
|
||||
procedure first and then the older C<"write mem"> procedure if that fails.
|
||||
The newer procedure is supported Cisco devices with the
|
||||
F<CISCO-CONFIG-COPY-MIB> available, Cisco IOS software release 12.0 or on
|
||||
some devices as early as release 11.2P. The older procedure has been
|
||||
depreciated by Cisco and is utilized only to support devices running older
|
||||
code revisions.
|
||||
|
||||
Example:
|
||||
$ciscoconfig->copy_run_start()
|
||||
or die "Couldn't save config. ",$ciscoconfig->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
411
lib/SNMP/Info/CiscoPortSecurity.pm
Normal file
411
lib/SNMP/Info/CiscoPortSecurity.pm
Normal file
@@ -0,0 +1,411 @@
|
||||
# SNMP::Info::CiscoPortSecurity
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoPortSecurity;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoPortSecurity::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoPortSecurity::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PAECAPABILITIES);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',
|
||||
'CISCO-PAE-MIB' => 'ciscoPaeMIB',
|
||||
'IEEE8021-PAE-MIB' => 'dot1xAuthLastEapolFrameSource',
|
||||
'CISCO-ERR-DISABLE-MIB' => 'ciscoErrDisableMIB',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
# CISCO-PORT-SECURITY-MIB
|
||||
'cps_clear' => 'cpsGlobalClearSecureMacAddresses',
|
||||
'cps_notify' => 'cpsGlobalSNMPNotifControl',
|
||||
'cps_rate' => 'cpsGlobalSNMPNotifRate',
|
||||
'cps_enable' => 'cpsGlobalPortSecurityEnable',
|
||||
'cps_mac_count' => 'cpsGlobalTotalSecureAddress',
|
||||
'cps_mac_max' => 'cpsGlobalMaxSecureAddress',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-PORT-SECURITY-MIB::cpsIfConfigTable
|
||||
'cps_i_limit_val' => 'cpsIfInvalidSrcRateLimitValue',
|
||||
'cps_i_limit' => 'cpsIfInvalidSrcRateLimitEnable',
|
||||
'cps_i_sticky' => 'cpsIfStickyEnable',
|
||||
'cps_i_clear_type' => 'cpsIfClearSecureMacAddresses',
|
||||
'cps_i_shutdown' => 'cpsIfShutdownTimeout',
|
||||
'cps_i_flood' => 'cpsIfUnicastFloodingEnable',
|
||||
'cps_i_clear' => 'cpsIfClearSecureAddresses',
|
||||
'cps_i_mac' => 'cpsIfSecureLastMacAddress',
|
||||
'cps_i_count' => 'cpsIfViolationCount',
|
||||
'cps_i_action' => 'cpsIfViolationAction',
|
||||
'cps_i_mac_static' => 'cpsIfStaticMacAddrAgingEnable',
|
||||
'cps_i_mac_type' => 'cpsIfSecureMacAddrAgingType',
|
||||
'cps_i_mac_age' => 'cpsIfSecureMacAddrAgingTime',
|
||||
'cps_i_mac_count' => 'cpsIfCurrentSecureMacAddrCount',
|
||||
'cps_i_mac_max' => 'cpsIfMaxSecureMacAddr',
|
||||
'cps_i_status' => 'cpsIfPortSecurityStatus',
|
||||
'cps_i_enable' => 'cpsIfPortSecurityEnable',
|
||||
|
||||
# CISCO-PORT-SECURITY-MIB::cpsIfVlanTable
|
||||
'cps_i_v_mac_count' => 'cpsIfVlanCurSecureMacAddrCount',
|
||||
'cps_i_v_mac_max' => 'cpsIfVlanMaxSecureMacAddr',
|
||||
|
||||
# CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable
|
||||
'cps_i_v_mac_status' => 'cpsIfVlanSecureMacAddrRowStatus',
|
||||
'cps_i_v_mac_age' => 'cpsIfVlanSecureMacAddrRemainAge',
|
||||
'cps_i_v_mac_type' => 'cpsIfVlanSecureMacAddrType',
|
||||
|
||||
# CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable
|
||||
'cps_m_status' => 'cpsSecureMacAddrRowStatus',
|
||||
'cps_m_age' => 'cpsSecureMacAddrRemainingAge',
|
||||
'cps_m_type' => 'cpsSecureMacAddrType',
|
||||
|
||||
# IEEE8021-PAE-MIB::dot1xPaePortEntry
|
||||
'pae_i_capabilities' => 'dot1xPaePortCapabilities',
|
||||
'pae_i_last_eapol_frame_source' => 'dot1xAuthLastEapolFrameSource',
|
||||
|
||||
# CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusEntry
|
||||
'cerr_i_cause' => 'cErrDisableIfStatusCause',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'cps_i_mac' => \&SNMP::Info::munge_mac,
|
||||
'pae_i_last_eapol_frame_source' => \&SNMP::Info::munge_mac,
|
||||
'pae_i_capabilities' => \&munge_pae_capabilities,
|
||||
);
|
||||
|
||||
%PAECAPABILITIES = (
|
||||
0 => 'dot1xPaePortAuthCapable',
|
||||
1 => 'dot1xPaePortSuppCapable',
|
||||
);
|
||||
|
||||
sub munge_pae_capabilities {
|
||||
my $bits = shift;
|
||||
|
||||
return unless defined $bits;
|
||||
my @vals
|
||||
= map( $PAECAPABILITIES{$_}, sprintf( "%x", unpack( 'b*', $bits ) ) );
|
||||
return join( ' ', @vals );
|
||||
}
|
||||
|
||||
# Define a generic method to show the cause for a port to be err-disabled.
|
||||
# Cisco indexes cErrDisableIfStatusCause by {ifindex,vlan}, but for a more
|
||||
# generic method, using ifIndex only makes it easier to implement across
|
||||
# device classes. Besides, several (most?) err-disable features will disable
|
||||
# the whole interface anyway, and not just a vlan on the interface.
|
||||
sub i_err_disable_cause {
|
||||
my $cps = shift;
|
||||
my $ret;
|
||||
my $causes = $cps->cerr_i_cause() || {};
|
||||
foreach my $interfacevlan (keys %$causes) {
|
||||
my ($iid, $vid) = split(/\./, $interfacevlan);
|
||||
$ret->{$iid} = $causes->{$interfacevlan};
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoPortSecurity - SNMP Interface to data from
|
||||
F<CISCO-PORT-SECURITY-MIB>, F<CISCO-PAE-MIB> and F<CISCO-ERR-DISABLE-MIB>.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $cps = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $cps->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoPortSecurity is a subclass of SNMP::Info that provides
|
||||
an interface to the F<CISCO-PORT-SECURITY-MIB>, F<CISCO-PAE-MIB> and
|
||||
F<CISCO-ERR-DISABLE-MIB>. These MIBs are used across the Catalyst
|
||||
family under CatOS and IOS.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-PORT-SECURITY-MIB>
|
||||
|
||||
=item F<CISCO-PAE-MIB>
|
||||
|
||||
=item F<IEEE8021-PAE-MIB>
|
||||
|
||||
=item F<CISCO-ERR-DISABLE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=head2 F<CISCO-PORT-SECURITY-MIB> globals
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cps_clear()
|
||||
|
||||
(C<cpsGlobalClearSecureMacAddresses>)
|
||||
|
||||
=item $cps->cps_notify()
|
||||
|
||||
(C<cpsGlobalSNMPNotifControl>)
|
||||
|
||||
=item $cps->cps_rate()
|
||||
|
||||
(C<cpsGlobalSNMPNotifRate>)
|
||||
|
||||
=item $cps->cps_enable()
|
||||
|
||||
(C<cpsGlobalPortSecurityEnable>)
|
||||
|
||||
=item $cps->cps_mac_count()
|
||||
|
||||
(C<cpsGlobalTotalSecureAddress>)
|
||||
|
||||
=item $cps->cps_mac_max()
|
||||
|
||||
(C<cpsGlobalMaxSecureAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 C<CISCO-PORT-SECURITY-MIB> - Interface Config Table
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cps_i_limit_val()
|
||||
|
||||
(C<cpsIfInvalidSrcRateLimitValue>)
|
||||
|
||||
=item $cps->cps_i_limit()
|
||||
|
||||
(C<cpsIfInvalidSrcRateLimitEnable>)
|
||||
|
||||
=item $cps->cps_i_sticky()
|
||||
|
||||
(C<cpsIfStickyEnable>)
|
||||
|
||||
=item $cps->cps_i_clear_type()
|
||||
|
||||
(C<cpsIfClearSecureMacAddresses>)
|
||||
|
||||
=item $cps->cps_i_shutdown()
|
||||
|
||||
(C<cpsIfShutdownTimeout>)
|
||||
|
||||
=item $cps->cps_i_flood()
|
||||
|
||||
(C<cpsIfUnicastFloodingEnable>)
|
||||
|
||||
=item $cps->cps_i_clear()
|
||||
|
||||
(C<cpsIfClearSecureAddresses>)
|
||||
|
||||
=item $cps->cps_i_mac()
|
||||
|
||||
(C<cpsIfSecureLastMacAddress>)
|
||||
|
||||
=item $cps->cps_i_count()
|
||||
|
||||
(C<cpsIfViolationCount>)
|
||||
|
||||
=item $cps->cps_i_action()
|
||||
|
||||
(C<cpsIfViolationAction>)
|
||||
|
||||
=item $cps->cps_i_mac_static()
|
||||
|
||||
(C<cpsIfStaticMacAddrAgingEnable>)
|
||||
|
||||
=item $cps->cps_i_mac_type()
|
||||
|
||||
(C<cpsIfSecureMacAddrAgingType>)
|
||||
|
||||
=item $cps->cps_i_mac_age()
|
||||
|
||||
(C<cpsIfSecureMacAddrAgingTime>)
|
||||
|
||||
=item $cps->cps_i_mac_count()
|
||||
|
||||
(C<cpsIfCurrentSecureMacAddrCount>)
|
||||
|
||||
=item $cps->cps_i_mac_max()
|
||||
|
||||
(C<cpsIfMaxSecureMacAddr>)
|
||||
|
||||
=item $cps->cps_i_status()
|
||||
|
||||
(C<cpsIfPortSecurityStatus>)
|
||||
|
||||
=item $cps->cps_i_enable()
|
||||
|
||||
(C<cpsIfPortSecurityEnable>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanTable>
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cps_i_v_mac_count()
|
||||
|
||||
(C<cpsIfVlanCurSecureMacAddrCount>)
|
||||
|
||||
=item $cps->cps_i_v_mac_max()
|
||||
|
||||
(C<cpsIfVlanMaxSecureMacAddr>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable>
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cps_i_v_mac_status()
|
||||
|
||||
(C<cpsIfVlanSecureMacAddrRowStatus>)
|
||||
|
||||
=item $cps->cps_i_v_mac_age()
|
||||
|
||||
(C<cpsIfVlanSecureMacAddrRemainAge>)
|
||||
|
||||
=item $cps->cps_i_v_mac_type()
|
||||
|
||||
(C<cpsIfVlanSecureMacAddrType>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 C<CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable>
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cps_m_status()
|
||||
|
||||
(C<cpsSecureMacAddrRowStatus>)
|
||||
|
||||
=item $cps->cps_m_age()
|
||||
|
||||
(C<cpsSecureMacAddrRemainingAge>)
|
||||
|
||||
=item $cps->cps_m_type()
|
||||
|
||||
(C<cpsSecureMacAddrType>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 C<IEEE8021-PAE-MIB::dot1xPaePortEntry>
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->pae_i_capabilities()
|
||||
|
||||
C<dot1xPaePortCapabilities>
|
||||
|
||||
Indicates the PAE functionality that this Port supports
|
||||
and that may be managed through this MIB munged to return either
|
||||
C<'dot1xPaePortAuthCapable'> or C<'dot1xPaePortSuppCapable'>.
|
||||
|
||||
=item $cps->pae_i_last_eapol_frame_source()
|
||||
|
||||
C<dot1xAuthLastEapolFrameSource>
|
||||
|
||||
The source MAC address carried in the most recently received EAPOL frame.
|
||||
|
||||
=back
|
||||
|
||||
=head2 C<CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusEntry>
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cerr_i_cause()
|
||||
|
||||
C<cErrDisableIfStatusCause>
|
||||
|
||||
Indicates the feature/event that caused the {interface, vlan} (or the entire
|
||||
interface) to be error-disabled.
|
||||
|
||||
=back
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=over
|
||||
|
||||
=item C<i_err_disable_cause>
|
||||
|
||||
Returns a HASH reference mapping ifIndex to err-disabled cause. The returned
|
||||
data is sparse, so if the ifIndex is not present in the return value, the port
|
||||
is not err-disabled.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->munge_pae_capabilities()
|
||||
|
||||
Return either C<'dot1xPaePortAuthCapable'> or C<'dot1xPaePortSuppCapable'>
|
||||
based upon bit value.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
196
lib/SNMP/Info/CiscoPower.pm
Normal file
196
lib/SNMP/Info/CiscoPower.pm
Normal file
@@ -0,0 +1,196 @@
|
||||
# SNMP::Info::CiscoPower
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoPower;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoPower::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoPower::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
|
||||
'CISCO-CDP-MIB' => 'cdpCachePowerConsumption',
|
||||
);
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
'cpeth_ent_phy' => 'cpeExtPsePortEntPhyIndex',
|
||||
'peth_port_power' => 'cpeExtPsePortPwrConsumption',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
# Cisco overcame the limitation of the module.port index of the
|
||||
# pethPsePortTable by adding another mapping table, which maps
|
||||
# a pethPsePortTable row to an entPhysicalTable index, which can
|
||||
# then be mapped to ifIndex.
|
||||
sub peth_port_ifindex {
|
||||
my $cpeth = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ent_phy = $cpeth->cpeth_ent_phy($partial);
|
||||
my $e_port = $cpeth->e_port();
|
||||
|
||||
my $peth_port_ifindex = {};
|
||||
foreach my $i ( keys %$ent_phy ) {
|
||||
if ( $e_port->{ $ent_phy->{$i} } ) {
|
||||
$peth_port_ifindex->{$i} = $e_port->{ $ent_phy->{$i} };
|
||||
}
|
||||
}
|
||||
return $peth_port_ifindex;
|
||||
}
|
||||
|
||||
# peth_port_neg_power uses the same index as the other peth_port_* tables.
|
||||
# However, cdpCachePowerConsumption uses <ifIndex>.<neighbor>.
|
||||
# Therefore, we have to invert peth_port_ifindex, to get to
|
||||
# the index that is expected and the rest of the code can re-invert it.
|
||||
sub peth_port_neg_power {
|
||||
my $cpeth = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Ignoring partial, since it's not easy to implement properly.
|
||||
my $index = $cpeth->peth_port_ifindex();
|
||||
my %inverse_index;
|
||||
foreach my $i ( keys %$index ) {
|
||||
$inverse_index{ $index->{$i} } = $i;
|
||||
}
|
||||
my $neg_power = $cpeth->cdpCachePowerConsumption();
|
||||
my $peth_port_neg_power = {};
|
||||
foreach my $i ( keys %$neg_power ) {
|
||||
my( $ifIndex, $nbrIndex ) = split( /\./, $i );
|
||||
if ( defined( $inverse_index{ $ifIndex } ) ) {
|
||||
$peth_port_neg_power->{ $inverse_index{ $ifIndex } } = $neg_power->{ $i };
|
||||
}
|
||||
}
|
||||
return $peth_port_neg_power;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoPower - SNMP Interface to data stored in
|
||||
F<CISCO-POWER-ETHERNET-EXT-MIB>.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $poe = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $poe->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The Info::PowerEthernet class needs a per-device helper function to
|
||||
properly map the C<pethPsePortTable> to C<ifIndex> values. This class
|
||||
provides that helper, using F<CISCO-POWER-ETHERNET-EXT-MIB>.
|
||||
It does not define any helpers for the extra values that this MIB
|
||||
contains.
|
||||
|
||||
Create or use a device subclass that inherit this class. Do not use directly.
|
||||
|
||||
For debugging purposes you can call this class directly as you would
|
||||
SNMP::Info
|
||||
|
||||
my $poe = new SNMP::Info::CiscoPower (...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
Note that it requires that the device inherits from Info::Entity.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-POWER-ETHERNET-EXT-MIB>
|
||||
|
||||
=item F<CISCO-CDP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
none.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Power Port Table
|
||||
|
||||
=over
|
||||
|
||||
=item $poe->peth_port_ifindex()
|
||||
|
||||
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
|
||||
|
||||
=item $poe->peth_port_power()
|
||||
|
||||
Power supplied by PoE ports, in milliwatts
|
||||
(C<cpeExtPsePortPwrConsumption>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 CDP Port table
|
||||
|
||||
=over
|
||||
|
||||
=item $poe->peth_port_neg_power()
|
||||
|
||||
Power negotiated using CDP, in milliwatts
|
||||
(C<cdpCachePowerConsumption>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
216
lib/SNMP/Info/CiscoQOS.pm
Normal file
216
lib/SNMP/Info/CiscoQOS.pm
Normal file
@@ -0,0 +1,216 @@
|
||||
# SNMP::Info::CiscoQOS
|
||||
#
|
||||
# Copyright (c) 2005 Alexander Hartmaier
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoQOS;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoQOS::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoQOS::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-CLASS-BASED-QOS-MIB::cbQosServicePolicyTable
|
||||
'qos_i_index' => 'cbQosIfIndex',
|
||||
'qos_i_type' => 'cbQosIfType',
|
||||
'qos_pol_direction' => 'cbQosPolicyDirection',
|
||||
|
||||
# CISCO-CLASS-BASED-QOS-MIB::cbQosObjectsTable
|
||||
'qos_obj_conf_index' => 'cbQosConfigIndex',
|
||||
'qos_obj_type' => 'cbQosObjectsType',
|
||||
'qos_obj_parent' => 'cbQosParentObjectsIndex',
|
||||
|
||||
# CISCO-CLASS-BASED-QOS-MIB::cbQosCMCfgTable
|
||||
'qos_cm_name' => 'cbQosCMName',
|
||||
'qos_cm_desc' => 'cbQosCMDesc',
|
||||
'qos_cm_info' => 'cbQosCMInfo',
|
||||
|
||||
# CISCO-CLASS-BASED-QOS-MIB::cbQosCMStatsTable
|
||||
'qos_octet_pre' => 'cbQosCMPrePolicyByte',
|
||||
'qos_octet_post' => 'cbQosCMPostPolicyByte',
|
||||
|
||||
# CISCO-CLASS-BASED-QOS-MIB::cbQosQueueingCfgTable
|
||||
'qos_queueingcfg_bw' => 'cbQosQueueingCfgBandwidth',
|
||||
'qos_queueingcfg_bw_units' => 'cbQosQueueingCfgBandwidthUnits',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoQOS - SNMP Interface to Cisco's Quality of Service MIBs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Alexander Hartmaier
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $qos = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $qos->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoQOS is a subclass of SNMP::Info that provides
|
||||
information about a cisco device's QoS config.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-CLASS-BASED-QOS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item none
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Service Policy Table (C<cbQosServicePolicyTable>)
|
||||
|
||||
This table describes the interfaces/media types and the policy map that are
|
||||
attached to it.
|
||||
|
||||
=over
|
||||
|
||||
=item $qos->qos_i_index()
|
||||
|
||||
(C<cbQosIfIndex>)
|
||||
|
||||
=item $qos->qos_i_type()
|
||||
|
||||
(C<cbQosIfType>)
|
||||
|
||||
=item $qos->qos_pol_direction()
|
||||
|
||||
(C<cbQosPolicyDirection>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Class Map Objects Table (C<cbQosObjectsTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $qos->qos_obj_index()
|
||||
|
||||
(C<cbQosConfigIndex>)
|
||||
|
||||
=item $qos->qos_obj_type()
|
||||
|
||||
(C<cbQosObjectsType>)
|
||||
|
||||
=item $qos->qos_obj_parent()
|
||||
|
||||
(C<cbQosParentObjectsIndex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Class Map Configuration Table (C<cbQosCMCfgTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $qos->qos_cm_name()
|
||||
|
||||
(C<cbQosCMName>)
|
||||
|
||||
=item $qos->qos_cm_desc()
|
||||
|
||||
(C<cbQosCMDesc>)
|
||||
|
||||
=item $qos->qos_cm_info()
|
||||
|
||||
(C<cbQosCMInfo>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Class Map Stats Table (C<cbQosCMStatsTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $qos->qos_octet_pre()
|
||||
|
||||
(C<cbQosCMPrePolicyByte>)
|
||||
|
||||
=item $qos->qos_octet_post()
|
||||
|
||||
(C<cbQosCMPostPolicyByte>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Queueing Configuration Table (C<cbQosQueueingCfgTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $qos->qos_queueingcfg_bw()
|
||||
|
||||
(C<cbQosQueueingCfgBandwidth>)
|
||||
|
||||
=item $qos->qos_queueingcfg_bw_units()
|
||||
|
||||
(C<cbQosQueueingCfgBandwidthUnits>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
136
lib/SNMP/Info/CiscoRTT.pm
Normal file
136
lib/SNMP/Info/CiscoRTT.pm
Normal file
@@ -0,0 +1,136 @@
|
||||
# SNMP::Info::CiscoRTT
|
||||
#
|
||||
# Copyright (c) 2005 Alexander Hartmaier
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoRTT;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoRTT::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoRTT::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-RTTMON-MIB
|
||||
'rtt_desc' => 'rttMonCtrlAdminOwner',
|
||||
'rtt_last' => 'rttMonLatestRttOperCompletionTime',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoRTT - SNMP Interface to Cisco's Round Trip Time MIBs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Alexander Hartmaier
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $rtt = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $rtt->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoRTT is a subclass of SNMP::Info that provides
|
||||
information about a cisco device's RTT values.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-RTTMON-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
None
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overall Control Group Table
|
||||
|
||||
This table is from C<CISCO-RTTMON-MIB::rttMonCtrlAdminTable>
|
||||
|
||||
=over
|
||||
|
||||
=item $rtt->rtt_desc()
|
||||
|
||||
(C<rttMonCtrlAdminOwner>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overall Control Group Table
|
||||
|
||||
This table is from C<CISCO-RTTMON-MIB::rttMonCtrl>
|
||||
|
||||
=over
|
||||
|
||||
=item $rtt->rtt_last()
|
||||
|
||||
(C<rttMonLatestRttOperCompletionTime>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
635
lib/SNMP/Info/CiscoStack.pm
Normal file
635
lib/SNMP/Info/CiscoStack.pm
Normal file
@@ -0,0 +1,635 @@
|
||||
# SNMP::Info::CiscoStack
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoStack;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
|
||||
@SNMP::Info::CiscoStack::ISA = qw/Exporter/;
|
||||
@SNMP::Info::CiscoStack::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PORTSTAT);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );
|
||||
|
||||
%GLOBALS = (
|
||||
'sysip' => 'sysIpAddr',
|
||||
'netmask' => 'sysNetMask',
|
||||
'broadcast' => 'sysBroadcast',
|
||||
'serial1' => 'chassisSerialNumber',
|
||||
'serial2' => 'chassisSerialNumberString',
|
||||
'model1' => 'chassisModel',
|
||||
'ps1_type' => 'chassisPs1Type',
|
||||
'ps1_status' => 'chassisPs1Status',
|
||||
'ps2_type' => 'chassisPs2Type',
|
||||
'ps2_status' => 'chassisPs2Status',
|
||||
'slots' => 'chassisNumSlots',
|
||||
'fan' => 'chassisFanStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-STACK-MIB::moduleEntry
|
||||
# These are blades in a catalyst device
|
||||
'm_type' => 'moduleType',
|
||||
'm_model' => 'moduleModel',
|
||||
'm_serial' => 'moduleSerialNumber',
|
||||
'm_serial_string' => 'moduleSerialNumberString',
|
||||
'm_status' => 'moduleStatus',
|
||||
'm_name' => 'moduleName',
|
||||
'm_ports' => 'moduleNumPorts',
|
||||
'm_ports_status' => 'modulePortStatus',
|
||||
'm_hwver' => 'moduleHwVersion',
|
||||
'm_fwver' => 'moduleFwVersion',
|
||||
'm_swver' => 'moduleSwVersion',
|
||||
|
||||
# Router Blades :
|
||||
'm_ip' => 'moduleIPAddress',
|
||||
'm_sub1' => 'moduleSubType',
|
||||
'm_sub2' => 'moduleSubType2',
|
||||
|
||||
# CISCO-STACK-MIB::portEntry
|
||||
'p_name' => 'portName',
|
||||
'p_type' => 'portType',
|
||||
'p_status' => 'portOperStatus',
|
||||
'p_status2' => 'portAdditionalStatus',
|
||||
'p_speed' => 'portAdminSpeed',
|
||||
'p_duplex' => 'portDuplex',
|
||||
'p_port' => 'portIfIndex',
|
||||
'p_rx_flow_control' => 'portOperRxFlowControl',
|
||||
'p_tx_flow_control' => 'portOperTxFlowControl',
|
||||
'p_rx_flow_control_admin' => 'portAdminRxFlowControl',
|
||||
'p_tx_flow_control_admin' => 'portAdminTxFlowControl',
|
||||
'p_oidx' => 'portCrossIndex',
|
||||
|
||||
# CISCO-STACK-MIB::PortCpbEntry
|
||||
'p_speed_admin' => 'portCpbSpeed',
|
||||
'p_duplex_admin' => 'portCpbDuplex',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'm_ports_status' => \&munge_port_status,
|
||||
'p_duplex_admin' => \&SNMP::Info::munge_bits,
|
||||
);
|
||||
|
||||
%PORTSTAT = (
|
||||
1 => 'other',
|
||||
2 => 'ok',
|
||||
3 => 'minorFault',
|
||||
4 => 'majorFault',
|
||||
);
|
||||
|
||||
# Changes binary byte describing each port into ascii, and returns
|
||||
# an ascii list separated by spaces.
|
||||
sub munge_port_status {
|
||||
my $status = shift;
|
||||
my @vals = map( $PORTSTAT{$_}, unpack( 'C*', $status ) );
|
||||
return join( ' ', @vals );
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $stack = shift;
|
||||
my $serial1 = $stack->serial1();
|
||||
my $serial2 = $stack->serial2();
|
||||
|
||||
return $serial1 if defined $serial1;
|
||||
return $serial2 if defined $serial2;
|
||||
return;
|
||||
}
|
||||
|
||||
# Rules for older CatOS devices using CiscoStack
|
||||
#
|
||||
# You can configure Ethernet and Fast Ethernet interfaces to either full
|
||||
# duplex or half duplex.
|
||||
#
|
||||
# You cannot configure the duplex mode on Gigabit Ethernet ports (they are
|
||||
# always in full-duplex mode).
|
||||
#
|
||||
# If you set the port speed to auto, duplex mode is automatically set to auto.
|
||||
#
|
||||
# For operational duplex if portCpbDuplex is all zeros the port is a gigabit
|
||||
# port and duplex is always full. If the port is not operational and auto
|
||||
# return value will be undef since we don't know the operational status.
|
||||
#
|
||||
# Newer devices use ETHERLIKE-MIB to report operational duplex, this will be
|
||||
# checked in the device class.
|
||||
|
||||
sub i_duplex {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $p_port = $stack->p_port() || {};
|
||||
my $p_duplex = $stack->p_duplex() || {};
|
||||
my $p_duplex_cap = $stack->p_duplex_admin() || {};
|
||||
|
||||
my $i_duplex = {};
|
||||
foreach my $port ( keys %$p_duplex ) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
|
||||
# Test for gigabit
|
||||
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) {
|
||||
$i_duplex->{$iid} = 'full';
|
||||
}
|
||||
|
||||
# Auto is not a valid operational state
|
||||
elsif ( $p_duplex->{$port} eq 'auto' ) {
|
||||
next;
|
||||
}
|
||||
else {
|
||||
$i_duplex->{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
}
|
||||
return $i_duplex;
|
||||
}
|
||||
|
||||
# For administrative duplex if portCpbDuplex is all zeros the port is a gigabit
|
||||
# port and duplex is always full. If portAdminSpeed is set to auto then the
|
||||
# duplex will be auto, otherwise use portDuplex.
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $p_port = $stack->p_port() || {};
|
||||
my $p_duplex = $stack->p_duplex() || {};
|
||||
my $p_duplex_cap = $stack->p_duplex_admin() || {};
|
||||
my $p_speed = $stack->p_speed() || {};
|
||||
|
||||
my $i_duplex_admin = {};
|
||||
foreach my $port ( keys %$p_duplex ) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
|
||||
# Test for gigabit
|
||||
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) {
|
||||
$i_duplex_admin->{$iid} = 'full';
|
||||
}
|
||||
|
||||
# Check admin speed for auto
|
||||
elsif ( $p_speed->{$port} =~ /auto/ ) {
|
||||
$i_duplex_admin->{$iid} = 'auto';
|
||||
}
|
||||
else {
|
||||
$i_duplex_admin->{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
}
|
||||
return $i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_speed_admin {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %i_speed_admin;
|
||||
my $p_port = $stack->p_port() || {};
|
||||
my $p_speed = $stack->p_speed() || {};
|
||||
|
||||
my %speeds = (
|
||||
'autoDetect' => 'auto',
|
||||
'autoDetect10100' => 'auto',
|
||||
's10000000' => '10 Mbps',
|
||||
's100000000' => '100 Mbps',
|
||||
's1000000000' => '1.0 Gbps',
|
||||
's10G' => '10 Gbps',
|
||||
);
|
||||
|
||||
%i_speed_admin
|
||||
= map { $p_port->{$_} => $speeds{ $p_speed->{$_} } } keys %$p_port;
|
||||
|
||||
return \%i_speed_admin;
|
||||
}
|
||||
|
||||
sub set_i_speed_admin {
|
||||
|
||||
# map speeds to those the switch will understand
|
||||
my %speeds = qw/auto 1 10 10000000 100 100000000 1000 1000000000/;
|
||||
|
||||
my $stack = shift;
|
||||
my ( $speed, $iid ) = @_;
|
||||
my $p_port = $stack->p_port() || {};
|
||||
my %reverse_p_port = reverse %$p_port;
|
||||
|
||||
$speed = lc($speed);
|
||||
|
||||
return 0 unless defined $speeds{$speed};
|
||||
|
||||
$iid = $reverse_p_port{$iid};
|
||||
|
||||
return $stack->set_p_speed( $speeds{$speed}, $iid );
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/half 1 full 2 auto 4/;
|
||||
|
||||
my $stack = shift;
|
||||
my ( $duplex, $iid ) = @_;
|
||||
if ( $duplex eq 'auto' ) {
|
||||
$stack->error_throw(
|
||||
"Software doesn't support setting auto duplex with
|
||||
set_i_duplex_admin() you must use
|
||||
set_i_speed_admin() and set both speed and duplex
|
||||
to auto"
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
|
||||
my $p_port = $stack->p_port() || {};
|
||||
my %reverse_p_port = reverse %$p_port;
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return 0 unless defined $duplexes{$duplex};
|
||||
|
||||
$iid = $reverse_p_port{$iid};
|
||||
|
||||
return $stack->set_p_duplex( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoStack - SNMP Interface to data from F<CISCO-STACK-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ciscostack = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ciscostack->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoStack is a subclass of SNMP::Info that provides
|
||||
an interface to the C<CISCO-STACK-MIB>. This MIB is used across
|
||||
the Catalyst family under CatOS and IOS.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-STACK-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->broadcast()
|
||||
|
||||
(C<sysBroadcast>)
|
||||
|
||||
=item $stack->fan()
|
||||
|
||||
(C<chassisFanStatus>)
|
||||
|
||||
=item $stack->model()
|
||||
|
||||
(C<chassisModel>)
|
||||
|
||||
=item $stack->netmask()
|
||||
|
||||
(C<sysNetMask>)
|
||||
|
||||
=item $stack->ps1_type()
|
||||
|
||||
(C<chassisPs1Type>)
|
||||
|
||||
=item $stack->ps2_type()
|
||||
|
||||
(C<chassisPs2Type>)
|
||||
|
||||
=item $stack->ps1_status()
|
||||
|
||||
(C<chassisPs1Status>)
|
||||
|
||||
=item $stack->ps2_status()
|
||||
|
||||
(C<chassisPs2Status>)
|
||||
|
||||
=item $stack->serial()
|
||||
|
||||
(C<chassisSerialNumberString>) or (C<chassisSerialNumber>)
|
||||
|
||||
=item $stack->slots()
|
||||
|
||||
(C<chassisNumSlots>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Interface Tables
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->i_physical()
|
||||
|
||||
Returns a map to IID for ports that are physical ports, not vlans, etc.
|
||||
|
||||
=item $stack->i_type()
|
||||
|
||||
Crosses p_port() with p_type() and returns the results.
|
||||
|
||||
Overrides with C<ifType> if p_type() isn't available.
|
||||
|
||||
=item $stack->i_duplex()
|
||||
|
||||
Returns reference to hash of iid to current link duplex setting.
|
||||
|
||||
First checks for fixed gigabit ports which are always full duplex. Next, if
|
||||
the port is not operational and reported port duplex (C<portDuplex>) is auto
|
||||
then the operational duplex can not be determined. Otherwise it uses the
|
||||
reported port duplex (C<portDuplex>).
|
||||
|
||||
=item $stack->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative duplex setting.
|
||||
|
||||
First checks for fixed gigabit ports which are always full duplex. Next checks
|
||||
the port administrative speed (C<portAdminSpeed>) which if set to
|
||||
autonegotiate then the duplex will also autonegotiate, otherwise it uses the
|
||||
reported port duplex (C<portDuplex>).
|
||||
|
||||
=item $stack->i_speed_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative speed setting.
|
||||
|
||||
C<portAdminSpeed>
|
||||
|
||||
=item $stack->set_i_speed_admin(speed, ifIndex)
|
||||
|
||||
Sets port speed, must be supplied with speed and port C<ifIndex>
|
||||
|
||||
Speed choices are 'auto', '10', '100', '1000'
|
||||
|
||||
Crosses $stack->p_port() with $stack->p_duplex() to
|
||||
utilize port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$stack->interfaces()};
|
||||
$stack->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port speed. ",$stack->error(1);
|
||||
|
||||
=item $stack->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>
|
||||
|
||||
Speed choices are 'auto', 'half', 'full'
|
||||
|
||||
Crosses $stack->p_port() with $stack->p_duplex() to
|
||||
utilize port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$stack->interfaces()};
|
||||
$stack->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port duplex. ",$stack->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=head2 Module table
|
||||
|
||||
This table holds configuration information for each of the blades installed in
|
||||
the Catalyst device.
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->m_type()
|
||||
|
||||
(C<moduleType>)
|
||||
|
||||
=item $stack->m_model()
|
||||
|
||||
(C<moduleModel>)
|
||||
|
||||
=item $stack->m_serial()
|
||||
|
||||
(C<moduleSerialNumber>)
|
||||
|
||||
=item $stack->m_status()
|
||||
|
||||
(C<moduleStatus>)
|
||||
|
||||
=item $stack->m_name()
|
||||
|
||||
(C<moduleName>)
|
||||
|
||||
=item $stack->m_ports()
|
||||
|
||||
(C<moduleNumPorts>)
|
||||
|
||||
=item $stack->m_ports_status()
|
||||
|
||||
Returns a list of space separated status strings for the ports.
|
||||
|
||||
To see the status of port 4 :
|
||||
|
||||
@ports_status = split(' ', $stack->m_ports_status() );
|
||||
$port4 = $ports_status[3];
|
||||
|
||||
(C<modulePortStatus>)
|
||||
|
||||
=item $stack->m_ports_hwver()
|
||||
|
||||
(C<moduleHwVersion>)
|
||||
|
||||
=item $stack->m_ports_fwver()
|
||||
|
||||
(C<moduleFwVersion>)
|
||||
|
||||
=item $stack->m_ports_swver()
|
||||
|
||||
(C<moduleSwVersion>)
|
||||
|
||||
=item $stack->m_ports_ip()
|
||||
|
||||
(C<moduleIPAddress>)
|
||||
|
||||
=item $stack->m_ports_sub1()
|
||||
|
||||
(C<moduleSubType>)
|
||||
|
||||
=item $stack->m_ports_sub2()
|
||||
|
||||
(C<moduleSubType2>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Modules - Router Blades
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->m_ip()
|
||||
|
||||
(C<moduleIPAddress>)
|
||||
|
||||
=item $stack->m_sub1()
|
||||
|
||||
(C<moduleSubType>)
|
||||
|
||||
=item $stack->m_sub2()
|
||||
|
||||
(C<moduleSubType2>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Entry Table (C<CISCO-STACK-MIB::portTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->p_name()
|
||||
|
||||
(C<portName>)
|
||||
|
||||
=item $stack->p_type()
|
||||
|
||||
(C<portType>)
|
||||
|
||||
=item $stack->p_status()
|
||||
|
||||
(C<portOperStatus>)
|
||||
|
||||
=item $stack->p_status2()
|
||||
|
||||
(C<portAdditionalStatus>)
|
||||
|
||||
=item $stack->p_speed()
|
||||
|
||||
(C<portAdminSpeed>)
|
||||
|
||||
=item $stack->p_duplex()
|
||||
|
||||
(C<portDuplex>)
|
||||
|
||||
=item $stack->p_port()
|
||||
|
||||
(C<portIfIndex>)
|
||||
|
||||
=item $stack->p_rx_flow_control()
|
||||
|
||||
Can be either C<on> C<off> or C<disagree>
|
||||
|
||||
"Indicates the receive flow control operational status of the port. If the
|
||||
port could not agree with the far end on a link protocol, its operational
|
||||
status will be disagree(3)."
|
||||
|
||||
C<portOperRxFlowControl>
|
||||
|
||||
=item $stack->p_tx_flow_control()
|
||||
|
||||
Can be either C<on> C<off> or C<disagree>
|
||||
|
||||
"Indicates the transmit flow control operational status of the port. If the
|
||||
port could not agree with the far end on a link protocol, its operational
|
||||
status will be disagree(3)."
|
||||
|
||||
C<portOperTxFlowControl>
|
||||
|
||||
=item $stack->p_rx_flow_control_admin()
|
||||
|
||||
Can be either C<on> C<off> or C<desired>
|
||||
|
||||
"Indicates the receive flow control administrative status set on the port. If
|
||||
the status is set to on(1), the port will require the far end to send flow
|
||||
control. If the status is set to off(2), the port will not allow far end to
|
||||
send flow control. If the status is set to desired(3), the port will allow
|
||||
the far end to send the flow control."
|
||||
|
||||
C<portAdminRxFlowControl>
|
||||
|
||||
=item $stack->p_tx_flow_control_admin()
|
||||
|
||||
Can be either C<on> C<off> or C<desired>
|
||||
|
||||
"Indicates the transmit flow control administrative status set on the port.
|
||||
If the status is set to on(1), the port will send flow control to the far end. If
|
||||
the status is set to off(2), the port will not send flow control to the far
|
||||
end. If the status is set to desired(3), the port will send flow control to
|
||||
the far end if the far end supports it."
|
||||
|
||||
C<portAdminTxFlowControl>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Port Capability Table (C<CISCO-STACK-MIB::portCpbTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->p_speed_admin()
|
||||
|
||||
(C<portCpbSpeed>)
|
||||
|
||||
=item $stack->p_duplex_admin()
|
||||
|
||||
(C<portCpbDuplex>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $stack->munge_port_status()
|
||||
|
||||
Munges binary byte describing each port into ascii, and returns an ascii
|
||||
list separated by spaces.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
560
lib/SNMP/Info/CiscoStats.pm
Normal file
560
lib/SNMP/Info/CiscoStats.pm
Normal file
@@ -0,0 +1,560 @@
|
||||
# SNMP::Info::CiscoStats
|
||||
#
|
||||
# Changes since Version 0.7 Copyright (c) 2008-2009 Max Baker and SNMP::Info Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoStats;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStats::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
'SNMPv2-MIB' => 'sysDescr',
|
||||
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
|
||||
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed',
|
||||
'OLD-CISCO-SYSTEM-MIB' => 'writeMem',
|
||||
'CISCO-PRODUCTS-MIB' => 'ciscoIGS',
|
||||
'ENTITY-MIB' => 'entPhysicalSoftwareRev',
|
||||
'CISCO-IMAGE-MIB' => 'ciscoImageString',
|
||||
|
||||
# some older catalysts live here
|
||||
'CISCO-STACK-MIB' => 'wsc1900sysID',
|
||||
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevChassis',
|
||||
'CISCO-FLASH-MIB' => 'ciscoFlashDeviceSize',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
'description' => 'sysDescr',
|
||||
'ent_physical_software_rev' => 'entPhysicalSoftwareRev.1',
|
||||
|
||||
# We will use the numeric OID's so that we don't require people
|
||||
# to install v1 MIBs, which can conflict.
|
||||
# OLD-CISCO-CPU-MIB:avgBusyPer
|
||||
'ios_cpu' => '1.3.6.1.4.1.9.2.1.56.0',
|
||||
'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
|
||||
'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
|
||||
|
||||
# CISCO-PROCESS-MIB
|
||||
'cat_cpu' => 'cpmCPUTotal5sec.9',
|
||||
'cat_cpu_1min' => 'cpmCPUTotal1min.9',
|
||||
'cat_cpu_5min' => 'cpmCPUTotal5min.9',
|
||||
|
||||
# OLD-CISCO-SYSTEM-MIB
|
||||
'write_mem' => 'writeMem',
|
||||
'rom_id' => 'romId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolTable
|
||||
'cisco_mem_free' => 'ciscoMemoryPoolFree',
|
||||
'cisco_mem_used' => 'ciscoMemoryPoolUsed',
|
||||
|
||||
# CISCO-FLASH-MIB::ciscoFlashDeviceTable
|
||||
'cisco_flash_size' => 'ciscoFlashDeviceSize',
|
||||
|
||||
# CISCO-IMAGE-MIB
|
||||
'ci_images' => 'ciscoImageString',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $l2 = shift;
|
||||
my $descr = $l2->description() || '';
|
||||
|
||||
# order here matters - there are Catalysts that run IOS and have catalyst
|
||||
# in their description field, as well as Catalysts that run IOS-XE.
|
||||
return 'ios-xe' if ( $descr =~ /Denali/ );
|
||||
return 'ios-xe' if ( $descr =~ /Fuji/ );
|
||||
return 'ios-xe' if ( $descr =~ /Everest/ );
|
||||
return 'ios-xe' if ( $descr =~ /Gibraltar/ );
|
||||
return 'ios-xe' if ( $descr =~ /Amsterdam/ );
|
||||
return 'ios-xe' if ( $descr =~ /IOS-XE/ );
|
||||
return 'ios-xr' if ( $descr =~ /IOS XR/ );
|
||||
return 'ios' if ( $descr =~ /IOS/ );
|
||||
return 'catalyst' if ( $descr =~ /catalyst/i );
|
||||
return 'css' if ( $descr =~ /Content Switch SW/ );
|
||||
return 'css-sca' if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
|
||||
return 'pix' if ( $descr =~ /Cisco PIX Security Appliance/ );
|
||||
return 'asa' if ( $descr =~ /Cisco Adaptive Security Appliance/ );
|
||||
return 'san-os' if ( $descr =~ /Cisco SAN-OS/ );
|
||||
|
||||
if ( $descr =~ /Application Control Engine Service Module/ ) {
|
||||
# Only the admin context implements the entity MIB
|
||||
return 'ace-admin' if defined $l2->ent_physical_software_rev();
|
||||
return 'ace-context';
|
||||
}
|
||||
|
||||
# Pre-version 3 FWSMs
|
||||
return 'fwsm' if ( $descr =~ /Cisco Secure FWSM Firewall/ );
|
||||
|
||||
# Version 3+ FWSMs (currently untested against version 4)
|
||||
if ( $descr =~ /Firewall Services Module/ ) {
|
||||
|
||||
my $model = $l2->model();
|
||||
|
||||
if ( defined $model && $model eq "WsSvcFwm1sc" ) {
|
||||
# Only the admin context implements the entity MIB
|
||||
return 'fwsm-admin' if defined $l2->ent_physical_software_rev();
|
||||
return 'fwsm-context';
|
||||
}
|
||||
|
||||
# Non context mode FWSM
|
||||
return 'fwsm';
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $l2 = shift;
|
||||
my $os = $l2->os();
|
||||
my $descr = $l2->description();
|
||||
|
||||
# Older Catalysts
|
||||
if ( defined $os
|
||||
and $os eq 'catalyst'
|
||||
and defined $descr
|
||||
and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'css'
|
||||
and defined $descr
|
||||
and $descr =~ m/Content Switch SW Version ([0-9\.\(\)]+) with SNMPv1\/v2c Agent/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'css-sca'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco Systems Inc CSS-SCA-2FE-K9, ([0-9\.\(\)]+) Release / )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'pix'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco PIX Security Appliance Version ([0-9\.\(\)]+)/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'asa'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco Adaptive Security Appliance Version ([0-9\.\(\)]+)/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os =~ /^ace/ )
|
||||
{
|
||||
return $l2->ent_physical_software_rev();
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os =~ /^fwsm/
|
||||
and defined $descr
|
||||
and $descr =~ m/Version (\d+\.\d+(\(\d+\)){0,1})/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'ios-xr'
|
||||
and defined $descr
|
||||
and $descr =~ m/Version (\d+[\.\d]+)/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Newer Catalysts and IOS devices
|
||||
if ( defined $descr
|
||||
and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Generic fallback: try to determine running image from CISCO-IMAGE-MIB
|
||||
my $image_info = $l2->ciscoImageString() || {};
|
||||
foreach my $row (keys %$image_info) {
|
||||
my $info_string = $image_info->{$row};
|
||||
if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $self = shift;
|
||||
my $rom_id = $self->rom_id();
|
||||
if ($rom_id =~ m/Version ([^,]+),/) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub cpu {
|
||||
my $self = shift;
|
||||
my $ios_cpu = $self->ios_cpu();
|
||||
return $ios_cpu if defined $ios_cpu;
|
||||
my $cat_cpu = $self->cat_cpu();
|
||||
return $cat_cpu;
|
||||
}
|
||||
|
||||
sub cpu_1min {
|
||||
my $self = shift;
|
||||
my $ios_cpu_1min = $self->ios_cpu_1min();
|
||||
return $ios_cpu_1min if defined $ios_cpu_1min;
|
||||
my $cat_cpu_1min = $self->cat_cpu_1min();
|
||||
return $cat_cpu_1min;
|
||||
}
|
||||
|
||||
sub cpu_5min {
|
||||
my $self = shift;
|
||||
my $ios_cpu_5min = $self->ios_cpu_5min();
|
||||
return $ios_cpu_5min if defined $ios_cpu_5min;
|
||||
my $cat_cpu_5min = $self->cat_cpu_5min();
|
||||
return $cat_cpu_5min;
|
||||
}
|
||||
|
||||
sub mem_free {
|
||||
my $self = shift;
|
||||
|
||||
my $mem_free;
|
||||
|
||||
my $cisco_mem_free = $self->cisco_mem_free() || {};
|
||||
|
||||
foreach my $mem_free_val ( values %$cisco_mem_free ) {
|
||||
$mem_free += $mem_free_val;
|
||||
}
|
||||
|
||||
return $mem_free;
|
||||
}
|
||||
|
||||
sub mem_used {
|
||||
my $self = shift;
|
||||
|
||||
my $mem_used;
|
||||
|
||||
my $cisco_mem_used = $self->cisco_mem_used() || {};
|
||||
|
||||
foreach my $mem_used_val ( values %$cisco_mem_used ) {
|
||||
$mem_used += $mem_used_val;
|
||||
}
|
||||
|
||||
return $mem_used;
|
||||
}
|
||||
|
||||
sub mem_total {
|
||||
my $self = shift;
|
||||
|
||||
my $mem_total;
|
||||
|
||||
my $cisco_mem_free = $self->cisco_mem_free() || {};
|
||||
my $cisco_mem_used = $self->cisco_mem_used() || {};
|
||||
|
||||
foreach my $mem_entry ( keys %$cisco_mem_free ) {
|
||||
my $mem_free = $cisco_mem_free->{$mem_entry} || 0;
|
||||
my $mem_used = $cisco_mem_used->{$mem_entry} || 0;
|
||||
$mem_total += ( $mem_free + $mem_used );
|
||||
}
|
||||
return $mem_total;
|
||||
}
|
||||
|
||||
sub flashmem_total {
|
||||
my $self = shift;
|
||||
|
||||
my $flashmem_total;
|
||||
|
||||
my $flash_sizes = $self->cisco_flash_size;
|
||||
|
||||
foreach my $flash_index ( keys %$flash_sizes ) {
|
||||
$flashmem_total += $flash_sizes->{$flash_index};
|
||||
}
|
||||
|
||||
return $flashmem_total;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco
|
||||
Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller, Max Baker, Sam Stickland
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ciscostats = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ciscostats->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory,
|
||||
os and version information about Cisco Devices.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-PRODUCTS-MIB>
|
||||
|
||||
=item F<CISCO-PROCESS-MIB>
|
||||
|
||||
=item F<CISCO-MEMORY-POOL-MIB>
|
||||
|
||||
=item F<SNMPv2-MIB>
|
||||
|
||||
=item F<OLD-CISCO-SYSTEM-MIB>
|
||||
|
||||
=item F<CISCO-STACK-MIB>
|
||||
|
||||
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
=item F<CISCO-FLASH-MIB>
|
||||
|
||||
=item F<ENTITY-MIB>
|
||||
|
||||
=item F<CISCO-IMAGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscostats->cpu()
|
||||
|
||||
Returns ios_cpu() or cat_cpu(), whichever is available.
|
||||
|
||||
=item $ciscostats->cpu_1min()
|
||||
|
||||
Returns ios_cpu_1min() or cat_cpu1min(), whichever is available.
|
||||
|
||||
=item $ciscostats->cpu_5min()
|
||||
|
||||
Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
|
||||
|
||||
=item $ciscostats->mem_total()
|
||||
|
||||
Returns mem_free() + mem_used()
|
||||
|
||||
=item $ciscostats->vendor()
|
||||
|
||||
'cisco'
|
||||
|
||||
=item $ciscostats->os()
|
||||
|
||||
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
|
||||
from description()
|
||||
|
||||
Available values:
|
||||
|
||||
'ios' for Cisco IOS
|
||||
'ios-xe' for Cisco IOS XE
|
||||
'ios-xr' for Cisco IOS XR
|
||||
'pix' for Cisco PIX
|
||||
'asa' for Cisco ASA
|
||||
'fwsm' for Single-mode FWSM
|
||||
'fwsm-admin' for Admin context of multi-context FWSM
|
||||
'fwsm-context' for Standard context of multi-context FWSM
|
||||
'ace-admin' for Admin context of ACE module
|
||||
'ace-context' for Standard context of ACE module (NB: No OS version
|
||||
detection is available, but will be the same as it's
|
||||
'ace admin')
|
||||
'css' for Cisco Content Switch
|
||||
'css-sca' for Cisco Content Switch Secure Content Acceleration
|
||||
'san-os' for Cisco SAN-OS
|
||||
|
||||
=item $ciscostats->os_ver()
|
||||
|
||||
Tries to parse device operating system version from description(), falls back
|
||||
to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed
|
||||
|
||||
=item $ciscostats->os_bin()
|
||||
|
||||
Tries to parse C<ROMMON> version from rom_id() string
|
||||
|
||||
=item $ciscostats->ios_cpu()
|
||||
|
||||
Current CPU usage in percent.
|
||||
|
||||
C<1.3.6.1.4.1.9.2.1.56.0> =
|
||||
C<OLD-CISCO-CPU-MIB:avgBusyPer>
|
||||
|
||||
=item $ciscostats->ios_cpu_1min()
|
||||
|
||||
Average CPU Usage in percent over the last minute.
|
||||
|
||||
C<1.3.6.1.4.1.9.2.1.57.0>
|
||||
|
||||
=item $ciscostats->ios_cpu_5min()
|
||||
|
||||
Average CPU Usage in percent over the last 5 minutes.
|
||||
|
||||
C<1.3.6.1.4.1.9.2.1.58.0>
|
||||
|
||||
=item $ciscostats->cat_cpu()
|
||||
|
||||
Current CPU usage in percent.
|
||||
|
||||
C<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
|
||||
|
||||
=item $ciscostats->cat_cpu_1min()
|
||||
|
||||
Average CPU Usage in percent over the last minute.
|
||||
|
||||
C<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
|
||||
|
||||
=item $ciscostats->cat_cpu_5min()
|
||||
|
||||
Average CPU Usage in percent over the last 5 minutes.
|
||||
|
||||
C<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
|
||||
|
||||
=item $ciscostats->mem_free()
|
||||
|
||||
Main DRAM free of the device in bytes.
|
||||
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree>
|
||||
|
||||
=item $ciscostats->mem_used()
|
||||
|
||||
Main DRAM used of the device in bytes.
|
||||
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
|
||||
|
||||
=item $ciscostats->mem_total()
|
||||
|
||||
Main DRAM of the device in bytes.
|
||||
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree> +
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
|
||||
|
||||
=item $ciscostats->flashmem_total()
|
||||
|
||||
Flash memory of the device in bytes.
|
||||
|
||||
C<CISCO-FLASH-MIB::ciscoFlashDeviceSize>
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Cisco Memory Pool Table (C<ciscoMemoryPoolTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscostats->cisco_mem_free()
|
||||
|
||||
The number of bytes from the memory pool that are currently unused on the
|
||||
managed device.
|
||||
|
||||
(C<ciscoMemoryPoolFree>)
|
||||
|
||||
=item $ciscostats->cisco_mem_used()
|
||||
|
||||
The number of bytes from the memory pool that are currently in use by
|
||||
applications on the managed device.
|
||||
|
||||
(C<ciscoMemoryPoolUsed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Cisco Flash Device Table (C<ciscoFlashDeviceTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscostats->cisco_flash_size()
|
||||
|
||||
Total size of the Flash device. For a removable device, the size will be
|
||||
zero if the device has been removed.
|
||||
|
||||
(C<ciscoFlashDeviceSize>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Cisco Image Table (C<ciscoImageTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ci->ci_images()
|
||||
|
||||
Returns the table of image strings.
|
||||
|
||||
C<ciscoImageString>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
414
lib/SNMP/Info/CiscoStpExtensions.pm
Normal file
414
lib/SNMP/Info/CiscoStpExtensions.pm
Normal file
@@ -0,0 +1,414 @@
|
||||
# SNMP::Info::CiscoStpExtensions
|
||||
#
|
||||
# Copyright (c)2009 Carlos Vicente
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the author nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoStpExtensions;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
|
||||
our ($VERSION, $DEBUG, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PORTSTAT, $INIT);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
@SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//;
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
'CISCO-STP-EXTENSIONS-MIB' => 'stpxSpanningTreeType',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
'stpx_mst_config_digest' => 'stpxSMSTConfigDigest',
|
||||
'stpx_mst_region_name' => 'stpxMSTRegionName',
|
||||
'stpx_mst_region_rev' => 'stpxSMSTRegionRevision',
|
||||
'stpx_stp_type' => 'stpxSpanningTreeType',
|
||||
'stpx_bpduguard_enable' => 'stpxFastStartBpduGuardEnable',
|
||||
'stpx_bpdufilter_enable' => 'stpxFastStartBpduFilterEnable',
|
||||
'stpx_faststart_default' => 'stpxFastStartGlobalDefaultMode',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
'stpx_rootguard_enabled' => 'stpxRootGuardConfigEnabled',
|
||||
'stpx_loopguard_enabled' => 'stpxLoopGuardConfigEnabled',
|
||||
'stpx_faststart_enabled' => 'stpxFastStartPortEnable',
|
||||
'stpx_faststart_operational' => 'stpxFastStartPortMode',
|
||||
'stpx_port_bpduguard_mode' => 'stpxFastStartPortBpduGuardMode',
|
||||
'stpx_port_bpdufilter_mode' => 'stpxFastStartPortBpduFilterMode',
|
||||
'stpx_smst_root' => 'stpxSMSTInstanceCISTRegionalRoot',
|
||||
'stpx_smst_vlans_mapped_1k2k' => 'stpxSMSTInstanceVlansMapped1k2k',
|
||||
'stpx_smst_vlans_mapped_3k4k' => 'stpxSMSTInstanceVlansMapped3k4k',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
'stpx_mst_config_digest' => \&SNMP::Info::CiscoStpExtensions::oct2str,
|
||||
);
|
||||
|
||||
|
||||
# Report version of STP via standard method
|
||||
sub stp_ver {
|
||||
my $self = shift;
|
||||
my $stp_ver = $self->SUPER::stp_ver();
|
||||
if ( !defined($stp_ver) || $stp_ver eq 'unknown' ){
|
||||
if ( defined $self->stpx_stp_type() ){
|
||||
$stp_ver = $self->stpx_stp_type();
|
||||
}
|
||||
}
|
||||
return $stp_ver;
|
||||
}
|
||||
|
||||
sub mst_config_digest {
|
||||
my $self = shift;
|
||||
return $self->stpx_mst_config_digest;
|
||||
}
|
||||
|
||||
sub mst_region_name {
|
||||
my $self = shift;
|
||||
return $self->stpx_mst_region_name;
|
||||
}
|
||||
|
||||
sub mst_region_rev {
|
||||
my $self = shift;
|
||||
return $self->stpx_mst_region_rev;
|
||||
}
|
||||
|
||||
|
||||
sub mst_vlan2instance {
|
||||
my $self = shift;
|
||||
|
||||
# Get MST vlan-to-instance mapping
|
||||
my $m1k2k = $self->stpx_smst_vlans_mapped_1k2k;
|
||||
my $m3k4k = $self->stpx_smst_vlans_mapped_3k4k;
|
||||
|
||||
# Get list of VLANs
|
||||
my $vlan_membership = $self->i_vlan_membership;
|
||||
my @vlans;
|
||||
foreach my $iid ( keys %$vlan_membership ){
|
||||
if ( my $vm = $vlan_membership->{$iid} ){
|
||||
foreach my $vid ( @$vm ){
|
||||
push @vlans, $vid;
|
||||
}
|
||||
}
|
||||
}
|
||||
my %res;
|
||||
foreach my $vlan ( @vlans ){
|
||||
if ( $vlan < 2048 ){
|
||||
foreach my $inst ( keys %$m1k2k ){
|
||||
my $list = $m1k2k->{$inst};
|
||||
my $vlanlist = [split(//, unpack("B*", $list))];
|
||||
if ( @$vlanlist[$vlan] ){
|
||||
$res{$vlan} = $inst;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
foreach my $inst ( keys %$m3k4k ){
|
||||
my $list = $m3k4k->{$inst};
|
||||
my $vlanlist = [split(//, unpack("B*", $list))];
|
||||
if ( @$vlanlist[$vlan-2048] ){
|
||||
$res{$vlan} = $inst;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
sub i_rootguard_enabled {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rg_enabled = $self->stpx_rootguard_enabled();
|
||||
my $bp_index = $self->bp_index($partial);
|
||||
|
||||
my %res;
|
||||
foreach my $index ( keys %$rg_enabled ){
|
||||
my $enabled = $rg_enabled->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $enabled;
|
||||
$res{$iid} = $enabled;
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
sub i_loopguard_enabled {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lg_enabled = $self->stpx_loopguard_enabled();
|
||||
my $bp_index = $self->bp_index($partial);
|
||||
|
||||
my %res;
|
||||
foreach my $index ( keys %$lg_enabled ){
|
||||
my $enabled = $lg_enabled->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $enabled;
|
||||
$res{$iid} = $enabled;
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
sub i_bpduguard_enabled {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $bpdugm_default = $self->stpx_bpduguard_enable();
|
||||
my $bp_index = $self->bp_index($partial);
|
||||
my $bpdugm = $self->stpx_port_bpduguard_mode();
|
||||
|
||||
my %res;
|
||||
foreach my $index ( keys %$bpdugm ){
|
||||
my $mode = $bpdugm->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $mode;
|
||||
if ( $mode eq 'default' ){
|
||||
$res{$iid} = $bpdugm_default;
|
||||
}else{
|
||||
$res{$iid} = $mode;
|
||||
}
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
sub i_bpdufilter_enabled {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $bpdufm_default = $self->stpx_bpdufilter_enable();
|
||||
my $bp_index = $self->bp_index($partial);
|
||||
my $bpdufm = $self->stpx_port_bpdufilter_mode();
|
||||
|
||||
my %res;
|
||||
foreach my $index ( keys %$bpdufm ){
|
||||
my $mode = $bpdufm->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $mode;
|
||||
if ( $mode eq 'default' ){
|
||||
$res{$iid} = $bpdufm_default;
|
||||
}else{
|
||||
$res{$iid} = $mode;
|
||||
}
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
sub i_faststart_enabled {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $faststart_default = $self->stpx_faststart_default();
|
||||
my $bp_index = $self->bp_index($partial);
|
||||
my $faststart = $self->stpx_faststart_enabled();
|
||||
my $faststart_oper = $self->stpx_faststart_operational();
|
||||
|
||||
my %res;
|
||||
# stpxFastStartPortEnable is deprecated in favour of stpxFastStartPortMode
|
||||
# see https://github.com/netdisco/netdisco/issues/12
|
||||
foreach my $index ( keys %$faststart, keys %$faststart_oper ){
|
||||
my $mode = $faststart_oper->{$index} || $faststart->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $mode;
|
||||
if ( $mode eq 'default' ){
|
||||
$res{$iid} = $faststart_default;
|
||||
}else{
|
||||
$res{$iid} = $mode;
|
||||
}
|
||||
$res{$iid} = 'enable' if $res{$iid} eq 'true';
|
||||
$res{$iid} = 'disable' if $res{$iid} eq 'false';
|
||||
$res{$iid} = 1 if $res{$iid} =~ m/enable/i; # enableForTrunk
|
||||
$res{$iid} = 0 if $res{$iid} eq 'disable';
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
|
||||
sub oct2str {
|
||||
my ($v) = @_;
|
||||
return sprintf('%s', unpack('H*', $v));
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoStpExtensions - SNMP Interface to C<CISCO-STP-EXTENSIONS-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Carlos Vicente
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $stpx = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $stpx->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Create or use a subclass of SNMP::Info that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
For debugging you can call new() directly as you would in SNMP::Info
|
||||
|
||||
my $stpx = new SNMP::Info::CiscoStpExtensions(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-STP-EXTENSIONS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $stpx->stp_ver()
|
||||
|
||||
Returns the particular STP version running on this device.
|
||||
Meant to override SNMP::Info::Brigde::stp_ver()
|
||||
|
||||
Values: C<pvstPlus>, C<mistp>, C<mistpPvstPlus>, C<mst>, C<rapidPvstPlus>
|
||||
|
||||
(C<stpxSpanningTreeType>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $stpx->mst_config_digest()
|
||||
|
||||
Returns the Multiple Spanning Tree (MST) configuration digest
|
||||
|
||||
(C<stpxSMSTConfigDigest>)
|
||||
|
||||
=item $stpx->mst_region_name()
|
||||
|
||||
Returns the Multiple Spanning Tree (MST) region name
|
||||
|
||||
(C<stpxMSTRegionName>)
|
||||
|
||||
=item $stpx->mst_region_rev()
|
||||
|
||||
Returns the Multiple Spanning Tree (MST) region name
|
||||
|
||||
(C<stpxSMSTRegionRevision>)
|
||||
|
||||
=item $stpx->mst_vlan2instance()
|
||||
|
||||
Returns the mapping of vlan to MST instance in the form of a hash reference
|
||||
with key = VLAN id, value = STP instance
|
||||
|
||||
=item $stpx->i_rootguard_enabled()
|
||||
|
||||
Returns 1 or 0 depending on whether C<RootGuard> is enabled on a given port.
|
||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
|
||||
|
||||
(C<stpxRootGuardConfigEnabled>)
|
||||
|
||||
=item $stpx->i_loopguard_enabled()
|
||||
|
||||
Returns 1 or 0 depending on whether C<LoopGuard> is enabled on a given port.
|
||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
|
||||
|
||||
(C<stpxLoopGuardConfigEnabled>)
|
||||
|
||||
=item $stpx->i_bpduguard_enabled()
|
||||
|
||||
Returns 1 or 0 depending on whether C<BpduGuard> is enabled on a given port.
|
||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
|
||||
|
||||
(C<stpxFastStartPortBpduGuardMode>)
|
||||
|
||||
=item $stpx->i_bpdufilter_enabled()
|
||||
|
||||
Returns 1 or 0 depending on whether C<BpduFilter> is enabled on a given port.
|
||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
|
||||
|
||||
(C<stpxFastStartBpduFilterEnable>)
|
||||
|
||||
=item $stpx->i_faststart_enabled()
|
||||
|
||||
Returns 1 or 0 depending on whether FastStart (aka PortFast) is enabled on a
|
||||
given port. Format is a hash reference with key = C<ifIndex>, value = [1|0]
|
||||
|
||||
(C<stpxFastStartPortEnable> and C<stpxFastStartPortMode>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item oct2str()
|
||||
|
||||
Unpacks H* into a string
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
980
lib/SNMP/Info/CiscoVTP.pm
Normal file
980
lib/SNMP/Info/CiscoVTP.pm
Normal file
@@ -0,0 +1,980 @@
|
||||
# SNMP::Info::CiscoVTP
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoVTP;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoVTP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoVTP::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-VTP-MIB' => 'vtpVlanName',
|
||||
'CISCO-VLAN-MEMBERSHIP-MIB' => 'vmMembershipEntry',
|
||||
'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
'vtp_version' => 'vtpVersion',
|
||||
'vtp_maxstore' => 'vtpMaxVlanStorage',
|
||||
'vtp_notify' => 'vtpNotificationsEnabled',
|
||||
'vtp_notify_create' => 'vtpVlanCreatedNotifEnabled',
|
||||
'vtp_notify_delete' => 'vtpVlanDeletedNotifEnabled',
|
||||
'vtp_trunk_set_serial' => 'vlanTrunkPortSetSerialNo',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-VTP-MIB::managementDomainTable
|
||||
'vtp_d_name' => 'managementDomainName',
|
||||
'vtp_d_mode' => 'managementDomainLocalMode',
|
||||
'vtp_d_rev' => 'managementDomainConfigRevNumber',
|
||||
'vtp_d_updater' => 'managementDomainLastUpdater',
|
||||
'vtp_d_last' => 'managementDomainLastChange',
|
||||
'vtp_d_status' => 'managementDomainRowStatus',
|
||||
'vtp_d_tftp' => 'managementDomainTftpServer',
|
||||
'vtp_d_tftp_path' => 'managementDomainTftpPathname',
|
||||
'vtp_d_pruning' => 'managementDomainPruningState',
|
||||
'vtp_d_ver' => 'managementDomainVersionInUse',
|
||||
|
||||
# CISCO-VTP-MIB::vtpVlanTable
|
||||
'v_state' => 'vtpVlanState',
|
||||
'v_type' => 'vtpVlanType',
|
||||
'v_name' => 'vtpVlanName',
|
||||
'v_mtu' => 'vtpVlanMtu',
|
||||
'v_said' => 'vtpVlanDot10Said',
|
||||
'v_ring' => 'vtpVlanRingNumber',
|
||||
'v_bridge' => 'vtpVlanBridgeNumber',
|
||||
'v_stp' => 'vtpVlanStpType',
|
||||
'v_parent' => 'vtpVlanParentVlan',
|
||||
'v_trans1' => 'vtpVlanTranslationalVlan1',
|
||||
'v_trans2' => 'vtpVlanTranslationalVlan2',
|
||||
'v_btype' => 'vtpVlanBridgeType',
|
||||
'v_hop_are' => 'vtpVlanAreHopCount',
|
||||
'v_hop_ste' => 'vtpVlanSteHopCount',
|
||||
'v_crf' => 'vtpVlanIsCRFBackup',
|
||||
'v_type_ext' => 'vtpVlanTypeExt',
|
||||
'v_if' => 'vtpVlanIfIndex',
|
||||
|
||||
# CISCO-VLAN-MEMBERSHIP-MIB::vmMembershipTable
|
||||
'i_vlan_type' => 'vmVlanType',
|
||||
'i_vlan2' => 'vmVlan',
|
||||
'i_vlan_stat' => 'vmPortStatus',
|
||||
'i_vlan_1' => 'vmVlans',
|
||||
'i_vlan_2' => 'vmVlans2k',
|
||||
'i_vlan_3' => 'vmVlans3k',
|
||||
'i_vlan_4' => 'vmVlans4k',
|
||||
|
||||
# CISCO-VLAN-MEMBERSHIP-MIB::vmVoiceVlanTable
|
||||
'i_voice_vlan' => 'vmVoiceVlanId',
|
||||
|
||||
# CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB
|
||||
'v_cvi_if' => 'cviRoutedVlanIfIndex',
|
||||
|
||||
# CISCO-VTP-MIB::vlanTrunkPortTable
|
||||
'vtp_trunk_mgmt_dom' => 'vlanTrunkPortManagementDomain',
|
||||
'vtp_trunk_encaps_t' => 'vlanTrunkPortEncapsulationType',
|
||||
'vtp_trunk_vlans' => 'vlanTrunkPortVlansEnabled',
|
||||
'vtp_trunk_vlans_2k' => 'vlanTrunkPortVlansEnabled2k',
|
||||
'vtp_trunk_vlans_3k' => 'vlanTrunkPortVlansEnabled3k',
|
||||
'vtp_trunk_vlans_4k' => 'vlanTrunkPortVlansEnabled4k',
|
||||
'vtp_trunk_native' => 'vlanTrunkPortNativeVlan',
|
||||
'i_pvid' => 'vlanTrunkPortNativeVlan',
|
||||
'vtp_trunk_rstat' => 'vlanTrunkPortRowStatus',
|
||||
'vtp_trunk_dyn' => 'vlanTrunkPortDynamicState',
|
||||
'vtp_trunk_dyn_stat' => 'vlanTrunkPortDynamicStatus',
|
||||
'vtp_trunk_vtp' => 'vlanTrunkPortVtpEnabled',
|
||||
'vtp_trunk_encaps' => 'vlanTrunkPortEncapsulationOperType',
|
||||
|
||||
# TODO Add these tables if someone wants them..
|
||||
# vtpEditControlTable
|
||||
# vtpVlanEditTable
|
||||
# vtpStatsTable
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub v_index {
|
||||
my $vtp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $v_name = $vtp->v_name($partial);
|
||||
my %v_index;
|
||||
foreach my $idx ( keys %$v_name ) {
|
||||
my ( $mgmtdomain, $vlan ) = split( /\./, $idx );
|
||||
$v_index{$idx} = $vlan;
|
||||
}
|
||||
return \%v_index;
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $vtp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_vlan = $vtp->vtp_trunk_native($partial) || {};
|
||||
my $i_vlan = $vtp->i_vlan2($partial) || {};
|
||||
my $trunk_dyn = $vtp->vtp_trunk_dyn($partial) || {};
|
||||
my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
|
||||
|
||||
my %i_vlans;
|
||||
|
||||
# Get access ports
|
||||
foreach my $port ( keys %$i_vlan ) {
|
||||
my $vlan = $i_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
|
||||
$i_vlans{$port} = $vlan;
|
||||
}
|
||||
|
||||
# Get trunk ports
|
||||
foreach my $port ( keys %$port_vlan ) {
|
||||
my $vlan = $port_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
|
||||
# ports up and trunking should have a trunking status
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
|
||||
# vtp_trunk_dyn_stat is not useful for down ports
|
||||
# so we use vtp_trunk_dyn to see if trunking is set
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
|
||||
if (($stat and $stat =~ /^trunking/ )
|
||||
or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))))
|
||||
{
|
||||
$i_vlans{$port} = $vlan;
|
||||
}
|
||||
}
|
||||
|
||||
# Check in CISCO-VLAN-IFTABLE-RELATION-MIB
|
||||
# Used for traditional Cisco Routers and Aironet
|
||||
|
||||
my $v_cvi_if = $vtp->v_cvi_if();
|
||||
if ( defined $v_cvi_if ) {
|
||||
|
||||
# Translate vlan.physical_interface -> iid
|
||||
# to iid -> vlan
|
||||
foreach my $i ( keys %$v_cvi_if ) {
|
||||
my ( $vlan, $phys ) = split( /\./, $i );
|
||||
my $iid = $v_cvi_if->{$i};
|
||||
|
||||
$i_vlans{$iid} = $vlan;
|
||||
}
|
||||
}
|
||||
|
||||
return \%i_vlans;
|
||||
}
|
||||
|
||||
sub i_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 ) = @_;
|
||||
|
||||
# cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
|
||||
# so we use vtp_trunk_dyn as a hint to use i_pvid
|
||||
|
||||
my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
|
||||
if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
|
||||
return $vtp->i_pvid(@_);
|
||||
}
|
||||
else {
|
||||
return $vtp->i_vlan(@_);
|
||||
}
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $vtp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ports_vlans = $vtp->vtp_trunk_vlans($partial) || {};
|
||||
my $ports_vlans_2k = $vtp->vtp_trunk_vlans_2k($partial) || {};
|
||||
my $ports_vlans_3k = $vtp->vtp_trunk_vlans_3k($partial) || {};
|
||||
my $ports_vlans_4k = $vtp->vtp_trunk_vlans_4k($partial) || {};
|
||||
my $vtp_vlans = $vtp->v_state();
|
||||
my $i_vlan = $vtp->i_vlan2($partial) || {};
|
||||
my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
|
||||
my $trunk_dyn = $vtp->vtp_trunk_dyn($partial) || {};
|
||||
my $i_voice_vlan = $vtp->i_voice_vlan($partial) || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
|
||||
# Get access ports
|
||||
foreach my $port ( keys %$i_vlan ) {
|
||||
my $vlan = $i_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
}
|
||||
|
||||
# Get voice VLANs
|
||||
foreach my $port ( keys %$i_voice_vlan ) {
|
||||
my $vlan = $i_voice_vlan->{$port};
|
||||
next unless defined $vlan;
|
||||
next unless ($vlan =~ m/[[:digit:]]+/ and $vlan < 4095);
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
}
|
||||
|
||||
# Get trunk ports
|
||||
my %oper_vlans;
|
||||
foreach my $iid ( keys %$vtp_vlans ) {
|
||||
my $vlan = 0;
|
||||
my $vtp_dom = 0;
|
||||
my $state = $vtp_vlans->{$iid};
|
||||
next unless defined $state;
|
||||
next if $state !~ /operational/;
|
||||
if ( $iid =~ /(\d+)\.(\d+)/ ) {
|
||||
$vtp_dom = $1;
|
||||
$vlan = $2;
|
||||
}
|
||||
$oper_vlans{$vlan}++;
|
||||
}
|
||||
|
||||
foreach my $port ( keys %$ports_vlans ) {
|
||||
my $stat = $trunk_dyn_stat->{$port};
|
||||
my $dyn = $trunk_dyn->{$port};
|
||||
if (($stat and $stat =~ /^trunking/ )
|
||||
or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate')))) {
|
||||
my $k = 0;
|
||||
my $list1 = $ports_vlans->{$port} || '0';
|
||||
my $list2 = $ports_vlans_2k->{$port} || '0';
|
||||
my $list3 = $ports_vlans_3k->{$port} || '0';
|
||||
my $list4 = $ports_vlans_4k->{$port} || '0';
|
||||
foreach my $list ( "$list1", "$list2", "$list3", "$list4" ) {
|
||||
my $offset = 1024 * $k++;
|
||||
next unless $list;
|
||||
my $vlanlist = [ split( //, unpack( "B*", $list ) ) ];
|
||||
foreach my $vlan ( keys %oper_vlans ) {
|
||||
next if (($vlan < $offset) or ($vlan - $offset > 1024));
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan )
|
||||
if ( @$vlanlist[ $vlan - $offset ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $vtp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlans = $vtp->i_vlan($partial);
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $port (keys %$vlans) {
|
||||
my $vlan = $vlans->{$port};
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub set_i_pvid {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
|
||||
|
||||
my $native_vlan = $vtp->vtp_trunk_native($ifindex);
|
||||
if ( defined $native_vlan ) {
|
||||
|
||||
print
|
||||
"Changing native VLAN from $native_vlan->{$ifindex} to $vlan_id on IfIndex: $ifindex\n"
|
||||
if $vtp->debug();
|
||||
|
||||
my $rv = $vtp->set_vtp_trunk_native( $vlan_id, $ifindex );
|
||||
unless ($rv) {
|
||||
$vtp->error_throw(
|
||||
"Unable to change native VLAN to $vlan_id on IfIndex: $ifindex"
|
||||
);
|
||||
return;
|
||||
}
|
||||
return $rv;
|
||||
}
|
||||
$vtp->error_throw("Can't find ifIndex: $ifindex - Is it a trunk port?");
|
||||
return;
|
||||
}
|
||||
|
||||
sub set_i_vlan {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
|
||||
|
||||
my $i_vlan = $vtp->i_vlan2($ifindex);
|
||||
if ( defined $i_vlan ) {
|
||||
|
||||
print
|
||||
"Changing VLAN from $i_vlan->{$ifindex} to $vlan_id on IfIndex: $ifindex\n"
|
||||
if $vtp->debug();
|
||||
|
||||
my $rv = $vtp->set_i_vlan2( $vlan_id, $ifindex );
|
||||
unless ($rv) {
|
||||
$vtp->error_throw(
|
||||
"Unable to change VLAN to $vlan_id on IfIndex: $ifindex");
|
||||
return;
|
||||
}
|
||||
return $rv;
|
||||
}
|
||||
$vtp->error_throw("Can't find ifIndex: $ifindex - Is it an access port?");
|
||||
return;
|
||||
}
|
||||
|
||||
sub set_i_untagged {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
# cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
|
||||
# so we use vtp_trunk_dyn as a hint to use i_pvid
|
||||
|
||||
my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
|
||||
if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
|
||||
return $vtp->set_i_pvid(@_);
|
||||
}
|
||||
else {
|
||||
return $vtp->set_i_vlan(@_);
|
||||
}
|
||||
}
|
||||
|
||||
sub set_add_i_vlan_tagged {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
|
||||
|
||||
print "Adding VLAN: $vlan_id to ifIndex: $ifindex\n" if $vtp->debug();
|
||||
|
||||
my $trunk_serial = $vtp->load_vtp_trunk_set_serial();
|
||||
my $trunk_members = $vtp->vtp_trunk_vlans($ifindex);
|
||||
|
||||
unless ( defined $trunk_members ) {
|
||||
$vtp->error_throw(
|
||||
"Can't find ifIndex: $ifindex - Is it a trunk port?");
|
||||
return;
|
||||
}
|
||||
|
||||
my @member_list = split( //, unpack( "B*", $trunk_members->{$ifindex} ) );
|
||||
|
||||
print "Original vlan list for ifIndex: $ifindex: @member_list \n"
|
||||
if $vtp->debug();
|
||||
$member_list[$vlan_id] = '1';
|
||||
print "Modified vlan list for ifIndex: $ifindex: @member_list \n"
|
||||
if $vtp->debug();
|
||||
my $new_list = pack( "B*", join( '', @member_list ) );
|
||||
|
||||
#Add VLAN to member list
|
||||
my $list_rv = $vtp->set_vtp_trunk_vlans( $new_list, $ifindex );
|
||||
unless ($list_rv) {
|
||||
$vtp->error_throw(
|
||||
"Unable to add VLAN: $vlan_id to ifIndex: $ifindex member list");
|
||||
return;
|
||||
}
|
||||
|
||||
#Make sure no other SNMP manager was making modifications at the same time.
|
||||
my $serial_rv = $vtp->set_vtp_trunk_set_serial($trunk_serial);
|
||||
unless ($serial_rv) {
|
||||
$vtp->error_throw(
|
||||
"Unable to increment trunk set serial number - check configuration!"
|
||||
);
|
||||
return;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub set_remove_i_vlan_tagged {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
return unless ( $vtp->_validate_vlan_param( $vlan_id, $ifindex ) );
|
||||
|
||||
print "Removing VLAN: $vlan_id from ifIndex: $ifindex\n" if $vtp->debug();
|
||||
|
||||
my $trunk_serial = $vtp->load_vtp_trunk_set_serial();
|
||||
my $trunk_members = $vtp->vtp_trunk_vlans($ifindex);
|
||||
|
||||
unless ( defined $trunk_members ) {
|
||||
$vtp->error_throw(
|
||||
"Can't find ifIndex: $ifindex - Is it a trunk port?");
|
||||
return;
|
||||
}
|
||||
|
||||
my @member_list = split( //, unpack( "B*", $trunk_members->{$ifindex} ) );
|
||||
|
||||
print "Original vlan list for ifIndex: $ifindex: @member_list \n"
|
||||
if $vtp->debug();
|
||||
$member_list[$vlan_id] = '0';
|
||||
print "Modified vlan list for ifIndex: $ifindex: @member_list \n"
|
||||
if $vtp->debug();
|
||||
my $new_list = pack( "B*", join( '', @member_list ) );
|
||||
|
||||
#Remove VLAN to member list
|
||||
my $list_rv = $vtp->set_vtp_trunk_vlans( $new_list, $ifindex );
|
||||
unless ($list_rv) {
|
||||
$vtp->error_throw(
|
||||
"Error: Unable to remove VLAN: $vlan_id from ifIndex: $ifindex member list"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
#Make sure no other manager was making modifications at the same time.
|
||||
my $serial_rv = $vtp->set_vtp_trunk_set_serial($trunk_serial);
|
||||
unless ($serial_rv) {
|
||||
$vtp->error_throw(
|
||||
"Error: Unable to increment trunk set serial number - check configuration!"
|
||||
);
|
||||
return;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#
|
||||
# These are internal methods and are not documented. Do not use directly.
|
||||
#
|
||||
sub _validate_vlan_param {
|
||||
my $vtp = shift;
|
||||
my ( $vlan_id, $ifindex ) = @_;
|
||||
|
||||
# VID and ifIndex should both be numeric
|
||||
unless (defined $vlan_id
|
||||
and defined $ifindex
|
||||
and $vlan_id =~ /^\d+$/
|
||||
and $ifindex =~ /^\d+$/ )
|
||||
{
|
||||
$vtp->error_throw("Invalid parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
# Check that ifIndex exists on device
|
||||
my $index = $vtp->interfaces($ifindex);
|
||||
|
||||
unless ( exists $index->{$ifindex} ) {
|
||||
$vtp->error_throw("ifIndex $ifindex does not exist");
|
||||
return;
|
||||
}
|
||||
|
||||
#Check that VLAN exists on device
|
||||
my $vtp_vlans = $vtp->v_state();
|
||||
my $vlan_exists = 0;
|
||||
|
||||
foreach my $iid ( keys %$vtp_vlans ) {
|
||||
my $vlan = 0;
|
||||
my $vtp_dom = 0;
|
||||
my $state = $vtp_vlans->{$iid};
|
||||
next unless defined $state;
|
||||
next if $state !~ /operational/;
|
||||
if ( $iid =~ /(\d+)\.(\d+)/ ) {
|
||||
$vtp_dom = $1;
|
||||
$vlan = $2;
|
||||
}
|
||||
|
||||
$vlan_exists = 1 if ( $vlan_id eq $vlan );
|
||||
}
|
||||
unless ($vlan_exists) {
|
||||
$vtp->error_throw(
|
||||
"VLAN $vlan_id does not exist or is not operational");
|
||||
return;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoVTP - SNMP Interface to Cisco's VLAN Management MIBs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $vtp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $vtp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoVTP is a subclass of SNMP::Info that provides
|
||||
information about a Cisco device's VLAN and VTP Domain membership.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-VTP-MIB>
|
||||
|
||||
=item F<CISCO-VLAN-MEMBERSHIP-MIB>
|
||||
|
||||
=item F<CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->vtp_version()
|
||||
|
||||
(C<vtpVersion>)
|
||||
|
||||
=item $vtp->vtp_maxstore()
|
||||
|
||||
(C<vtpMaxVlanStorage>)
|
||||
|
||||
=item $vtp->vtp_notify()
|
||||
|
||||
(C<vtpNotificationsEnabled>)
|
||||
|
||||
=item $vtp->vtp_notify_create()
|
||||
|
||||
(C<vtpVlanCreatedNotifEnabled>)
|
||||
|
||||
=item $vtp->vtp_notify_delete()
|
||||
|
||||
(C<vtpVlanDeletedNotifEnabled>)
|
||||
|
||||
=item $vtp->vtp_trunk_set_serial()
|
||||
|
||||
(C<vlanTrunkPortSetSerialNo>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
Your device will only implement a subset of these methods.
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and assigned VLAN ID for access ports
|
||||
and the default VLAN ID for trunk ports.
|
||||
|
||||
=item $vtp->i_untagged()
|
||||
|
||||
An alias for C<i_vlan>.
|
||||
|
||||
=item $vtp->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of enabled VLAN list for the port.
|
||||
|
||||
Example:
|
||||
my $interfaces = $vtp->interfaces();
|
||||
my $vlans = $vtp->i_vlan_membership();
|
||||
|
||||
foreach my $iid (sort keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $vtp->i_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>)
|
||||
|
||||
See L<ftp://ftp.cisco.com/pub/mibs/supportlists/wsc5000/wsc5000-communityIndexing.html>
|
||||
for a good treaty of how to connect to the VLANs
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->v_index()
|
||||
|
||||
(C<vtpVlanIndex>)
|
||||
|
||||
=item $vtp->v_state()
|
||||
|
||||
(C<vtpVlanState>)
|
||||
|
||||
=item $vtp->v_type()
|
||||
|
||||
(C<vtpVlanType>)
|
||||
|
||||
=item $vtp->v_name()
|
||||
|
||||
(C<vtpVlanName>)
|
||||
|
||||
=item $vtp->v_mtu()
|
||||
|
||||
(C<vtpVlanMtu>)
|
||||
|
||||
=item $vtp->v_said()
|
||||
|
||||
(C<vtpVlanDot10Said>)
|
||||
|
||||
=item $vtp->v_ring()
|
||||
|
||||
(C<vtpVlanRingNumber>)
|
||||
|
||||
=item $vtp->v_bridge()
|
||||
|
||||
(C<vtpVlanBridgeNumber>)
|
||||
|
||||
=item $vtp->v_stp()
|
||||
|
||||
(C<vtpVlanStpType>)
|
||||
|
||||
=item $vtp->v_parent()
|
||||
|
||||
(C<vtpVlanParentVlan>)
|
||||
|
||||
=item $vtp->v_trans1()
|
||||
|
||||
(C<vtpVlanTranslationalVlan1>)
|
||||
|
||||
=item $vtp->v_trans2()
|
||||
|
||||
(C<vtpVlanTranslationalVlan2>)
|
||||
|
||||
=item $vtp->v_btype()
|
||||
|
||||
(C<vtpVlanBridgeType>)
|
||||
|
||||
=item $vtp->v_hop_are()
|
||||
|
||||
(C<vtpVlanAreHopCount>)
|
||||
|
||||
=item $vtp->v_hop_ste()
|
||||
|
||||
(C<vtpVlanSteHopCount>)
|
||||
|
||||
=item $vtp->v_crf()
|
||||
|
||||
(C<vtpVlanIsCRFBackup>)
|
||||
|
||||
=item $vtp->v_type_ext()
|
||||
|
||||
(C<vtpVlanTypeExt>)
|
||||
|
||||
=item $vtp->v_if()
|
||||
|
||||
(C<vtpVlanIfIndex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Membership Table (C<CISCO-VLAN-MEMBERSHIP-MIB::vmMembershipTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->i_vlan_type()
|
||||
|
||||
Static, Dynamic, or multiVlan.
|
||||
|
||||
(C<vmVlanType>)
|
||||
|
||||
=item $vtp->i_vlan2()
|
||||
|
||||
The VLAN that an access port is assigned to.
|
||||
|
||||
(C<vmVlan>)
|
||||
|
||||
=item $vtp->i_vlan_stat()
|
||||
|
||||
Inactive, active, shutdown.
|
||||
|
||||
(C<vmPortStatus>)
|
||||
|
||||
=item $vtp->i_vlan_1()
|
||||
|
||||
Each bit represents a VLAN. This is 0 through 1023
|
||||
|
||||
(C<vmVlans>)
|
||||
|
||||
=item $vtp->i_vlan_2()
|
||||
|
||||
Each bit represents a VLAN. This is 1024 through 2047
|
||||
|
||||
(C<vmVlans2k>)
|
||||
|
||||
=item $vtp->i_vlan_3()
|
||||
|
||||
Each bit represents a VLAN. This is 2048 through 3071
|
||||
|
||||
(C<vmVlans3k>)
|
||||
|
||||
=item $vtp->i_vlan_4()
|
||||
|
||||
Each bit represents a VLAN. This is 3072 through 4095
|
||||
|
||||
(C<vmVlans4k>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Membership Voice VLAN Table
|
||||
(C<CISCO-VLAN-MEMBERSHIP-MIB::vmVoiceVlanTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->i_voice_vlan()
|
||||
|
||||
(C<vmVoiceVlanId>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Management Domain Table (C<CISCO-VTP-MIB::managementDomainTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->vtp_d_name()
|
||||
|
||||
(C<managementDomainName>)
|
||||
|
||||
=item $vtp->vtp_d_mode()
|
||||
|
||||
(C<managementDomainLocalMode>)
|
||||
|
||||
=item $vtp->vtp_d_rev()
|
||||
|
||||
(C<managementDomainConfigRevNumber>)
|
||||
|
||||
=item $vtp->vtp_d_updater()
|
||||
|
||||
(C<managementDomainLastUpdater>)
|
||||
|
||||
=item $vtp->vtp_d_last()
|
||||
|
||||
(C<managementDomainLastChange>)
|
||||
|
||||
=item $vtp->vtp_d_status()
|
||||
|
||||
(C<managementDomainRowStatus>)
|
||||
|
||||
=item $vtp->vtp_d_tftp()
|
||||
|
||||
(C<managementDomainTftpServer>)
|
||||
|
||||
=item $vtp->vtp_d_tftp_path()
|
||||
|
||||
(C<managementDomainTftpPathname>)
|
||||
|
||||
=item $vtp->vtp_d_pruning()
|
||||
|
||||
(C<managementDomainPruningState>)
|
||||
|
||||
=item $vtp->vtp_d_ver()
|
||||
|
||||
(C<managementDomainVersionInUse>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 VLAN Trunk Port Table (C<CISCO-VTP-MIB::vlanTrunkPortTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->vtp_trunk_mgmt_dom()
|
||||
|
||||
(C<vlanTrunkPortManagementDomain>)
|
||||
|
||||
=item $vtp->vtp_trunk_encaps_t()
|
||||
|
||||
(C<vlanTrunkPortEncapsulationType>)
|
||||
|
||||
=item $vtp->vtp_trunk_vlans()
|
||||
|
||||
(C<vlanTrunkPortVlansEnabled>)
|
||||
|
||||
=item $vtp->vtp_trunk_vlans_2k()
|
||||
|
||||
(C<vlanTrunkPortVlansEnabled2k>)
|
||||
|
||||
=item $vtp->vtp_trunk_vlans_3k()
|
||||
|
||||
(C<vlanTrunkPortVlansEnabled3k>)
|
||||
|
||||
=item $vtp->vtp_trunk_vlans_4k()
|
||||
|
||||
(C<vlanTrunkPortVlansEnabled4k>)
|
||||
|
||||
=item $vtp->vtp_trunk_native()
|
||||
|
||||
(C<vlanTrunkPortNativeVlan>)
|
||||
|
||||
=item $vtp->i_pvid()
|
||||
|
||||
(C<vlanTrunkPortNativeVlan>)
|
||||
|
||||
=item $vtp->vtp_trunk_rstat()
|
||||
|
||||
(C<vlanTrunkPortRowStatus>)
|
||||
|
||||
=item $vtp->vtp_trunk_dyn()
|
||||
|
||||
(C<vlanTrunkPortDynamicState>)
|
||||
|
||||
=item $vtp->vtp_trunk_dyn_stat()
|
||||
|
||||
(C<vlanTrunkPortDynamicStatus>)
|
||||
|
||||
=item $vtp->vtp_trunk_vtp()
|
||||
|
||||
(C<vlanTrunkPortVtpEnabled>)
|
||||
|
||||
=item $vtp->vtp_trunk_encaps()
|
||||
|
||||
(C<vlanTrunkPortEncapsulationOperType>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item $vtp->set_i_vlan ( vlan, ifIndex )
|
||||
|
||||
Changes an access (untagged) port VLAN, must be supplied with the numeric
|
||||
VLAN ID and port C<ifIndex>. This method should only be used on end station
|
||||
(non-trunk) ports.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$vtp->interfaces()};
|
||||
$vtp->set_i_vlan('2', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port VLAN. ",$vtp->error(1);
|
||||
|
||||
=item $vtp->set_i_pvid ( pvid, ifIndex )
|
||||
|
||||
Sets port default VLAN, must be supplied with the numeric VLAN ID and
|
||||
port C<ifIndex>. This method should only be used on trunk ports.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$vtp->interfaces()};
|
||||
$vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port default VLAN. ",$vtp->error(1);
|
||||
|
||||
=item $vtp->set_i_untagged ( vlan, ifIndex )
|
||||
|
||||
This method attempts to work out whether the port referenced by ifIndex is
|
||||
trunking, and if so will return the value of C<set_i_pvid>. Otherwise, the
|
||||
value of C<set_i_vlan> is returned.
|
||||
|
||||
=item $vtp->set_add_i_vlan_tagged ( vlan, ifIndex )
|
||||
|
||||
Adds the VLAN to the enabled VLANs list of the port, must be supplied with the
|
||||
numeric VLAN ID and port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$vtp->interfaces()};
|
||||
$vtp->set_add_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't add port to egress list. ",$vtp->error(1);
|
||||
|
||||
=item $vtp->set_remove_i_vlan_tagged ( vlan, ifIndex )
|
||||
|
||||
Removes the VLAN from the enabled VLANs list of the port, must be supplied
|
||||
with the numeric VLAN ID and port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$vtp->interfaces()};
|
||||
$vtp->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't add port to egress list. ",$vtp->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
126
lib/SNMP/Info/DocsisCM.pm
Normal file
126
lib/SNMP/Info/DocsisCM.pm
Normal file
@@ -0,0 +1,126 @@
|
||||
# SNMP::Info::DocsisCM - SNMP Interface to DOCSIS Cable Modems
|
||||
#
|
||||
# Copyright (c) 2019 by The Netdisco Developer Team.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::DocsisCM;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::DocsisCM::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::DocsisCM::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.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
|
||||
296
lib/SNMP/Info/EDP.pm
Normal file
296
lib/SNMP/Info/EDP.pm
Normal file
@@ -0,0 +1,296 @@
|
||||
# SNMP::Info::EDP
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
package SNMP::Info::EDP;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::EDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::EDP::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
'EXTREME-EDP-MIB' => 'extremeEdpPortIfIndex',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
# EXTREME-EDP-MIB::extremeEdpTable
|
||||
'edp_rem_sysname' => 'extremeEdpNeighborName',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'edp_rem_sysname' => \&SNMP::Info::munge_null,
|
||||
);
|
||||
|
||||
sub hasEDP {
|
||||
my $edp = shift;
|
||||
|
||||
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
|
||||
|
||||
return 1 if ( scalar( keys %$edp_ip ) );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
# Since we need to get IP Addresses from the extremeEdpNeighborTable which has
|
||||
# a different index (adds VLAN name) than the extremeEdpTable which holds
|
||||
# the remote device details use the index from extremeEdpNeighborTable but skip
|
||||
# indexes which have an address of 0.0.0.0. Would like to include only one
|
||||
# address since they should all originate from the same device, but we don't
|
||||
# know if they would all be reachable from the network management application.
|
||||
#
|
||||
# We don't implement partials since this is private index function
|
||||
sub _edp_index {
|
||||
my $edp = shift;
|
||||
|
||||
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
|
||||
|
||||
my %edp_index;
|
||||
foreach my $key ( keys %$edp_ip ) {
|
||||
my $ip = $edp_ip->{$key};
|
||||
next if ($ip eq '0.0.0.0');
|
||||
next unless $ip;
|
||||
$edp_index{$key} = $key;
|
||||
}
|
||||
return \%edp_index;
|
||||
}
|
||||
|
||||
sub edp_if {
|
||||
my $edp = shift;
|
||||
|
||||
my $index = $edp->_edp_index() || {};
|
||||
|
||||
my %edp_if;
|
||||
foreach my $key (keys %$index) {
|
||||
my $iid = $key;
|
||||
# ifIndex is first part of the iid
|
||||
$iid = $1 if $iid =~ /^(\d+)\./;
|
||||
$edp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%edp_if;
|
||||
}
|
||||
|
||||
sub edp_ip {
|
||||
my $edp = shift;
|
||||
|
||||
my $index = $edp->_edp_index() || {};
|
||||
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
|
||||
|
||||
my %edp_ip;
|
||||
foreach my $key ( keys %$index ) {
|
||||
my $ip = $edp_ip->{$key};
|
||||
# MIB says should only be IPv4
|
||||
next unless ($ip =~ /\d+(\.\d+){3}/);
|
||||
$edp_ip{$key} = $ip;
|
||||
}
|
||||
return \%edp_ip;
|
||||
}
|
||||
|
||||
sub edp_port {
|
||||
my $edp = shift;
|
||||
|
||||
my $index = $edp->_edp_index() || {};
|
||||
my $edp_rport = $edp->extremeEdpNeighborPort() || {};
|
||||
my $edp_rslot = $edp->extremeEdpNeighborSlot() || {};
|
||||
|
||||
my %edp_port;
|
||||
foreach my $key ( sort keys %$edp_rport ) {
|
||||
my $port = $edp_rport->{$key};
|
||||
my $slot = $edp_rslot->{$key} || 0;
|
||||
next unless $port;
|
||||
my $slotport = defined $slot ? "$slot\/$port" : $port;
|
||||
|
||||
foreach my $iid ( sort keys %$index ) {
|
||||
$edp_port{$iid} = $slotport if ($iid =~ /^$key/);
|
||||
}
|
||||
}
|
||||
return \%edp_port;
|
||||
}
|
||||
|
||||
sub edp_id {
|
||||
my $edp = shift;
|
||||
|
||||
my $index = $edp->_edp_index() || {};
|
||||
my $edp_name = $edp->edp_rem_sysname() || {};
|
||||
|
||||
my %edp_name;
|
||||
foreach my $key ( sort keys %$edp_name ) {
|
||||
my $name = $edp_name->{$key} || 0;
|
||||
next unless $name;
|
||||
|
||||
foreach my $iid ( sort keys %$index ) {
|
||||
$edp_name{$iid} = $name if ($iid =~ /^$key/);
|
||||
}
|
||||
}
|
||||
return \%edp_name;
|
||||
}
|
||||
|
||||
sub edp_ver {
|
||||
my $edp = shift;
|
||||
|
||||
my $index = $edp->_edp_index() || {};
|
||||
my $edp_ver = $edp->extremeEdpNeighborSoftwareVersion() || {};
|
||||
|
||||
my %edp_ver;
|
||||
foreach my $key ( sort keys %$edp_ver ) {
|
||||
my $ver = $edp_ver->{$key} || 0;
|
||||
next unless $ver;
|
||||
|
||||
foreach my $iid ( sort keys %$index ) {
|
||||
$edp_ver{$iid} = $ver if ($iid =~ /^$key/);
|
||||
}
|
||||
}
|
||||
return \%edp_ver;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::EDP - SNMP Interface to the Extreme Discovery Protocol (EDP)
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $edp = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $edp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
$hasedp = $edp->hasEDP() ? 'yes' : 'no';
|
||||
|
||||
# Print out a map of device ports with EDP neighbors:
|
||||
my $interfaces = $edp->interfaces();
|
||||
my $edp_if = $edp->edp_if();
|
||||
my $edp_ip = $edp->edp_ip();
|
||||
my $edp_port = $edp->edp_port();
|
||||
|
||||
foreach my $edp_key (keys %$edp_ip){
|
||||
my $iid = $edp_if->{$edp_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $edp_ip->{$edp_key};
|
||||
my $neighbor_port = $edp_port->{$edp_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to EDP information through SNMP.
|
||||
|
||||
EDP is a Layer 2 protocol that allows a network device to advertise its
|
||||
identity and capabilities on the local network providing topology information.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<EXTREME-EDP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $edp->hasEDP()
|
||||
|
||||
Is EDP active on this device?
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $edp->edp_id()
|
||||
|
||||
Returns the string value used to identify the chassis component associated
|
||||
with the remote system.
|
||||
|
||||
(C<extremeEdpNeighborName>)
|
||||
|
||||
=item $edp->edp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
=item $edp->edp_ip()
|
||||
|
||||
Returns remote IPv4 address.
|
||||
|
||||
=item $edp->edp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
=item $edp->edp_ver()
|
||||
|
||||
Returns the operating system version of the remote system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<extremeEdpNeighborSoftwareVersion>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
348
lib/SNMP/Info/Entity.pm
Normal file
348
lib/SNMP/Info/Entity.pm
Normal file
@@ -0,0 +1,348 @@
|
||||
# SNMP::Info::Entity
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Entity;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Entity::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
'e_alias' => 'entPhysicalAlias',
|
||||
'e_class' => 'entPhysicalClass',
|
||||
'e_descr' => 'entPhysicalDescr',
|
||||
'e_fwver' => 'entPhysicalFirmwareRev',
|
||||
'e_fru' => 'entPhysicalIsFRU',
|
||||
'e_hwver' => 'entPhysicalHardwareRev',
|
||||
'e_id' => 'entPhysicalAssetID',
|
||||
'e_map' => 'entAliasMappingIdentifier',
|
||||
'e_model' => 'entPhysicalModelName',
|
||||
'e_name' => 'entPhysicalName',
|
||||
'e_parent' => 'entPhysicalContainedIn',
|
||||
'e_pos' => 'entPhysicalParentRelPos',
|
||||
'e_serial' => 'entPhysicalSerialNum',
|
||||
'e_swver' => 'entPhysicalSoftwareRev',
|
||||
'e_type' => 'entPhysicalVendorType',
|
||||
'e_vendor' => 'entPhysicalMfgName',
|
||||
);
|
||||
|
||||
%MUNGE = ( 'e_type' => \&SNMP::Info::munge_e_type, );
|
||||
|
||||
# entPhysicalIndex is not-accessible. Create to facilitate emulation methods
|
||||
# in other classes
|
||||
|
||||
sub e_index {
|
||||
my $entity = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Force use of MIB leaf to avoid inheritance issues in pseudo classes
|
||||
my $e_descr = $entity->entPhysicalDescr($partial);
|
||||
|
||||
return unless ($e_descr);
|
||||
|
||||
my %e_index;
|
||||
|
||||
foreach my $iid ( keys %$e_descr ) {
|
||||
$e_index{$iid} = $iid;
|
||||
}
|
||||
return \%e_index;
|
||||
}
|
||||
|
||||
sub e_port {
|
||||
my $entity = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $e_map = $entity->e_map($partial);
|
||||
|
||||
my %e_port;
|
||||
|
||||
foreach my $e_id ( keys %$e_map ) {
|
||||
my $id = $e_id;
|
||||
$id =~ s/\.0$//;
|
||||
|
||||
my $iid = $e_map->{$e_id};
|
||||
$iid =~ s/.*\.//;
|
||||
|
||||
$e_port{$id} = $iid;
|
||||
}
|
||||
|
||||
return \%e_port;
|
||||
}
|
||||
|
||||
sub entity_derived_serial {
|
||||
my $entity = shift;
|
||||
|
||||
my $e_parent = $entity->e_parent() || {};
|
||||
my $e_class = $entity->e_class() || {};
|
||||
|
||||
# Sort keys to return a consistent result between runs
|
||||
foreach my $iid ( sort keys %$e_parent ) {
|
||||
my $parent = $e_parent->{$iid};
|
||||
my $class = $e_class->{$iid} || '';
|
||||
# Only consider serial numbers for entries without a parent, or
|
||||
# if they are of type "chassis"
|
||||
if ( $parent eq '0' or $class eq 'chassis') {
|
||||
my $serial = $entity->e_serial($iid);
|
||||
if ( $serial && $serial->{$iid} ) {
|
||||
return $serial->{$iid};
|
||||
}
|
||||
else {
|
||||
my $descr = $entity->e_descr($iid);
|
||||
if ( $descr and $descr->{$iid} =~ /serial#?:\s*([a-z0-9]+)/i )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub entity_derived_os_ver {
|
||||
my $entity = shift;
|
||||
|
||||
my $e_parent = $entity->e_parent() || {};
|
||||
my $e_class = $entity->e_class() || {};
|
||||
|
||||
# Sort keys to return a consistent result between runs
|
||||
foreach my $iid ( sort keys %$e_parent ) {
|
||||
my $parent = $e_parent->{$iid};
|
||||
my $class = $e_class->{$iid} || '';
|
||||
# Only consider serial numbers for entries without a parent, or
|
||||
# if they are of type "chassis"
|
||||
if ( $parent eq '0' or $class eq 'chassis') {
|
||||
my $os_ver = $entity->e_swver($iid);
|
||||
if ( $os_ver && $os_ver->{$iid} ) {
|
||||
return $os_ver->{$iid};
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Entity - SNMP Interface to data stored in F<ENTITY-MIB>. RFC 2737
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $entity = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $entity->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
F<ENTITY-MIB> is used by Layer 2 devices from Brocade, Cisco, HP,
|
||||
and more.
|
||||
|
||||
See RFC 2737 for full details.
|
||||
|
||||
Create or use a device subclass that inherit this class. Do not use directly.
|
||||
|
||||
For debugging purposes you can call this class directly as you would
|
||||
SNMP::Info
|
||||
|
||||
my $entity = new SNMP::Info::Entity (...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ENTITY-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
none.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $entity->entity_derived_serial()
|
||||
|
||||
Tries to determine the device serial number from the F<ENTITY-MIB>. Only
|
||||
considers serial numbers for entries without a parent, or if they are of type
|
||||
chassis. Looks at C<entPhysicalSerialNum> and then C<entPhysicalDescr> for
|
||||
serial number.
|
||||
|
||||
=item $entity->entity_derived_os_ver()
|
||||
|
||||
Tries to determine the device OS version from the F<ENTITY-MIB>. Only
|
||||
considers serial numbers for entries without a parent, or if they are of type
|
||||
chassis. Looks at C<entPhysicalSoftwareRev> for the version.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Entity Table
|
||||
|
||||
=over
|
||||
|
||||
=item $entity->e_index()
|
||||
|
||||
Index
|
||||
|
||||
(C<entPhysicalIndex>)
|
||||
|
||||
=item $entity->e_alias()
|
||||
|
||||
Human entered, not usually used.
|
||||
|
||||
(C<entPhysicalAlias>)
|
||||
|
||||
=item $entity->e_class()
|
||||
|
||||
Stack, Module, Container, Port ...
|
||||
|
||||
(C<entPhysicalClass>)
|
||||
|
||||
=item $entity->e_descr()
|
||||
|
||||
Human Friendly
|
||||
|
||||
(C<entPhysicalClass>)
|
||||
|
||||
=item $entity->e_fwver()
|
||||
|
||||
(C<entPhysicalFirmwareRev>)
|
||||
|
||||
=item $entity->e_fru()
|
||||
|
||||
BOOLEAN. Is a Field Replaceable unit?
|
||||
|
||||
(C<entPhysicalFRU>)
|
||||
|
||||
=item $entity->e_hwver()
|
||||
|
||||
(C<entPhysicalHardwareRev>)
|
||||
|
||||
=item $entity->e_id()
|
||||
|
||||
This is human entered and not normally used.
|
||||
|
||||
(C<entPhysicalAssetID>)
|
||||
|
||||
=item $entity->e_map()
|
||||
|
||||
See MIB.
|
||||
|
||||
(C<entAliasMappingIdentifier>)
|
||||
|
||||
=item $entity->e_model()
|
||||
|
||||
Model Name of Entity.
|
||||
|
||||
(C<entPhysicalModelName>)
|
||||
|
||||
=item $entity->e_name()
|
||||
|
||||
More computer friendly name of entity. Parse me.
|
||||
|
||||
(C<entPhysicalName>)
|
||||
|
||||
=item $entity->e_parent()
|
||||
|
||||
0 if root.
|
||||
|
||||
(C<entPhysicalContainedIn>)
|
||||
|
||||
=item $entity->e_port()
|
||||
|
||||
Maps Entity Table entries to the Interface Table (C<IfTable>) using
|
||||
$entity->e_map()
|
||||
|
||||
=item $entity->e_pos()
|
||||
|
||||
The relative position among all entities sharing the same parent.
|
||||
|
||||
(C<entPhysicalParentRelPos>)
|
||||
|
||||
=item $entity->e_serial()
|
||||
|
||||
(C<entPhysicalSerialNum>)
|
||||
|
||||
=item $entity->e_swver()
|
||||
|
||||
(C<entPhysicalSoftwareRev>)
|
||||
|
||||
=item $entity->e_type()
|
||||
|
||||
This is an OID, which gets munged into the object name if the right
|
||||
MIB is loaded.
|
||||
|
||||
(C<entPhysicalVendorType>)
|
||||
|
||||
=item $entity->e_vendor()
|
||||
|
||||
Vendor of Module.
|
||||
|
||||
(C<entPhysicalMfgName>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
253
lib/SNMP/Info/EtherLike.pm
Normal file
253
lib/SNMP/Info/EtherLike.pm
Normal file
@@ -0,0 +1,253 @@
|
||||
# SNMP::Info::EtherLike
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::EtherLike;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::EtherLike::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::EtherLike::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# EtherLike StatsTable
|
||||
'el_chipset' => 'dot3StatsEtherChipSet',
|
||||
'el_coll_excess' => 'dot3StatsExcessiveCollisions',
|
||||
'el_coll_late' => 'dot3StatsLateCollisions',
|
||||
'el_coll_mult' => 'dot3StatsMultipleCollisionFrames',
|
||||
'el_coll_single' => 'dot3StatsSingleCollisionFrames',
|
||||
'el_duplex' => 'dot3StatsDuplexStatus',
|
||||
'el_error_alignment' => 'dot3StatsAlignmentErrors',
|
||||
'el_error_fcs' => 'dot3StatsFCSErrors',
|
||||
'el_error_cs' => 'dot3StatsCarrierSenseErrors',
|
||||
'el_error_frame' => 'dot3StatsFrameTooLongs',
|
||||
'el_error_mac_rec' => 'dot3StatsInternalMacReceiveErrors',
|
||||
'el_error_mac_xmit' => 'dot3StatsInternalMacTransmitErrors',
|
||||
'el_error_sqe' => 'dot3StatsSQETestErrors',
|
||||
'el_error_symbol' => 'dot3StatsSymbolErrors',
|
||||
'el_index' => 'dot3StatsIndex',
|
||||
'el_xmit_defer' => 'dot3StatsDeferredTransmissions',
|
||||
|
||||
# Ethernet-like Collision Statistics Group
|
||||
'el_coll_freq' => 'dot3CollFrequencies',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::MUNGE, 'el_duplex' => \&munge_el_duplex, );
|
||||
|
||||
sub munge_el_duplex {
|
||||
my $duplex = shift;
|
||||
return unless defined $duplex;
|
||||
|
||||
$duplex =~ s/Duplex$//;
|
||||
return $duplex;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::EtherLike - SNMP Interface to SNMP F<ETHERLIKE-MIB> RFC 1398
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $el = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $el->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
# Find the duplex setting for a port on a device that implements
|
||||
# ETHERLIKE-MIB
|
||||
my $interfaces = $el->interfaces();
|
||||
my $el_index = $el->el_index();
|
||||
my $el_duplex = $el->el_duplex();
|
||||
|
||||
foreach my $el_port (keys %$el_duplex){
|
||||
my $duplex = $el_duplex->{$el_port};
|
||||
my $iid = $el_index->{$el_port};
|
||||
my $port = $interfaces->{$iid};
|
||||
|
||||
print "PORT:$port set to duplex:$duplex\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies
|
||||
access to the F<ETHERLIKE-MIB> used by some Layer 3 Devices such as
|
||||
Cisco routers.
|
||||
|
||||
See RFC 1398 for more details.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one. Do not use
|
||||
directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ETHERLIKE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item None
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 ETHERLIKE STATS TABLE (C<dot3StatsTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $el->el_index()
|
||||
|
||||
Returns reference to hash. Indexes Stats Table to the interface index (iid).
|
||||
|
||||
(C<dot3StatsIndex>)
|
||||
|
||||
=item $el->el_duplex()
|
||||
|
||||
Returns reference to hash. Indexes Stats Table to Duplex Status of port.
|
||||
|
||||
(C<dot3StatsDuplexStatus>)
|
||||
|
||||
=item $el->el_chipset()
|
||||
|
||||
(C<dot3StatsEtherChipSet>)
|
||||
|
||||
=item $el->el_coll_excess()
|
||||
|
||||
(C<dot3StatsExcessiveCollisions>)
|
||||
|
||||
=item $el->el_coll_late()
|
||||
|
||||
(C<dot3StatsLateCollisions>)
|
||||
|
||||
=item $el->el_coll_mult()
|
||||
|
||||
(C<dot3StatsMultipleCollisionFrames>)
|
||||
|
||||
=item $el->el_coll_single()
|
||||
|
||||
(C<dot3StatsSingleCollisionFrames>)
|
||||
|
||||
=item $el->el_error_alignment()
|
||||
|
||||
(C<dot3StatsAlignmentErrors>)
|
||||
|
||||
=item $el->el_error_fcs()
|
||||
|
||||
(C<dot3StatsFCSErrors>)
|
||||
|
||||
=item $el->el_error_cs()
|
||||
|
||||
(C<dot3StatsCarrierSenseErrors>)
|
||||
|
||||
=item $el->el_error_frame()
|
||||
|
||||
(C<dot3StatsFrameTooLongs>)
|
||||
|
||||
=item $el->el_error_mac_rec()
|
||||
|
||||
(C<dot3StatsInternalMacReceiveErrors>)
|
||||
|
||||
=item $el->el_error_mac_xmit()
|
||||
|
||||
(C<dot3StatsInternalMacTransmitErrors>)
|
||||
|
||||
=item $el->el_error_sqe()
|
||||
|
||||
(C<dot3StatsSQETestErrors>)
|
||||
|
||||
=item $el->el_error_symbol()
|
||||
|
||||
(C<dot3StatsSymbolErrors>)
|
||||
|
||||
=item $el->el_xmit_defer()
|
||||
|
||||
(C<dot3StatsDeferredTransmissions>)
|
||||
|
||||
=item $el->el_coll_count()
|
||||
|
||||
(C<dot3CollCount>)
|
||||
|
||||
=item $el->el_coll_freq()
|
||||
|
||||
(C<dot3CollFrequencies>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $el->munge_el_duplex()
|
||||
|
||||
Removes 'Duplex' from the end of a string.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
369
lib/SNMP/Info/FDP.pm
Normal file
369
lib/SNMP/Info/FDP.pm
Normal file
@@ -0,0 +1,369 @@
|
||||
# SNMP::Info::FDP
|
||||
#
|
||||
# Copyright (c) 2008 Bruce Rodger, Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::FDP;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::FDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::FDP::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
|
||||
|
||||
%GLOBALS = (
|
||||
'fdp_run' => 'snFdpGlobalRun',
|
||||
'fdp_interval' => 'snFdpGlobalMessageInterval',
|
||||
'fdp_holdtime' => 'snFdpGlobalHoldTime',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
'fdp_proto' => 'snFdpCacheAddressType',
|
||||
'fdp_ip' => 'snFdpCacheAddress',
|
||||
'fdp_ver' => 'snFdpCacheVersion',
|
||||
'fdp_id' => 'snFdpCacheDeviceId',
|
||||
'fdp_port' => 'snFdpCacheDevicePort',
|
||||
'fdp_platform' => 'snFdpCachePlatform',
|
||||
'fdp_capabilities' => 'snFdpCacheCapabilities',
|
||||
'fdp_cache_type' => 'snFdpCacheVendorId',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'fdp_capabilities' => \&SNMP::Info::munge_bits,
|
||||
'fdp_ip' => \&SNMP::Info::munge_ip,
|
||||
);
|
||||
|
||||
sub fdp_run {
|
||||
my $fdp = shift;
|
||||
my $fdp_run = $fdp->orig_fdp_run();
|
||||
|
||||
# if fdp_run isn't implemented on device, assume FDP is on
|
||||
return $fdp_run if defined $fdp_run;
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub hasFDP {
|
||||
my $fdp = shift;
|
||||
|
||||
my $ver = $fdp->snmp_ver();
|
||||
|
||||
# SNMP v1 clients dont have the globals
|
||||
if ( defined $ver and $ver == 1 ) {
|
||||
my $fdp_ip = $fdp->fdp_ip();
|
||||
|
||||
# See if anything in fdp cache, if so we have fdp
|
||||
return 1 if ( defined $fdp_ip and scalar( keys %$fdp_ip ) );
|
||||
return;
|
||||
}
|
||||
|
||||
return $fdp->fdp_run();
|
||||
}
|
||||
|
||||
sub fdp_if {
|
||||
my $fdp = shift;
|
||||
|
||||
my $fdp_ip = $fdp->fdp_ip();
|
||||
unless ( defined $fdp_ip ) {
|
||||
$fdp->error_throw(
|
||||
"SNMP::Info::FDP:fdp_if() - Device doesn't have fdp_ip() data. Can't fake fdp_index()"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
my %fdp_if;
|
||||
foreach my $key ( keys %$fdp_ip ) {
|
||||
next unless defined $key;
|
||||
my $iid = $key;
|
||||
|
||||
# Truncate .1 from fdp cache entry
|
||||
$iid =~ s/\.\d+$//;
|
||||
$fdp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%fdp_if;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::FDP - SNMP Interface to Foundry Discovery Protocol (FDP) using
|
||||
SNMP
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bruce Rodger, Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $fdp = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $fdp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
$hasfdp = $fdp->hasFDP() ? 'yes' : 'no';
|
||||
|
||||
# Print out a map of device ports with FDP neighbors:
|
||||
my $interfaces = $fdp->interfaces();
|
||||
my $fdp_if = $fdp->fdp_if();
|
||||
my $fdp_ip = $fdp->fdp_ip();
|
||||
my $fdp_port = $fdp->fdp_port();
|
||||
|
||||
foreach my $fdp_key (keys %$fdp_ip){
|
||||
my $iid = $fdp_if->{$fdp_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $fdp_ip->{$fdp_key};
|
||||
my $neighbor_port = $fdp_port->{$fdp_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::FDP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to FDP information through SNMP.
|
||||
|
||||
FDP is a Layer 2 protocol that supplies topology information of
|
||||
devices that also speak FDP, mostly switches and routers. It has
|
||||
similar functionality to Cisco's CDP, and the SNMP interface is
|
||||
virtually identical. FDP is implemented in Brocade (Foundry) devices.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
Each device implements a subset of the global and cache entries.
|
||||
Check the return value to see if that data is held by the device.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
|
||||
|
||||
Needs a reasonably recent MIB. Works OK with B2R07604A.mib, but doesn't
|
||||
work with B2R07600C.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $fdp->hasFDP()
|
||||
|
||||
Is FDP is active in this device?
|
||||
|
||||
Accounts for SNMP version 1 devices which may have FDP but not fdp_run()
|
||||
|
||||
=item $fdp->fdp_run()
|
||||
|
||||
Is FDP enabled on this device?
|
||||
|
||||
(C<fdpGlobalRun>)
|
||||
|
||||
=item $fdp->fdp_interval()
|
||||
|
||||
Interval in seconds at which FDP messages are generated.
|
||||
|
||||
(C<fdpGlobalMessageInterval>)
|
||||
|
||||
=item $fdp->fdp_holdtime()
|
||||
|
||||
Time in seconds that FDP messages are kept.
|
||||
|
||||
(C<fdpGlobalHoldTime>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
CDP compatibility
|
||||
|
||||
=over
|
||||
|
||||
=item $fdp->fdp_interval()
|
||||
|
||||
Interval in seconds at which FDP messages are generated.
|
||||
|
||||
(C<fdpGlobalMessageInterval>)
|
||||
|
||||
=item $fdp->fdp_holdtime()
|
||||
|
||||
Time in seconds that FDP messages are kept.
|
||||
|
||||
(C<fdpGlobalHoldTime>)
|
||||
|
||||
=item $fdp->fdp_id()
|
||||
|
||||
Returns FDP device ID.
|
||||
|
||||
This is the device id broadcast via FDP to other devices, and is what is
|
||||
retrieved from remote devices with $fdp->id().
|
||||
|
||||
(C<fdpGlobalDeviceId>)
|
||||
|
||||
=item $fdp->fdp_run()
|
||||
|
||||
Is FDP enabled on this device?
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
CDP compatibility
|
||||
|
||||
=over
|
||||
|
||||
=item $fdp->fdp_capabilities()
|
||||
|
||||
Returns Device Functional Capabilities. Results are munged into an ascii
|
||||
binary string, MSB. Each digit represents a bit from the table below.
|
||||
|
||||
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
|
||||
|
||||
(Bit) - Description
|
||||
|
||||
=over
|
||||
|
||||
=item (0x40) - Provides level 1 functionality.
|
||||
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
|
||||
non router ports.
|
||||
|
||||
=item (0x10) - Sends and receives packets for at least one network layer
|
||||
protocol. If the device is routing the protocol, this bit should not be set.
|
||||
|
||||
=item (0x08) - Performs level 2 switching. The difference between this bit
|
||||
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
|
||||
device is assumed to be deployed in a physical loop-free topology.
|
||||
|
||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
|
||||
would set both this bit and bit 0x02.
|
||||
|
||||
=item (0x02) - Performs level 2 transparent bridging.
|
||||
|
||||
=item (0x01) - Performs level 3 routing for at least one network layer
|
||||
protocol.
|
||||
|
||||
=back
|
||||
|
||||
Thanks to Martin Lorensen for a pointer to this information.
|
||||
|
||||
(C<fdpCacheCapabilities>)
|
||||
|
||||
=item $fdp->fdp_id()
|
||||
|
||||
Returns remote device id string
|
||||
|
||||
(C<fdpCacheDeviceId>)
|
||||
|
||||
=item $fdp->fdp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
In order to map the fdp table entry back to the interfaces() entry, we
|
||||
truncate the last number off of it :
|
||||
|
||||
my $fdp_ip = $device->fdp_ip();
|
||||
|
||||
my %fdp_if
|
||||
foreach my $key (keys %$fdp_ip){
|
||||
$iid = $key;
|
||||
## Truncate off .1 from fdp response
|
||||
$iid =~ s/\.\d+$//;
|
||||
$fdp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%fdp_if;
|
||||
|
||||
=item $fdp->fdp_ip()
|
||||
|
||||
Returns remote IP address
|
||||
|
||||
(C<fdpCacheAddress>)
|
||||
|
||||
=item $fdp->fdp_platform()
|
||||
|
||||
Returns remote platform id
|
||||
|
||||
(C<fdpCachePlatform>)
|
||||
|
||||
=item $fdp->fdp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
(C<fdpDevicePort>)
|
||||
|
||||
=item $fdp->fdp_proto()
|
||||
|
||||
Returns remote address type received. Usually IP.
|
||||
|
||||
(C<fdpCacheAddressType>)
|
||||
|
||||
=item $fdp->fdp_ver()
|
||||
|
||||
Returns remote hardware version
|
||||
|
||||
(C<fdpCacheVersion>)
|
||||
|
||||
=item $fdp->fdp_cache_type()
|
||||
|
||||
Returns type of entry received, either FDP or CDP.
|
||||
|
||||
(C<snFdpCacheVendorId>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
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
|
||||
408
lib/SNMP/Info/IEEE802dot11.pm
Normal file
408
lib/SNMP/Info/IEEE802dot11.pm
Normal file
@@ -0,0 +1,408 @@
|
||||
# SNMP::Info::IEEE802dot11
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::IEEE802dot11;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::IEEE802dot11::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::IEEE802dot11::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# dot11PhyOFDMTable
|
||||
'dot11_cur_freq' => 'dot11CurrentFrequency',
|
||||
|
||||
# dot11PhyDSSSTable
|
||||
'dot11_cur_ch' => 'dot11CurrentChannel',
|
||||
|
||||
# dot11PhyOperationTable
|
||||
'dot11_phy_type' => 'dot11PHYType',
|
||||
'dot11_reg_dom' => 'dot11CurrentRegDomain',
|
||||
|
||||
# dot11ResourceInfoTable
|
||||
'dot11_prod_ver' => 'dot11manufacturerProductVersion',
|
||||
'dot11_prod_name' => 'dot11manufacturerProductName',
|
||||
'dot11_man_name' => 'dot11manufacturerName',
|
||||
|
||||
# dot11OperationTable
|
||||
'dot11_mac' => 'dot11MACAddress',
|
||||
|
||||
# dot11StationConfigTable
|
||||
'dot11_bss_type' => 'dot11DesiredBSSType',
|
||||
'i_ssidlist' => 'dot11DesiredSSID',
|
||||
'dot11_pwr_mode' => 'dot11PowerManagementMode',
|
||||
'dot11_sta_id' => 'dot11StationID',
|
||||
|
||||
# dot11PhyTxPowerTable
|
||||
'dot11_cur_tx_pwr' => 'dot11CurrentTxPowerLevel',
|
||||
'dot11_tx_pwr_level_1' => 'dot11TxPowerLevel1',
|
||||
'dot11_tx_pwr_level_2' => 'dot11TxPowerLevel2',
|
||||
'dot11_tx_pwr_level_3' => 'dot11TxPowerLevel3',
|
||||
'dot11_tx_pwr_level_4' => 'dot11TxPowerLevel4',
|
||||
'dot11_tx_pwr_level_5' => 'dot11TxPowerLevel5',
|
||||
'dot11_tx_pwr_level_6' => 'dot11TxPowerLevel6',
|
||||
'dot11_tx_pwr_level_7' => 'dot11TxPowerLevel7',
|
||||
'dot11_tx_pwr_level_8' => 'dot11TxPowerLevel8',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'dot11_mac' => \&SNMP::Info::munge_mac,
|
||||
'dot11_sta_id' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $names = $dot11->dot11_man_name();
|
||||
|
||||
foreach my $iid ( keys %$names ) {
|
||||
my $vendor = $names->{$iid};
|
||||
next unless defined $vendor;
|
||||
if ( $vendor =~ /^(\S+)/ ) {
|
||||
return lc($1);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $names = $dot11->dot11_prod_name();
|
||||
|
||||
foreach my $iid ( keys %$names ) {
|
||||
my $prod = $names->{$iid};
|
||||
next unless defined $prod;
|
||||
return lc($prod);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $versions = $dot11->dot11_prod_ver();
|
||||
|
||||
foreach my $iid ( keys %$versions ) {
|
||||
my $ver = $versions->{$iid};
|
||||
next unless defined $ver;
|
||||
if ( $ver =~ /([\d\.]+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $phy_type = $dot11->dot11_phy_type() || {};
|
||||
my $cur_freq = $dot11->dot11_cur_freq() || {};
|
||||
my $cur_ch = $dot11->dot11_cur_ch() || {};
|
||||
|
||||
my %i_80211channel;
|
||||
foreach my $iid ( keys %$phy_type ) {
|
||||
my $type = $phy_type->{$iid};
|
||||
next unless defined $type;
|
||||
if ( $type =~ /dsss/ ) {
|
||||
my $ch = $cur_ch->{$iid};
|
||||
next unless defined $ch;
|
||||
$i_80211channel{$iid} = $ch;
|
||||
}
|
||||
elsif ( $type =~ /ofdm/ ) {
|
||||
my $ch = $cur_freq->{$iid};
|
||||
next unless defined $ch;
|
||||
$i_80211channel{$iid} = $ch;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
return \%i_80211channel;
|
||||
}
|
||||
|
||||
sub dot11_cur_tx_pwr_mw {
|
||||
my $dot11 = shift;
|
||||
my $partial = shift;
|
||||
my $cur = $dot11->dot11_cur_tx_pwr($partial);
|
||||
my $dot11_cur_tx_pwr_mw = {};
|
||||
foreach my $idx ( keys %$cur ) {
|
||||
my $pwr = $cur->{$idx};
|
||||
if ( $pwr >= 1 && $pwr <= 8 ) {
|
||||
|
||||
# ToDo - Look at string eval
|
||||
my $mw
|
||||
= eval "\$dot11->dot11_tx_pwr_level_$pwr(\$idx)"; ## no critic
|
||||
$dot11_cur_tx_pwr_mw->{$idx} = $mw->{$idx};
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return $dot11_cur_tx_pwr_mw;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::IEEE802dot11 - SNMP Interface to data from F<IEEE802dot11-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $dot11 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $dot11->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::IEEE802dot11 is a subclass of SNMP::Info that provides an
|
||||
interface to F<IEEE802dot11-MIB>. This MIB is used in standards based
|
||||
802.11 wireless devices.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one.
|
||||
Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
None.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<IEEE802dot11-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->vendor()
|
||||
|
||||
Tries to discover the vendor from dot11_man_name() - returns lower case
|
||||
of the first word in the first instance found.
|
||||
|
||||
=item $dot11->model()
|
||||
|
||||
Tries to discover the model from dot11_prod_name() - returns lower case
|
||||
of the first instance found.
|
||||
|
||||
=item $dot11->os_ver()
|
||||
|
||||
Tries to discover the operating system version from dot11_prod_ver() - returns
|
||||
string of numeric and decimals in the first instance found.
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->i_ssidlist()
|
||||
|
||||
Returns reference to hash. SSID's recognized by the radio interface.
|
||||
|
||||
(C<dot11DesiredSSID>)
|
||||
|
||||
=item $dot11->i_80211channel()
|
||||
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface.
|
||||
|
||||
=item $dot11->dot11_cur_tx_pwr_mw()
|
||||
|
||||
Returns reference to hash. Current transmit power, in milliwatts, of the
|
||||
radio interface.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Phy OFDM Table (C<dot11PhyOFDMTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_cur_freq()
|
||||
|
||||
(C<dot11CurrentFrequency>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Phy DSSS Table (C<dot11PhyDSSSTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_cur_ch()
|
||||
|
||||
(C<dot11CurrentChannel>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Phy Operation Table (C<dot11PhyOperationTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_phy_type()
|
||||
|
||||
(C<dot11PHYType>)
|
||||
|
||||
=item $dot11->dot11_reg_dom()
|
||||
|
||||
(C<dot11CurrentRegDomain>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Resource Information Table (C<dot11ResourceInfoTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_prod_ver()
|
||||
|
||||
(C<dot11manufacturerProductVersion>)
|
||||
|
||||
=item $dot11->dot11_prod_name()
|
||||
|
||||
(C<dot11manufacturerProductName>)
|
||||
|
||||
=item $dot11->dot11_man_name()
|
||||
|
||||
(C<dot11manufacturerName>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Operation Table (C<dot11OperationTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_mac()
|
||||
|
||||
(C<dot11MACAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Station Configuration Table (C<dot11StationConfigTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_bss_type()
|
||||
|
||||
(C<dot11DesiredBSSType>)
|
||||
|
||||
=item $dot11->dot11_pwr_mode()
|
||||
|
||||
(C<dot11PowerManagementMode>)
|
||||
|
||||
=item $dot11->dot11_sta_id()
|
||||
|
||||
(C<dot11StationID>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Transmission Power Table (C<dot11PhyTxPowerTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_cur_tx_pwr()
|
||||
|
||||
(C<dot11CurrentTxPowerLevel>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_1()
|
||||
|
||||
(C<dot11TxPowerLevel1>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_2()
|
||||
|
||||
(C<dot11TxPowerLevel2>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_3()
|
||||
|
||||
(C<dot11TxPowerLevel3>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_4()
|
||||
|
||||
(C<dot11TxPowerLevel4>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_5()
|
||||
|
||||
(C<dot11TxPowerLevel5>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_6()
|
||||
|
||||
(C<dot11TxPowerLevel6>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_7()
|
||||
|
||||
(C<dot11TxPowerLevel7>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_8()
|
||||
|
||||
(C<dot11TxPowerLevel8>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
153
lib/SNMP/Info/IEEE802dot3ad.pm
Normal file
153
lib/SNMP/Info/IEEE802dot3ad.pm
Normal file
@@ -0,0 +1,153 @@
|
||||
# SNMP::Info::IEEE802dot3ad
|
||||
#
|
||||
# Copyright (c) 2018 SNMP::Info Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::IEEE802dot3ad;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Aggregate;
|
||||
|
||||
@SNMP::Info::IEEE802dot3ad::ISA = qw/
|
||||
SNMP::Info::Aggregate
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::IEEE802dot3ad::EXPORT_OK = qw/
|
||||
agg_ports_lag
|
||||
/;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Aggregate::MIBS,
|
||||
'IEEE8023-LAG-MIB' => 'dot3adAggPortSelectedAggID',
|
||||
);
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
'ad_lag_ports' => 'dot3adAggPortListPorts',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'ad_lag_ports' => \&SNMP::Info::munge_port_list,
|
||||
);
|
||||
|
||||
sub agg_ports_lag {
|
||||
my $dev = shift;
|
||||
|
||||
# TODO: implement partial
|
||||
my $ports = $dev->ad_lag_ports();
|
||||
my $index = $dev->bp_index() || {};
|
||||
|
||||
return {} unless ref {} eq ref $ports and scalar keys %$ports;
|
||||
|
||||
my $ret = {};
|
||||
foreach my $m ( keys %$ports ) {
|
||||
my $idx = $m;
|
||||
my $portlist = $ports->{$m};
|
||||
next unless $portlist;
|
||||
|
||||
# While dot3adAggTable is indexed by ifIndex, the portlist is indexed
|
||||
# with a dot1dBasePort, so we need to use dot1dBasePortIfIndex to map to
|
||||
# the ifIndex. If we don't have dot1dBasePortIfIndex assume
|
||||
# dot1dBasePort = ifIndex
|
||||
for ( my $i = 0; $i <= scalar(@$portlist); $i++ ) {
|
||||
my $ifindex = $i+1;
|
||||
if ( exists($index->{$i+1}) and defined($index->{$i+1}) ) {
|
||||
$ifindex = $index->{$i+1};
|
||||
}
|
||||
$ret->{$ifindex} = $idx if ( @$portlist[$i] );
|
||||
}
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::IEEE802dot3ad - SNMP Interface to IEEE Aggregated Links
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
SNMP::Info Developers
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class provides access to Aggregated Links configuration on devices
|
||||
implementing C<IEEE8023-LAG-MIB>.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
L<SNMP::Info::Aggregate>
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<IEEE8023-LAG-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=over 4
|
||||
|
||||
=item C<agg_ports_lag>
|
||||
|
||||
Returns a HASH reference mapping from slave to master port for each member of
|
||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||
ifIndex of the corresponding master ports.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
560
lib/SNMP/Info/IPv6.pm
Normal file
560
lib/SNMP/Info/IPv6.pm
Normal file
@@ -0,0 +1,560 @@
|
||||
# SNMP::Info::IPv6
|
||||
#
|
||||
# Copyright (c) 2010 Jeroen van Ingen and Carlos Vicente
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::IPv6;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::IPv6::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::IPv6::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, $METHOD);
|
||||
|
||||
use constant {
|
||||
IPMIB => 1,
|
||||
CISCO => 2,
|
||||
IPV6MIB => 3,
|
||||
};
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
|
||||
|
||||
%MIBS = (
|
||||
'IP-MIB' => 'ipv6InterfaceTableLastChange',
|
||||
'IPV6-MIB' => 'ipv6IfTableLastChange',
|
||||
'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress',
|
||||
);
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
'ip_n2p_phys_addr' => 'ipNetToPhysicalPhysAddress', # IP-MIB
|
||||
'c_inet_phys_addr' => 'cInetNetToMediaPhysAddress', # CISCO-IETF-IP-MIB
|
||||
'i6_n2p_phys_addr' => 'ipv6NetToMediaPhysAddress', # IPV6-MIB
|
||||
|
||||
'ip_n2p_phys_type' => 'ipNetToPhysicalType', # IP-MIB
|
||||
'c_inet_phys_type' => 'cInetNetToMediaType', # CISCO-IETF-IP-MIB
|
||||
'i6_n2p_phys_type' => 'ipv6NetToMediaType', # IPV6-MIB
|
||||
|
||||
'ip_n2p_phys_state' => 'ipNetToPhysicalState', # IP-MIB
|
||||
'c_inet_phys_state' => 'cInetNetToMediaState', # CISCO-IETF-IP-MIB
|
||||
'i6_n2p_phys_state' => 'ipv6IfNetToMediaState', # IPV6-MIB
|
||||
|
||||
'ip_pfx_origin' => 'ipAddressPrefixOrigin', # IP-MIB
|
||||
'c_pfx_origin' => 'cIpAddressPfxOrigin', # CISCO-IETF-IP-MIB
|
||||
|
||||
'ip_addr6_pfx' => 'ipAddressPrefix', # IP-MIB
|
||||
'c_addr6_pfx' => 'cIpAddressPrefix', # CISCO-IETF-IP-MIB
|
||||
|
||||
# Commented out are not-accessible according to MIB
|
||||
#'ip_addr6_pfxlen' => 'ipAddressPrefixLength', # IP-MIB
|
||||
#'c_addr6_pfxlen' => 'cIpAddressPfxLength', # CISCO-IETF-IP-MIB
|
||||
'i6_addr_pfxlen' => 'ipv6AddrPfxLength', # IPV6-MIB
|
||||
|
||||
'ip_addr6_index' => 'ipAddressIfIndex', # IP-MIB
|
||||
'c_addr6_index' => 'cIpAddressIfIndex', # CISCO-IETF-IP-MIB
|
||||
|
||||
'ip_addr6_type' => 'ipAddressType', # IP-MIB
|
||||
'c_addr6_type' => 'cIpAddressType', # CISCO-IETF-IP-MIB
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'ip_n2p_phys_addr' => \&SNMP::Info::munge_mac,
|
||||
'c_inet_phys_addr' => \&munge_physaddr,
|
||||
'i6_n2p_phys_addr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
|
||||
sub ipv6_n2p_mac {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_addr;
|
||||
foreach my $row (keys %$phys_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if (($addrtype == 2) && (defined $phys_addr->{$row})) { # IPv6
|
||||
$return->{$row} = substr($phys_addr->{$row}, 0, 17);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_addr {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $net_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $net_addr;
|
||||
foreach my $row (keys %$net_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
my $v6_packed = pack("C*", split(/\./, $v6addr));
|
||||
if (length($v6_packed) == 15) {
|
||||
# Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize,
|
||||
# so what we've collected in that variable is actually the first byte of the address.
|
||||
$v6_packed = pack('C', $addrsize) . $v6_packed;
|
||||
}
|
||||
if (length($v6_packed) == 17) {
|
||||
# Workaround for IPV6-MIB on Windows 2012: if the address is one byte too long, the SNMP agent probably has an incorrect
|
||||
# implementation where a length field precedes the actual IPv6 address.
|
||||
# In that case, the first character should be chr(16), ie 0x10; strip it if that's the case.
|
||||
$v6_packed =~ s/^\x10//;
|
||||
}
|
||||
if (length($v6_packed) == 16) {
|
||||
$v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
|
||||
$return->{$row} = $v6addr;
|
||||
} else {
|
||||
printf("Invalid size for IPv6 address: expected 16 bytes, got %d (%s = %s)\n", length($v6_packed), $row, $net_addr->{$row});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_if {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_addr;
|
||||
foreach my $row (keys %$phys_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ifindex;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_type {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_type = &_test_methods( $info, {
|
||||
ip_n2p_phys_type => IPMIB,
|
||||
c_inet_phys_type => CISCO,
|
||||
i6_n2p_phys_type => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_type;
|
||||
foreach my $row (keys %$phys_type) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $phys_type->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_state {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_state = &_test_methods( $info, {
|
||||
ip_n2p_phys_state => IPMIB,
|
||||
c_inet_phys_state => CISCO,
|
||||
i6_n2p_phys_state => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_state;
|
||||
foreach my $row (keys %$phys_state) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $phys_state->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_index {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_index = &_test_methods( $info, {
|
||||
ip_addr6_index => IPMIB,
|
||||
c_addr6_index => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_index;
|
||||
foreach my $row (keys %$ipv6_index){
|
||||
if ($row =~ /^(\d+)\.([\d\.]+)$/) {
|
||||
my $addrtype = $1; my $v6addr = $2;
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_index->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_type {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_type = &_test_methods( $info, {
|
||||
ip_addr6_type => IPMIB,
|
||||
c_addr6_type => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_type;
|
||||
foreach my $row (keys %$ipv6_type){
|
||||
if ($row =~ /^(\d+)\.([\d\.]+)$/) {
|
||||
my $addrtype = $1; my $v6addr = $2;
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_type->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_pfx_origin {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_pfx_origin = &_test_methods( $info, {
|
||||
ip_pfx_origin => IPMIB,
|
||||
c_pfx_origin => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_pfx_origin;
|
||||
foreach my $row (keys %$ipv6_pfx_origin){
|
||||
if ($row =~ /^(\d+)\.(\d+)\.([\d\.]+)\.(\d+)$/) {
|
||||
my $ifindex = $1; my $type = $2; my $pfx = $3; my $len = $4;
|
||||
if ($type == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_pfx_origin->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_addr_prefix {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_addr_prefix = &_test_methods( $info, {
|
||||
ip_addr6_pfx => IPMIB,
|
||||
c_addr6_pfx => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_addr_prefix;
|
||||
foreach my $row (keys %$ipv6_addr_prefix){
|
||||
if ($row =~ /^(\d+)\.[\d\.]+$/) {
|
||||
my $type = $1;
|
||||
if (($type == 2) or ($type == 4)) { # IPv6
|
||||
# Remove interface specific part from vrf interfaces
|
||||
if ($row =~ /^((\d+\.){17}\d+)/) { $row = $1 }
|
||||
# Remove the OID part from the value
|
||||
my $val = $ipv6_addr_prefix->{$row};
|
||||
if ( $val =~ /^.+?((?:\d+\.){19}\d+)$/ ){
|
||||
$val = $1;
|
||||
$return->{$row} = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_addr_prefixlength {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_addr_prefix = &_test_methods( $info, {
|
||||
ip_addr6_pfx => IPMIB,
|
||||
c_addr6_pfx => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_addr_prefix;
|
||||
foreach my $row (keys %$ipv6_addr_prefix) {
|
||||
if ($row =~ /^(\d+)\.[\d\.]+$/) {
|
||||
my $type = $1;
|
||||
if (($type == 2) or ($type == 4)) { # IPv6
|
||||
# Remove interface specific part from vrf interfaces
|
||||
if ($row =~ /^((\d+\.){17}\d+)/) { $row = $1 }
|
||||
# Remove the OID part from the value
|
||||
my $val = $ipv6_addr_prefix->{$row} || '';
|
||||
if ( $val =~ /^.+?((?:\d+\.){19}(\d+))$/ ) {
|
||||
$val = $2;
|
||||
$return->{$row} = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_addr {
|
||||
my $info = shift;
|
||||
my $return = {};
|
||||
my $indexes = $info->ipv6_index();
|
||||
foreach my $row (keys %$indexes) {
|
||||
my @parts = split(/\./, $row);
|
||||
my $is_valid = 0;
|
||||
if (scalar @parts == 18) {
|
||||
my $addrtype = shift @parts;
|
||||
$is_valid = 1;
|
||||
} elsif (scalar @parts == 17) {
|
||||
$is_valid = 1;
|
||||
}
|
||||
my $addrsize = shift @parts; # First element now is addrsize, should be 16
|
||||
if ($is_valid && $addrsize == 16) {
|
||||
$return->{$row} = join(':', unpack('(H4)*', pack('C*', @parts)));
|
||||
} 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';
|
||||
} elsif ($info::METHOD eq IPV6MIB) {
|
||||
$return = 'IPV6-MIB';
|
||||
} elsif ($info::METHOD eq CISCO) {
|
||||
$return = 'CISCO-IETF-IP-MIB';
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub _test_methods {
|
||||
my $info = shift;
|
||||
my $test = shift;
|
||||
my $return = {};
|
||||
foreach my $method (sort {$test->{$a} <=> $test->{$b}} keys %$test) {
|
||||
$return = $info->$method || {};
|
||||
if (scalar keys %$return) {
|
||||
# FIXME ugh! a global. makes order of calls important for debug.
|
||||
$info::METHOD = $test->{$method};
|
||||
last;
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub _my_sub_name {
|
||||
my @callinfo = caller(1);
|
||||
return $callinfo[3];
|
||||
}
|
||||
|
||||
sub munge_physaddr {
|
||||
my $addr = shift;
|
||||
return unless defined $addr;
|
||||
return unless length $addr;
|
||||
$addr = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $addr ) );
|
||||
return $addr;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::IPv6 - SNMP Interface for obtaining IPv6 addresses and IPv6
|
||||
address mappings
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen and Carlos Vicente
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses
|
||||
to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>,
|
||||
F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the
|
||||
device.
|
||||
|
||||
This class is inherited by Info::Layer3 to provide IPv6 node tracking across
|
||||
device classes.
|
||||
|
||||
For debugging purposes you can call this class directly as you would
|
||||
SNMP::Info
|
||||
|
||||
my $info = new SNMP::Info::IPv6 (...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<IP-MIB>
|
||||
|
||||
=item F<IPV6-MIB>
|
||||
|
||||
=item F<CISCO-IETF-IP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
none.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Internet Address Table
|
||||
|
||||
=over
|
||||
|
||||
=item $info->ipv6_n2p_addr()
|
||||
|
||||
=item $info->ipv6_n2p_if()
|
||||
|
||||
=item $info->ipv6_n2p_mac()
|
||||
|
||||
=item $info->ipv6_n2p_state()
|
||||
|
||||
=item $info->ipv6_n2p_type()
|
||||
|
||||
=item $info->ipv6_index()
|
||||
|
||||
Maps an IPv6 address to an interface C<ifIndex>
|
||||
|
||||
=item $info->ipv6_type()
|
||||
|
||||
Maps an IPv6 address to its type (unicast, anycast, etc.)
|
||||
|
||||
=item $info->ipv6_pfx_origin()
|
||||
|
||||
Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.)
|
||||
|
||||
=item $info->ipv6_addr_prefix()
|
||||
|
||||
Maps IPv6 addresses with their prefixes
|
||||
|
||||
=item $info->ipv6_addr_prefixlength()
|
||||
|
||||
Maps IPv6 addresses with their prefix length
|
||||
|
||||
=item $info->ipv6_addr()
|
||||
|
||||
Maps a table instance to an IPv6 address
|
||||
|
||||
=back
|
||||
|
||||
=head2 Internet Address Translation Table
|
||||
|
||||
=over
|
||||
|
||||
=item $info->c_inet_phys_address()
|
||||
|
||||
Maps an address of type C<cInetNetToMediaNetAddressType> on interface C<ifIndex> to a physical address.
|
||||
|
||||
=back
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item munge_physaddr()
|
||||
|
||||
Takes an octet stream (HEX-STRING) and returns a colon separated ASCII hex
|
||||
string.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
844
lib/SNMP/Info/LLDP.pm
Normal file
844
lib/SNMP/Info/LLDP.pm
Normal file
@@ -0,0 +1,844 @@
|
||||
# SNMP::Info::LLDP
|
||||
#
|
||||
# Copyright (c) 2018 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::LLDP;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::LLDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::LLDP::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
'LLDP-MIB' => 'lldpLocSysCapEnabled',
|
||||
'LLDP-EXT-MED-MIB' => 'lldpXMedMIB',
|
||||
'LLDP-EXT-DOT1-MIB' => 'lldpXdot1MIB',
|
||||
'LLDP-EXT-DOT3-MIB' => 'lldpXdot3MIB',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
'lldp_sysname' => 'lldpLocSysName',
|
||||
'lldp_sysdesc' => 'lldpLocSysDesc',
|
||||
'lldp_sys_cap' => 'lldpLocSysCapEnabled',
|
||||
'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',
|
||||
'lldp_rem_pid_type' => 'lldpRemPortIdSubtype',
|
||||
'lldp_rem_pid' => 'lldpRemPortId',
|
||||
'lldp_rem_desc' => 'lldpRemPortDesc',
|
||||
'lldp_rem_sysname' => 'lldpRemSysName',
|
||||
'lldp_rem_sysdesc' => 'lldpRemSysDesc',
|
||||
'lldp_rem_sys_cap' => 'lldpRemSysCapEnabled',
|
||||
'lldp_rem_cap_spt' => 'lldpRemSysCapSupported',
|
||||
|
||||
# LLDP-MIB::lldpXMedRemInventoryTable
|
||||
'lldp_rem_hw_rev' => 'lldpXMedRemHardwareRev',
|
||||
'lldp_rem_fw_rev' => 'lldpXMedRemFirmwareRev',
|
||||
'lldp_rem_sw_rev' => 'lldpXMedRemSoftwareRev',
|
||||
'lldp_rem_serial' => 'lldpXMedRemSerialNum',
|
||||
'lldp_rem_vendor' => 'lldpXMedRemMfgName',
|
||||
'lldp_rem_model' => 'lldpXMedRemModelName',
|
||||
'lldp_rem_asset' => 'lldpXMedRemAssetID',
|
||||
|
||||
'lldp_rem_media_cap' => 'lldpXMedRemCapCurrent',
|
||||
'lldp_rem_media_cap_spt' => 'lldpXMedRemCapSupported',
|
||||
|
||||
# LLDP-MIB::lldpRemManAddrTable
|
||||
'lldp_rman_addr' => 'lldpRemManAddrIfSubtype',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'lldp_sysdesc' => \&SNMP::Info::munge_null,
|
||||
'lldp_sysname' => \&SNMP::Info::munge_null,
|
||||
'lldp_rem_sysname' => \&SNMP::Info::munge_null,
|
||||
'lldp_rem_sysdesc' => \&SNMP::Info::munge_null,
|
||||
'lldp_rem_port_desc' => \&SNMP::Info::munge_null,
|
||||
'lldp_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 {
|
||||
my $lldp = shift;
|
||||
|
||||
# We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
|
||||
# so we could be running LLDP but not return any useful information
|
||||
my $lldp_cap = $lldp->lldp_sys_cap();
|
||||
return 1 if defined $lldp_cap;
|
||||
|
||||
# If the device doesn't return local system capabilities, fallback
|
||||
# by checking if it would report neighbors
|
||||
my $lldp_rem = $lldp->lldp_rem_id() || {};
|
||||
return 1 if scalar keys %$lldp_rem;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub lldp_if {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $addr = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $i_descr = $lldp->i_description() || {};
|
||||
my $i_alias = $lldp->i_alias() || {};
|
||||
my %r_i_descr = reverse %$i_descr;
|
||||
my %r_i_alias = reverse %$i_alias;
|
||||
|
||||
my %lldp_if;
|
||||
foreach my $key ( keys %$addr ) {
|
||||
my @aOID = split( '\.', $key );
|
||||
my $port = $aOID[1];
|
||||
next unless $port;
|
||||
|
||||
# Local LLDP port may not equate to ifIndex, see LldpPortNumber
|
||||
# TEXTUAL-CONVENTION in LLDP-MIB. Cross reference lldpLocPortDesc
|
||||
# with ifDescr and ifAlias to get ifIndex, prefer ifDescr over
|
||||
# ifAlias because using cross ref with description is correct
|
||||
# behavior according to the LLDP-MIB. Some devices (eg H3C gear)
|
||||
# seem to use ifAlias though.
|
||||
# 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 ( $desc && exists $r_i_descr{$desc} ) {
|
||||
$port = $r_i_descr{$desc};
|
||||
}
|
||||
elsif ( $desc && exists $r_i_alias{$desc} ) {
|
||||
$port = $r_i_alias{$desc};
|
||||
}
|
||||
|
||||
$lldp_if{$key} = $port;
|
||||
}
|
||||
return \%lldp_if;
|
||||
}
|
||||
|
||||
sub lldp_ip {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ip;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
next unless $proto == 1;
|
||||
$lldp_ip{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ip;
|
||||
}
|
||||
|
||||
sub lldp_ipv6 {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ipv6;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
next unless $proto == 2;
|
||||
$lldp_ipv6{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ipv6;
|
||||
}
|
||||
|
||||
sub lldp_mac {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ipv6;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
next unless $proto == 6;
|
||||
$lldp_ipv6{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ipv6;
|
||||
}
|
||||
|
||||
sub lldp_addr {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ip;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
$lldp_ip{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ip;
|
||||
}
|
||||
|
||||
sub lldp_port {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $pdesc = $lldp->lldp_rem_desc($partial) || {};
|
||||
my $pid = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $ptype = $lldp->lldp_rem_pid_type($partial) || {};
|
||||
my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
|
||||
|
||||
my %lldp_port;
|
||||
foreach my $key ( sort keys %$pid ) {
|
||||
my $port = $pdesc->{$key};
|
||||
my $type = $ptype->{$key};
|
||||
if ( $type
|
||||
and ( $type eq 'interfaceName' or $type eq 'local' )
|
||||
and ( defined $pid->{$key} and $pid->{$key} !~ /^\d+$/ ) )
|
||||
{
|
||||
|
||||
# If the pid claims to be an interface name,
|
||||
# believe it.
|
||||
$port = $pid->{$key};
|
||||
}
|
||||
unless ($port) {
|
||||
$port = $pid->{$key};
|
||||
next unless $port;
|
||||
next unless $type;
|
||||
|
||||
# May need to format other types in the future, i.e. Network address
|
||||
if ( $type =~ /mac/ ) {
|
||||
$port = SNMP::Info::munge_mac($port)
|
||||
}
|
||||
}
|
||||
|
||||
# Avaya/Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
|
||||
# figure out slot.port based upon lldpRemPortDesc
|
||||
if ( defined $desc->{$key}
|
||||
&& $desc->{$key}
|
||||
=~ /^Ethernet\s(?:Routing\s)?Switch\s\d|^Virtual\sServices\sPlatform\s\d/
|
||||
&& $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ )
|
||||
{
|
||||
$port = defined $1 ? "$2.$3" : "1.$3";
|
||||
}
|
||||
|
||||
$lldp_port{$key} = $port;
|
||||
}
|
||||
return \%lldp_port;
|
||||
}
|
||||
|
||||
sub _lldp_id_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;
|
||||
|
||||
my $ch_type = $lldp->lldp_rem_id_type($partial) || {};
|
||||
my $ch = $lldp->lldp_rem_id($partial) || {};
|
||||
|
||||
my %lldp_id;
|
||||
foreach my $key ( keys %$ch ) {
|
||||
my $id = $ch->{$key};
|
||||
next unless $id;
|
||||
my $type = $ch_type->{$key};
|
||||
next unless $type;
|
||||
|
||||
$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;
|
||||
|
||||
my $rid = $lldp->lldp_rem_id($partial) || {};
|
||||
my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
|
||||
my $name = $lldp->lldp_rem_sysname($partial) || {};
|
||||
|
||||
my %lldp_platform;
|
||||
foreach my $key ( keys %$rid ) {
|
||||
$lldp_platform{$key} = $desc->{$key} || $name->{$key};
|
||||
}
|
||||
return \%lldp_platform;
|
||||
}
|
||||
|
||||
sub lldp_cap {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp_caps = $lldp->lldp_rem_cap_spt($partial) || {};
|
||||
|
||||
# Encoded as BITS which Perl Net-SNMP implementation doesn't seem to
|
||||
# be able to enumerate for us, so we have to get it from the MIB
|
||||
# and enumerate ourselves
|
||||
my $oid
|
||||
= SNMP::translateObj( 'LLDP-MIB::lldpRemSysCapEnabled', 0, 1 ) || '';
|
||||
my $enums = (
|
||||
( ref {} eq ref $SNMP::MIB{$oid}{'enums'} )
|
||||
? $SNMP::MIB{$oid}{'enums'}
|
||||
: {}
|
||||
);
|
||||
my %r_enums = reverse %$enums;
|
||||
|
||||
my %lldp_cap;
|
||||
foreach my $key ( keys %$lldp_caps ) {
|
||||
my $cap_bits = $lldp_caps->{$key};
|
||||
next unless $cap_bits;
|
||||
|
||||
my $count = 0;
|
||||
foreach my $bit ( split //, $cap_bits ) {
|
||||
if ($bit) {
|
||||
push( @{ $lldp_cap{$key} }, $r_enums{$count} );
|
||||
}
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
return \%lldp_cap;
|
||||
}
|
||||
|
||||
sub lldp_media_cap {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lldp_caps = $lldp->lldp_rem_media_cap_spt($partial) || {};
|
||||
|
||||
# Encoded as BITS which Perl Net-SNMP implementation doesn't seem to
|
||||
# be able to enumerate for us, so we have to get it from the MIB
|
||||
# and enumerate ourselves
|
||||
my $oid = SNMP::translateObj( 'lldpXMedRemCapCurrent', 0, 1 ) || '';
|
||||
my $enums = (
|
||||
( ref {} eq ref $SNMP::MIB{$oid}{'enums'} )
|
||||
? $SNMP::MIB{$oid}{'enums'}
|
||||
: {}
|
||||
);
|
||||
my %r_enums = reverse %$enums;
|
||||
|
||||
my %lldp_cap;
|
||||
foreach my $key ( keys %$lldp_caps ) {
|
||||
my $cap_bits = $lldp_caps->{$key};
|
||||
next unless $cap_bits;
|
||||
|
||||
my $count = 0;
|
||||
foreach my $bit ( split //, $cap_bits ) {
|
||||
if ($bit) {
|
||||
push( @{ $lldp_cap{$key} }, $r_enums{$count} );
|
||||
}
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
return \%lldp_cap;
|
||||
}
|
||||
|
||||
#sub root_ip {
|
||||
# my $lldp = shift;
|
||||
#
|
||||
# my $man_addr = $lldp->lldp_lman_addr() || {};
|
||||
#
|
||||
# foreach my $key (keys %$man_addr) {
|
||||
# my @oids = split(/\./, $key);
|
||||
# my $proto = shift(@oids);
|
||||
# my $length = shift(@oids);
|
||||
# # IPv4
|
||||
# if ($proto == 1) {
|
||||
# my $addr = join('.',@oids);
|
||||
# return $addr if (defined $addr and $lldp->snmp_connect_ip($addr));
|
||||
# }
|
||||
# }
|
||||
# return;
|
||||
#}
|
||||
|
||||
# Break up the lldpRemManAddrTable INDEX into common index, protocol,
|
||||
# and address.
|
||||
sub _lldp_addr_index {
|
||||
my $lldp = shift;
|
||||
my $idx = shift;
|
||||
|
||||
my @oids = split( /\./, $idx );
|
||||
my $index = join( '.', splice( @oids, 0, 3 ) );
|
||||
my $proto = shift(@oids);
|
||||
shift(@oids) if scalar @oids > 4; # $length
|
||||
|
||||
# IPv4
|
||||
if ( $proto == 1 ) {
|
||||
return ( $index, $proto, join( '.', @oids ) );
|
||||
}
|
||||
|
||||
# IPv6
|
||||
elsif ( $proto == 2 ) {
|
||||
return ( $index, $proto,
|
||||
join( ':', unpack( '(H4)*', pack( 'C*', @oids ) ) ) );
|
||||
}
|
||||
|
||||
# MAC
|
||||
elsif ( $proto == 6 ) {
|
||||
return ( $index, $proto,
|
||||
join( ':', map { sprintf "%02x", $_ } @oids ) );
|
||||
}
|
||||
|
||||
# TODO - Other protocols may be used as well; implement when needed?
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::LLDP - SNMP Interface to the Link Layer Discovery Protocol (LLDP)
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $lldp = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $lldp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
$haslldp = $lldp->hasLLDP() ? 'yes' : 'no';
|
||||
|
||||
# Print out a map of device ports with LLDP neighbors:
|
||||
my $interfaces = $lldp->interfaces();
|
||||
my $lldp_if = $lldp->lldp_if();
|
||||
my $lldp_ip = $lldp->lldp_ip();
|
||||
my $lldp_port = $lldp->lldp_port();
|
||||
|
||||
foreach my $lldp_key (keys %$lldp_ip){
|
||||
my $iid = $lldp_if->{$lldp_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $lldp_ip->{$lldp_key};
|
||||
my $neighbor_port = $lldp_port->{$lldp_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::LLDP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to LLDP information through SNMP.
|
||||
|
||||
LLDP is a Layer 2 protocol that allows a network device to advertise its
|
||||
identity and capabilities on the local network providing topology information.
|
||||
The protocol is defined in the IEEE standard 802.1AB.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<LLDP-MIB>
|
||||
|
||||
=item F<LLDP-EXT-MED-MIB>
|
||||
|
||||
=item F<LLDP-EXT-DOT1-MIB>
|
||||
|
||||
=item F<LLDP-EXT-DOT3-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $lldp->hasLLDP()
|
||||
|
||||
Is LLDP is active in this device?
|
||||
|
||||
Note: LLDP may be active, but nothing in C<lldpRemoteSystemsData> Tables so
|
||||
the device would not return any useful topology information.
|
||||
|
||||
=item $lldp->lldp_sysname()
|
||||
|
||||
The string value used to identify the system name of the local system. If the
|
||||
local agent supports IETF RFC 3418, C<lldpLocSysName> object should have the
|
||||
same value of C<sysName> object.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpLocSysName>)
|
||||
|
||||
=item $lldp->lldp_sysdesc()
|
||||
|
||||
The string value used to identify the system description of the local system.
|
||||
If the local agent supports IETF RFC 3418, C<lldpLocSysDesc> object should
|
||||
have the same value of C<sysDesc> object.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpLocSysDesc>)
|
||||
|
||||
=item $lldp->lldp_sys_cap()
|
||||
|
||||
Returns which system capabilities are enabled on the local system. Results
|
||||
are munged into an ascii binary string, LSB. Each digit represents a bit
|
||||
from the table below:
|
||||
|
||||
=over
|
||||
|
||||
=item Bit 'other(0)' indicates that the system has capabilities other than
|
||||
those listed below.
|
||||
|
||||
=item Bit 'repeater(1)' indicates that the system has repeater capability.
|
||||
|
||||
=item Bit 'bridge(2)' indicates that the system has bridge capability.
|
||||
|
||||
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
|
||||
point capability.
|
||||
|
||||
=item Bit 'router(4)' indicates that the system has router capability.
|
||||
|
||||
=item Bit 'telephone(5)' indicates that the system has telephone capability.
|
||||
|
||||
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
|
||||
Device capability (IETF RFC 2669 & 2670).
|
||||
|
||||
=item Bit 'stationOnly(7)' indicates that the system has only station
|
||||
capability and nothing else."
|
||||
|
||||
=back
|
||||
|
||||
(C<lldpLocSysCapEnabled>)
|
||||
|
||||
=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
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $lldp->lldp_id()
|
||||
|
||||
Returns the string value used to identify the chassis component associated
|
||||
with the remote system.
|
||||
|
||||
(C<lldpRemChassisId>)
|
||||
|
||||
=item $lldp->lldp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table. Tries to cross reference
|
||||
(C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>),
|
||||
if unable defaults to (C<lldpRemLocalPortNum>).
|
||||
|
||||
=item $lldp->lldp_ip()
|
||||
|
||||
Returns remote IPv4 address. Returns for all other address types, use
|
||||
lldp_addr if you want any return address type.
|
||||
|
||||
=item $lldp->lldp_ipv6()
|
||||
|
||||
Returns remote IPv6 address, if known. Returns for all other address types,
|
||||
use lldp_addr if you don't care about return address type.
|
||||
|
||||
=item $lldp->lldp_mac()
|
||||
|
||||
Returns remote (management) MAC address, if known. Returns for all other
|
||||
address types, use lldp_addr if you don't care about return address type.
|
||||
|
||||
=item $lldp->lldp_addr()
|
||||
|
||||
Returns remote address. Type may be any IANA Address Family Number.
|
||||
Currently only returns IPv4, IPv6 or MAC addresses. If the remote device
|
||||
returns more than one address type, this method will give only one. Which one
|
||||
is returned is decided by chance, phase of the moon and Perl hash ordering.
|
||||
|
||||
Use lldp_mac, lldp_ip or lldp_ipv6 if you want a specific address type.
|
||||
|
||||
=item $lldp->lldp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
=item $lldp->lldp_platform()
|
||||
|
||||
Tries to return something useful from C<lldp_rem_sysdesc()> or
|
||||
C<lldp_rem_sysname()>.
|
||||
|
||||
=item $lldp->lldp_cap()
|
||||
|
||||
Returns hash of arrays with each array containing the system capabilities
|
||||
supported by the remote system. Possible elements in the array are
|
||||
enumerated from C<LldpSystemCapabilitiesMap>.
|
||||
|
||||
=item $lldp->lldp_media_cap()
|
||||
|
||||
Returns hash of arrays with each array containing the media capabilities
|
||||
supported by the remote system. Possible elements in the array are
|
||||
enumerated from C<LldpXMedCapabilities>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 LLDP Remote Table (C<lldpRemTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $lldp->lldp_rem_id_type()
|
||||
|
||||
Returns the type of encoding used to identify the chassis associated with
|
||||
the remote system.
|
||||
|
||||
(C<lldpRemChassisIdSubtype>)
|
||||
|
||||
=item $lldp->lldp_rem_id()
|
||||
|
||||
Returns the string value used to identify the chassis component associated
|
||||
with the remote system.
|
||||
|
||||
(C<lldpRemChassisId>)
|
||||
|
||||
=item $lldp->lldp_rem_pid_type()
|
||||
|
||||
Returns the type of port identifier encoding used in the associated
|
||||
C<lldpRemPortId> object.
|
||||
|
||||
(C<lldpRemPortIdSubtype>)
|
||||
|
||||
=item $lldp->lldp_rem_pid()
|
||||
|
||||
Returns the string value used to identify the port component associated with
|
||||
the remote system.
|
||||
|
||||
(C<lldpRemPortId>)
|
||||
|
||||
=item $lldp->lldp_rem_desc()
|
||||
|
||||
Returns the string value used to identify the description of the given port
|
||||
associated with the remote system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpRemPortDesc>)
|
||||
|
||||
=item $lldp->lldp_rem_sysname()
|
||||
|
||||
Returns the string value used to identify the system name of the remote
|
||||
system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpRemSysName>)
|
||||
|
||||
=item $lldp->lldp_rem_sysdesc()
|
||||
|
||||
Returns the string value used to identify the system description of the
|
||||
remote system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpRemSysDesc>)
|
||||
|
||||
=item $lldp->lldp_rem_hw_rev()
|
||||
|
||||
Returns the string value used to identify the hardware revision of the
|
||||
remote system. Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpXMedRemHardwareRev>)
|
||||
|
||||
=item $lldp->lldp_rem_fw_rev()
|
||||
|
||||
Returns the string value used to identify the firmware revision of the
|
||||
remote system. Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpXMedRemHardwareRev>)
|
||||
|
||||
=item $lldp->lldp_rem_sw_rev()
|
||||
|
||||
Returns the string value used to identify the software revision of the
|
||||
remote system. Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpXMedRemSoftwareRev>)
|
||||
|
||||
=item $lldp->lldp_rem_serial()
|
||||
|
||||
Returns the string value used to identify the serial number of the
|
||||
remote system. Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpXMedRemSerialNum>)
|
||||
|
||||
=item $lldp->lldp_rem_vendor()
|
||||
|
||||
Returns the string value used to identify the manufacturer of the
|
||||
remote system. Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpXMedRemMfgName>)
|
||||
|
||||
=item $lldp->lldp_rem_asset()
|
||||
|
||||
Returns the string value used to identify the asset number of the
|
||||
remote system. Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpXMedRemAssetID>)
|
||||
|
||||
=item $lldp->lldp_rem_model()
|
||||
|
||||
Returns the string value used to identify the model of the
|
||||
remote system. Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpXMedRemModelName>)
|
||||
|
||||
=item $lldp->lldp_rem_media_cap_spt()
|
||||
|
||||
Returns which media capabilities are supported on the remote system. Results
|
||||
are munged into an ascii binary string, LSB.
|
||||
|
||||
=item $lldp->lldp_rem_media_cap()
|
||||
|
||||
Returns which media capabilities are enabled on the remote system. Results
|
||||
are munged into an ascii binary string, LSB.
|
||||
|
||||
=item $lldp->lldp_rem_sys_cap()
|
||||
|
||||
Returns which system capabilities are enabled on the remote system. Results
|
||||
are munged into an ascii binary string, LSB. Each digit represents a bit
|
||||
from the table below:
|
||||
|
||||
=over
|
||||
|
||||
=item Bit 'other(0)' indicates that the system has capabilities other than
|
||||
those listed below.
|
||||
|
||||
=item Bit 'repeater(1)' indicates that the system has repeater capability.
|
||||
|
||||
=item Bit 'bridge(2)' indicates that the system has bridge capability.
|
||||
|
||||
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
|
||||
point capability.
|
||||
|
||||
=item Bit 'router(4)' indicates that the system has router capability.
|
||||
|
||||
=item Bit 'telephone(5)' indicates that the system has telephone capability.
|
||||
|
||||
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
|
||||
Device capability (IETF RFC 2669 & 2670).
|
||||
|
||||
=item Bit 'stationOnly(7)' indicates that the system has only station
|
||||
capability and nothing else."
|
||||
|
||||
=back
|
||||
|
||||
(C<lldpRemSysCapEnabled>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
343
lib/SNMP/Info/Layer1.pm
Normal file
343
lib/SNMP/Info/Layer1.pm
Normal file
@@ -0,0 +1,343 @@
|
||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::Layer1::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer1::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
'ports_managed' => 'ifNumber',
|
||||
'rptr_slots' => 'rptrGroupCapacity',
|
||||
'slots' => 'rptrGroupCapacity',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
'rptr_ports' => 'rptrGroupPortCapacity',
|
||||
'rptr_port' => 'rptrPortIndex',
|
||||
'rptr_slot' => 'rptrPortGroupIndex',
|
||||
'rptr_up_admin' => 'rptrPortAdminStatus',
|
||||
'rptr_up' => 'rptrPortOperStatus',
|
||||
'rptr_last_src' => 'rptrAddrTrackNewLastSrcAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
'rptr_last_src' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
# assuming managed ports aren't in repeater ports?
|
||||
sub ports {
|
||||
my $l1 = shift;
|
||||
|
||||
my $ports = $l1->ports_managed();
|
||||
my $rptr_ports = $l1->rptr_ports();
|
||||
|
||||
foreach my $group ( keys %$rptr_ports ) {
|
||||
$ports += $rptr_ports->{$group};
|
||||
}
|
||||
|
||||
return $ports;
|
||||
}
|
||||
|
||||
# $l1->model() - Looks at sysObjectID which gives the oid of the system
|
||||
# name, contained in a proprietary MIB.
|
||||
sub model {
|
||||
my $l1 = shift;
|
||||
my $id = $l1->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
# HP
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
# Cisco
|
||||
$model =~ s/sysid$//i;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l1 = shift;
|
||||
my $descr = $l1->description();
|
||||
|
||||
return 'hp' if ( $descr =~ /hp/i );
|
||||
return 'cisco' if ( $descr =~ /(catalyst|cisco|ios)/i );
|
||||
return 'allied' if ( $descr =~ /allied/i );
|
||||
return 'asante' if ( $descr =~ /asante/i );
|
||||
|
||||
return 'unknown';
|
||||
|
||||
}
|
||||
|
||||
# By Default we'll use the description field
|
||||
sub interfaces {
|
||||
my $l1 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l1->i_index($partial) || {};
|
||||
my $rptr_port = $l1->rptr_port($partial) || {};
|
||||
|
||||
foreach my $port ( keys %$rptr_port ) {
|
||||
$interfaces->{$port} = $port;
|
||||
}
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $l1 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up_admin = $l1->SUPER::i_up_admin($partial) || {};
|
||||
my $rptr_up_admin = $l1->rptr_up_admin($partial) || {};
|
||||
|
||||
foreach my $key ( keys %$rptr_up_admin ) {
|
||||
my $up = $rptr_up_admin->{$key};
|
||||
$i_up_admin->{$key} = 'up' if $up =~ /enabled/;
|
||||
$i_up_admin->{$key} = 'down' if $up =~ /disabled/;
|
||||
}
|
||||
|
||||
return $i_up_admin;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $l1 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up = $l1->SUPER::i_up($partial) || {};
|
||||
my $rptr_up = $l1->rptr_up($partial) || {};
|
||||
|
||||
foreach my $key ( keys %$rptr_up ) {
|
||||
my $up = $rptr_up->{$key};
|
||||
$i_up->{$key} = 'up' if $up =~ /operational/;
|
||||
}
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1 - SNMP Interface to network devices serving Layer1 only.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $l1 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l1->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
my $interfaces = $l1->interfaces();
|
||||
my $i_up = $l1->i_up();
|
||||
my $i_speed = $l1->i_speed();
|
||||
|
||||
foreach my $iid (keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $up = $i_up->{$iid};
|
||||
my $speed = $i_speed->{$iid}
|
||||
print "Port $port is $up. Port runs at $speed.\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes
|
||||
listed under SNMP::Info::Layer1::* Please read all docs under SNMP::Info
|
||||
first.
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Layer1 device through SNMP. Information is stored in a number of MIBs.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $l1 = new SNMP::Info::Layer1(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<SNMP-REPEATER-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs required for L<SNMP::Info/"REQUIREMENTS">
|
||||
|
||||
See L<SNMP::Info/"REQUIREMENTS"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $l1->ports_managed()
|
||||
|
||||
Gets the number of ports under the interface mib
|
||||
|
||||
(C<ifNumber>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l1->model()
|
||||
|
||||
Cross references $l1->id() with product IDs.
|
||||
|
||||
For HP devices, removes C<'hpswitch'> from the name
|
||||
|
||||
For Cisco devices, removes C<'sysid'> from the name
|
||||
|
||||
=item $l1->vendor()
|
||||
|
||||
Tries to discover the vendor from $l1->model() and $l1->vendor()
|
||||
|
||||
=item $l1->ports()
|
||||
|
||||
Adds the values from rptr_ports() and ports_managed()
|
||||
|
||||
=item $l1->slots()
|
||||
|
||||
Number of 'groups' in the Repeater MIB
|
||||
|
||||
(C<rptrGroupCapacity>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"USAGE"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l1->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $l1->i_up()
|
||||
|
||||
Returns reference to map of IIDs to link status.
|
||||
|
||||
=item $l1->i_up_admin()
|
||||
|
||||
Returns reference to map of IIDs to administrative link status.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Repeater MIB
|
||||
|
||||
=over
|
||||
|
||||
=item $l1->rptr_ports()
|
||||
|
||||
Number of ports in each group.
|
||||
|
||||
(C<rptrGroupPortCapacity>)
|
||||
|
||||
=item $l1->rptr_port()
|
||||
|
||||
Port number in Group
|
||||
|
||||
(C<rptrPortIndex>)
|
||||
|
||||
=item $l1->rptr_slot()
|
||||
|
||||
Group (slot) Number for given port.
|
||||
|
||||
(C<rptrPortGroupIndex>)
|
||||
|
||||
=item $l1->rptr_up_admin()
|
||||
|
||||
(C<rptrPortAdminStatus>)
|
||||
|
||||
=item $l1->rptr_up()
|
||||
|
||||
(C<rptrPortOperStatus>)
|
||||
|
||||
=item $l1->rptr_last_src()
|
||||
|
||||
(C<rptrAddrTrackNewLastSrcAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"USAGE"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,64 +1,65 @@
|
||||
# SNMP::Info::Layer1::Allied
|
||||
# Max Baker <max@warped.org>
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::Allied;
|
||||
$VERSION = 0.4;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer1::Allied::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Allied::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Allied::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer1::GLOBALS,
|
||||
'root_ip' => 'actualIPAddr',
|
||||
);
|
||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer1::FUNCS,
|
||||
'i_name2' => 'ifName',
|
||||
'ati_p_name' => 'portName',
|
||||
'ati_up' => 'linkTestLED',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer1::FUNCS,
|
||||
'ati_p_name' => 'portName',
|
||||
'ati_up' => 'linkTestLED',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer1::MIBS,
|
||||
'ATI-MIB' => 'atiPortGroupIndex'
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer1::MIBS,
|
||||
'ATI-MIB' => 'atiPortGroupIndex',
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer1::MUNGE,
|
||||
);
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer1::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'allied';
|
||||
@@ -70,11 +71,12 @@ sub os {
|
||||
|
||||
sub os_ver {
|
||||
my $allied = shift;
|
||||
my $descr = $allied->description();
|
||||
|
||||
if ($descr =~ m/version (\d+\.\d+)/){
|
||||
my $descr = $allied->description();
|
||||
|
||||
if ( defined ($descr) && $descr =~ m/version (\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
@@ -82,39 +84,40 @@ 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 undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_name{
|
||||
my $allied = shift;
|
||||
sub i_name {
|
||||
my $allied = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $allied->i_name2();
|
||||
my $i_name = $allied->orig_i_name($partial) || {};
|
||||
my $ati_p_name = $allied->ati_p_name($partial) || {};
|
||||
|
||||
my $ati_p_name = $allied->ati_p_name();
|
||||
|
||||
foreach my $port (keys %$ati_p_name){
|
||||
foreach my $port ( keys %$ati_p_name ) {
|
||||
my $name = $ati_p_name->{$port};
|
||||
$i_name->{$port} = $name if (defined $name and $name !~ /^\s*$/);
|
||||
$i_name->{$port} = $name if ( defined $name and $name !~ /^\s*$/ );
|
||||
}
|
||||
|
||||
|
||||
return $i_name;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $allied = shift;
|
||||
my $allied = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up = SNMP::Info::Layer1::i_up($allied);
|
||||
my $ati_up = $allied->ati_up();
|
||||
my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
|
||||
my $ati_up = $allied->ati_up($partial) || {};
|
||||
|
||||
foreach my $port (keys %$ati_up){
|
||||
foreach my $port ( keys %$ati_up ) {
|
||||
my $up = $ati_up->{$port};
|
||||
$i_up->{$port} = 'down' if $up eq 'linktesterror';
|
||||
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
|
||||
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
|
||||
}
|
||||
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
1;
|
||||
@@ -126,28 +129,27 @@ SNMP::Info::Layer1::Allied - SNMP Interface to old Allied Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
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,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myhub',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l1->class();
|
||||
my $class = $allied->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
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
|
||||
@@ -162,16 +164,14 @@ inherited methods.
|
||||
|
||||
=over
|
||||
|
||||
=item ATI-MIB
|
||||
|
||||
Download for your device from http://www.allied-telesyn.com/allied/support/
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs listed in SNMP::Info::Layer1 and its inherited classes.
|
||||
=item F<ATI-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -186,7 +186,7 @@ Returns 'allied' :)
|
||||
|
||||
=item $allied->os()
|
||||
|
||||
Returns 'allied'
|
||||
Returns 'allied'
|
||||
|
||||
=item $allied->os_ver()
|
||||
|
||||
@@ -196,19 +196,19 @@ Culls Version from description()
|
||||
|
||||
Returns IP Address of Managed Hub.
|
||||
|
||||
(B<actualIpAddr>)
|
||||
(C<actualIpAddr>)
|
||||
|
||||
=item $allied->model()
|
||||
|
||||
Trys to cull out AT-nnnnX out of the description field.
|
||||
Tries to cull out C<AT-nnnnX> out of the description field.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
@@ -231,16 +231,16 @@ the values of ati_up() to 'up' and 'down'.
|
||||
|
||||
=item $allied->ati_p_name()
|
||||
|
||||
(B<portName>)
|
||||
(C<portName>)
|
||||
|
||||
=item $allied->ati_up()
|
||||
|
||||
(B<linkTestLED>)
|
||||
(C<linkTestLED>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
295
lib/SNMP/Info/Layer1/Asante.pm
Normal file
295
lib/SNMP/Info/Layer1/Asante.pm
Normal file
@@ -0,0 +1,295 @@
|
||||
# SNMP::Info::Layer1::Asante
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::Asante;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer1::Asante::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Asante::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer1::FUNCS,
|
||||
'asante_port' => 'ePortIndex',
|
||||
'asante_group' => 'ePortGrpIndex',
|
||||
'i_type' => 'ePortGrpIndex',
|
||||
'asante_up' => 'ePortStateLinkStatus',
|
||||
);
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-AH1012-MIB' => 'asante' );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
|
||||
|
||||
sub interfaces {
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rptr_port = $asante->rptr_port($partial) || {};
|
||||
|
||||
my %interfaces;
|
||||
|
||||
foreach my $port ( keys %$rptr_port ) {
|
||||
$interfaces{$port} = $port;
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'asante';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $asante = shift;
|
||||
my $descr = $asante->description();
|
||||
|
||||
if ( defined ($descr) && $descr =~ /software v(\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'asante';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $asante = shift;
|
||||
|
||||
my $id = $asante->id();
|
||||
my $model = SNMP::translateObj($id);
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $asante_up = $asante->asante_up($partial) || {};
|
||||
|
||||
my $i_up = {};
|
||||
foreach my $port ( keys %$asante_up ) {
|
||||
my $up = $asante_up->{$port};
|
||||
$i_up->{$port} = 'down' if $up =~ /off/;
|
||||
$i_up->{$port} = 'up' if $up =~ /on/;
|
||||
}
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_speed = $asante->orig_i_speed($partial) || {};
|
||||
|
||||
my %i_speed;
|
||||
|
||||
$i_speed{"1.2"} = $i_speed->{1};
|
||||
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_mac = $asante->orig_i_mac($partial) || {};
|
||||
|
||||
my %i_mac;
|
||||
|
||||
$i_mac{"1.2"} = $i_mac->{1};
|
||||
|
||||
return \%i_mac;
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $asante->orig_i_description($partial) || {};
|
||||
|
||||
my %i_name;
|
||||
|
||||
$i_name{"1.2"} = $i_name->{1};
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1::Asante - SNMP Interface to old Asante 1012 Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $asante = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $asante->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from an
|
||||
Asante device through SNMP.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer1
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ASANTE-AH1012-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $asante->os()
|
||||
|
||||
Returns 'asante'
|
||||
|
||||
=item $asante->os_ver()
|
||||
|
||||
Culls software version from description()
|
||||
|
||||
=item $asante->vendor()
|
||||
|
||||
Returns 'asante'
|
||||
|
||||
=item $asante->model()
|
||||
|
||||
Cross references $asante->id() to the F<ASANTE-AH1012-MIB> and returns
|
||||
the results.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $asante->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $asante->i_description()
|
||||
|
||||
Description of the interface.
|
||||
|
||||
=item $asante->i_mac()
|
||||
|
||||
MAC address of the interface. Note this is just the MAC of the port, not
|
||||
anything connected to it.
|
||||
|
||||
=item $asante->i_name()
|
||||
|
||||
Returns reference to map of IIDs to human-set port name.
|
||||
|
||||
=item $asante->i_up()
|
||||
|
||||
Returns reference to map of IIDs to link status. Changes
|
||||
the values of asante_up() to 'up' and 'down'.
|
||||
|
||||
=item $asante->i_speed()
|
||||
|
||||
Speed of the link, human format.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Asante MIB
|
||||
|
||||
=over
|
||||
|
||||
=item $asante->ati_p_name()
|
||||
|
||||
(C<portName>)
|
||||
|
||||
=item $asante->ati_up()
|
||||
|
||||
(C<linkTestLED>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
731
lib/SNMP/Info/Layer1/Bayhub.pm
Normal file
731
lib/SNMP/Info/Layer1/Bayhub.pm
Normal file
@@ -0,0 +1,731 @@
|
||||
# SNMP::Info::Layer1::Bayhub
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller, Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::Bayhub;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::SONMP;
|
||||
use SNMP::Info::NortelStack;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer1::Bayhub::ISA
|
||||
= qw/SNMP::Info::SONMP SNMP::Info::NortelStack SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer1::Bayhub::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::NortelStack::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
'S5-ETHERNET-COMMON-MIB' => 's5EnPortTable',
|
||||
'S5-COMMON-STATS-MIB' => 's5CmStat',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::NortelStack::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
|
||||
# S5-ETHERNET-COMMON-MIB::s5EnPortTable
|
||||
'bayhub_pb_index' => 's5EnPortBrdIndx',
|
||||
'bayhub_pp_index' => 's5EnPortIndx',
|
||||
'bayhub_up_admin' => 's5EnPortPartStatus',
|
||||
'bayhub_up' => 's5EnPortLinkStatus',
|
||||
|
||||
# S5-ETHERNET-COMMON-MIB::s5EnPortExtTable
|
||||
'bayhub_p_speed' => 's5EnPortExtActiveSpeed',
|
||||
'bayhub_p_cap' => 's5EnPortExtHwCapability',
|
||||
'bayhub_p_adv' => 's5EnPortExtAutoNegAdv',
|
||||
|
||||
# S5-COMMON-STATS-MIB::s5CmSNodeTable
|
||||
'bayhub_nb_index' => 's5CmSNodeBrdIndx',
|
||||
'bayhub_np_index' => 's5CmSNodePortIndx',
|
||||
'fw_mac' => 's5CmSNodeMacAddr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::NortelStack::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
);
|
||||
|
||||
sub layers {
|
||||
return '00000011';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'bay_hub';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $bayhub = shift;
|
||||
my $id = $bayhub->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
$model =~ s/^sreg-//i;
|
||||
|
||||
return 'Baystack Hub' if ( $model =~ /BayStack/ );
|
||||
return '5000' if ( $model =~ /5000/ );
|
||||
return '5005' if ( $model =~ /5005/ );
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Hubs do not support ifMIB requirements for get MAC
|
||||
# and port status
|
||||
|
||||
sub i_index {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $bayhub->bayhub_pb_index($partial) || {};
|
||||
my $p_index = $bayhub->bayhub_pp_index($partial) || {};
|
||||
my $model = $bayhub->model() || 'Baystack Hub';
|
||||
|
||||
my %i_index;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
if ( $model eq 'Baystack Hub' ) {
|
||||
my $comidx = $board;
|
||||
if ( !( $comidx % 5 ) ) {
|
||||
$board = ( $board / 5 );
|
||||
}
|
||||
elsif ( $comidx =~ /[16]$/ ) {
|
||||
$board = int( $board / 5 );
|
||||
$port = 25;
|
||||
}
|
||||
elsif ( $comidx =~ /[27]$/ ) {
|
||||
$board = int( $board / 5 );
|
||||
$port = 26;
|
||||
}
|
||||
}
|
||||
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
|
||||
$i_index{$iid} = $index;
|
||||
}
|
||||
return \%i_index;
|
||||
}
|
||||
|
||||
# Partials don't really help in this class, but implemented
|
||||
# for consistency
|
||||
|
||||
sub interfaces {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $bayhub->i_index() || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# Index numbers are deterministic slot * 256 + port
|
||||
my $port = $index % 256;
|
||||
my $slot = int( $index / 256 );
|
||||
|
||||
my $slotport = "$slot.$port";
|
||||
|
||||
$if{$index} = $slotport;
|
||||
}
|
||||
|
||||
return \%if;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $bayhub->i_index() || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
my $duplex = 'half';
|
||||
$i_duplex{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $bayhub->i_index() || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
my $duplex = 'half';
|
||||
$i_duplex_admin{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $bayhub->i_index() || {};
|
||||
my $port_speed = $bayhub->bayhub_p_speed() || {};
|
||||
|
||||
my %i_speed;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $speed = $port_speed->{$iid} || '10 Mbps';
|
||||
|
||||
$speed = '10 Mbps' if $speed =~ /bps10M/i;
|
||||
$speed = '100 Mbps' if $speed =~ /bps100M/i;
|
||||
$i_speed{$index} = $speed;
|
||||
}
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $bayhub->i_index() || {};
|
||||
my $link_stat = $bayhub->bayhub_up() || {};
|
||||
|
||||
my %i_up;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $link_stat = $link_stat->{$iid};
|
||||
next unless defined $link_stat;
|
||||
|
||||
$link_stat = 'up' if $link_stat =~ /on/i;
|
||||
$link_stat = 'down' if $link_stat =~ /off/i;
|
||||
|
||||
$i_up{$index} = $link_stat;
|
||||
}
|
||||
return \%i_up;
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $bayhub->i_index() || {};
|
||||
my $link_stat = $bayhub->bayhub_up_admin() || {};
|
||||
|
||||
my %i_up_admin;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $link_stat = $link_stat->{$iid};
|
||||
next unless defined $link_stat;
|
||||
|
||||
$i_up_admin{$index} = $link_stat;
|
||||
}
|
||||
return \%i_up_admin;
|
||||
}
|
||||
|
||||
sub set_i_up_admin {
|
||||
|
||||
# map setting to those the hub will understand
|
||||
my %setting = qw/up 2 down 3/;
|
||||
|
||||
my $bayhub = shift;
|
||||
my ( $setting, $iid ) = @_;
|
||||
|
||||
my $i_index = $bayhub->i_index() || {};
|
||||
my %reverse_i_index = reverse %$i_index;
|
||||
|
||||
$setting = lc($setting);
|
||||
|
||||
return 0 unless defined $setting{$setting};
|
||||
|
||||
$iid = $reverse_i_index{$iid};
|
||||
|
||||
return $bayhub->set_bayhub_up_admin( $setting{$setting}, $iid );
|
||||
}
|
||||
|
||||
# Hubs do not support the standard Bridge MIB
|
||||
sub bp_index {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $bayhub->bayhub_nb_index() || {};
|
||||
my $p_index = $bayhub->bayhub_np_index() || {};
|
||||
my $model = $bayhub->model() || 'Baystack Hub';
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
if ( $model eq 'Baystack Hub' ) {
|
||||
my $comidx = $board;
|
||||
if ( !( $comidx % 5 ) ) {
|
||||
$board = ( $board / 5 );
|
||||
}
|
||||
elsif ( $comidx =~ /[16]$/ ) {
|
||||
$board = int( $board / 5 );
|
||||
$port = 25;
|
||||
}
|
||||
elsif ( $comidx =~ /[27]$/ ) {
|
||||
$board = int( $board / 5 );
|
||||
$port = 26;
|
||||
}
|
||||
}
|
||||
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
$bp_index{$index} = $index;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $bayhub->SUPER::fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $bayhub->bayhub_nb_index($partial) || {};
|
||||
my $p_index = $bayhub->bayhub_np_index($partial) || {};
|
||||
my $model = $bayhub->model() || 'Baystack Hub';
|
||||
|
||||
my %fw_port;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
if ( $model eq 'Baystack Hub' ) {
|
||||
my $comidx = $board;
|
||||
if ( !( $comidx % 5 ) ) {
|
||||
$board = ( $board / 5 );
|
||||
}
|
||||
elsif ( $comidx =~ /[16]$/ ) {
|
||||
$board = int( $board / 5 );
|
||||
$port = 25;
|
||||
}
|
||||
elsif ( $comidx =~ /[27]$/ ) {
|
||||
$board = int( $board / 5 );
|
||||
$port = 26;
|
||||
}
|
||||
}
|
||||
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
|
||||
$fw_port{$iid} = $index;
|
||||
}
|
||||
return \%fw_port;
|
||||
}
|
||||
|
||||
sub index_factor {
|
||||
return 256;
|
||||
}
|
||||
|
||||
sub slot_offset {
|
||||
return 0;
|
||||
}
|
||||
|
||||
# Devices do not support ENTITY-MIB use proprietary methods.
|
||||
|
||||
sub e_index {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_index($partial);
|
||||
}
|
||||
|
||||
sub e_class {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_class($partial);
|
||||
}
|
||||
|
||||
sub e_descr {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_descr($partial);
|
||||
}
|
||||
|
||||
sub e_name {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_name($partial);
|
||||
}
|
||||
|
||||
sub e_fwver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_fwver($partial);
|
||||
}
|
||||
|
||||
sub e_hwver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_hwver($partial);
|
||||
}
|
||||
|
||||
sub e_parent {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_parent($partial);
|
||||
}
|
||||
|
||||
sub e_pos {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_pos($partial);
|
||||
}
|
||||
|
||||
sub e_serial {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_serial($partial);
|
||||
}
|
||||
|
||||
sub e_swver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_swver($partial);
|
||||
}
|
||||
|
||||
sub e_type {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_type($partial);
|
||||
}
|
||||
|
||||
sub e_vendor {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->ns_e_vendor($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay/Nortel/Avaya Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $bayhub = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $bayhub->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Bay hub device through SNMP. Also provides device MAC to port mapping through
|
||||
the proprietary MIB.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::NortelStack
|
||||
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<S5-ETHERNET-COMMON-MIB>
|
||||
|
||||
=item F<S5-COMMON-STATS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::NortelStack/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $bayhub->vendor()
|
||||
|
||||
Returns 'avaya'
|
||||
|
||||
=item $bayhub->os()
|
||||
|
||||
Returns 'bay_hub'
|
||||
|
||||
=item $bayhub->model()
|
||||
|
||||
Cross references $bayhub->id() to the F<SYNOPTICS-MIB> and returns
|
||||
the results.
|
||||
|
||||
Removes either Baystack Hub, 5000, or 5005 depending on the model.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $bayhub->layers()
|
||||
|
||||
Returns 00000011. Class emulates Layer 2 functionality through proprietary
|
||||
MIBs.
|
||||
|
||||
=item $bayhub->index_factor()
|
||||
|
||||
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||
reserved per slot within the device MIB. Returns 256.
|
||||
|
||||
=item $bayhub->slot_offset()
|
||||
|
||||
Required by SNMP::Info::SONMP. Offset if slot numbering does not
|
||||
start at 0. Returns 0.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::NortelStack
|
||||
|
||||
See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $bayhub->i_index()
|
||||
|
||||
Returns reference to map of IIDs to Interface index.
|
||||
|
||||
Since hubs do not support C<ifIndex>, the interface index is created using the
|
||||
formula (board * 256 + port).
|
||||
|
||||
=item $bayhub->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to physical ports.
|
||||
|
||||
=item $bayhub->i_duplex()
|
||||
|
||||
Returns half, hubs do not support full duplex.
|
||||
|
||||
=item $bayhub->i_duplex_admin()
|
||||
|
||||
Returns half, hubs do not support full duplex.
|
||||
|
||||
=item $bayhub->i_speed()
|
||||
|
||||
Returns interface speed.
|
||||
|
||||
=item $bayhub->i_up()
|
||||
|
||||
Returns (C<s5EnPortLinkStatus>) for each port. Translates on/off to up/down.
|
||||
|
||||
=item $bayhub->i_up_admin()
|
||||
|
||||
Returns (C<s5EnPortPartStatus>) for each port.
|
||||
|
||||
=item $bayhub->set_i_up_admin(state, ifIndex)
|
||||
|
||||
Sets port state, must be supplied with state and port C<ifIndex>
|
||||
|
||||
State choices are 'up' or 'down'
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$bayhub->interfaces()};
|
||||
$bayhub->set_i_up_admin('down', $if_map{'1.1'})
|
||||
or die "Couldn't change port state. ",$bayhub->error(1);
|
||||
|
||||
=item $bayhub->bp_index()
|
||||
|
||||
Simulates bridge MIB by returning reference to a hash containing the index for
|
||||
both the keys and values.
|
||||
|
||||
=item $bayhub->fw_port()
|
||||
|
||||
Returns reference to map of IIDs of the C<S5-COMMON-STATS-MIB::s5CmSNodeTable>
|
||||
to the Interface index.
|
||||
|
||||
=item $bayhub->fw_mac()
|
||||
|
||||
(C<s5CmSNodeMacAddr>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Pseudo F<ENTITY-MIB> Information
|
||||
|
||||
These devices do not support F<ENTITY-MIB>. These methods emulate Physical
|
||||
Table methods using F<S5-CHASSIS-MIB>. See
|
||||
L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
|
||||
|
||||
=over
|
||||
|
||||
=item $bayhub->e_index()
|
||||
|
||||
Returns ns_e_index().
|
||||
|
||||
=item $bayhub->e_class()
|
||||
|
||||
Returns ns_e_class().
|
||||
|
||||
=item $bayhub->e_descr()
|
||||
|
||||
Returns ns_e_descr().
|
||||
|
||||
=item $bayhub->e_name()
|
||||
|
||||
Returns ns_e_name().
|
||||
|
||||
=item $bayhub->e_fwver()
|
||||
|
||||
Returns ns_e_fwver().
|
||||
|
||||
=item $bayhub->e_hwver()
|
||||
|
||||
Returns ns_e_hwver().
|
||||
|
||||
=item $bayhub->e_parent()
|
||||
|
||||
Returns ns_e_parent().
|
||||
|
||||
=item $bayhub->e_pos()
|
||||
|
||||
Returns ns_e_pos().
|
||||
|
||||
=item $bayhub->e_serial()
|
||||
|
||||
Returns ns_e_serial().
|
||||
|
||||
=item $bayhub->e_swver()
|
||||
|
||||
Returns ns_e_swver().
|
||||
|
||||
=item $bayhub->e_type()
|
||||
|
||||
Returns ns_e_type().
|
||||
|
||||
=item $bayhub->e_vendor()
|
||||
|
||||
Returns ns_e_vendor().
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::NortelStack
|
||||
|
||||
See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
640
lib/SNMP/Info/Layer1/Cyclades.pm
Normal file
640
lib/SNMP/Info/Layer1/Cyclades.pm
Normal file
@@ -0,0 +1,640 @@
|
||||
# SNMP::Info::Layer1::Cyclades
|
||||
#
|
||||
# Copyright (c) 2018 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::Cyclades;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer1::Cyclades::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Cyclades::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD);
|
||||
|
||||
$VERSION = '3.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
|
||||
550
lib/SNMP/Info/Layer1/S3000.pm
Normal file
550
lib/SNMP/Info/Layer1/S3000.pm
Normal file
@@ -0,0 +1,550 @@
|
||||
# SNMP::Info::Layer1::S3000
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::S3000;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer1::S3000::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer1::S3000::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'SYNOPTICS-ETHERNET-MIB' => 's3EnetPortTable',
|
||||
'SYNOPTICS-COMMON-MIB' => 's3AgentType',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
|
||||
# From SYNOPTICS-COMMON-MIB
|
||||
'os_bin' => 's3AgentFwVer',
|
||||
's3000_major_ver' => 's3AgentSwMajorVer',
|
||||
's3000_minor_ver' => 's3AgentSwMinorVer',
|
||||
's3000_maint_ver' => 's3AgentSwMaintVer',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
|
||||
# SYNOPTICS-ETHERNET-MIB::s3EnetPortTable
|
||||
's3000_pb_index' => 's3EnetPortBoardIndex',
|
||||
's3000_pp_index' => 's3EnetPortIndex',
|
||||
's3000_up_admin' => 's3EnetPortPartStatus',
|
||||
's3000_up' => 's3EnetPortLinkStatus',
|
||||
|
||||
# SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable
|
||||
's3000_nb_index' => 's3EnetShowNodesSlotIndex',
|
||||
's3000_np_index' => 's3EnetShowNodesPortIndex',
|
||||
'fw_mac' => 's3EnetShowNodesMacAddress',
|
||||
|
||||
# SYNOPTICS-ETHERNET-MIB::s3EnetTopNmmTable
|
||||
's3000_topo_port' => 's3EnetTopNmmPort',
|
||||
's3000_topo_mac' => 's3EnetTopNmmMacAddr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, 's3000_topo_mac' => \&SNMP::Info::munge_mac
|
||||
);
|
||||
|
||||
sub layers {
|
||||
return '00000011';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'synoptics';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $s3000 = shift;
|
||||
my $id = $s3000->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
$model =~ s/^s3reg-//i;
|
||||
|
||||
return $1 if ( $model =~ /((\d+){3}[\dX])/ );
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $s3000 = shift;
|
||||
my $major_ver = $s3000->s3000_major_ver() || 0;
|
||||
my $minor_ver = $s3000->s3000_minor_ver() || 0;
|
||||
my $maint_ver = $s3000->s3000_maint_ver() || 0;
|
||||
|
||||
my $ver = "$major_ver.$minor_ver.$maint_ver";
|
||||
return $ver;
|
||||
}
|
||||
|
||||
sub mac {
|
||||
my $s3000 = shift;
|
||||
my $topo_port = $s3000->s3000_topo_port();
|
||||
my $topo_mac = $s3000->s3000_topo_mac();
|
||||
|
||||
foreach my $entry ( keys %$topo_port ) {
|
||||
my $port = $topo_port->{$entry};
|
||||
next unless $port == 0;
|
||||
my $mac = $topo_mac->{$entry};
|
||||
return $mac;
|
||||
}
|
||||
|
||||
# Topology turned off, not supported.
|
||||
return;
|
||||
}
|
||||
|
||||
# Hubs do not support ifMIB requirements for get MAC
|
||||
# and port status
|
||||
|
||||
sub i_index {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $s3000->s3000_pb_index($partial) || {};
|
||||
my $p_index = $s3000->s3000_pp_index($partial) || {};
|
||||
|
||||
my %i_index;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
# We need to make up an index for multiple board instances.
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
|
||||
$i_index{$iid} = $index;
|
||||
}
|
||||
return \%i_index;
|
||||
}
|
||||
|
||||
# Partials don't really help in this class, but implemented
|
||||
# for consistency
|
||||
|
||||
sub interfaces {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $s3000->i_index() || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# Index numbers are deterministic slot * 256 + port - see i_index()
|
||||
my $port = $index % 256;
|
||||
my $slot = int( $index / 256 );
|
||||
|
||||
my $slotport = "$slot.$port";
|
||||
|
||||
$if{$index} = $slotport;
|
||||
}
|
||||
|
||||
return \%if;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# Hubs only function half duplex
|
||||
my $duplex = 'half';
|
||||
$i_duplex{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# Hubs only function half duplex
|
||||
my $duplex = 'half';
|
||||
$i_duplex_admin{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
|
||||
my %i_speed;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# These hubs only support 10 Mbs
|
||||
my $speed = '10000000';
|
||||
$i_speed{$index} = $speed;
|
||||
}
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
my $link_stat = $s3000->s3000_up() || {};
|
||||
|
||||
my %i_up;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $link_stat = $link_stat->{$iid};
|
||||
next unless defined $link_stat;
|
||||
|
||||
$link_stat = 'up' if $link_stat =~ /on/i;
|
||||
$link_stat = 'down' if $link_stat =~ /off/i;
|
||||
|
||||
$i_up{$index} = $link_stat;
|
||||
}
|
||||
return \%i_up;
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $s3000->i_index() || {};
|
||||
my $link_stat = $s3000->s3000_up_admin() || {};
|
||||
|
||||
my %i_up_admin;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $link_stat = $link_stat->{$iid};
|
||||
next unless defined $link_stat;
|
||||
|
||||
$i_up_admin{$index} = $link_stat;
|
||||
}
|
||||
return \%i_up_admin;
|
||||
}
|
||||
|
||||
sub set_i_up_admin {
|
||||
|
||||
# map setting to those the hub will understand
|
||||
my %setting = qw/up 2 down 3/;
|
||||
|
||||
my $s3000 = shift;
|
||||
my ( $setting, $iid ) = @_;
|
||||
|
||||
my $i_index = $s3000->i_index() || {};
|
||||
my %reverse_i_index = reverse %$i_index;
|
||||
|
||||
$setting = lc($setting);
|
||||
|
||||
return 0 unless defined $setting{$setting};
|
||||
|
||||
$iid = $reverse_i_index{$iid};
|
||||
|
||||
return $s3000->set_s3000_up_admin( $setting{$setting}, $iid );
|
||||
}
|
||||
|
||||
# Hubs do not support the standard Bridge MIB
|
||||
sub bp_index {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $s3000->s3000_nb_index() || {};
|
||||
my $p_index = $s3000->s3000_np_index() || {};
|
||||
my $model = $s3000->model();
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
$bp_index{$index} = $index;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $s3000->SUPER::fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $s3000->s3000_nb_index($partial) || {};
|
||||
my $p_index = $s3000->s3000_np_index($partial) || {};
|
||||
my $model = $s3000->model();
|
||||
|
||||
my %fw_port;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
|
||||
$fw_port{$iid} = $index;
|
||||
}
|
||||
return \%fw_port;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1::S3000 - SNMP Interface to Synoptics / Nortel Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $s3000 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $s3000->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Bay hub device through SNMP. Also provides device MAC to port mapping through
|
||||
the proprietary MIB.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<SYNOPTICS-COMMON-MIB>
|
||||
|
||||
=item F<SYNOPTICS-ETHERNET-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $s3000->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
|
||||
=item $s3000->os()
|
||||
|
||||
Returns 'synoptics'
|
||||
|
||||
=item $s3000->model()
|
||||
|
||||
Cross references $s3000->id() to the F<SYNOPTICS-MIB> and returns
|
||||
the results.
|
||||
|
||||
Removes C<sreg-> from the model name and returns only the numeric model
|
||||
identifier.
|
||||
|
||||
=item $stack->os_ver()
|
||||
|
||||
Returns the software version specified as major.minor.maint.
|
||||
|
||||
(C<s3AgentSwMajorVer>).(C<s3AgentSwMinorVer>).(C<s3AgentSwMaintVer>)
|
||||
|
||||
=item $stack->os_bin()
|
||||
|
||||
Returns the firmware version. (C<s3AgentFwVer>)
|
||||
|
||||
=item $s3000->mac()
|
||||
|
||||
Returns MAC of the advertised IP address of the device.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $s3000->layers()
|
||||
|
||||
Returns 00000011. Class emulates Layer 2 functionality through proprietary
|
||||
MIBs.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $s3000->i_index()
|
||||
|
||||
Returns reference to map of IIDs to Interface index.
|
||||
|
||||
Since hubs do not support C<ifIndex>, the interface index is created using the
|
||||
formula (board * 256 + port). This is required to support devices with more
|
||||
than one module.
|
||||
|
||||
=item $s3000->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to physical ports.
|
||||
|
||||
=item $s3000->i_duplex()
|
||||
|
||||
Returns half, hubs do not support full duplex.
|
||||
|
||||
=item $s3000->i_duplex_admin()
|
||||
|
||||
Returns half, hubs do not support full duplex.
|
||||
|
||||
=item $s3000->i_speed()
|
||||
|
||||
Returns 10000000. The hubs only support 10 Mbs Ethernet.
|
||||
|
||||
=item $s3000->i_up()
|
||||
|
||||
Returns (C<s3EnetPortLinkStatus>) for each port. Translates on/off to
|
||||
up/down.
|
||||
|
||||
=item $s3000->i_up_admin()
|
||||
|
||||
Returns (C<s3EnetPortPartStatus>) for each port.
|
||||
|
||||
=item $s3000->set_i_up_admin(state, ifIndex)
|
||||
|
||||
Sets port state, must be supplied with state and port C<ifIndex>
|
||||
|
||||
State choices are 'up' or 'down'
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$s3000->interfaces()};
|
||||
$s3000->set_i_up_admin('down', $if_map{'1.1'})
|
||||
or die "Couldn't change port state. ",$s3000->error(1);
|
||||
|
||||
=item $s3000->bp_index()
|
||||
|
||||
Simulates bridge MIB by returning reference to a hash containing the index for
|
||||
both the keys and values.
|
||||
|
||||
=item $s3000->fw_port()
|
||||
|
||||
Returns reference to map of IIDs of the
|
||||
C<SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable> to the Interface index.
|
||||
|
||||
=item $s3000->fw_mac()
|
||||
|
||||
(C<s3EnetShowNodesMacAddress>)
|
||||
|
||||
=item $s3000->s3000_topo_port()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Port Number
|
||||
(interface iid)
|
||||
|
||||
(C<s3EnetTopNmmPort>)
|
||||
|
||||
=item $s3000->s3000_topo_mac()
|
||||
|
||||
(C<s3EnetTopNmmMacAddr>)
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote MAC address
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
353
lib/SNMP/Info/Layer2.pm
Normal file
353
lib/SNMP/Info/Layer2.pm
Normal file
@@ -0,0 +1,353 @@
|
||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::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::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MUNGE);
|
||||
|
||||
$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
|
||||
);
|
||||
|
||||
%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 = (
|
||||
|
||||
# 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 proprietary MIB.
|
||||
sub model {
|
||||
my $l2 = shift;
|
||||
my $id = $l2->id();
|
||||
my $model = &SNMP::translateObj($id) || $id || '';
|
||||
|
||||
# HP
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
# Cisco
|
||||
$model =~ s/sysid$//i;
|
||||
$model =~ s/^(cisco|catalyst)//i;
|
||||
$model =~ s/^cat//i;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l2 = shift;
|
||||
my $model = $l2->model() || '';
|
||||
my $descr = $l2->description() || '';
|
||||
|
||||
if ( $model =~ /hp/i or $descr =~ /\bhp\b/i ) {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
if ( $model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i ) {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $l2 = shift;
|
||||
|
||||
my $entity_serial = $l2->entity_derived_serial();
|
||||
if ( defined $entity_serial and $entity_serial !~ /^\s*$/ ){
|
||||
return $entity_serial;
|
||||
}
|
||||
|
||||
my $serial1 = $l2->serial1();
|
||||
if ( defined $serial1 and $serial1 !~ /^\s*$/ ) {
|
||||
return $serial1;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $l2 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l2->i_index($partial) || {};
|
||||
my $i_descr = $l2->i_description($partial) || {};
|
||||
|
||||
# Replace the Index with the ifDescr field.
|
||||
# Check for duplicates in ifDescr, if so uniquely identify by adding
|
||||
# ifIndex to repeated values
|
||||
my (%seen, %first_seen_as);
|
||||
foreach my $iid ( sort keys %$i_descr ) {
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$port = SNMP::Info::munge_null($port);
|
||||
$port =~ s/^\s+//; $port =~ s/\s+$//;
|
||||
next unless length $port;
|
||||
|
||||
if ( $seen{$port}++ ) {
|
||||
# (#320) also fixup the port this is a duplicate of
|
||||
$interfaces->{ $first_seen_as{$port} }
|
||||
= sprintf( "%s (%d)", $port, $first_seen_as{$port} );
|
||||
|
||||
$interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
|
||||
}
|
||||
else {
|
||||
$interfaces->{$iid} = $port;
|
||||
$first_seen_as{$port} = $iid;
|
||||
}
|
||||
}
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2 - SNMP Interface to network devices serving Layer2 only.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $l2 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l2->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
my $interfaces = $l2->interfaces();
|
||||
my $i_up = $l2->i_up();
|
||||
my $i_speed = $l2->i_speed();
|
||||
foreach my $iid (keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $up = $i_up->{$iid};
|
||||
my $speed = $i_speed->{$iid}
|
||||
print "Port $port is $up. Port runs at $speed.\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes
|
||||
listed under SNMP::Info::Layer2::* Please read all docs under SNMP::Info
|
||||
first.
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Layer2 device through SNMP. Information is stored in a number of MIBs.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $l2 = new SNMP::Info::Layer2(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=item SNMP::Info::DocsisHE
|
||||
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::PowerEthernet
|
||||
|
||||
=item SNMP::Info::PortAccessEntity
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found in netdisco-mibs package.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l2->model()
|
||||
|
||||
Cross references $l2->id() with product IDs in the
|
||||
Cisco MIBs.
|
||||
|
||||
For HP devices, removes C<'hpswitch'> from the name
|
||||
|
||||
For Cisco devices, removes c<'sysid'> from the name
|
||||
|
||||
=item $l2->vendor()
|
||||
|
||||
Tries to discover the vendor from $l2->model() and $l2->description()
|
||||
|
||||
=item $l2->serial()
|
||||
|
||||
Returns a serial number if found from F<ENTITY-MIB> and F<OLD-CISCO->... MIB.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"USAGE"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=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
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l2->interfaces()
|
||||
|
||||
Creates a map between the interface identifier (iid) and the physical port
|
||||
name.
|
||||
|
||||
Defaults to C<ifDescr> but checks and overrides with C<ifName>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"USAGE"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::PortAccessEntity
|
||||
|
||||
See documentation in L<SNMP::Info::PortAccessEntity/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
203
lib/SNMP/Info/Layer2/3Com.pm
Normal file
203
lib/SNMP/Info/Layer2/3Com.pm
Normal file
@@ -0,0 +1,203 @@
|
||||
# SNMP::Info::Layer2::3Com - SNMP Interface to 3Com Devices
|
||||
#
|
||||
# Copyright (c) 2019 by The Netdisco Developer Team.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::3Com;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::CDP;
|
||||
|
||||
@SNMP::Info::Layer2::3Com::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::3Com::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'A3Com-products-MIB' => 'wlanAP7760',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
);
|
||||
|
||||
sub os {
|
||||
return '3Com';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $dev = shift;
|
||||
my $e_serial = $dev->e_serial();
|
||||
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( sort keys %$e_serial ) {
|
||||
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
|
||||
return $e_serial->{$e};
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
|
||||
my $dev = shift;
|
||||
my $e_swver = $dev->e_swver();
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( sort keys %$e_swver ) {
|
||||
if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
|
||||
return $e_swver->{$e};
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return '3com';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $dsmodel = shift;
|
||||
my $descr = $dsmodel->description();
|
||||
|
||||
if (defined ($descr)) {
|
||||
if ($descr =~ /^([\S ]+) Software.*/) {
|
||||
return $1;
|
||||
} else {
|
||||
return $descr;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::3Com - SNMP Interface to L2 3Com Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Kosmach
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $router = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $router->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for 3Com L2 devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<A3Com-products-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $device->vendor()
|
||||
|
||||
Returns '3com'
|
||||
|
||||
=item $device->os()
|
||||
|
||||
Returns '3Com'
|
||||
|
||||
=item $device->os_ver()
|
||||
|
||||
Return os version
|
||||
|
||||
=item $device->model()
|
||||
|
||||
Returns device model extracted from description
|
||||
|
||||
=item $device->serial()
|
||||
|
||||
Returns serial number
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
308
lib/SNMP/Info/Layer2/Adtran.pm
Normal file
308
lib/SNMP/Info/Layer2/Adtran.pm
Normal file
@@ -0,0 +1,308 @@
|
||||
# SNMP::Info::Layer2::Adtran - SNMP Interface to Adtran Devices
|
||||
#
|
||||
# Copyright (c) 2019 by The Netdisco Developer Team.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Adtran;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer2::Adtran::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Adtran::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
|
||||
|
||||
$VERSION = '3.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
|
||||
398
lib/SNMP/Info/Layer2/Airespace.pm
Normal file
398
lib/SNMP/Info/Layer2/Airespace.pm
Normal file
@@ -0,0 +1,398 @@
|
||||
# SNMP::Info::Layer2::Airespace
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Airespace;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::Airespace;
|
||||
|
||||
@SNMP::Info::Layer2::Airespace::ISA
|
||||
= qw/SNMP::Info::Airespace SNMP::Info::CDP SNMP::Info::Bridge Exporter/;
|
||||
@SNMP::Info::Layer2::Airespace::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::CDP::MIBS, %SNMP::Info::Airespace::MIBS,
|
||||
'CISCO-LWAPP-DOT11-CLIENT-MIB' => 'cldcClientCurrentTxRateSet',
|
||||
'CISCO-LWAPP-DOT11-MIB' => 'cldHtDot11nChannelBandwidth',
|
||||
'CISCO-LWAPP-AP-MIB' => 'cLApIfMacAddress',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS, %SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS, %SNMP::Info::Airespace::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS, %SNMP::Info::Airespace::FUNCS,
|
||||
# CISCO-LWAPP-AP-MIB::cLApTable
|
||||
'ap_if_mac' => 'cLApIfMacAddress',
|
||||
# CISCO-LWAPP-DOT11-CLIENT-MIB::cldcClientTable
|
||||
'client_txrate' => 'cldcClientCurrentTxRateSet',
|
||||
'cd11_proto' => 'cldcClientProtocol',
|
||||
'cd11_rateset' => 'cldcClientDataRateSet',
|
||||
# CISCO-LWAPP-DOT11-MIB::cldHtMacOperationsTable
|
||||
'cd11n_ch_bw' => 'cldHtDot11nChannelBandwidth',
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::MUNGE, %SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE, %SNMP::Info::Airespace::MUNGE,
|
||||
'ap_if_mac' => \&SNMP::Info::munge_mac,
|
||||
'cd11n_ch_bw' => \&munge_cd11n_ch_bw,
|
||||
'cd11_rateset' => \&munge_cd11_rateset,
|
||||
'cd11_proto' => \&munge_cd11_proto,
|
||||
);
|
||||
|
||||
# 802.11n Modulation and Coding Scheme (MCS)
|
||||
my $mcs_index = {
|
||||
20 => {
|
||||
m0 => '6.5',
|
||||
m1 => '13',
|
||||
m2 => '19.5',
|
||||
m3 => '26',
|
||||
m4 => '39',
|
||||
m5 => '52',
|
||||
m6 => '58.5',
|
||||
m7 => '65',
|
||||
m8 => '13',
|
||||
m9 => '26',
|
||||
m10 => '39',
|
||||
m11 => '52',
|
||||
m12 => '78',
|
||||
m13 => '104',
|
||||
m14 => '117',
|
||||
m15 => '130',
|
||||
m16 => '19.5',
|
||||
m17 => '39',
|
||||
m18 => '58.5',
|
||||
m19 => '78',
|
||||
m20 => '117',
|
||||
m21 => '156',
|
||||
m22 => '175.5',
|
||||
m23 => '195',
|
||||
# This is a cheat for 802.11a bonded
|
||||
m108 => '108',
|
||||
},
|
||||
40 => {
|
||||
m0 => '15',
|
||||
m1 => '30',
|
||||
m2 => '45',
|
||||
m3 => '60',
|
||||
m4 => '90',
|
||||
m5 => '120',
|
||||
m6 => '135',
|
||||
m7 => '157.5',
|
||||
m8 => '30',
|
||||
m9 => '60',
|
||||
m10 => '90',
|
||||
m11 => '120',
|
||||
m12 => '180',
|
||||
m13 => '240',
|
||||
m14 => '270',
|
||||
m15 => '300',
|
||||
m16 => '45',
|
||||
m17 => '90',
|
||||
m18 => '135',
|
||||
m19 => '180',
|
||||
m20 => '270',
|
||||
m21 => '360',
|
||||
m22 => '405',
|
||||
m23 => '450',
|
||||
}
|
||||
};
|
||||
|
||||
sub os {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $airespace = shift;
|
||||
my $model = $airespace->airespace_model();
|
||||
return unless defined $model;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub cd11_mac {
|
||||
my $airespace = shift;
|
||||
my $cd11_sigstrength = $airespace->cd11_sigstrength();
|
||||
|
||||
my $ret = {};
|
||||
foreach my $idx ( keys %$cd11_sigstrength ) {
|
||||
my $mac = join( ":", map { sprintf "%02x", $_ } split /\./, $idx );
|
||||
$ret->{$idx} = $mac
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub cd11_txrate {
|
||||
my $airespace = shift;
|
||||
|
||||
my $rates = $airespace->client_txrate() || {};
|
||||
my $protos = $airespace->cd11_proto() || {};
|
||||
my $bws = $airespace->cd11n_ch_bw() || {};
|
||||
|
||||
my $cd11_txrate = {};
|
||||
foreach my $idx ( keys %$rates ) {
|
||||
my $rate = $rates->{$idx} || '0.0';
|
||||
|
||||
if ( $rate =~ /^\d+/ ) {
|
||||
$cd11_txrate->{$idx} = [ $rate * 1.0 ];
|
||||
}
|
||||
elsif ( $rate =~ /^m/ ) {
|
||||
my $band = $protos->{$idx};
|
||||
my $bw = $bws->{$band};
|
||||
# FIXME throw some kind of error if we get an index/rate that we haven't implemented yet? Now we simply return "0.0"...
|
||||
$cd11_txrate->{$idx} = [ $mcs_index->{$bw}->{$rate} || '0.0' ];
|
||||
}
|
||||
else {
|
||||
$cd11_txrate->{$idx} = [ $rate ];
|
||||
}
|
||||
}
|
||||
return $cd11_txrate;
|
||||
}
|
||||
|
||||
sub munge_cd11n_ch_bw {
|
||||
my $bw = shift;
|
||||
|
||||
if ( $bw =~ /forty/ ) {
|
||||
return 40;
|
||||
}
|
||||
return 20;
|
||||
}
|
||||
|
||||
sub munge_cd11_proto {
|
||||
my $bw = shift;
|
||||
|
||||
return 2 if ( $bw eq 'dot11n5' );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub munge_cd11_rateset {
|
||||
my $rates = shift;
|
||||
return [ map { $_ * 1.0 } split /,/, $rates ];
|
||||
}
|
||||
|
||||
# Cisco provides the AP's Ethernet MAC via
|
||||
# CISCO-LWAPP-AP-MIB::cLApIfMacAddress this was not available pre-Cisco
|
||||
sub i_mac {
|
||||
my $airespace = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $airespace->i_index($partial) || {};
|
||||
my $ap_mac = $airespace->ap_if_mac() || {};
|
||||
|
||||
my $i_mac = $airespace->SUPER::i_mac() || {};
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
$index =~ s/\.\d+$//;
|
||||
next unless defined $index;
|
||||
my $sys_mac = join( '.', map { hex($_) } split( ':', $index ) );
|
||||
my $mac = $ap_mac->{$sys_mac};
|
||||
$i_mac->{$iid} = $mac;
|
||||
}
|
||||
}
|
||||
return $i_mac;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Airespace - SNMP Interface to Cisco (Airespace) Wireless
|
||||
Controllers
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $airespace = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $airespace->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from
|
||||
Cisco (Airespace) Wireless Controllers through SNMP.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Airespace
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-LWAPP-DOT11-CLIENT-MIB>
|
||||
|
||||
=item F<CISCO-LWAPP-DOT11-MIB>
|
||||
|
||||
=item F<CISCO-LWAPP-AP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $airespace->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $airespace->os()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $airespace->model()
|
||||
|
||||
(C<agentInventoryMachineModel>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Airespace
|
||||
|
||||
See documentation in L<SNMP::Info::Airespace/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item cd11_mac()
|
||||
|
||||
Returns client radio interface MAC addresses.
|
||||
|
||||
=item cd11_txrate()
|
||||
|
||||
Returns client transmission speed in Mbs.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item i_mac()
|
||||
|
||||
Adds AP Ethernet MAC as port mac on radio ports from C<CISCO-LWAPP-AP-MIB>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Airespace
|
||||
|
||||
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item munge_cd11n_ch_bw()
|
||||
|
||||
Converts 802.11n channel bandwidth to either 20 or 40.
|
||||
|
||||
=item munge_cd11_proto()
|
||||
|
||||
Converts 802.11n 2.4Ghz to 1 and 5Ghz to 2 to correspond to the
|
||||
(C<cldHtMacOperationsTable>) index.
|
||||
|
||||
=item munge_cd11_rateset()
|
||||
|
||||
Converts rate set to array.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
688
lib/SNMP/Info/Layer2/Aironet.pm
Normal file
688
lib/SNMP/Info/Layer2/Aironet.pm
Normal file
@@ -0,0 +1,688 @@
|
||||
# SNMP::Info::Layer2::Aironet
|
||||
#
|
||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Aironet;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::EtherLike;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::IEEE802dot11;
|
||||
|
||||
@SNMP::Info::Layer2::Aironet::ISA
|
||||
= qw/SNMP::Info::Layer2 SNMP::Info::EtherLike
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
|
||||
@SNMP::Info::Layer2::Aironet::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'serial' => 'entPhysicalSerialNum.1',
|
||||
'ps1_type' => 'cpoePdCurrentPowerSource',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
'i_80211channel' => 'cd11IfPhyDsssCurrentChannel',
|
||||
'c_dot11subif' => 'cDot11ClientSubIfIndex',
|
||||
'cd11_rateset' => 'cDot11ClientDataRateSet',
|
||||
'cd11_txrate' => 'cDot11ClientCurrentTxRateSet',
|
||||
'cd11_uptime' => 'cDot11ClientUpTime',
|
||||
'cd11_sigstrength' => 'cDot11ClientSignalStrength',
|
||||
'cd11_sigqual' => 'cDot11ClientSigQuality',
|
||||
'cd11_rxpkt' => 'cDot11ClientPacketsReceived',
|
||||
'cd11_txpkt' => 'cDot11ClientPacketsSent',
|
||||
'cd11_rxbyte' => 'cDot11ClientBytesReceived',
|
||||
'cd11_txbyte' => 'cDot11ClientBytesSent',
|
||||
'mbss_mac_addr' => 'cdot11MbssidIfMacAddress',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::IEEE802dot11::MIBS,
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
'CISCO-DOT11-IF-MIB' => 'cd11IfAuxSsid',
|
||||
'CISCO-DOT11-ASSOCIATION-MIB' => 'cDot11ClientSubIfIndex',
|
||||
'CISCO-DOT11-SSID-SECURITY-MIB' => 'cdot11SecVlanNameId',
|
||||
'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
|
||||
'CISCO-POE-PD-MIB' => 'cpoePdCurrentPowerSource',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::IEEE802dot11::MUNGE,
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
'cd11_txrate' => \&munge_cd11_txrate,
|
||||
'cd11_rateset' => \&munge_cd11_txrate,
|
||||
'mbss_mac_addr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Use 802.11 power level without putting IEEE802dot11 in @ISA
|
||||
*SNMP::Info::Layer2::Aironet::dot11_cur_tx_pwr_mw
|
||||
= \&SNMP::Info::IEEE802dot11::dot11_cur_tx_pwr_mw;
|
||||
|
||||
sub vendor {
|
||||
# Sorry, but it's true.
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $aironet = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_description = $aironet->i_description($partial);
|
||||
|
||||
return $i_description;
|
||||
}
|
||||
|
||||
# Tag on e_descr.1
|
||||
sub description {
|
||||
my $aironet = shift;
|
||||
my $descr = $aironet->SUPER::description();
|
||||
my $e_descr = $aironet->e_descr();
|
||||
|
||||
if (defined $e_descr->{1}) {
|
||||
if (defined $descr) {
|
||||
$descr = "$e_descr->{1} $descr"
|
||||
} else {
|
||||
$descr = "$e_descr->{1}"
|
||||
}
|
||||
}
|
||||
return $descr;
|
||||
}
|
||||
|
||||
# Fetch duplex from EtherLike
|
||||
sub i_duplex {
|
||||
my $aironet = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $aironet->el_duplex($partial);
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $d ( keys %$el_duplex ) {
|
||||
my $val = $el_duplex->{$d};
|
||||
next unless defined $val;
|
||||
$i_duplex{$d} = 'full' if $val =~ /full/i;
|
||||
$i_duplex{$d} = 'half' if $val =~ /half/i;
|
||||
}
|
||||
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
#
|
||||
# IOS 12.3 introduces the cDot11ClientSubIfIndex in the
|
||||
# cDot11ClientConfigInfoTable, which supplies the ifIndex
|
||||
# of the VLAN Subinterface if one exists, or of the primary
|
||||
# interface if there are not subinterfaces. 12.2 used the
|
||||
# Q-BRIDGE-MIB dot1qTpFdbTable but that was removed in 12.3.
|
||||
sub _aironet_special {
|
||||
my $aironet = shift;
|
||||
my $os_ver = $aironet->os_ver();
|
||||
if ( defined($os_ver)
|
||||
&& $os_ver =~ /^(\d+)\.(\d+)(\D|$)/
|
||||
&& ( ( $1 == 12 && $2 >= 3 ) || $1 > 12 ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# INDEX { ifIndex, cd11IfAuxSsid, cDot11ClientAddress }
|
||||
sub _aironet_breakout_dot11idx {
|
||||
my $oid = shift;
|
||||
|
||||
my @parts = split( /\./, $oid );
|
||||
my $ifindex = shift(@parts);
|
||||
my $ssidlen = shift(@parts);
|
||||
my $ssid = pack( "C*", splice( @parts, 0, $ssidlen ) );
|
||||
my $mac = join( ":", map { sprintf "%02x", $_ } @parts );
|
||||
return ( $ifindex, $ssid, $mac );
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->qb_fw_mac() unless _aironet_special($aironet);
|
||||
my $c_dot11subif = $aironet->c_dot11subif();
|
||||
my $fw_mac = {};
|
||||
|
||||
foreach my $i ( keys %$c_dot11subif ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
|
||||
$fw_mac->{$i} = $mac;
|
||||
}
|
||||
return $fw_mac;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->qb_fw_port() unless _aironet_special($aironet);
|
||||
my $c_dot11subif = $aironet->c_dot11subif();
|
||||
my $fw_port = {};
|
||||
|
||||
foreach my $i ( keys %$c_dot11subif ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
|
||||
$fw_port->{$i} = $c_dot11subif->{$i} || $ifindex;
|
||||
}
|
||||
return $fw_port;
|
||||
}
|
||||
|
||||
sub bp_index {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->orig_bp_index() unless _aironet_special($aironet);
|
||||
my $c_dot11subif = $aironet->c_dot11subif();
|
||||
my $bp_index = {};
|
||||
|
||||
foreach my $i ( keys %$c_dot11subif ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
|
||||
my ($i) = $c_dot11subif->{$i} || $ifindex;
|
||||
$bp_index->{$i} = $i;
|
||||
}
|
||||
return $bp_index;
|
||||
}
|
||||
|
||||
###
|
||||
#
|
||||
# VLAN support
|
||||
#
|
||||
sub v_name {
|
||||
my $aironet = shift;
|
||||
|
||||
my $v_name = {};
|
||||
my $vlan_nameid = $aironet->cdot11SecVlanNameId();
|
||||
foreach my $i ( keys %$vlan_nameid ) {
|
||||
my @parts = split( /\./, $i );
|
||||
my $namelen = shift(@parts);
|
||||
|
||||
my $name = pack( "C*", @parts );
|
||||
$v_name->{$i} = $name;
|
||||
}
|
||||
return $v_name;
|
||||
}
|
||||
|
||||
sub v_index {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->cdot11SecVlanNameId();
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $aironet = shift;
|
||||
|
||||
my $i_vlan = {};
|
||||
my $idxmap = $aironet->cviRoutedVlanIfIndex();
|
||||
foreach my $i ( keys %$idxmap ) {
|
||||
my @parts = split( /\./, $i );
|
||||
$i_vlan->{ $idxmap->{$i} } = $parts[0];
|
||||
}
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
# The MIB reports in units of half a megabit, e.g.,
|
||||
# 5.5Mbps is reported as 11.
|
||||
sub munge_cd11_txrate {
|
||||
my $txrates = shift;
|
||||
my @units = unpack( "C*", $txrates );
|
||||
my @rates = map {
|
||||
my $unit = $_;
|
||||
$unit *= 0.5;
|
||||
} @units;
|
||||
|
||||
return \@rates;
|
||||
}
|
||||
|
||||
# cd11 INDEX
|
||||
sub cd11_port {
|
||||
my $aironet = shift;
|
||||
my $cd11_sigstrength = $aironet->cd11_sigstrength();
|
||||
my $interfaces = $aironet->interfaces();
|
||||
my %ret;
|
||||
foreach ( keys %$cd11_sigstrength ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
|
||||
$ret{$_} = $interfaces->{$ifindex};
|
||||
}
|
||||
return \%ret;
|
||||
}
|
||||
|
||||
sub cd11_ssid {
|
||||
my $aironet = shift;
|
||||
my $cd11_sigstrength = $aironet->cd11_sigstrength();
|
||||
my %ret;
|
||||
foreach ( keys %$cd11_sigstrength ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
|
||||
$ret{$_} = $ssid;
|
||||
}
|
||||
return \%ret;
|
||||
}
|
||||
|
||||
sub cd11_mac {
|
||||
my $aironet = shift;
|
||||
my $cd11_sigstrength = $aironet->cd11_sigstrength();
|
||||
my %ret;
|
||||
foreach ( keys %$cd11_sigstrength ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
|
||||
$ret{$_} = $mac;
|
||||
}
|
||||
return \%ret;
|
||||
}
|
||||
|
||||
# Map VLAN N on interface I to its actual ifIndex.
|
||||
sub _vlan_map_n_stack {
|
||||
my $aironet = shift;
|
||||
my $vlan_idx = $aironet->cviRoutedVlanIfIndex();
|
||||
|
||||
my $vlan_map = {};
|
||||
foreach my $idx ( keys %$vlan_idx ) {
|
||||
my ( $vlan, $num ) = split( /\./, $idx );
|
||||
$vlan_map->{$vlan}->{$num} = $vlan_idx->{$idx};
|
||||
}
|
||||
return $vlan_map;
|
||||
}
|
||||
|
||||
# When using MBSS, the ifTable reports the
|
||||
# base MAC address, but the actual association is
|
||||
# with a different MAC address for MBSS.
|
||||
# This convoluted path seems to be necessary
|
||||
# to get the right overrides.
|
||||
sub i_mac {
|
||||
my $aironet = shift;
|
||||
|
||||
# no partial is possible due to the levels
|
||||
# of indirection.
|
||||
|
||||
# Start with the ifPhysAddress, and override
|
||||
my $mbss_mac = $aironet->orig_i_mac();
|
||||
|
||||
my $mbss_mac_addr = $aironet->mbss_mac_addr();
|
||||
my $ssid_vlan = $aironet->cdot11SecAuxSsidVlan();
|
||||
my $vlan_map = $aironet->cviRoutedVlanIfIndex();
|
||||
my $ifstack = $aironet->ifStackStatus();
|
||||
|
||||
my $vlan_list = {};
|
||||
foreach my $idx ( keys %$vlan_map ) {
|
||||
my ( $vlan, $num ) = split( /\./, $idx );
|
||||
push( @{ $vlan_list->{$vlan} }, $vlan_map->{$idx} );
|
||||
}
|
||||
|
||||
my $stack = {};
|
||||
foreach my $idx ( keys %$ifstack ) {
|
||||
my ( $upper, $lower ) = split( /\./, $idx );
|
||||
$stack->{$upper}->{$lower} = $ifstack->{$idx};
|
||||
}
|
||||
|
||||
# mbss_mac_addr index is (radio, ssid).
|
||||
# ssid_vlan maps ssid->vlan.
|
||||
# vlan_map maps vlan->[list of interfaces]
|
||||
# ifstack allows us to pick the right interface
|
||||
foreach my $idx ( keys %$mbss_mac_addr ) {
|
||||
my ( $interface, @ssid ) = split( /\./, $idx );
|
||||
my $vlan = $ssid_vlan->{ join( ".", scalar(@ssid), @ssid ) };
|
||||
next unless defined($vlan);
|
||||
foreach my $vlanif ( @{ $vlan_list->{$vlan} } ) {
|
||||
if ( defined( $stack->{$vlanif}->{$interface} ) ) {
|
||||
$mbss_mac->{$vlanif} = $mbss_mac_addr->{$idx};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $mbss_mac;
|
||||
}
|
||||
|
||||
sub i_ssidlist {
|
||||
my $aironet = shift;
|
||||
|
||||
# no partial is possible due to the levels
|
||||
# of indirection.
|
||||
my $ssid_row = $aironet->cdot11SecInterfSsidRowStatus();
|
||||
my $ssid_vlan = $aironet->cdot11SecAuxSsidVlan();
|
||||
if ( !defined($ssid_row) || !defined($ssid_vlan) ) {
|
||||
return $aironet->cd11IfAuxSsid();
|
||||
}
|
||||
my $ssidlist = {};
|
||||
my $if_ssidcount = {};
|
||||
my $vlan_map = $aironet->_vlan_map_n_stack();
|
||||
foreach my $idx ( keys %$ssid_row ) {
|
||||
next unless $ssid_row->{$idx} eq 'active';
|
||||
|
||||
# ssid_row index is radio.ssid
|
||||
my ( $interface, $ssid ) = split( /\./, $idx, 2 );
|
||||
my ( $len, @ssidt ) = split( /\./, $ssid );
|
||||
my $mappedintf = $vlan_map->{ $ssid_vlan->{$ssid} }->{$interface};
|
||||
next unless $mappedintf;
|
||||
if ( !$if_ssidcount->{$mappedintf} ) {
|
||||
$if_ssidcount->{$mappedintf} = 1;
|
||||
}
|
||||
my $ssidlist_idx
|
||||
= sprintf( "%s.%d", $mappedintf, $if_ssidcount->{$mappedintf} );
|
||||
$ssidlist->{$ssidlist_idx} = pack( "C*", @ssidt );
|
||||
$if_ssidcount->{$mappedintf}++;
|
||||
}
|
||||
return $ssidlist;
|
||||
}
|
||||
|
||||
sub i_ssidbcast {
|
||||
my $aironet = shift;
|
||||
my $partial = shift;
|
||||
my $mbss_bcast = $aironet->cdot11SecAuxSsidMbssidBroadcast();
|
||||
if ( !defined($mbss_bcast) ) {
|
||||
return $aironet->cd11IfAuxSsidBroadcastSsid($partial);
|
||||
}
|
||||
my $map = {};
|
||||
foreach my $key ( keys %$mbss_bcast ) {
|
||||
my (@idx) = split( /\./, $key );
|
||||
my $len = shift(@idx);
|
||||
$map->{ pack( "C*", @idx ) } = $mbss_bcast->{$key};
|
||||
}
|
||||
|
||||
# This needs to return the same indexes as i_ssidlist.
|
||||
# mbss_bcast maps ssid -> broadcasting
|
||||
# so we just replace the i_ssidlist values with the mbss_bcast ones.
|
||||
my $i_ssidlist = $aironet->i_ssidlist();
|
||||
my $i_ssidbcast = {};
|
||||
foreach my $key ( keys %$i_ssidlist ) {
|
||||
$i_ssidbcast->{$key} = $map->{ $i_ssidlist->{$key} };
|
||||
}
|
||||
return $i_ssidbcast;
|
||||
}
|
||||
|
||||
sub i_ssidmac {
|
||||
my $aironet = shift;
|
||||
my $partial = shift;
|
||||
my $mbss_mac_addr = $aironet->mbss_mac_addr();
|
||||
|
||||
# Same logic as i_ssidbcast to return same indexes as i_ssidlist
|
||||
my $map = {};
|
||||
foreach my $key ( keys %$mbss_mac_addr ) {
|
||||
my ( $interface, @idx ) = split( /\./, $key );
|
||||
$map->{ pack( "C*", @idx ) } = $mbss_mac_addr->{$key};
|
||||
}
|
||||
|
||||
my $i_ssidlist = $aironet->i_ssidlist();
|
||||
my $i_ssidmac = {};
|
||||
foreach my $key ( keys %$i_ssidlist ) {
|
||||
$i_ssidmac->{$key} = $map->{ $i_ssidlist->{$key} };
|
||||
}
|
||||
return $i_ssidmac;
|
||||
}
|
||||
|
||||
###
|
||||
# PoE status. The ps1_type is the PoE injector type, which is just
|
||||
# a scalar; the status is a little more complex.
|
||||
sub ps1_status {
|
||||
my $aironet = shift;
|
||||
my $idx = $aironet->cpoePdCurrentPowerLevel();
|
||||
my $mw = $aironet->cpoePdSupportedPower( $idx );
|
||||
my $descr = $aironet->cpoePdSupportedPowerMode( $idx );
|
||||
|
||||
return sprintf( "%.2fW (%s)", $mw->{$idx} * 0.001, $descr->{$idx} );
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running
|
||||
IOS.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $aironet = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $aironet->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides interface to SNMP Data available on newer Aironet devices running
|
||||
Cisco IOS.
|
||||
|
||||
Note there are two classes for Aironet devices :
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3::Aironet
|
||||
|
||||
This class is for devices running Aironet software (older)
|
||||
|
||||
=item SNMP::Info::Layer2::Aironet
|
||||
|
||||
This class is for devices running Cisco IOS software (newer)
|
||||
|
||||
=back
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $aironet = new SNMP::Info::Layer2::Aironet(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::EtherLike
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-DOT11-ASSOCIATION-MIB>
|
||||
|
||||
=item F<CISCO-DOT11-IF-MIB>
|
||||
|
||||
=item F<CISCO-DOT11-SSID-SECURITY-MIB>
|
||||
|
||||
=item F<CISCO-POE-PD-MIB>
|
||||
|
||||
=item F<CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB>
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $aironet->description()
|
||||
|
||||
System description. Adds info from method e_descr() from SNMP::Info::Entity
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->cd11_port()
|
||||
|
||||
Returns radio interfaces.
|
||||
|
||||
=item $aironet->cd11_mac()
|
||||
|
||||
Returns client radio interface MAC addresses.
|
||||
|
||||
=item $aironet->cd11_ssid()
|
||||
|
||||
Returns radio interface ssid.
|
||||
|
||||
=item $aironet->dot11_cur_tx_pwr_mw()
|
||||
|
||||
Current transmit power, in milliwatts, of the radio interface.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->interfaces()
|
||||
|
||||
Uses the i_description() field.
|
||||
|
||||
=item $aironet->i_mac()
|
||||
|
||||
MAC address of the interface. Note this is just the MAC of the port, not
|
||||
anything connected to it.
|
||||
|
||||
=item $aironet->i_duplex()
|
||||
|
||||
Crosses information from SNMP::Info::EtherLike to get duplex info for
|
||||
interfaces.
|
||||
|
||||
=item $aironet->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (iid)
|
||||
|
||||
=item $aironet->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses
|
||||
|
||||
=item $aironet->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
=item $aironet->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=item $aironet->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
=item $aironet->v_name()
|
||||
|
||||
Returns VLAN names
|
||||
|
||||
=item $aironet->i_ssidlist()
|
||||
|
||||
Returns a list of SSIDs associated with interfaces. This function
|
||||
is C<MBSSID> aware, so when using C<MBSSID> can map SSIDs to the sub-interface
|
||||
to which they belong.
|
||||
|
||||
=item $aironet->i_ssidbcast()
|
||||
|
||||
With the same keys as i_ssidlist, returns whether the given SSID is
|
||||
being broadcast.
|
||||
|
||||
=item $aironet->i_ssidmac()
|
||||
|
||||
With the same keys as i_ssidlist, returns the Basic service set
|
||||
identification (BSSID), MAC address, the AP is using for the SSID.
|
||||
|
||||
=item $aironet ps1_status()
|
||||
|
||||
Returns the PoE injector status based on C<cpoePdSupportedPower> and
|
||||
C<cpoePdSupportedPowerMode>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->munge_cd11_txrate()
|
||||
|
||||
Converts units of half a megabit to human readable string.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
240
lib/SNMP/Info/Layer2/Allied.pm
Normal file
240
lib/SNMP/Info/Layer2/Allied.pm
Normal file
@@ -0,0 +1,240 @@
|
||||
# SNMP::Info::Layer2::Allied
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Allied;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer2::Allied::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Allied::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
'ip_adresses' => 'atNetAddress',
|
||||
'ip_mac' => 'atPhysAddress',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'AtiSwitch-MIB' => 'atiswitchProductType',
|
||||
'AtiStackInfo-MIB' => 'atiswitchEnhancedStacking',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'allied';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'allied';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $allied = shift;
|
||||
my $descr = $allied->description();
|
||||
|
||||
if ( defined ($descr) && $descr =~ m/version (\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $allied = shift;
|
||||
my $desc = $allied->description();
|
||||
|
||||
if ( defined ($desc) && $desc =~ /(AT-80\d{2}\S*)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub root_ip {
|
||||
my $allied = shift;
|
||||
my $ip_hash = $allied->ip_addresses();
|
||||
my $found_ip;
|
||||
|
||||
foreach my $ip ( values %{$ip_hash} ) {
|
||||
$found_ip = SNMP::Info::munge_ip($ip) if ( defined $ip );
|
||||
last; # this is only one IP address
|
||||
}
|
||||
return $found_ip;
|
||||
}
|
||||
|
||||
sub mac {
|
||||
my $allied = shift;
|
||||
my $mac_hash = $allied->ip_mac();
|
||||
my $found_mac;
|
||||
|
||||
foreach my $mac ( values %{$mac_hash} ) {
|
||||
$found_mac = SNMP::Info::munge_mac($mac);
|
||||
last; # this is only one MAC address
|
||||
}
|
||||
return $found_mac;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $allied = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
|
||||
|
||||
foreach my $port ( keys %$i_up ) {
|
||||
my $up = $i_up->{$port};
|
||||
$i_up->{$port} = 'down' if $up eq 'linktesterror';
|
||||
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
|
||||
}
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesis switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker, Dmitry Sergienko <dmitry@trifle.net>
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $allied = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myhub',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $allied->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Allied device through SNMP. See inherited classes' documentation for
|
||||
inherited methods.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<AtiSwitch-MIB>
|
||||
|
||||
=item F<AtiStackInfo-MIB>
|
||||
|
||||
Download for your device from ftp://ftp.allied-telesyn.com/pub/switches/mibs/
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $allied->vendor()
|
||||
|
||||
Returns 'allied'
|
||||
|
||||
=item $allied->os()
|
||||
|
||||
Returns 'allied'
|
||||
|
||||
=item $allied->os_ver()
|
||||
|
||||
Culls Version from description()
|
||||
|
||||
=item $allied->root_ip()
|
||||
|
||||
Returns IP Address of Managed Device.
|
||||
|
||||
(C<actualIpAddr>)
|
||||
|
||||
=item $allied->model()
|
||||
|
||||
Tries to cull out C<AT-nnnnX> out of the description field.
|
||||
|
||||
=item $allied->mac()
|
||||
|
||||
Returns device MAC.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $allied->i_up()
|
||||
|
||||
Returns reference to map of IIDs to link status. Changes
|
||||
the values of ati_up() to 'up' and 'down'.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
168
lib/SNMP/Info/Layer2/Atmedia.pm
Normal file
168
lib/SNMP/Info/Layer2/Atmedia.pm
Normal file
@@ -0,0 +1,168 @@
|
||||
# SNMP::Info::Layer2::Atmedia
|
||||
#
|
||||
# Copyright (c) 2018 Netdisco Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Atmedia;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Atmedia::ISA = qw/SNMP::Info::Layer2/;
|
||||
@SNMP::Info::Layer2::Atmedia::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.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
|
||||
689
lib/SNMP/Info/Layer2/Baystack.pm
Normal file
689
lib/SNMP/Info/Layer2/Baystack.pm
Normal file
@@ -0,0 +1,689 @@
|
||||
# SNMP::Info::Layer2::Baystack
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Baystack;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::SONMP;
|
||||
use SNMP::Info::NortelStack;
|
||||
use SNMP::Info::RapidCity;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer2::Baystack::ISA
|
||||
= qw/SNMP::Info::SONMP SNMP::Info::NortelStack
|
||||
SNMP::Info::RapidCity
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer2::Baystack::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
'BAY-STACK-PETH-EXT-MIB' => 'bspePethPsePortExtMeasuredPower',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::RapidCity::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
'peth_port_power' => 'bspePethPsePortExtMeasuredPower',
|
||||
);
|
||||
|
||||
# 450's report full duplex as speed = 20mbps?!
|
||||
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
|
||||
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
|
||||
$SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps';
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::RapidCity::MUNGE, %SNMP::Info::NortelStack::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
);
|
||||
|
||||
sub os {
|
||||
my $baystack = shift;
|
||||
my $descr = $baystack->description() || "";
|
||||
my $model = $baystack->model() || "";
|
||||
|
||||
if ( $descr =~ /Business Ethernet Switch.*SW:v/i ) {
|
||||
return 'bes';
|
||||
}
|
||||
if ( ( ( $model =~ /(420|425|BPS)/ ) and ( $descr =~ m/SW:v[1-2]/i ) )
|
||||
or ( ( $model =~ /(410|450|380)/ ) ) )
|
||||
{
|
||||
return 'baystack';
|
||||
}
|
||||
if ( $model =~ /VSP/ ) {
|
||||
return 'vsp';
|
||||
}
|
||||
|
||||
return 'boss';
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $baystack = shift;
|
||||
my $descr = $baystack->description();
|
||||
return unless defined $descr;
|
||||
|
||||
# 303 / 304
|
||||
if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# 450
|
||||
if ( $descr =~ m/FW:V(\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( $descr =~ m/FW:(\d+\.\d+\.\d+\.\d+)/i ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $baystack = shift;
|
||||
my $id = $baystack->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
my $descr = $baystack->description();
|
||||
|
||||
return '303' if ( defined $descr and $descr =~ /\D303\D/ );
|
||||
return '304' if ( defined $descr and $descr =~ /\D304\D/ );
|
||||
return 'BPS' if ( $model =~ /BPS2000/i );
|
||||
|
||||
# Pull sreg- from all
|
||||
$model =~ s/^sreg-//;
|
||||
# Strip ES/ERS/BayStack etc. from those families
|
||||
$model =~ s/^(E(R)?S|BayStack|Ethernet(Routing)?Switch)-?//;
|
||||
$model =~ s/-ethSwitchNMM//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $baystack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $baystack->i_index($partial) || {};
|
||||
my $index_factor = $baystack->index_factor();
|
||||
my $slot_offset = $baystack->slot_offset();
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
# Ignore cascade ports
|
||||
next if $index > $index_factor * 8;
|
||||
|
||||
my $port = ( $index % $index_factor );
|
||||
my $slot = ( int( $index / $index_factor ) ) + $slot_offset;
|
||||
|
||||
my $slotport = "$slot.$port";
|
||||
$if{$iid} = $slotport;
|
||||
}
|
||||
return \%if;
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $baystack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_mac = $baystack->orig_i_mac($partial) || {};
|
||||
|
||||
my %i_mac;
|
||||
|
||||
# Baystack 303's with a hw rev < 2.11.4.5 report the mac as all zeros
|
||||
foreach my $iid ( keys %$i_mac ) {
|
||||
my $mac = $i_mac->{$iid};
|
||||
next unless defined $mac;
|
||||
next if $mac eq '00:00:00:00:00:00';
|
||||
$i_mac{$iid} = $mac;
|
||||
}
|
||||
return \%i_mac;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $baystack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $baystack->i_index($partial) || {};
|
||||
my $i_alias = $baystack->i_alias($partial) || {};
|
||||
my $i_name2 = $baystack->orig_i_name($partial) || {};
|
||||
|
||||
my %i_name;
|
||||
foreach my $iid ( keys %$i_name2 ) {
|
||||
my $name = $i_name2->{$iid};
|
||||
my $alias = $i_alias->{$iid};
|
||||
$i_name{$iid}
|
||||
= ( defined $alias and $alias !~ /^\s*$/ )
|
||||
? $alias
|
||||
: $name;
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub index_factor {
|
||||
my $baystack = shift;
|
||||
my $model = $baystack->model() || "";
|
||||
my $os = $baystack->os();
|
||||
my $os_ver = $baystack->os_ver();
|
||||
my $op_mode = $baystack->ns_op_mode();
|
||||
|
||||
$op_mode = 'pure' unless defined $op_mode;
|
||||
if ( $os_ver =~ m/^(\d+)\./ ) {
|
||||
$os_ver = $1;
|
||||
} else {
|
||||
$os_ver = 1;
|
||||
}
|
||||
|
||||
my $index_factor = 32;
|
||||
$index_factor = 64
|
||||
if ( ( $model =~ /(470)/ )
|
||||
or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) );
|
||||
$index_factor = 128
|
||||
if ( ( $model =~ /(5[56]\d\d)|VSP|4950|59100/ )
|
||||
and ( $os_ver >= 6 ) );
|
||||
|
||||
return $index_factor;
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Newer devices support ENTITY-MIB, use if available otherwise use proprietary
|
||||
# methods.
|
||||
|
||||
sub e_index {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_index($partial) || $stack->ns_e_index($partial);
|
||||
}
|
||||
|
||||
sub e_class {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_class($partial) || $stack->ns_e_class($partial);
|
||||
}
|
||||
|
||||
sub e_descr {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_descr($partial) || $stack->ns_e_descr($partial);
|
||||
}
|
||||
|
||||
sub e_name {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_name($partial) || $stack->ns_e_name($partial);
|
||||
}
|
||||
|
||||
sub e_fwver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_fwver($partial) || $stack->ns_e_fwver($partial);
|
||||
}
|
||||
|
||||
sub e_hwver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_hwver($partial) || $stack->ns_e_hwver($partial);
|
||||
}
|
||||
|
||||
sub e_parent {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_parent($partial) || $stack->ns_e_parent($partial);
|
||||
}
|
||||
|
||||
sub e_pos {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_pos($partial) || $stack->ns_e_pos($partial);
|
||||
}
|
||||
|
||||
sub e_serial {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_serial($partial) || $stack->ns_e_serial($partial);
|
||||
}
|
||||
|
||||
sub e_swver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_swver($partial) || $stack->ns_e_swver($partial);
|
||||
}
|
||||
|
||||
sub e_type {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_type($partial) || $stack->ns_e_type($partial);
|
||||
}
|
||||
|
||||
sub e_vendor {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_vendor($partial) || $stack->ns_e_vendor($partial);
|
||||
}
|
||||
|
||||
# fix for stack of switches without POE on module 1
|
||||
# https://sourceforge.net/tracker/?func=detail&aid=3317739&group_id=70362&atid=527529
|
||||
sub peth_port_ifindex {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %peth_port_ifindex = ();
|
||||
my $poe_port_st = $stack->peth_port_status($partial);
|
||||
my $if_index = $stack->interfaces($partial);
|
||||
|
||||
foreach my $i (keys %$if_index) {
|
||||
next unless defined $poe_port_st->{$if_index->{$i}};
|
||||
$peth_port_ifindex{$if_index->{$i}} = $i;
|
||||
}
|
||||
return \%peth_port_ifindex;
|
||||
}
|
||||
|
||||
# Currently only ERS 4800 v5.8+ support the rcBridgeSpbmMacTable
|
||||
# which holds the FDB for a SPBM edge deployment.
|
||||
#
|
||||
# Q-BRIDGE still holds some entries when the rcBridgeSpbmMacTable is in use
|
||||
# so we merge hash entries.
|
||||
|
||||
sub fw_mac {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::fw_mac() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_mac() || {};
|
||||
my $fw_mac = { %$qb, %$spbm };
|
||||
|
||||
return $fw_mac;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::fw_port() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_port() || {};
|
||||
my $fw_port = { %$qb, %$spbm };
|
||||
|
||||
return $fw_port;
|
||||
}
|
||||
|
||||
sub fw_status {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::fw_status() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_status() || {};
|
||||
my $fw_status = { %$qb, %$spbm };
|
||||
|
||||
return $fw_status;
|
||||
}
|
||||
|
||||
sub qb_fw_vlan {
|
||||
my $rapidcity = shift;
|
||||
|
||||
my $qb = $rapidcity->SUPER::qb_fw_vlan() || {};
|
||||
my $spbm = $rapidcity->rc_spbm_fw_vlan() || {};
|
||||
my $qb_fw_vlan = { %$qb, %$spbm };
|
||||
|
||||
return $qb_fw_vlan;
|
||||
}
|
||||
|
||||
# Baystack uses S5-AGENT-MIB (loaded in NortelStack) versus RAPID-CITY
|
||||
sub stp_ver {
|
||||
my $rapidcity = shift;
|
||||
|
||||
return $rapidcity->s5AgSysSpanningTreeOperMode()
|
||||
|| $rapidcity->SUPER::stp_ver();
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Baystack - SNMP Interface to Avaya Ethernet Switch
|
||||
(Baystack) and VSP 7000 series switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $baystack = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $baystack->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from an
|
||||
Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series
|
||||
through SNMP.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
=item SNMP::Info::NortelStack
|
||||
|
||||
=item SNMP::Info::RapidCity
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<BAY-STACK-PETH-EXT-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::NortelStack/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::RapidCity/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $baystack->vendor()
|
||||
|
||||
Returns 'avaya'
|
||||
|
||||
=item $baystack->model()
|
||||
|
||||
Cross references $baystack->id() to the F<SYNOPTICS-MIB> and returns
|
||||
the results. 303s and 304s have the same ID, so we have a hack
|
||||
to return depending on which it is.
|
||||
|
||||
Returns BPS for Business Policy Switch
|
||||
|
||||
For others extracts and returns the switch numeric designation.
|
||||
|
||||
=item $baystack->os()
|
||||
|
||||
Returns 'baystack' or 'boss' depending on software version.
|
||||
|
||||
=item $baystack->os_bin()
|
||||
|
||||
Returns the firmware version extracted from C<sysDescr>.
|
||||
|
||||
=item $baystack->stp_ver()
|
||||
|
||||
Returns the particular STP version running on this device.
|
||||
|
||||
Values: C<nortelStpg>, C<pvst>, C<rstp>, C<mstp>, C<ieee8021d>
|
||||
|
||||
(C<s5AgSysSpanningTreeOperMode>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $baystack->index_factor()
|
||||
|
||||
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||
reserved per slot within the device MIB.
|
||||
|
||||
Index factor on the Baystack switches are determined by the formula: Index
|
||||
Factor = 64 if (model = 470 or (os eq 'boss' and operating in pure mode))
|
||||
or else Index factor = 32.
|
||||
|
||||
Returns either 32 or 64 based upon the formula.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::NortelStack
|
||||
|
||||
See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::RapidCity
|
||||
|
||||
See L<SNMP::Info::RapidCity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $baystack->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
Slot and port numbers on the Baystack switches are determined by the
|
||||
formula:
|
||||
|
||||
port = (Interface index % Index factor)
|
||||
slot = (int(Interface index / Index factor)) + Slot offset
|
||||
|
||||
The physical port name is returned as slot.port.
|
||||
|
||||
=item $baystack->i_mac()
|
||||
|
||||
Returns the C<ifPhysAddress> table entries.
|
||||
|
||||
Removes all entries matching '00:00:00:00:00:00' -- Certain
|
||||
revisions of Baystack firmware report all zeros for each port mac.
|
||||
|
||||
=item $baystack->i_name()
|
||||
|
||||
Crosses C<ifName> with C<ifAlias> and returns the human set port name if
|
||||
exists.
|
||||
|
||||
=item $baystack->peth_port_ifindex()
|
||||
|
||||
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
|
||||
|
||||
=item $baystack->peth_port_power()
|
||||
|
||||
Power supplied by PoE ports, in milliwatts
|
||||
|
||||
(C<bspePethPsePortExtMeasuredPower>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 F<ENTITY-MIB> Information
|
||||
|
||||
For older devices which do not support F<ENTITY-MIB>, these methods emulate
|
||||
Physical Table methods using F<S5-CHASSIS-MIB>. See
|
||||
L<SNMP::Info::NortelStack/"TABLE METHODS"> for details on ns_e_* methods.
|
||||
|
||||
=over
|
||||
|
||||
=item $baystack->e_index()
|
||||
|
||||
If the device doesn't support C<entPhysicalDescr>, this will try ns_e_index().
|
||||
Note that this is based on C<entPhysicalDescr> due to implementation
|
||||
details of SNMP::Info::Entity::e_index().
|
||||
|
||||
=item $baystack->e_class()
|
||||
|
||||
If the device doesn't support C<entPhysicalClass>, this will try ns_e_class().
|
||||
|
||||
=item $baystack->e_descr()
|
||||
|
||||
If the device doesn't support C<entPhysicalDescr>, this will try ns_e_descr().
|
||||
|
||||
=item $baystack->e_name()
|
||||
|
||||
If the device doesn't support C<entPhysicalName>, this will try ns_e_name().
|
||||
|
||||
=item $baystack->e_fwver()
|
||||
|
||||
If the device doesn't support C<entPhysicalFirmwareRev>, this will try
|
||||
ns_e_fwver().
|
||||
|
||||
=item $baystack->e_hwver()
|
||||
|
||||
If the device doesn't support C<entPhysicalHardwareRev>, this will try
|
||||
ns_e_hwver().
|
||||
|
||||
=item $baystack->e_parent()
|
||||
|
||||
If the device doesn't support C<entPhysicalContainedIn>, this will try
|
||||
ns_e_parent().
|
||||
|
||||
=item $baystack->e_pos()
|
||||
|
||||
If the device doesn't support C<entPhysicalParentRelPos>, this will try
|
||||
ns_e_pos().
|
||||
|
||||
=item $baystack->e_serial()
|
||||
|
||||
If the device doesn't support C<entPhysicalSerialNum>, this will try
|
||||
ns_e_serial().
|
||||
|
||||
=item $baystack->e_swver()
|
||||
|
||||
If the device doesn't support C<entPhysicalSoftwareRev>, this will try
|
||||
ns_e_swver().
|
||||
|
||||
=item $baystack->e_type()
|
||||
|
||||
If the device doesn't support C<entPhysicalVendorType>, this will try
|
||||
ns_e_type().
|
||||
|
||||
=item $baystack->e_vendor()
|
||||
|
||||
If the device doesn't support C<entPhysicalMfgName>, this will try
|
||||
ns_e_vendor().
|
||||
|
||||
=back
|
||||
|
||||
=head2 Layer 2 Forwarding Database
|
||||
|
||||
These methods try to obtain the layer 2 forwarding database entries via the
|
||||
normal bridge methods as well as SPBM entries via rapid city methods.
|
||||
|
||||
=over
|
||||
|
||||
=item $baystack->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses
|
||||
|
||||
=item $baystack->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
=item $baystack->qb_fw_vlan()
|
||||
|
||||
Returns reference to hash of forwarding table entries VLAN ID
|
||||
|
||||
=item $baystack->fw_status()
|
||||
|
||||
Returns reference to hash of forwarding table entries status
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::NortelStack
|
||||
|
||||
See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::RapidCity
|
||||
|
||||
See L<SNMP::Info::RapidCity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
571
lib/SNMP/Info/Layer2/C1900.pm
Normal file
571
lib/SNMP/Info/Layer2/C1900.pm
Normal file
@@ -0,0 +1,571 @@
|
||||
# SNMP::Info::Layer2::C1900
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::C1900;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::CiscoAgg;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoConfig SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg SNMP::Info::Layer2
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoAgg::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'c1900_flash_status' => 'upgradeFlashBankStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoAgg::FUNCS,
|
||||
%SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
|
||||
# ESSWITCH-MIB
|
||||
'c1900_p_index' => 'swPortIndex',
|
||||
'c1900_p_ifindex' => 'swPortIfIndex',
|
||||
'c1900_p_duplex' => 'swPortDuplexStatus',
|
||||
'c1900_p_duplex_admin' => 'swPortFullDuplex',
|
||||
'c1900_p_name' => 'swPortName',
|
||||
'c1900_p_up_admin' => 'swPortAdminStatus',
|
||||
'c1900_p_type' => 'swPortMediaCapability',
|
||||
'c1900_p_media' => 'swPortConnectorType',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoAgg::MIBS,
|
||||
%SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
|
||||
# Also known as the ESSWITCH-MIB
|
||||
'STAND-ALONE-ETHERNET-SWITCH-MIB' => 'series2000'
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoAgg::MUNGE,
|
||||
%SNMP::Info::CiscoStpExtensions::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
);
|
||||
|
||||
sub bulkwalk_no { return 1; }
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'catalyst';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $c1900 = shift;
|
||||
|
||||
# Check for superclass one
|
||||
my $os_ver = $c1900->SUPER::os_ver();
|
||||
return $os_ver if defined $os_ver;
|
||||
|
||||
my $c1900_flash_status = $c1900->c1900_flash_status();
|
||||
return unless defined $c1900_flash_status;
|
||||
|
||||
if ( $c1900_flash_status =~ m/V(\d+\.\d+(\.\d+)?)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $c1900->i_description($partial) || {};
|
||||
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
$i_descr->{$iid} =~ s/\s*$//;
|
||||
}
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $c1900_p_duplex = $c1900->c1900_p_duplex($partial) || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if ( keys %$c1900_p_duplex ) {
|
||||
my $duplex = $c1900_p_duplex->{$if};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $c1900_p_admin = $c1900->c1900_p_duplex_admin($partial) || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if ( keys %$c1900_p_admin ) {
|
||||
my $duplex = $c1900_p_admin->{$if};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /disabled/i;
|
||||
$duplex = 'full' if $duplex =~ /flow control/i;
|
||||
$duplex = 'full' if $duplex =~ /enabled/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex_admin{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $c1900->orig_i_name($partial) || {};
|
||||
my $c1900_p_name = $c1900->c1900_p_name($partial) || {};
|
||||
|
||||
foreach my $port ( keys %$c1900_p_name ) {
|
||||
my $name = $c1900_p_name->{$port};
|
||||
next unless defined $name;
|
||||
next unless $name !~ /^\s*$/;
|
||||
$i_name->{$port} = $name;
|
||||
}
|
||||
|
||||
return $i_name;
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
my $c1900 = shift;
|
||||
my ( $duplex, $port ) = @_;
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/full 1 half 2 auto 3/;
|
||||
|
||||
my $iid = $c1900->c1900_p_ifindex($port);
|
||||
|
||||
return 0 unless $iid->{$port};
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return 0 unless defined $duplexes{$duplex};
|
||||
|
||||
return $c1900->set_c1900_p_duplex_admin( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Overlap allows more than one VLAN per port. Unable to determine default
|
||||
my $overlap
|
||||
= $c1900->bridgeGroupAllowMembershipOverlap()
|
||||
|| $c1900->vlanAllowMembershipOverlap()
|
||||
|| 'disabled';
|
||||
|
||||
if ( $overlap eq 'enabled' ) {
|
||||
return {};
|
||||
}
|
||||
|
||||
my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
|
||||
|| $c1900->vlanMemberPortOfVlan() || {};
|
||||
|
||||
my $i_pvid = {};
|
||||
foreach my $idx ( keys %$member_of ) {
|
||||
my @values = split( /\./, $idx );
|
||||
my ( $vlan, $port ) = @values;
|
||||
next unless $vlan;
|
||||
next unless $port;
|
||||
next if ( defined $partial and $port !~ /^$partial$/ );
|
||||
my $value = $member_of->{$idx};
|
||||
next if ( $value eq 'false' );
|
||||
|
||||
$i_pvid->{$port} = $vlan;
|
||||
}
|
||||
return $i_pvid;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
|
||||
|| $c1900->vlanMemberPortOfVlan() || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $idx ( keys %$member_of ) {
|
||||
my @values = split( /\./, $idx );
|
||||
my ( $vlan, $port ) = @values;
|
||||
next unless $vlan;
|
||||
next unless $port;
|
||||
next if ( defined $partial and $port !~ /^$partial$/ );
|
||||
my $value = $member_of->{$idx};
|
||||
next if ( $value eq 'false' );
|
||||
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged { return {}; }
|
||||
|
||||
sub bp_index {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $if_index = $c1900->i_index($partial);
|
||||
my $index = $c1900->orig_bp_index($partial) || {};
|
||||
foreach my $iid ( keys %$if_index ) {
|
||||
$index->{$iid} = $iid if ( !defined $index->{$iid} );
|
||||
}
|
||||
return $index;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::C1900 - SNMP Interface to data from Cisco Catalyst 1900
|
||||
Network Switches running CatOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c1900 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $c1900->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Catalyst 1900 device through SNMP. See SNMP::Info for full documentation
|
||||
|
||||
Note that most of these devices only talk SNMP version 1, but not all.
|
||||
|
||||
=head2 Inherited classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=item SNMP::Info::CiscoAgg
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)>
|
||||
|
||||
F<ESSWITCH-MIB> is included in the Version 1 MIBs from Cisco.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->c1900_flash_status()
|
||||
|
||||
Usually contains the version of the software loaded in flash.
|
||||
Used by os_ver()
|
||||
|
||||
C<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
|
||||
|
||||
=item $c1900->os()
|
||||
|
||||
Returns 'catalyst'
|
||||
|
||||
=item $c1900->os_ver()
|
||||
|
||||
Returns CatOS version if obtainable. First tries to use
|
||||
SNMP::Info::CiscoStats->os_ver() . If that fails then it
|
||||
checks for the presence of $c1900->c1900_flash_status() and culls
|
||||
the version from there.
|
||||
|
||||
=item $c1900->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=item $c1900->bulkwalk_no
|
||||
|
||||
Return C<1>. Bulkwalk is turned off for this class.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $c1900->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
|
||||
=item $c1900->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
=item $c1900->i_name()
|
||||
|
||||
Crosses C<ifName> with $c1900->c1900_p_name() and returns the human set port
|
||||
name if exists.
|
||||
|
||||
=item $c1900->i_vlan()
|
||||
|
||||
Returns a mapping between the interface and the VLAN / bridge group if overlap
|
||||
is not enabled.
|
||||
|
||||
=item $c1900->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = interface, value = array of VLAN /
|
||||
bridge group IDs.
|
||||
|
||||
Example:
|
||||
my $interfaces = $c1900->interfaces();
|
||||
my $vlans = $c1900->i_vlan_membership();
|
||||
|
||||
foreach my $iid (sort keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $c1900->i_vlan_membership_untagged()
|
||||
|
||||
Unsupported, returns nothing.
|
||||
|
||||
=item $c1900->bp_index()
|
||||
|
||||
Returns a bp_index that contains the original bp_index entries and extra
|
||||
entries for those interfaces listed in if_index, as some C1900 devices do not
|
||||
return complete bp_indexes.
|
||||
|
||||
=back
|
||||
|
||||
=head2 F<STAND-ALONE-ETHERNET-SWITCH-MIB> Switch Port Table Entries:
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->c1900_p_index()
|
||||
|
||||
Maps the Switch Port Table to the IID
|
||||
|
||||
C<swPortIfIndex>
|
||||
|
||||
=item $c1900->c1900_p_duplex()
|
||||
|
||||
Gives Port Duplex Info
|
||||
|
||||
(C<swPortDuplexStatus>)
|
||||
|
||||
=item $c1900->c1900_p_duplex_admin()
|
||||
|
||||
Gives admin setting for Duplex Info
|
||||
|
||||
(C<swPortFullDuplex>)
|
||||
|
||||
=item $c1900->c1900_p_name()
|
||||
|
||||
Gives human set name for port
|
||||
|
||||
(C<swPortName>)
|
||||
|
||||
=item $c1900->c1900_p_up_admin()
|
||||
|
||||
Gives Admin status of port enabled.
|
||||
|
||||
(C<swPortAdminStatus>)
|
||||
|
||||
=item $c1900->c1900_p_type()
|
||||
|
||||
Gives Type of port, i.e. C<"general-ethernet">
|
||||
|
||||
(C<swPortMediaCapability>)
|
||||
|
||||
=item $c1900->c1900_p_media()
|
||||
|
||||
Gives the media of the port , i.e. "C<fiber-sc>"
|
||||
|
||||
(C<swPortConnectorType>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>. Speed
|
||||
choices are 'auto', 'half', 'full'.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c1900->interfaces()};
|
||||
$c1900->set_i_duplex_admin('auto', $if_map{'1'})
|
||||
or die "Couldn't change port duplex. ",$c1900->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
404
lib/SNMP/Info/Layer2/C2900.pm
Normal file
404
lib/SNMP/Info/Layer2/C2900.pm
Normal file
@@ -0,0 +1,404 @@
|
||||
# SNMP::Info::Layer2::C2900
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::C2900;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2::Cisco;
|
||||
|
||||
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::Layer2::Cisco Exporter/;
|
||||
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::Cisco::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::Cisco::FUNCS,
|
||||
'i_name' => 'ifAlias',
|
||||
|
||||
# C2900PortEntry
|
||||
'c2900_p_index' => 'c2900PortIfIndex',
|
||||
'c2900_p_duplex' => 'c2900PortDuplexStatus',
|
||||
'c2900_p_duplex_admin' => 'c2900PortDuplexState',
|
||||
'c2900_p_speed_admin' => 'c2900PortAdminSpeed',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::Cisco::MIBS,
|
||||
'CISCO-C2900-MIB' => 'ciscoC2900MIB',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::Cisco::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces($partial);
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my $c2900_p_duplex = $c2900->c2900_p_duplex();
|
||||
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $port_2900 = $reverse_2900{$if};
|
||||
next unless defined $port_2900;
|
||||
my $duplex = $c2900_p_duplex->{$port_2900};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces($partial);
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my $c2900_p_admin = $c2900->c2900_p_duplex_admin();
|
||||
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $port_2900 = $reverse_2900{$if};
|
||||
next unless defined $port_2900;
|
||||
my $duplex = $c2900_p_admin->{$port_2900};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex_admin{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_speed_admin {
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces($partial);
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my $c2900_p_admin = $c2900->c2900_p_speed_admin();
|
||||
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
my %i_speed_admin;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $port_2900 = $reverse_2900{$if};
|
||||
next unless defined $port_2900;
|
||||
my $speed = $c2900_p_admin->{$port_2900};
|
||||
next unless defined $speed;
|
||||
|
||||
$speed = 'auto' if $speed eq 'autoDetect';
|
||||
$speed = '10 Mbps' if $speed eq 's10000000';
|
||||
$speed = '100 Mbps' if $speed eq 's100000000';
|
||||
$i_speed_admin{$if} = $speed;
|
||||
}
|
||||
return \%i_speed_admin;
|
||||
}
|
||||
|
||||
sub set_i_speed_admin {
|
||||
my $c2900 = shift;
|
||||
my ( $speed, $iid ) = @_;
|
||||
|
||||
# map speeds to those the switch will understand
|
||||
my %speeds = qw/auto 1 10 10000000 100 100000000/;
|
||||
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
$speed = lc($speed);
|
||||
|
||||
return unless defined $speeds{$speed};
|
||||
|
||||
# account for weirdness of c2900 mib
|
||||
$iid = $reverse_2900{$iid};
|
||||
|
||||
return $c2900->set_c2900_p_speed_admin( $speeds{$speed}, $iid );
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
my $c2900 = shift;
|
||||
my ( $duplex, $iid ) = @_;
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/full 1 half 2 auto 3/;
|
||||
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return unless defined $duplexes{$duplex};
|
||||
|
||||
# account for weirdness of c2900 mib
|
||||
$iid = $reverse_2900{$iid};
|
||||
|
||||
return $c2900->set_c2900_p_duplex_admin( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
|
||||
# Use i_description for port key, cuz i_name can be manually entered.
|
||||
sub interfaces {
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $c2900->i_index($partial) || {};
|
||||
my $i_descr = $c2900->i_description($partial) || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$port =~ s/\./\//g if ( $port =~ /\d+\.\d+$/ );
|
||||
$port =~ s/[^\d\/,()\w]+//gi;
|
||||
|
||||
$if{$iid} = $port;
|
||||
}
|
||||
|
||||
return \%if;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches
|
||||
running IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c2900 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $c2900->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
C2900 device through SNMP.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2::Cisco
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-C2900-MIB>
|
||||
|
||||
Part of the v2 MIBs from Cisco.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c2900->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $c2900->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c2900->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
On the 2900 devices i_name isn't reliable, so we override to just the
|
||||
description.
|
||||
|
||||
Next all dots are changed for forward slashes so that the physical port name
|
||||
is the same as the broad-casted CDP port name.
|
||||
(Ethernet0.1 -> Ethernet0/1)
|
||||
|
||||
Also, any weird characters are removed, as I saw a few pop up.
|
||||
|
||||
=item $c2900->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex()
|
||||
|
||||
=item $c2900->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin()
|
||||
|
||||
=item $c2900->i_speed_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin speed setting.
|
||||
|
||||
=back
|
||||
|
||||
=head2 F<C2900-MIB> Port Entry Table
|
||||
|
||||
=over
|
||||
|
||||
=item $c2900->c2900_p_index()
|
||||
|
||||
Maps the Switch Port Table to the IID
|
||||
|
||||
(C<c2900PortIfIndex>)
|
||||
|
||||
=item $c2900->c2900_p_duplex()
|
||||
|
||||
Gives Port Duplex Info
|
||||
|
||||
(C<c2900PortDuplexStatus>)
|
||||
|
||||
=item $c2900->c2900_p_duplex_admin()
|
||||
|
||||
Gives admin setting for Duplex Info
|
||||
|
||||
(C<c2900PortDuplexState>)
|
||||
|
||||
=item $c2900->c2900_p_speed_admin()
|
||||
|
||||
Gives Admin speed of port
|
||||
|
||||
(C<c2900PortAdminSpeed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item $c2900->set_i_speed_admin(speed, ifIndex)
|
||||
|
||||
Sets port speed, must be supplied with speed and port C<ifIndex>
|
||||
|
||||
Speed choices are 'auto', '10', '100'
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_speed_admin() to utilize
|
||||
port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c2900->interfaces()};
|
||||
$c2900->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port speed. ",$c2900->error(1);
|
||||
|
||||
=item $c2900->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>
|
||||
|
||||
Speed choices are 'auto', 'half', 'full'
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin() to utilize
|
||||
port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c2900->interfaces()};
|
||||
$c2900->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port duplex. ",$c2900->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
312
lib/SNMP/Info/Layer2/Catalyst.pm
Normal file
312
lib/SNMP/Info/Layer2/Catalyst.pm
Normal file
@@ -0,0 +1,312 @@
|
||||
# SNMP::Info::Layer2::Catalyst
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Catalyst;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::Layer2::Cisco;
|
||||
|
||||
@SNMP::Info::Layer2::Catalyst::ISA
|
||||
= qw/SNMP::Info::CiscoStack SNMP::Info::Layer2::Cisco Exporter/;
|
||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::Cisco::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::Cisco::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::Cisco::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::Cisco::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
|
||||
# Overridden Methods
|
||||
|
||||
# i_physical sets a hash entry as true if the iid is a physical port
|
||||
sub i_physical {
|
||||
my $cat = shift;
|
||||
|
||||
my $p_port = $cat->p_port() || {};
|
||||
|
||||
my %i_physical;
|
||||
foreach my $port ( keys %$p_port ) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_physical{$iid} = 1;
|
||||
}
|
||||
return \%i_physical;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'catalyst';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $cat = shift;
|
||||
my $os_ver = $cat->SUPER::os_ver();
|
||||
return $os_ver if defined $os_ver;
|
||||
|
||||
my $m_swver = $cat->m_swver();
|
||||
return unless defined $m_swver;
|
||||
|
||||
# assume .1 entry is the chassis and the sw version we want.
|
||||
return $m_swver->{1} if defined $m_swver->{1};
|
||||
return;
|
||||
}
|
||||
|
||||
# Workaround for incomplete bp_index
|
||||
sub bp_index {
|
||||
my $cat = shift;
|
||||
my $p_index = $cat->p_port() || {};
|
||||
my $b_index = $cat->p_oidx() || {};
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid ( keys %$p_index ) {
|
||||
my $ifidx = $p_index->{$iid};
|
||||
next unless defined $ifidx;
|
||||
my $bpidx = $b_index->{$iid} || 0;
|
||||
|
||||
$bp_index{$bpidx} = $ifidx;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $cat = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $cat->i_index($partial);
|
||||
my $portnames = $cat->p_port() || {};
|
||||
my %portmap = reverse %$portnames;
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
next unless defined $iid;
|
||||
my $if = $i_index->{$iid};
|
||||
$if =~ s/\./\// if $if;
|
||||
my $port = $portmap{$iid};
|
||||
$port =~ s/\./\// if $port;
|
||||
$interfaces{$iid} = $port || $if;
|
||||
}
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $cat = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $p_port = $cat->p_port() || {};
|
||||
my $p_name = $cat->p_name() || {};
|
||||
|
||||
my %i_name;
|
||||
foreach my $port ( keys %$p_name ) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
$i_name{$iid} = $p_name->{$port};
|
||||
}
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Catalyst - SNMP Interface to Cisco Catalyst devices
|
||||
running Catalyst OS.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $cat = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $cat->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info subclass to provide information for Cisco Catalyst series switches
|
||||
running CatOS.
|
||||
|
||||
This class includes the Catalyst 2920, 4000, 5000, 6000 (hybrid mode)
|
||||
families.
|
||||
|
||||
This subclass is not for all devices that have the name Catalyst. Note that
|
||||
some Catalyst switches run IOS, like the 2900 and 3550 families. Cisco
|
||||
Catalyst 1900 switches use their own MIB and have a separate subclass. Use
|
||||
the method above to have SNMP::Info determine the appropriate subclass before
|
||||
using this class directly.
|
||||
|
||||
See SNMP::Info::device_type() for specifics.
|
||||
|
||||
Note: Some older Catalyst switches will only talk SNMP version 1. Some
|
||||
newer ones will not return all their data if connected via Version 1.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $cat = new SNMP::Info::Layer2::Catalyst(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2::Cisco
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
These MIBs are found in the standard v2 MIBs from Cisco.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->os()
|
||||
|
||||
Returns 'catalyst'
|
||||
|
||||
=item $cat->os_ver()
|
||||
|
||||
Tries to use the value from SNMP::Info::CiscoStats->os_ver() and if it fails
|
||||
it grabs $cat->m_swver()->{1} and uses that.
|
||||
|
||||
=item $cat->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $cat->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $cat->interfaces()
|
||||
|
||||
Returns the map between SNMP Interface Identifier (iid) and physical port
|
||||
name.
|
||||
|
||||
=item $cat->i_name()
|
||||
|
||||
Returns reference to hash of iid to human set name.
|
||||
|
||||
C<portName>
|
||||
|
||||
=item $cat->i_physical()
|
||||
|
||||
Returns a map to IID for ports that are physical ports, not vlans, etc.
|
||||
|
||||
=item $cat->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (iid)
|
||||
|
||||
Crosses (C<portCrossIndex>) to (C<portIfIndex>) since some devices seem to
|
||||
have problems with F<BRIDGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
524
lib/SNMP/Info/Layer2/Centillion.pm
Normal file
524
lib/SNMP/Info/Layer2/Centillion.pm
Normal file
@@ -0,0 +1,524 @@
|
||||
# SNMP::Info::Layer2::Centillion
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Centillion;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::NortelStack;
|
||||
use SNMP::Info::SONMP;
|
||||
|
||||
@SNMP::Info::Layer2::Centillion::ISA
|
||||
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/;
|
||||
@SNMP::Info::Layer2::Centillion::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::NortelStack::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
'CENTILLION-DOT3-EXTENSIONS-MIB' => 'cnDot3ExtnTable',
|
||||
'S5-COMMON-STATS-MIB' => 's5CmStat',
|
||||
'CENTILLION-VLAN-MIB' => 'cnVlanENETMgt',
|
||||
'CENTILLION-CONFIG-MIB' => 'sysTFTPStart',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::NortelStack::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS,
|
||||
'tftp_action' => 'sysTFTPStart',
|
||||
'tftp_host' => 'sysTFTPIpAddress',
|
||||
'tftp_file' => 'sysTFTPFileName',
|
||||
'tftp_type' => 'sysTFTPFileType',
|
||||
'tftp_result' => 'sysTFTPResult',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::NortelStack::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
|
||||
# CENTILLION-DOT3-EXTENSIONS-MIB::cnDot3ExtnTable
|
||||
'centillion_p_index' => 'cnDot3ExtnIfIndex',
|
||||
'centillion_p_duplex' => 'cnDot3ExtnIfOperConnectionType',
|
||||
'centillion_p_duplex_admin' => 'cnDot3ExtnIfAdminConnectionType',
|
||||
|
||||
# S5-COMMON-STATS-MIB::s5CmSNodeTable
|
||||
'fw_mac' => 's5CmSNodeMacAddr',
|
||||
'fw_port' => 's5CmSNodeIfIndx',
|
||||
|
||||
# CENTILLION-VLAN-MIB::cnVlanPortMemberTable
|
||||
'centillion_i_vlan_index' => 'cnVlanPortMemberIfIndex',
|
||||
'centillion_i_vlan' => 'cnVlanPortMemberVID',
|
||||
'centillion_i_vlan_type' => 'cnVlanPortMemberIngressType',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::NortelStack::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
);
|
||||
|
||||
sub os {
|
||||
return 'centillion';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $centillion = shift;
|
||||
my $descr = $centillion->i_description();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$descr ) {
|
||||
my $type = $descr->{$if};
|
||||
|
||||
# Skip virtual interfaces
|
||||
$i_ignore{$if}++ if $type =~ /(VE|VID|vc|lp)/i;
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $centillion = shift;
|
||||
my $i_index = $centillion->i_index();
|
||||
my $i_descr = $centillion->i_description();
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
my $descr = $i_descr->{$iid};
|
||||
|
||||
# Skip ATM and virtual interfaces
|
||||
next if $descr =~ /(VE|VID|vc|lp)/i;
|
||||
|
||||
# Index numbers are deterministic slot * 256 + port
|
||||
my $port = $index % 256;
|
||||
my $slot = int( $index / 256 );
|
||||
my $slotport = "$slot.$port";
|
||||
|
||||
$slotport = "$descr" if $descr =~ /(mcp)/i;
|
||||
|
||||
$if{$index} = $slotport;
|
||||
}
|
||||
|
||||
return \%if;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $centillion = shift;
|
||||
|
||||
my $port_index = $centillion->centillion_p_index();
|
||||
my $port_duplex = $centillion->centillion_p_duplex();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
my $duplex = $port_duplex->{$iid};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $centillion = shift;
|
||||
|
||||
my $port_index = $centillion->centillion_p_index();
|
||||
my $port_admin = $centillion->centillion_p_duplex_admin();
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
my $duplex = $port_admin->{$iid};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex_admin{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $centillion = shift;
|
||||
|
||||
my $cn_vlan_index = $centillion->centillion_i_vlan_index();
|
||||
my $cn_vlan = $centillion->centillion_i_vlan();
|
||||
|
||||
my %i_vlan;
|
||||
foreach my $iid ( keys %$cn_vlan_index ) {
|
||||
my $index = $cn_vlan_index->{$iid};
|
||||
next unless defined $index;
|
||||
my $vlan = $cn_vlan->{$iid};
|
||||
next unless defined $vlan;
|
||||
|
||||
$i_vlan{$index} = $vlan;
|
||||
}
|
||||
return \%i_vlan;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $centillion = shift;
|
||||
my $id = $centillion->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
$model =~ s/^sreg-//i;
|
||||
|
||||
return '5000BH' if ( $model =~ /5000BH/ );
|
||||
return '5005BH' if ( $model =~ /5005BH/ );
|
||||
return 'C100' if ( $model =~ /Centillion100/ );
|
||||
return 'C50N' if ( $model =~ /Centillion50N/ );
|
||||
return 'C50T' if ( $model =~ /Centillion50T/ );
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub bp_index {
|
||||
my $centillion = shift;
|
||||
my $index = $centillion->fw_port();
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid ( keys %$index ) {
|
||||
my $b_index = $index->{$iid};
|
||||
next unless defined $b_index;
|
||||
|
||||
#Index value is the same as ifIndex
|
||||
$bp_index{$b_index} = $b_index;
|
||||
}
|
||||
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub index_factor {
|
||||
return 256;
|
||||
}
|
||||
|
||||
sub slot_offset {
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $centillion = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $centillion->SUPER::fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $centillion = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $centillion->SUPER::fw_port($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Centillion - SNMP Interface to Nortel Centillion based
|
||||
ATM Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $centillion = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $centillion->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Centillion device through SNMP.
|
||||
|
||||
Note: This class supports version 4.X and 5.X which are VLAN based rather
|
||||
than bridge group based.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=item SNMP::Info::NortelStack
|
||||
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CENTILLION-DOT3-EXTENSIONS-MIB>
|
||||
|
||||
=item F<S5-COMMON-STATS-MIB>
|
||||
|
||||
=item F<CENTILLION-VLAN-MIB>
|
||||
|
||||
=item F<CENTILLION-CONFIG-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info/"REQUIREMENTS"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::NortelStack/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $centillion->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
|
||||
=item $centillion->model()
|
||||
|
||||
Cross references $centillion->id() to the F<SYNOPTICS-MIB> and returns
|
||||
the results.
|
||||
|
||||
Removes C<sreg-> from the model name
|
||||
|
||||
=item $centillion->os()
|
||||
|
||||
Returns 'centillion'
|
||||
|
||||
=item $centillion->tftp_action()
|
||||
|
||||
(C<sysTFTPStart>)
|
||||
|
||||
=item $centillion->tftp_host()
|
||||
|
||||
(C<sysTFTPIpAddress>)
|
||||
|
||||
=item $centillion->tftp_file()
|
||||
|
||||
(C<sysTFTPFileName>)
|
||||
|
||||
=item $centillion->tftp_type()
|
||||
|
||||
(C<sysTFTPFileType>)
|
||||
|
||||
=item $centillion->tftp_result()
|
||||
|
||||
(C<sysTFTPResult>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $centillion->index_factor()
|
||||
|
||||
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||
reserved per slot within the device MIB. Returns 256.
|
||||
|
||||
=item $centillion->slot_offset()
|
||||
|
||||
Required by SNMP::Info::SONMP. Offset if slot numbering does not
|
||||
start at 0. Returns 0.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"USAGE"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::NortelStack
|
||||
|
||||
See documentation in L<SNMP::Info::NortelStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $centillion->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
Slot and port numbers on the Passport switches are determined by the
|
||||
formula:
|
||||
port = index % 256
|
||||
slot = int(index / 256)
|
||||
|
||||
The physical port name is returned as slot.port.
|
||||
|
||||
=item $centillion->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
|
||||
=item $centillion->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
=item $centillion->i_ignore()
|
||||
|
||||
Returns reference to hash of IIDs to ignore.
|
||||
|
||||
=item $centillion->fw_mac()
|
||||
|
||||
(C<s5CmSNodeMacAddr>)
|
||||
|
||||
=item $centillion->fw_port()
|
||||
|
||||
(C<s5CmSNodeIfIndx>)
|
||||
|
||||
=item $centillion->bp_index()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the Bridge Table.
|
||||
|
||||
=item $centillion->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the VLAN.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Centillion 802.3 Extension Table (C<cnDot3ExtnTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $centillion->centillion_p_index()
|
||||
|
||||
Returns reference to hash. Maps table IIDs to Interface IIDs
|
||||
|
||||
(C<cnDot3ExtnIfIndex>)
|
||||
|
||||
=item $centillion->centillion_p_duplex()
|
||||
|
||||
Returns reference to hash. Maps port operational duplexes to IIDs
|
||||
|
||||
(C<cnDot3ExtnIfOperConnectionType>)
|
||||
|
||||
=item $centillion->rc_centillion_p_duplex_admin()
|
||||
|
||||
Returns reference to hash. Maps port admin duplexes to IIDs
|
||||
|
||||
(C<cnDot3ExtnIfAdminConnectionType>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Centillion VLAN Table (C<cnVlanPortMemberTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $centillion->centillion_i_vlan_index()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Index
|
||||
|
||||
(C<cnVlanPortMemberIfIndex>)
|
||||
|
||||
=item $centillion->centillion_i_vlan()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: VLAN ID
|
||||
|
||||
(C<cnVlanPortMemberVID>)
|
||||
|
||||
=item $centillion->centillion_i_vlan_type()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: VLAN Type
|
||||
|
||||
(C<cnVlanPortMemberIngressType>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"USAGE"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::NortelStack
|
||||
|
||||
See documentation in L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
274
lib/SNMP/Info/Layer2/Cisco.pm
Normal file
274
lib/SNMP/Info/Layer2/Cisco.pm
Normal file
@@ -0,0 +1,274 @@
|
||||
# SNMP::Info::Layer2::Cisco
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Cisco;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoRTT;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::CiscoAgg;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoRTT
|
||||
SNMP::Info::CiscoConfig SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg
|
||||
SNMP::Info::Layer2
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoAgg::MIBS,
|
||||
%SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoRTT::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoAgg::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoRTT::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoAgg::FUNCS,
|
||||
%SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoRTT::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::CiscoAgg::MUNGE,
|
||||
%SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoRTT::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L2 Cisco devices that are
|
||||
not covered in other classes and the base L2 Cisco class for other device
|
||||
specific L2 Cisco classes.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $cisco = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $cisco->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Layer 2 Cisco devices and the base L2 Cisco class for
|
||||
other device specific L2 Cisco classes.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoRTT
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=item SNMP::Info::CiscoAgg
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cisco->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoRTT
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoRTT
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoAgg
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
311
lib/SNMP/Info/Layer2/CiscoSB.pm
Normal file
311
lib/SNMP/Info/Layer2/CiscoSB.pm
Normal file
@@ -0,0 +1,311 @@
|
||||
# SNMP::Info::Layer2::CiscoSB
|
||||
#
|
||||
# Copyright (c) 2013 Nic Bernstein
|
||||
#
|
||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::CiscoSB;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::EtherLike;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CDP;
|
||||
|
||||
@SNMP::Info::Layer2::CiscoSB::ISA
|
||||
= qw/SNMP::Info::Layer2 SNMP::Info::EtherLike
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
|
||||
@SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'descr' => 'sysDescr',
|
||||
'mac' => 'rndBasePhysicalAddress',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
'peth_port_power' => 'rlPethPsePortOutputPower',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
'CISCOSB-POE-MIB' => 'rlPethPsePortOutputPower',
|
||||
'CISCOSB-DEVICEPARAMS-MIB' => 'rndBasePhysicalAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'ros';
|
||||
}
|
||||
|
||||
# Walk the entPhysicalSerialNum table and return the first serial found
|
||||
sub serial {
|
||||
my $ciscosb = shift;
|
||||
my $e_serial = $ciscosb->e_serial();
|
||||
|
||||
# Find entity table entry for this unit
|
||||
foreach my $e ( sort keys %$e_serial ) {
|
||||
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
|
||||
return $e_serial->{$e};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $ciscosb = shift;
|
||||
my $e_swver = $ciscosb->e_swver();
|
||||
|
||||
foreach my $e ( sort keys %$e_swver ) {
|
||||
if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
|
||||
return $e_swver->{$e};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Grab e_model from Entity and tag on e_hwver
|
||||
sub model {
|
||||
my $ciscosb = shift;
|
||||
my $e_model = $ciscosb->e_model();
|
||||
my $e_hwver = $ciscosb->e_hwver();
|
||||
|
||||
foreach my $e ( sort keys %$e_model ) {
|
||||
if (defined $e_model->{$e} and $e_model->{$e} !~ /^\s*$/) {
|
||||
return $e_model->{$e};
|
||||
#my $model = "$e_model->{$e} $e_hwver->{$e}";
|
||||
#return $model;
|
||||
}
|
||||
}
|
||||
return $ciscosb->description();
|
||||
}
|
||||
|
||||
# CISCOSBinterfaces.mib also contains duplex info if needed
|
||||
sub i_duplex {
|
||||
my $ciscosb = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $ciscosb->el_duplex($partial);
|
||||
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my %i_duplex;
|
||||
foreach my $el_port ( keys %$el_duplex ) {
|
||||
my $duplex = $el_duplex->{$el_port};
|
||||
next unless defined $duplex;
|
||||
|
||||
$i_duplex{$el_port} = 'half' if $duplex =~ /half/i;
|
||||
$i_duplex{$el_port} = 'full' if $duplex =~ /full/i;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
}
|
||||
|
||||
# ifDescr is the same for all interfaces in a class, but the ifName is
|
||||
# unique, so let's use that for port name.
|
||||
sub interfaces {
|
||||
my $ciscosb = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $ciscosb->i_name($partial);
|
||||
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::CiscoSB - SNMP Interface to Cisco Small Business series
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Nic Bernstein (shamelessly stolen from Max Baker's Aironet code)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ciscosb = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ciscosb->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides interface to SNMP Data available on Cisco Small Business (nee LinkSys)
|
||||
managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1)]
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::EtherLike
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCOSB-DEVICEPARAMS-MIB>
|
||||
|
||||
=item F<CISCOSB-POE-MIB>
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP.
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscosb->mac()
|
||||
|
||||
Returns mac from (C<rndBasePhysicalAddress>)
|
||||
|
||||
=item $ciscosb->os_ver()
|
||||
|
||||
Returns software version (C<entPhysicalSoftwareRev>)
|
||||
|
||||
=item $ciscosb->serial()
|
||||
|
||||
Returns serial number of unit (C<entPhysicalSerialNum>)
|
||||
|
||||
=item $ciscosb->model()
|
||||
|
||||
Returns model and hardware revision of unit
|
||||
(C<entPhysicalModelName+entPhysicalHardwareRev>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscosb->vendor()
|
||||
|
||||
Returns 'cisco'.
|
||||
|
||||
=item $ciscosb->os()
|
||||
|
||||
Returns 'ros'.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscosb->peth_port_power()
|
||||
|
||||
Power supplied by PoE ports, in milliwatts.
|
||||
(C<rlPethPsePortOutputPower>)
|
||||
|
||||
=item $ciscosb->i_duplex()
|
||||
|
||||
Return duplex based upon the result of EtherLike->el_duplex().
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscosb->interfaces()
|
||||
|
||||
Uses the i_name() field.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
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
|
||||
944
lib/SNMP/Info/Layer2/HP.pm
Normal file
944
lib/SNMP/Info/Layer2/HP.pm
Normal file
@@ -0,0 +1,944 @@
|
||||
# SNMP::Info::Layer2::HP - SNMP Interface to HP ProCurve Switches
|
||||
#
|
||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::HP;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::Aggregate 'agg_ports_ifstack';
|
||||
|
||||
@SNMP::Info::Layer2::HP::ISA = qw/
|
||||
SNMP::Info::Aggregate
|
||||
SNMP::Info::Layer3
|
||||
SNMP::Info::MAU
|
||||
SNMP::Info::CDP
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::Layer2::HP::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MODEL_MAP, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::Aggregate::MIBS,
|
||||
'RFC1271-MIB' => 'logDescription',
|
||||
'HP-ICF-OID' => 'hpSwitch4000',
|
||||
'STATISTICS-MIB' => 'hpSwitchCpuStat',
|
||||
'NETSWITCH-MIB' => 'hpMsgBufFree',
|
||||
'CONFIG-MIB' => 'hpSwitchConfig',
|
||||
'HP-ICF-CHASSIS' => 'hpicfSensorObjectId',
|
||||
'HP-ICF-BRIDGE' => 'hpicfBridgeRstpForceVersion',
|
||||
'HP-ICF-POE-MIB' => 'hpicfPoePethPsePortCurrent',
|
||||
'SEMI-MIB' => 'hpHttpMgSerialNumber',
|
||||
'HP-SWITCH-PL-MIB' => 'hpSwitchProliant',
|
||||
'BLADETYPE4-NETWORK-MIB' => 'hpProLiant-GbE2c-InterconnectSwitch',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::Aggregate::GLOBALS,
|
||||
'serial1' => 'entPhysicalSerialNum.1',
|
||||
'serial2' => 'hpHttpMgSerialNumber.0',
|
||||
'hp_cpu' => 'hpSwitchCpuStat.0',
|
||||
'hp_mem_total' => 'hpGlobalMemTotalBytes.1',
|
||||
'mem_free' => 'hpGlobalMemFreeBytes.1',
|
||||
'mem_used' => 'hpGlobalMemAllocBytes.1',
|
||||
'os_version' => 'hpSwitchOsVersion.0',
|
||||
'os_version2' => 'hpHttpMgVersion.0',
|
||||
'os_bin' => 'hpSwitchRomVersion.0',
|
||||
'mac' => 'hpSwitchBaseMACAddress.0',
|
||||
'rstp_ver' => 'hpicfBridgeRstpForceVersion',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::Aggregate::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
|
||||
# RFC1271
|
||||
'l_descr' => 'logDescription',
|
||||
|
||||
# CONFIG-MIB::hpSwitchPortTable
|
||||
'hp_duplex' => 'hpSwitchPortEtherMode',
|
||||
'hp_duplex_admin' => 'hpSwitchPortFastEtherMode',
|
||||
'vendor_i_type' => 'hpSwitchPortType',
|
||||
|
||||
# HP-ICF-CHASSIS
|
||||
'hp_s_oid' => 'hpicfSensorObjectId',
|
||||
'hp_s_name' => 'hpicfSensorDescr',
|
||||
'hp_s_status' => 'hpicfSensorStatus',
|
||||
|
||||
# HP-ICF-POE-MIB
|
||||
'peth_port_power' => 'hpicfPoePethPsePortPower',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::Aggregate::MUNGE,
|
||||
'c_id' => \&munge_hp_c_id,
|
||||
);
|
||||
|
||||
|
||||
# Model map, reverse sorted by common model name (sort -k2 -r)
|
||||
# Potential sources for model information: http://www.hp.com/rnd/software/switches.htm or HP-ICF-OID MIB
|
||||
%MODEL_MAP = (
|
||||
'J8131A' => 'WAP-420-WW',
|
||||
'J8130A' => 'WAP-420-NA',
|
||||
'J9833A' => 'PS1810-8G',
|
||||
'J9834A' => 'PS1810-24G',
|
||||
'J8133A' => 'AP520WL',
|
||||
'J8680A' => '9408sl',
|
||||
'J9091A' => '8212zl',
|
||||
'J9475A' => '8206zl',
|
||||
'J9265A' => '6600ml-24XG',
|
||||
'J9264A' => '6600ml-24G-4XG',
|
||||
'J9263A' => '6600ml-24G',
|
||||
'J9452A' => '6600-48G-4XG',
|
||||
'J9451A' => '6600-48G',
|
||||
'J8474A' => '6410cl-6XG',
|
||||
'J8433A' => '6400cl-6XG',
|
||||
'J8992A' => '6200yl-24G',
|
||||
'J4902A' => '6108',
|
||||
'J8698A' => '5412zl',
|
||||
'J9851A' => '5412R-zl2',
|
||||
'J8719A' => '5408yl',
|
||||
'J8697A' => '5406zl',
|
||||
'J9850A' => '5406R-zl2',
|
||||
'J8718A' => '5404yl',
|
||||
'J4819A' => '5308XL',
|
||||
'J4850A' => '5304XL',
|
||||
'J8773A' => '4208vl',
|
||||
'J8770A' => '4204vl',
|
||||
'J8772A' => '4202vl-72',
|
||||
'J9032A' => '4202vl-68G',
|
||||
'J9031A' => '4202vl-68',
|
||||
'J8771A' => '4202vl-48G',
|
||||
'J4865A' => '4108GL',
|
||||
'J4887A' => '4104GL',
|
||||
'JL074A' => '3810M-48G-PoE+',
|
||||
'JL072A' => '3810M-48G',
|
||||
'JL076A' => '3810M-40G-8SR-PoE+',
|
||||
'JL073A' => '3810M-24G-PoE+',
|
||||
'JL071A' => '3810M-24G',
|
||||
'JL075A' => '3810M-16SFP+',
|
||||
'J9588A' => '3800-48G-PoE+-4XG',
|
||||
'J9574A' => '3800-48G-PoE+-4SFP+',
|
||||
'J9586A' => '3800-48G-4XG',
|
||||
'J9576A' => '3800-48G-4SFP+',
|
||||
'J9584A' => '3800-24SFP-2SFP+',
|
||||
'J9587A' => '3800-24G-PoE+-2XG',
|
||||
'J9573A' => '3800-24G-PoE+-2SFP+',
|
||||
'J9585A' => '3800-24G-2XG',
|
||||
'J9575A' => '3800-24G-2SFP+',
|
||||
'J8693A' => '3500yl-48G-PWR',
|
||||
'J8692A' => '3500yl-24G-PWR',
|
||||
'J9473A' => '3500-48-PoE',
|
||||
'J9472A' => '3500-48',
|
||||
'J9471A' => '3500-24-PoE',
|
||||
'J9470A' => '3500-24',
|
||||
'J4906A' => '3400cl-48G',
|
||||
'J4905A' => '3400cl-24G',
|
||||
'J4815A' => '3324XL',
|
||||
'J4851A' => '3124',
|
||||
'JL322A' => '2930M-48G-PoE+',
|
||||
'JL321A' => '2930M-48G',
|
||||
'JL323A' => '2930M-40G-8SR-PoE+',
|
||||
'JL320A' => '2930M-24G-PoE+',
|
||||
'JL324A' => '2930M-24G-8SR-PoE+',
|
||||
'JL319A' => '2930M-24G',
|
||||
'JL258A' => '2930F-8G-PoE+-2SFP+',
|
||||
'JL558A' => '2930F-48G-PoE+-4SFP+-740W',
|
||||
'JL557A' => '2930F-48G-PoE+-4SFP-740W',
|
||||
'JL256A' => '2930F-48G-PoE+-4SFP+',
|
||||
'JL262A' => '2930F-48G-PoE+-4SFP',
|
||||
'JL254A' => '2930F-48G-4SFP+',
|
||||
'JL260A' => '2930F-48G-4SFP',
|
||||
'JL255A' => '2930F-24G-PoE+-4SFP+',
|
||||
'JL261A' => '2930F-24G-PoE+-4SFP',
|
||||
'JL253A' => '2930F-24G-4SFP+',
|
||||
'JL259A' => '2930F-24G-4SFP',
|
||||
'J9729A' => '2920-48G-PoE+',
|
||||
'J9729A' => '2920-48G-PoE+',
|
||||
'J9728A' => '2920-48G',
|
||||
'J9728A' => '2920-48G',
|
||||
'J9727A' => '2920-24G-PoE+',
|
||||
'J9727A' => '2920-24G-PoE+',
|
||||
'J9726A' => '2920-24G',
|
||||
'J9726A' => '2920-24G',
|
||||
'J9562A' => '2915-8G-PoE',
|
||||
'J9148A' => '2910al-48G-PoE+',
|
||||
'J9147A' => '2910al-48G',
|
||||
'J9146A' => '2910al-24G-PoE+',
|
||||
'J9145A' => '2910al-24G',
|
||||
'J9050A' => '2900-48G',
|
||||
'J9049A' => '2900-24G',
|
||||
'J4904A' => '2848',
|
||||
'J4903A' => '2824',
|
||||
'J9022A' => '2810-48G',
|
||||
'J9021A' => '2810-24G',
|
||||
'J8165A' => '2650-PWR',
|
||||
'J4899B' => '2650-CR',
|
||||
'J4899C' => '2650C',
|
||||
'J4899A' => '2650',
|
||||
'J8164A' => '2626-PWR',
|
||||
'J4900B' => '2626-CR',
|
||||
'J4900C' => '2626C',
|
||||
'J4900A' => '2626',
|
||||
'J9627A' => '2620-48-PoE+',
|
||||
'J9626A' => '2620-48',
|
||||
'J9624A' => '2620-24-PPoE+',
|
||||
'J9625A' => '2620-24-PoE+',
|
||||
'J9623A' => '2620-24',
|
||||
'J9565A' => '2615-8-PoE',
|
||||
'J9089A' => '2610-48-PWR',
|
||||
'J9088A' => '2610-48',
|
||||
'J9087A' => '2610-24-PWR',
|
||||
'J9086A' => '2610-24/12PWR',
|
||||
'J9085A' => '2610-24',
|
||||
'J8762A' => '2600-8-PWR',
|
||||
'JL357A' => '2540-48G-PoE+-4SFP+',
|
||||
'JL355A' => '2540-48G-4SFP+',
|
||||
'JL356A' => '2540-24G-PoE+-4SFP+',
|
||||
'JL354A' => '2540-24G-4SFP+',
|
||||
'JL070A' => '2530-8-PoE+ Internal PS',
|
||||
'J9780A' => '2530-8-PoE+',
|
||||
'J9774A' => '2530-8G-PoEP',
|
||||
'J9777A' => '2530-8G',
|
||||
'J9783A' => '2530-8',
|
||||
'J9778A' => '2530-48-PoE+',
|
||||
'J9853A' => '2530-48G-PoE+-2SFP+',
|
||||
'J9772A' => '2530-48G-PoE+',
|
||||
'J9855A' => '2530-48G-2SFP+',
|
||||
'J9775A' => '2530-48G',
|
||||
'J9781A' => '2530-48',
|
||||
'J9779A' => '2530-24-PoE+',
|
||||
'J9854A' => '2530-24G-PoE+-2SFP+',
|
||||
'J9773A' => '2530-24G-PoE+',
|
||||
'J9856A' => '2530-24G-2SFP+',
|
||||
'J9776A' => '2530-24G',
|
||||
'J9782A' => '2530-24',
|
||||
'J4813A' => '2524',
|
||||
'J9298A' => '2520G-8-PoE',
|
||||
'J9299A' => '2520G-24-PoE',
|
||||
'J9137A' => '2520-8-PoE',
|
||||
'J9138A' => '2520-24-PoE',
|
||||
'J4812A' => '2512',
|
||||
'J9280A' => '2510G-48',
|
||||
'J9279A' => '2510G-24',
|
||||
'J9020A' => '2510-48A',
|
||||
'J9019B' => '2510-24B',
|
||||
'J9019A' => '2510-24A',
|
||||
'J4818A' => '2324',
|
||||
'J4817A' => '2312',
|
||||
'J9449A' => '1810G-8',
|
||||
'J9450A' => '1810G-24',
|
||||
'J9802A' => '1810-8G',
|
||||
'J9803A' => '1810-24G',
|
||||
'J9029A' => '1800-8G',
|
||||
'J9028A' => '1800-24G',
|
||||
);
|
||||
|
||||
# Method Overrides
|
||||
|
||||
sub stp_ver {
|
||||
my $hp = shift;
|
||||
return $hp->rstp_ver() || $hp->SUPER::stp_ver();
|
||||
}
|
||||
|
||||
sub cpu {
|
||||
my $hp = shift;
|
||||
return $hp->hp_cpu();
|
||||
}
|
||||
|
||||
sub mem_total {
|
||||
my $hp = shift;
|
||||
return $hp->hp_mem_total();
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $hp = shift;
|
||||
my $os_version = $hp->os_version() || $hp->os_version2();
|
||||
return $os_version if defined $os_version;
|
||||
|
||||
# Some older ones don't have this value,so we cull it from the description
|
||||
my $descr = $hp->description();
|
||||
if ( $descr =~ m/revision ([A-Z]{1}\.\d{2}\.\d{2})/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
# Regular managed ProCurve switches have the serial num in entity mib,
|
||||
# the web-managed models in the semi mib (hphttpmanageable).
|
||||
sub serial {
|
||||
my $hp = shift;
|
||||
|
||||
my $serial = $hp->serial1() || $hp->serial2() || undef;;
|
||||
|
||||
return $serial;
|
||||
}
|
||||
|
||||
# Lookup model number, and translate the part number to the common number
|
||||
sub model {
|
||||
my $hp = shift;
|
||||
my $id = $hp->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^(hp|aruba)switch//i;
|
||||
|
||||
return defined $MODEL_MAP{$model} ? $MODEL_MAP{$model} : $model;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $hp = shift;
|
||||
my $interfaces = $hp->i_index();
|
||||
my $i_descr = $hp->i_description();
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $descr = $i_descr->{$iid};
|
||||
next unless defined $descr;
|
||||
$if{$iid} = $descr if ( defined $descr and length $descr );
|
||||
}
|
||||
|
||||
return \%if
|
||||
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $hp = shift;
|
||||
my $i_alias = $hp->i_alias();
|
||||
my $e_name = $hp->e_name();
|
||||
my $e_port = $hp->e_port();
|
||||
|
||||
my %i_name;
|
||||
|
||||
foreach my $port ( keys %$e_name ) {
|
||||
my $iid = $e_port->{$port};
|
||||
next unless defined $iid;
|
||||
my $alias = $i_alias->{$iid};
|
||||
next unless defined $iid;
|
||||
$i_name{$iid} = $e_name->{$port};
|
||||
|
||||
# Check for alias
|
||||
$i_name{$iid} = $alias if ( defined $alias and length($alias) );
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $hp = shift;
|
||||
|
||||
return $hp->mau_i_duplex();
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Try HP MIB first
|
||||
my $hp_duplex = $hp->hp_duplex_admin($partial);
|
||||
if ( defined $hp_duplex and scalar( keys %$hp_duplex ) ) {
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if ( keys %$hp_duplex ) {
|
||||
my $duplex = $hp_duplex->{$if};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
else {
|
||||
return $hp->mau_i_duplex_admin();
|
||||
}
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub log {
|
||||
my $hp = shift;
|
||||
|
||||
my $log = $hp->l_descr();
|
||||
|
||||
my $logstring = undef;
|
||||
|
||||
foreach my $val ( values %$log ) {
|
||||
next if $val =~ /^Link\s+(Up|Down)/;
|
||||
$logstring .= "$val\n";
|
||||
}
|
||||
|
||||
return $logstring;
|
||||
}
|
||||
|
||||
sub slots {
|
||||
my $hp = shift;
|
||||
|
||||
my $e_name = $hp->e_name();
|
||||
|
||||
return unless defined $e_name;
|
||||
|
||||
my $slots;
|
||||
foreach my $slot ( keys %$e_name ) {
|
||||
$slots++ if $e_name->{$slot} =~ /slot/i;
|
||||
}
|
||||
|
||||
return $slots;
|
||||
}
|
||||
|
||||
sub fan {
|
||||
my $hp = shift;
|
||||
return &_sensor( $hp, 'fan' );
|
||||
}
|
||||
|
||||
sub ps1_status {
|
||||
my $hp = shift;
|
||||
return &_sensor( $hp, 'power', '^power supply 1' )
|
||||
|| &_sensor( $hp, 'power', '^power supply sensor' );
|
||||
}
|
||||
|
||||
sub ps2_status {
|
||||
my $hp = shift;
|
||||
return &_sensor( $hp, 'power', '^power supply 2' )
|
||||
|| &_sensor( $hp, 'power', '^redundant' );
|
||||
}
|
||||
|
||||
sub _sensor {
|
||||
my $hp = shift;
|
||||
my $search_type = shift || 'fan';
|
||||
my $search_name = shift || '';
|
||||
my $hp_s_oid = $hp->hp_s_oid();
|
||||
my $result;
|
||||
foreach my $sensor ( keys %$hp_s_oid ) {
|
||||
my $sensortype = &SNMP::translateObj( $hp_s_oid->{$sensor} );
|
||||
if ( $sensortype =~ /$search_type/i ) {
|
||||
my $sensorname = $hp->hp_s_name()->{$sensor};
|
||||
my $sensorstatus = $hp->hp_s_status()->{$sensor};
|
||||
if ( $sensorname =~ /$search_name/i ) {
|
||||
$result = $sensorstatus;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub munge_hp_c_id {
|
||||
my ($v) = @_;
|
||||
if ( length(unpack('H*', $v)) == 12 ){
|
||||
return join(':',map { sprintf "%02x", $_ } unpack('C*', $v));
|
||||
}if ( length(unpack('H*', $v)) == 10 ){
|
||||
# IP address (first octet is sign, I guess)
|
||||
my @octets = (map { sprintf "%02x",$_ } unpack('C*', $v))[1..4];
|
||||
return join '.', map { hex($_) } @octets;
|
||||
}else{
|
||||
return $v;
|
||||
}
|
||||
}
|
||||
|
||||
# POWER-ETHERNET-MIB doesn't define a mapping of its
|
||||
# "module"/"port" index to ifIndex. Different vendors
|
||||
# do this in different ways.
|
||||
# HP switches use the ifIndex as port index, so we can
|
||||
# ignore the module information and map the index directly
|
||||
# onto an ifIndex.
|
||||
sub peth_port_ifindex {
|
||||
my $peth = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $peth_port_status = $peth->peth_port_status($partial);
|
||||
my $peth_port_ifindex;
|
||||
|
||||
foreach my $i ( keys %$peth_port_status ) {
|
||||
my ( $module, $port ) = split( /\./, $i );
|
||||
$peth_port_ifindex->{$i} = $port;
|
||||
}
|
||||
return $peth_port_ifindex;
|
||||
}
|
||||
|
||||
sub set_i_vlan {
|
||||
my $hp = shift;
|
||||
my $rv;
|
||||
|
||||
my $qb_i_vlan = $hp->qb_i_vlan_t();
|
||||
if (defined $qb_i_vlan and scalar(keys %$qb_i_vlan)){
|
||||
my $vlan = shift;
|
||||
my $iid = shift;
|
||||
|
||||
my $qb_v_egress = $hp->qb_v_egress();
|
||||
if (defined $qb_v_egress and scalar($qb_v_egress->{$vlan})) {
|
||||
# store current untagged VLAN to remove it from the port list later
|
||||
my $old_untagged = $qb_i_vlan->{$iid};
|
||||
|
||||
# set new untagged / native VLAN
|
||||
$rv = $hp->set_qb_i_vlan($vlan, $iid);
|
||||
|
||||
# If change is successful, the old native VLAN will now be a tagged VLAN on the port. This is generally not what we want.
|
||||
# We'll have to remove this VLAN from the "egress list" on the port.
|
||||
if (defined $rv and $old_untagged != $vlan) {
|
||||
if (defined $old_untagged and defined $qb_v_egress and scalar($qb_v_egress->{$vlan})){
|
||||
|
||||
# First, get the egress list of the old native VLAN (arrayref structure)
|
||||
my $egressports = $qb_v_egress->{$old_untagged};
|
||||
|
||||
# Since arrays are zero-based, we have to change the element at Index - 1
|
||||
$egressports->[$iid-1] = "0";
|
||||
|
||||
# After changing, pack the array into a binary structure (expected by set_qb_v_egress) and set the new value on the device.
|
||||
my $new_egresslist = pack("B*", join('', @$egressports));
|
||||
|
||||
$rv = $hp->set_qb_v_egress($new_egresslist, $old_untagged);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$hp->error_throw(sprintf("Requested VLAN %s doesn't seem to exist on device...", $vlan));
|
||||
}
|
||||
}
|
||||
return $rv;
|
||||
}
|
||||
|
||||
sub set_i_vlan_tagged {
|
||||
my $hp = shift;
|
||||
my $rv;
|
||||
|
||||
my $qb_i_vlan = $hp->qb_i_vlan_t();
|
||||
if (defined $qb_i_vlan and scalar(keys %$qb_i_vlan)){
|
||||
my $vlan = shift;
|
||||
my $iid = shift;
|
||||
|
||||
my $qb_v_egress = $hp->qb_v_egress();
|
||||
if (defined $qb_v_egress and scalar($qb_v_egress->{$vlan})) {
|
||||
|
||||
# First, get the egress list of the VLAN we want to add to the port.
|
||||
my $egressports = $qb_v_egress->{$vlan};
|
||||
|
||||
# Since arrays are zero-based, we have to change the element at Index - 1
|
||||
$egressports->[$iid-1] = "1";
|
||||
|
||||
# After changing, pack the array into a binary structure (expected by set_qb_v_egress) and set the new value on the device.
|
||||
my $new_egresslist = pack("B*", join('', @$egressports));
|
||||
$rv = $hp->set_qb_v_egress($new_egresslist, $vlan);
|
||||
return $rv;
|
||||
} else {
|
||||
$hp->error_throw(sprintf("Requested VLAN %s doesn't seem to exist on device...", $vlan));
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub agg_ports { return agg_ports_ifstack(@_) }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::HP - SNMP Interface to HP Procurve Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $hp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $hp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
HP ProCurve Switch via SNMP.
|
||||
|
||||
Note: Some HP Switches will connect via SNMP version 1, but a lot of config
|
||||
data will not be available. Make sure you try and connect with Version 2
|
||||
first, and then fail back to version 1.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $hp = new SNMP::Info::Layer2::HP(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<RFC1271-MIB>
|
||||
|
||||
Included in V2 mibs from Cisco
|
||||
|
||||
=item F<HP-ICF-OID>
|
||||
|
||||
(this MIB new with SNMP::Info 0.8)
|
||||
|
||||
=item F<STATISTICS-MIB>
|
||||
|
||||
=item F<NETSWITCH-MIB>
|
||||
|
||||
=item F<CONFIG-MIB>
|
||||
|
||||
=item F<HP-ICF-BRIDGE>
|
||||
|
||||
=item F<HP-ICF-POE-MIB>
|
||||
|
||||
=item F<HP-ICF-CHASSIS>
|
||||
|
||||
=item F<SEMI-MIB>
|
||||
|
||||
=item F<HP-SWITCH-PL-MIB>
|
||||
|
||||
=item F<BLADETYPE4-NETWORK-MIB>
|
||||
|
||||
=back
|
||||
|
||||
The last four MIBs listed are from HP and can be found at
|
||||
L<http://www.hp.com/rnd/software> or
|
||||
L<http://www.hp.com/rnd/software/MIBs.htm>
|
||||
|
||||
=head1 Change Log
|
||||
|
||||
Version 0.4 - Removed F<ENTITY-MIB> e_*() methods to separate sub-class -
|
||||
SNMP::Info::Entity
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->cpu()
|
||||
|
||||
Returns CPU Utilization in percentage.
|
||||
|
||||
=item $hp->log()
|
||||
|
||||
Returns all the log entries from the switch's log that are not Link up or
|
||||
down messages.
|
||||
|
||||
=item $hp->mem_free()
|
||||
|
||||
Returns bytes of free memory
|
||||
|
||||
=item $hp->mem_total()
|
||||
|
||||
Return bytes of total memory
|
||||
|
||||
=item $hp->mem_used()
|
||||
|
||||
Returns bytes of used memory
|
||||
|
||||
=item $hp->model()
|
||||
|
||||
Returns the model number of the HP Switch. Will translate between the HP Part
|
||||
number and the common model number with this map :
|
||||
|
||||
%MODEL_MAP = (
|
||||
'J8131A' => 'WAP-420-WW',
|
||||
'J8130A' => 'WAP-420-NA',
|
||||
'J8133A' => 'AP520WL',
|
||||
'J8680A' => '9408sl',
|
||||
'J9091A' => '8212zl',
|
||||
'J9475A' => '8206zl',
|
||||
'J9265A' => '6600ml-24XG',
|
||||
'J9264A' => '6600ml-24G-4XG',
|
||||
'J9263A' => '6600ml-24G',
|
||||
'J9452A' => '6600-48G-4XG',
|
||||
'J9451A' => '6600-48G',
|
||||
'J8474A' => '6410cl-6XG',
|
||||
'J8433A' => '6400cl-6XG',
|
||||
'J8992A' => '6200yl-24G',
|
||||
'J4902A' => '6108',
|
||||
'J8698A' => '5412zl',
|
||||
'J8719A' => '5408yl',
|
||||
'J8697A' => '5406zl',
|
||||
'J8718A' => '5404yl',
|
||||
'J4819A' => '5308XL',
|
||||
'J4850A' => '5304XL',
|
||||
'J8773A' => '4208vl',
|
||||
'J8770A' => '4204vl',
|
||||
'J8772A' => '4202vl-72',
|
||||
'J9032A' => '4202vl-68G',
|
||||
'J9031A' => '4202vl-68',
|
||||
'J8771A' => '4202vl-48G',
|
||||
'J4865A' => '4108GL',
|
||||
'J4887A' => '4104GL',
|
||||
'J9588A' => '3800-48G-PoE+-4XG',
|
||||
'J9574A' => '3800-48G-PoE+-4SFP+',
|
||||
'J9586A' => '3800-48G-4XG',
|
||||
'J9576A' => '3800-48G-4SFP+',
|
||||
'J9584A' => '3800-24SFP-2SFP+',
|
||||
'J9587A' => '3800-24G-PoE+-2XG',
|
||||
'J9573A' => '3800-24G-PoE+-2SFP+',
|
||||
'J9585A' => '3800-24G-2XG',
|
||||
'J9575A' => '3800-24G-2SFP+',
|
||||
'J8693A' => '3500yl-48G-PWR',
|
||||
'J8692A' => '3500yl-24G-PWR',
|
||||
'J9473A' => '3500-48-PoE',
|
||||
'J9472A' => '3500-48',
|
||||
'J9471A' => '3500-24-PoE',
|
||||
'J9470A' => '3500-24',
|
||||
'J4906A' => '3400cl-48G',
|
||||
'J4905A' => '3400cl-24G',
|
||||
'J4815A' => '3324XL',
|
||||
'J4851A' => '3124',
|
||||
'J9562A' => '2915-8G-PoE',
|
||||
'J9148A' => '2910al-48G-PoE+',
|
||||
'J9147A' => '2910al-48G',
|
||||
'J9146A' => '2910al-24G-PoE+',
|
||||
'J9145A' => '2910al-24G',
|
||||
'J9050A' => '2900-48G',
|
||||
'J9049A' => '2900-24G',
|
||||
'J4904A' => '2848',
|
||||
'J4903A' => '2824',
|
||||
'J9022A' => '2810-48G',
|
||||
'J9021A' => '2810-24G',
|
||||
'J8165A' => '2650-PWR',
|
||||
'J4899B' => '2650-CR',
|
||||
'J4899C' => '2650C',
|
||||
'J4899A' => '2650',
|
||||
'J8164A' => '2626-PWR',
|
||||
'J4900B' => '2626-CR',
|
||||
'J4900C' => '2626C',
|
||||
'J4900A' => '2626',
|
||||
'J9627A' => '2620-48-PoE+',
|
||||
'J9626A' => '2620-48',
|
||||
'J9624A' => '2620-24-PPoE+',
|
||||
'J9625A' => '2620-24-PoE+',
|
||||
'J9623A' => '2620-24',
|
||||
'J9565A' => '2615-8-PoE',
|
||||
'J9089A' => '2610-48-PWR',
|
||||
'J9088A' => '2610-48',
|
||||
'J9087A' => '2610-24-PWR',
|
||||
'J9086A' => '2610-24/12PWR',
|
||||
'J9085A' => '2610-24',
|
||||
'J8762A' => '2600-8-PWR',
|
||||
'J4813A' => '2524',
|
||||
'J9298A' => '2520G-8-PoE',
|
||||
'J9299A' => '2520G-24-PoE',
|
||||
'J9137A' => '2520-8-PoE',
|
||||
'J9138A' => '2520-24-PoE',
|
||||
'J4812A' => '2512',
|
||||
'J9280A' => '2510G-48',
|
||||
'J9279A' => '2510G-24',
|
||||
'J9020A' => '2510-48A',
|
||||
'J9019B' => '2510-24B',
|
||||
'J9019A' => '2510-24A',
|
||||
'J4818A' => '2324',
|
||||
'J4817A' => '2312',
|
||||
'J9449A' => '1810G-8',
|
||||
'J9450A' => '1810G-24',
|
||||
'J9029A' => '1800-8G',
|
||||
'J9028A' => '1800-24G',
|
||||
);
|
||||
|
||||
=item $hp->os()
|
||||
|
||||
Returns hp
|
||||
|
||||
=item $hp->os_bin()
|
||||
|
||||
C<hpSwitchRomVersion.0>
|
||||
|
||||
=item $hp->os_ver()
|
||||
|
||||
Tries to use os_version() and if that fails will try and cull the version from
|
||||
the description field.
|
||||
|
||||
=item $hp->os_version()
|
||||
|
||||
C<hpSwitchOsVersion.0>
|
||||
|
||||
=item $hp->serial()
|
||||
|
||||
Returns serial number if available through SNMP
|
||||
|
||||
=item $hp->slots()
|
||||
|
||||
Returns number of entries in $hp->e_name that have 'slot' in them.
|
||||
|
||||
=item $hp->vendor()
|
||||
|
||||
hp
|
||||
|
||||
=item $hp->fan()
|
||||
|
||||
Returns fan status
|
||||
|
||||
=item $hp->ps1_status()
|
||||
|
||||
Power supply 1 status
|
||||
|
||||
=item $hp->ps2_status()
|
||||
|
||||
Power supply 2 status
|
||||
|
||||
=item $hp->peth_port_power()
|
||||
|
||||
Power supplied by PoE ports, in milliwatts
|
||||
(C<hpicfPoePethPsePortPower>)
|
||||
|
||||
=item $hp->stp_ver()
|
||||
|
||||
Returns what version of STP the device is running.
|
||||
(C<hpicfBridgeRstpForceVersion> with fallback to inherited stp_ver())
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over 4
|
||||
|
||||
=item $hp->interfaces()
|
||||
|
||||
Uses $hp->i_description()
|
||||
|
||||
=item $hp->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex.
|
||||
|
||||
=item $hp->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting.
|
||||
|
||||
=item $hp->vendor_i_type()
|
||||
|
||||
Returns reference to hash of IIDs to HP specific port type
|
||||
(C<hpSwitchPortType>).
|
||||
|
||||
=item $hp->i_name()
|
||||
|
||||
Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias()
|
||||
|
||||
=item $hp->peth_port_ifindex()
|
||||
|
||||
Returns reference to hash of power Ethernet port table entries map back to
|
||||
interface index (c<ifIndex>)
|
||||
|
||||
=item C<agg_ports>
|
||||
|
||||
Returns a HASH reference mapping from slave to master port for each member of
|
||||
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||
ifIndex of the corresponding master ports.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item munge_hp_c_id()
|
||||
|
||||
Munge for c_id which handles CDP and LLDP.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item set_i_vlan()
|
||||
|
||||
=item set_i_vlan_tagged()
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
739
lib/SNMP/Info/Layer2/HP4000.pm
Normal file
739
lib/SNMP/Info/Layer2/HP4000.pm
Normal file
@@ -0,0 +1,739 @@
|
||||
# SNMP::Info::Layer2::HP4000 - SNMP Interface to older HP ProCurve Switches (1600, 2400, 2424M, 4000 and 8000)
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::HP4000;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::CDP;
|
||||
|
||||
@SNMP::Info::Layer2::HP4000::ISA
|
||||
= qw/SNMP::Info::Layer3 SNMP::Info::MAU
|
||||
SNMP::Info::CDP Exporter/;
|
||||
@SNMP::Info::Layer2::HP4000::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MODEL_MAP, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
'RFC1271-MIB' => 'logDescription',
|
||||
'HP-ICF-OID' => 'hpSwitch4000',
|
||||
'HP-VLAN' => 'hpVlanMemberIndex',
|
||||
'STATISTICS-MIB' => 'hpSwitchCpuStat',
|
||||
'NETSWITCH-MIB' => 'hpMsgBufFree',
|
||||
'CONFIG-MIB' => 'hpSwitchConfig',
|
||||
'SEMI-MIB' => 'hpHttpMgSerialNumber',
|
||||
'HP-ICF-CHASSIS' => 'hpicfSensorObjectId',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'serial1' => 'hpHttpMgSerialNumber.0',
|
||||
'hp_cpu' => 'hpSwitchCpuStat.0',
|
||||
'hp_mem_total' => 'hpGlobalMemTotalBytes.1',
|
||||
'mem_free' => 'hpGlobalMemFreeBytes.1',
|
||||
'mem_used' => 'hpGlobalMemAllocBytes.1',
|
||||
'os_version' => 'hpSwitchOsVersion.0',
|
||||
'os_bin' => 'hpSwitchRomVersion.0',
|
||||
'mac' => 'hpSwitchBaseMACAddress.0',
|
||||
'hp_vlans' => 'hpVlanNumber',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
'bp_index2' => 'dot1dBasePortIfIndex',
|
||||
'i_type2' => 'ifType',
|
||||
|
||||
# RFC1271
|
||||
'l_descr' => 'logDescription',
|
||||
|
||||
# HP-VLAN-MIB
|
||||
'hp_v_index' => 'hpVlanDot1QID',
|
||||
'hp_v_name' => 'hpVlanIdentName',
|
||||
'hp_v_state' => 'hpVlanIdentState',
|
||||
'hp_v_type' => 'hpVlanIdentType',
|
||||
'hp_v_status' => 'hpVlanIdentStatus',
|
||||
'hp_v_mac' => 'hpVlanAddrPhysAddress',
|
||||
'hp_v_if_index' => 'hpVlanMemberIndex',
|
||||
'hp_v_if_tag' => 'hpVlanMemberTagged2',
|
||||
|
||||
# CONFIG-MIB::hpSwitchPortTable
|
||||
'hp_duplex' => 'hpSwitchPortEtherMode',
|
||||
'hp_duplex_admin' => 'hpSwitchPortFastEtherMode',
|
||||
'vendor_i_type' => 'hpSwitchPortType',
|
||||
|
||||
# HP-ICF-CHASSIS
|
||||
'hp_s_oid' => 'hpicfSensorObjectId',
|
||||
'hp_s_name' => 'hpicfSensorDescr',
|
||||
'hp_s_status' => 'hpicfSensorStatus',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE
|
||||
);
|
||||
|
||||
%MODEL_MAP = (
|
||||
'J4093A' => '2424M',
|
||||
'J4110A' => '8000M',
|
||||
'J4120A' => '1600M',
|
||||
'J4121A' => '4000M',
|
||||
'J4122A' => '2400M',
|
||||
'J4122B' => '2424M',
|
||||
);
|
||||
|
||||
# Method Overrides
|
||||
|
||||
sub cpu {
|
||||
my $hp = shift;
|
||||
return $hp->hp_cpu();
|
||||
}
|
||||
|
||||
sub mem_total {
|
||||
my $hp = shift;
|
||||
return $hp->hp_mem_total();
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $hp = shift;
|
||||
my $os_version = $hp->os_version();
|
||||
return $os_version if defined $os_version;
|
||||
|
||||
# Some older ones don't have this value,so we cull it from the description
|
||||
my $descr = $hp->description();
|
||||
if ( $descr =~ m/revision ([A-Z]{1}\.\d{2}\.\d{2})/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
# Lookup model number, and translate the part number to the common number
|
||||
sub model {
|
||||
my $hp = shift;
|
||||
my $id = $hp->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
return defined $MODEL_MAP{$model} ? $MODEL_MAP{$model} : $model;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $hp = shift;
|
||||
my $interfaces = $hp->i_index();
|
||||
my $i_descr = $hp->i_description();
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $descr = $i_descr->{$iid};
|
||||
next unless defined $descr;
|
||||
$if{$iid} = $descr if ( defined $descr and length $descr );
|
||||
}
|
||||
|
||||
return \%if
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $hp = shift;
|
||||
my $i_alias = $hp->i_alias();
|
||||
my $e_name = $hp->e_name();
|
||||
my $e_port = $hp->e_port();
|
||||
|
||||
my %i_name;
|
||||
|
||||
foreach my $port ( keys %$e_name ) {
|
||||
my $iid = $e_port->{$port};
|
||||
next unless defined $iid;
|
||||
my $alias = $i_alias->{$iid};
|
||||
next unless defined $iid;
|
||||
$i_name{$iid} = $e_name->{$port};
|
||||
|
||||
# Check for alias
|
||||
$i_name{$iid} = $alias if ( defined $alias and length($alias) );
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $hp = shift;
|
||||
|
||||
return $hp->mau_i_duplex();
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Try HP MIB first
|
||||
my $hp_duplex = $hp->hp_duplex_admin($partial);
|
||||
if ( defined $hp_duplex and scalar( keys %$hp_duplex ) ) {
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if ( keys %$hp_duplex ) {
|
||||
my $duplex = $hp_duplex->{$if};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
else {
|
||||
return $hp->mau_i_duplex_admin();
|
||||
}
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub log {
|
||||
my $hp = shift;
|
||||
|
||||
my $log = $hp->l_descr();
|
||||
|
||||
my $logstring = undef;
|
||||
|
||||
foreach my $val ( values %$log ) {
|
||||
next if $val =~ /^Link\s+(Up|Down)/;
|
||||
$logstring .= "$val\n";
|
||||
}
|
||||
|
||||
return $logstring;
|
||||
}
|
||||
|
||||
sub slots {
|
||||
my $hp = shift;
|
||||
|
||||
my $e_name = $hp->e_name();
|
||||
|
||||
return unless defined $e_name;
|
||||
|
||||
my $slots;
|
||||
foreach my $slot ( keys %$e_name ) {
|
||||
$slots++ if $e_name->{$slot} =~ /slot/i;
|
||||
}
|
||||
|
||||
return $slots;
|
||||
}
|
||||
|
||||
sub fan {
|
||||
my $hp = shift;
|
||||
return &_sensor( $hp, 'fan' );
|
||||
}
|
||||
|
||||
sub ps1_status {
|
||||
my $hp = shift;
|
||||
return &_sensor( $hp, 'power', '^power supply 1' )
|
||||
|| &_sensor( $hp, 'power', '^power supply sensor' );
|
||||
}
|
||||
|
||||
sub ps2_status {
|
||||
my $hp = shift;
|
||||
return &_sensor( $hp, 'power', '^power supply 2' )
|
||||
|| &_sensor( $hp, 'power', '^redundant' );
|
||||
}
|
||||
|
||||
sub _sensor {
|
||||
my $hp = shift;
|
||||
my $search_type = shift || 'fan';
|
||||
my $search_name = shift || '';
|
||||
my $hp_s_oid = $hp->hp_s_oid();
|
||||
my $result;
|
||||
foreach my $sensor ( keys %$hp_s_oid ) {
|
||||
my $sensortype = &SNMP::translateObj( $hp_s_oid->{$sensor} );
|
||||
if ( $sensortype =~ /$search_type/i ) {
|
||||
my $sensorname = $hp->hp_s_name()->{$sensor};
|
||||
my $sensorstatus = $hp->hp_s_status()->{$sensor};
|
||||
if ( $sensorname =~ /$search_name/i ) {
|
||||
$result = $sensorstatus;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
# Bridge MIB does not map Bridge Port to ifIndex correctly on older models, but Bridge Port equals ifIndex in these devices
|
||||
sub bp_index {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $if_index = $hp->i_index($partial);
|
||||
my %mod_bp_index;
|
||||
foreach my $iid ( keys %$if_index ) {
|
||||
$mod_bp_index{$iid} = $iid;
|
||||
}
|
||||
return \%mod_bp_index;
|
||||
}
|
||||
|
||||
# VLAN methods. Devices in this class use the proprietary HP-VLAN-MIB.
|
||||
|
||||
sub v_index {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $hp->hp_v_index($partial);
|
||||
}
|
||||
|
||||
sub v_name {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $hp->hp_v_name($partial);
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $hp = shift;
|
||||
|
||||
# the hpvlanmembertagged2 table has an entry in the form of
|
||||
# vlan.interface = /untagged/no/tagged/auto
|
||||
my $i_vlan = {};
|
||||
my $hp_v_index = $hp->hp_v_index();
|
||||
my $hp_v_if_tag = $hp->hp_v_if_tag();
|
||||
foreach my $row ( keys %$hp_v_if_tag ) {
|
||||
my ( $index, $if ) = split( /\./, $row );
|
||||
|
||||
my $tag = $hp_v_if_tag->{$row};
|
||||
my $vlan = $hp_v_index->{$index};
|
||||
|
||||
next unless ( defined $tag and $tag =~ /untagged/ );
|
||||
|
||||
$i_vlan->{$if} = $vlan if defined $vlan;
|
||||
}
|
||||
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $hp = shift;
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
my $hp_v_index = $hp->hp_v_index();
|
||||
my $hp_v_if_tag = $hp->hp_v_if_tag();
|
||||
foreach my $row ( keys %$hp_v_if_tag ) {
|
||||
my ( $index, $if ) = split( /\./, $row );
|
||||
|
||||
my $tag = $hp_v_if_tag->{$row};
|
||||
my $vlan = $hp_v_index->{$index};
|
||||
|
||||
next unless ( defined $tag );
|
||||
next if ( $tag eq 'no' );
|
||||
|
||||
push( @{ $i_vlan_membership->{$if} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub i_vlan_membership_untagged {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $vlans = $hp->i_vlan($partial);
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $port (keys %$vlans) {
|
||||
my $vlan = $vlans->{$port};
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub set_i_vlan {
|
||||
my $hp = shift;
|
||||
my $rv;
|
||||
|
||||
my $hp_v_index = $hp->hp_v_index();
|
||||
my $hp_v_if_tag = $hp->hp_v_if_tag();
|
||||
if (defined $hp_v_index and scalar(keys %$hp_v_index)){
|
||||
my $vlan = shift;
|
||||
my $iid = shift;
|
||||
my $old_untagged;
|
||||
# Hash to lookup VLAN index of the VID (dot1q tag)
|
||||
my %vl_trans = reverse %$hp_v_index;
|
||||
|
||||
# Translate the VLAN identifier (tag) value to the index used by the HP-VLAN MIB
|
||||
my $vlan_index = $vl_trans{$vlan};
|
||||
if (defined $vlan_index) {
|
||||
|
||||
# First, loop through table to determine current untagged vlan for the port we're about to change
|
||||
foreach my $row (keys %$hp_v_if_tag){
|
||||
my ($index,$if) = split(/\./,$row);
|
||||
if ($if == $iid and $hp_v_if_tag->{$row} =~ /untagged/) {
|
||||
# Store the row information of the current untagged VLAN and temporarily set it to tagged
|
||||
$old_untagged = $row;
|
||||
$rv = $hp->set_hp_v_if_tag(1, $row);
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
# Then set our port untagged in the desired VLAN
|
||||
my $rv = $hp->set_hp_v_if_tag(2, "$vlan_index.$iid");
|
||||
if (defined $rv) {
|
||||
# If vlan change is successful, remove VLAN that used to be untagged from the port
|
||||
if (defined $old_untagged) {
|
||||
$rv = $hp->set_hp_v_if_tag(3, $old_untagged);
|
||||
$hp->error_throw("Error removing previous untagged vlan from port, should never happen...\n") unless defined $rv;
|
||||
}
|
||||
} else {
|
||||
# If vlan change was not successful, try to revert to the old situation.
|
||||
if (defined $old_untagged) {
|
||||
$rv = $hp->set_hp_v_if_tag(2, $old_untagged) if defined $old_untagged;
|
||||
if (defined $rv) {
|
||||
$hp->error_throw("VLAN change failed, restored port to previous configuration.\n");
|
||||
} else {
|
||||
$hp->error_throw("VLAN change failed, unable to restore old configuration. Check device.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$hp->error_throw("Requested VLAN (VLAN ID: $vlan) not available on device.\n");
|
||||
}
|
||||
} else {
|
||||
$hp->error_throw("Error retrieving VLAN information from device.\n");
|
||||
}
|
||||
return $rv;
|
||||
}
|
||||
|
||||
sub set_i_vlan_tagged {
|
||||
my $hp = shift;
|
||||
my $vlan = shift;
|
||||
my $iid = shift;
|
||||
my $rv;
|
||||
|
||||
my $hp_v_index = $hp->hp_v_index();
|
||||
if (defined $hp_v_index and scalar(keys %$hp_v_index)){
|
||||
# Hash to lookup VLAN index of the VID (dot1q tag)
|
||||
my %vl_trans = reverse %$hp_v_index;
|
||||
|
||||
# Translate the VLAN identifier (tag) value to the index used by the HP-VLAN MIB
|
||||
my $vlan_index = $vl_trans{$vlan};
|
||||
if (defined $vlan_index) {
|
||||
# Set our port tagged in the desired VLAN
|
||||
$rv = $hp->set_hp_v_if_tag(1, "$vlan_index.$iid");
|
||||
} else {
|
||||
$hp->error_throw("Requested VLAN (VLAN ID: $vlan) not available on device.\n");
|
||||
}
|
||||
}
|
||||
return $rv;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::HP4000 - SNMP Interface to older HP ProCurve Switches (1600, 2400, 2424M, 4000 and 8000)
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $hp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $hp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
HP ProCurve Switch via SNMP.
|
||||
|
||||
Note: Some HP Switches will connect via SNMP version 1, but a lot of config
|
||||
data will not be available. Make sure you try and connect with Version 2
|
||||
first, and then fail back to version 1.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<RFC1271-MIB>
|
||||
|
||||
Included in V2 mibs from Cisco
|
||||
|
||||
=item F<HP-ICF-OID>
|
||||
|
||||
=item F<HP-VLAN>
|
||||
|
||||
(this MIB new with SNMP::Info 0.8)
|
||||
|
||||
=item F<STATISTICS-MIB>
|
||||
|
||||
=item F<NETSWITCH-MIB>
|
||||
|
||||
=item F<CONFIG-MIB>
|
||||
|
||||
=back
|
||||
|
||||
The last five MIBs listed are from HP and can be found at
|
||||
L<http://www.hp.com/rnd/software> or
|
||||
L<http://www.hp.com/rnd/software/MIBs.htm>
|
||||
|
||||
=head1 Change Log
|
||||
|
||||
Version 0.4 - Removed F<ENTITY-MIB> e_*() methods to separate sub-class -
|
||||
SNMP::Info::Entity
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->cpu()
|
||||
|
||||
Returns CPU Utilization in percentage.
|
||||
|
||||
=item $hp->log()
|
||||
|
||||
Returns all the log entries from the switch's log that are not Link up or
|
||||
down messages.
|
||||
|
||||
=item $hp->mem_free()
|
||||
|
||||
Returns bytes of free memory
|
||||
|
||||
=item $hp->mem_total()
|
||||
|
||||
Return bytes of total memory
|
||||
|
||||
=item $hp->mem_used()
|
||||
|
||||
Returns bytes of used memory
|
||||
|
||||
=item $hp->model()
|
||||
|
||||
Returns the model number of the HP Switch. Will translate between the HP Part
|
||||
number and the common model number with this map :
|
||||
|
||||
%MODEL_MAP = (
|
||||
'J4093A' => '2424M',
|
||||
'J4110A' => '8000M',
|
||||
'J4120A' => '1600M',
|
||||
'J4121A' => '4000M',
|
||||
'J4122A' => '2400M',
|
||||
'J4122B' => '2424M',
|
||||
);
|
||||
|
||||
=item $hp->os()
|
||||
|
||||
Returns hp
|
||||
|
||||
=item $hp->os_bin()
|
||||
|
||||
C<hpSwitchRomVersion.0>
|
||||
|
||||
=item $hp->os_ver()
|
||||
|
||||
Tries to use os_version() and if that fails will try and cull the version from
|
||||
the description field.
|
||||
|
||||
=item $hp->os_version()
|
||||
|
||||
C<hpSwitchOsVersion.0>
|
||||
|
||||
=item $hp->serial()
|
||||
|
||||
Returns serial number if available through SNMP
|
||||
|
||||
=item $hp->slots()
|
||||
|
||||
Returns number of entries in $hp->e_name that have 'slot' in them.
|
||||
|
||||
=item $hp->vendor()
|
||||
|
||||
hp
|
||||
|
||||
=item $hp->fan()
|
||||
|
||||
Returns fan status
|
||||
|
||||
=item $hp->ps1_status()
|
||||
|
||||
Power supply 1 status
|
||||
|
||||
=item $hp->ps2_status()
|
||||
|
||||
Power supply 2 status
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->interfaces()
|
||||
|
||||
Uses $hp->i_description()
|
||||
|
||||
=item $hp->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex.
|
||||
|
||||
=item $hp->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting.
|
||||
|
||||
=item $hp->vendor_i_type()
|
||||
|
||||
Returns reference to hash of IIDs to HP specific port type
|
||||
(C<hpSwitchPortType>).
|
||||
|
||||
=item $hp->i_name()
|
||||
|
||||
Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias()
|
||||
|
||||
=item $hp->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID (default VLAN) or untagged
|
||||
port when using F<HP-VLAN>.
|
||||
|
||||
=item $hp->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the egress list for the port.
|
||||
It is the union of tagged, untagged, and auto ports.
|
||||
|
||||
Example:
|
||||
my $interfaces = $hp->interfaces();
|
||||
my $vlans = $hp->i_vlan_membership();
|
||||
|
||||
foreach my $iid (sort keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $hp->i_vlan_membership_untagged()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the untagged egress list for
|
||||
the port.
|
||||
|
||||
=item $hp->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
=item $hp->v_name()
|
||||
|
||||
Returns VLAN names
|
||||
|
||||
=item $hp->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (iid)
|
||||
|
||||
Returns (C<ifIndex>) for both key and value for 1600, 2424, 4000, and 8000
|
||||
models since they seem to have problems with F<BRIDGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item set_i_vlan()
|
||||
|
||||
=item set_i_vlan_tagged()
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
191
lib/SNMP/Info/Layer2/HPVC.pm
Normal file
191
lib/SNMP/Info/Layer2/HPVC.pm
Normal file
@@ -0,0 +1,191 @@
|
||||
# SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::HPVC;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::HPVC::ISA
|
||||
= qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'HPVC-MIB' => 'vcDomainName',
|
||||
'CPQSINFO-MIB' => 'cpqSiSysSerialNum',
|
||||
'HPVCMODULE-MIB' => 'vcModuleDomainName',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
'serial1' => 'cpqSiSysSerialNum.0',
|
||||
'os_ver' => 'cpqHoSWRunningVersion.1',
|
||||
'os_bin' => 'cpqHoFwVerVersion.1',
|
||||
'productname' => 'cpqSiProductName.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
);
|
||||
|
||||
# Method Overrides
|
||||
|
||||
sub os {
|
||||
return 'hpvc';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $hp = shift;
|
||||
return $hp->productname();
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::HPVC - SNMP Interface to HP Virtual Connect Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $hp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $hp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
HP Virtual Connect Switch via SNMP.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HPVC-MIB>
|
||||
|
||||
=item F<CPQSINFO-MIB>
|
||||
|
||||
=item F<HPVCMODULE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
All required MIBs can be found in the netdisco-mibs package.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->os()
|
||||
|
||||
Returns C<'hpvc'>
|
||||
|
||||
=item $hp->os_bin()
|
||||
|
||||
C<cpqHoFwVerVersion.1>
|
||||
|
||||
=item $hp->os_ver()
|
||||
|
||||
C<cpqHoSWRunningVersion.1>
|
||||
|
||||
=item $hp->serial()
|
||||
|
||||
C<cpqSiSysSerialNum.0>
|
||||
|
||||
=item $hp->vendor()
|
||||
|
||||
hp
|
||||
|
||||
=item $hp->model()
|
||||
|
||||
C<cpqSiProductName.0>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=cut
|
||||
177
lib/SNMP/Info/Layer2/Kentrox.pm
Normal file
177
lib/SNMP/Info/Layer2/Kentrox.pm
Normal file
@@ -0,0 +1,177 @@
|
||||
package SNMP::Info::Layer2::Kentrox;
|
||||
|
||||
# Copyright (c) 2011 Netdisco Project
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Kentrox::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Kentrox::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
#from DATASMART-MIB
|
||||
# MIB isn't yet in netdisco-mibs (not clear permission)
|
||||
# ... when it is, this can change to dsScWyv
|
||||
'ds_sysinfo' => '.1.3.6.1.4.1.181.2.2.12.15.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
|
||||
|
||||
sub os {
|
||||
return 'kentrox';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $dsver = shift;
|
||||
my $descr = $dsver->description();
|
||||
if ( defined ($descr) && $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $dsserial = shift;
|
||||
my $serial = $dsserial->ds_sysinfo();
|
||||
if ( defined ($serial) && $serial =~ /SERIAL\s(\S+)/){
|
||||
my $str = substr($1,8,10);
|
||||
return $str;
|
||||
}
|
||||
return;
|
||||
}
|
||||
sub vendor {
|
||||
return 'kentrox';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $dsmodel = shift;
|
||||
my $descr = $dsmodel->description();
|
||||
if ( defined ($descr) && $descr =~ /^(\S+\s\S+)/){
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Kentrox - SNMP Interface to L2 Kentrox DataSMART DSU/CSU
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
phishphreek@gmail.com
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $router = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $router->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Kentrox DataSMART DSU/CSU
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $router->vendor()
|
||||
|
||||
=item $router->os()
|
||||
|
||||
=item $router->os_ver()
|
||||
|
||||
=item $router->model()
|
||||
|
||||
=item $router->serial()
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
234
lib/SNMP/Info/Layer2/N2270.pm
Normal file
234
lib/SNMP/Info/Layer2/N2270.pm
Normal file
@@ -0,0 +1,234 @@
|
||||
# SNMP::Info::Layer2::N2270
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::N2270;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::SONMP;
|
||||
use SNMP::Info::Airespace;
|
||||
|
||||
@SNMP::Info::Layer2::N2270::ISA
|
||||
= qw/SNMP::Info::Layer2 SNMP::Info::SONMP SNMP::Info::Airespace Exporter/;
|
||||
@SNMP::Info::Layer2::N2270::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD, $INIT, $DEBUG);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
%SNMP::Info::Airespace::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS,
|
||||
%SNMP::Info::Airespace::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
%SNMP::Info::Airespace::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
%SNMP::Info::Airespace::MUNGE,
|
||||
);
|
||||
|
||||
sub os {
|
||||
return 'nortel';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $n2270 = shift;
|
||||
my $id = $n2270->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
$model =~ s/^sreg-WLANSecuritySwitch//i;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub index_factor {
|
||||
return 256;
|
||||
}
|
||||
|
||||
sub slot_offset {
|
||||
return 0;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::N2270 - SNMP Interface to Nortel 2270 Series Wireless
|
||||
Switch
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $n2270 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $n2270->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Nortel 2270 Series Wireless Switch through SNMP.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
=item SNMP::Info::Airespace
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $n2270->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
|
||||
=item $n2270->os()
|
||||
|
||||
Returns 'nortel'
|
||||
|
||||
=item $n2270->model()
|
||||
|
||||
Cross references $bayhub->id() to the F<SYNOPTICS-ROOT-MIB> and returns
|
||||
the results.
|
||||
|
||||
Removes C<sreg-WLANSecuritySwitch> from the model name
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $bayhub->index_factor()
|
||||
|
||||
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||
reserved per slot within the device MIB. Returns 256.
|
||||
|
||||
=item $bayhub->slot_offset()
|
||||
|
||||
Required by SNMP::Info::SONMP. Offset if slot numbering does not
|
||||
start at 0. Returns 0.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Airespace
|
||||
|
||||
See documentation in L<SNMP::Info::Airespace/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item None
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Airespace
|
||||
|
||||
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
581
lib/SNMP/Info/Layer2/NAP222x.pm
Normal file
581
lib/SNMP/Info/Layer2/NAP222x.pm
Normal file
@@ -0,0 +1,581 @@
|
||||
# SNMP::Info::Layer2::NAP222x
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::NAP222x;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
use SNMP::Info::SONMP;
|
||||
use SNMP::Info::IEEE802dot11;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::NAP222x::ISA
|
||||
= qw/SNMP::Info::SONMP SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::NAP222x::EXPORT_OK = qw//;
|
||||
|
||||
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
|
||||
|
||||
$VERSION = '3.88';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS, 'NORTEL-WLAN-AP-MIB' => 'ntWlanSwHardwareVer',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS,
|
||||
'nt_hw_ver' => 'ntWlanSwHardwareVer',
|
||||
'nt_fw_ver' => 'ntWlanSwBootRomVer',
|
||||
'nt_sw_ver' => 'ntWlanSwOpCodeVer',
|
||||
'nt_cc' => 'ntWlanSwCountryCode',
|
||||
'tftp_action' => 'ntWlanTransferStart',
|
||||
'tftp_host' => 'ntWlanFileServer',
|
||||
'tftp_file' => 'ntWlanDestFile',
|
||||
'tftp_type' => 'ntWlanFileType',
|
||||
'tftp_result' => 'ntWlanFileTransferStatus',
|
||||
'tftp_xtype' => 'ntWlanTransferType',
|
||||
'tftp_src_file' => 'ntWlanSrcFile',
|
||||
'ftp_user' => 'ntWlanUserName',
|
||||
'ftp_pass' => 'ntWlanPassword',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
|
||||
# From ntWlanPortTable
|
||||
'nt_prt_name' => 'ntWlanPortName',
|
||||
'nt_dpx_admin' => 'ntWlanPortCapabilities',
|
||||
'nt_auto' => 'ntWlanPortAutonegotiation',
|
||||
'nt_dpx' => 'ntWlanPortSpeedDpxStatus',
|
||||
|
||||
# From ntWlanDot11PhyOperationTable
|
||||
'nt_i_broadcast' => 'ntWlanDot11ClosedSystem',
|
||||
|
||||
# From ntWlanApVlanTable
|
||||
'nt_i_vlan' => 'ntWlanApVlanDefaultVid',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
);
|
||||
|
||||
sub os {
|
||||
return 'nortel';
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $nap222x = shift;
|
||||
my $bin = $nap222x->nt_fw_ver();
|
||||
return unless defined $bin;
|
||||
|
||||
if ( $bin =~ m/(\d+\.\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $nap222x = shift;
|
||||
my $descr = $nap222x->description();
|
||||
return unless defined $descr;
|
||||
|
||||
return 'AP-2220' if ( $descr =~ /2220/ );
|
||||
return 'AP-2221' if ( $descr =~ /2221/ );
|
||||
return;
|
||||
}
|
||||
|
||||
sub mac {
|
||||
my $nap222x = shift;
|
||||
my $i_mac = $nap222x->i_mac();
|
||||
|
||||
# Return Interface MAC
|
||||
foreach my $entry ( keys %$i_mac ) {
|
||||
my $sn = $i_mac->{$entry};
|
||||
next unless $sn;
|
||||
return $sn;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $nap222x = shift;
|
||||
my $i_mac = $nap222x->i_mac();
|
||||
|
||||
# Return Interface MAC
|
||||
foreach my $entry ( keys %$i_mac ) {
|
||||
my $sn = $i_mac->{$entry};
|
||||
next unless $sn;
|
||||
return $sn;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $nap222x = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $nap222x->i_index($partial) || {};
|
||||
my $description = $nap222x->i_description($partial) || {};
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $desc = $description->{$iid};
|
||||
next unless defined $desc;
|
||||
next if $desc =~ /lo/i;
|
||||
|
||||
$interfaces{$iid} = $desc;
|
||||
}
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $nap222x = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $mode = $nap222x->nt_dpx($partial) || {};
|
||||
my $port_name = $nap222x->nt_prt_name($partial) || {};
|
||||
my $interfaces = $nap222x->interfaces($partial) || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $port = $interfaces->{$if};
|
||||
next unless $port =~ /dp/i;
|
||||
foreach my $idx ( keys %$mode ) {
|
||||
my $name = $port_name->{$idx} || 'unknown';
|
||||
next unless $name eq $port;
|
||||
my $duplex = $mode->{$idx};
|
||||
|
||||
$duplex = 'other' unless defined $duplex;
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $nap222x = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $dpx_admin = $nap222x->nt_dpx_admin($partial) || {};
|
||||
my $nt_auto = $nap222x->nt_auto($partial) || {};
|
||||
my $interfaces = $nap222x->interfaces($partial) || {};
|
||||
my $port_name = $nap222x->nt_prt_name($partial) || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $port = $interfaces->{$if};
|
||||
next unless $port =~ /dp/i;
|
||||
foreach my $idx ( keys %$dpx_admin ) {
|
||||
my $name = $port_name->{$idx} || 'unknown';
|
||||
next unless $name eq $port;
|
||||
my $duplex = $dpx_admin->{$idx};
|
||||
my $auto = $nt_auto->{$idx};
|
||||
|
||||
$duplex = 'other' unless defined $duplex;
|
||||
$duplex = 'half'
|
||||
if ( $duplex =~ /half/i and $auto =~ /disabled/i );
|
||||
$duplex = 'full'
|
||||
if ( $duplex =~ /full/i and $auto =~ /disabled/i );
|
||||
$duplex = 'auto' if $auto =~ /enabled/i;
|
||||
|
||||
$i_duplex_admin{$if} = $duplex;
|
||||
}
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $nap222x = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $nap222x->interfaces($partial) || {};
|
||||
|
||||
my %i_name;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $desc = $interfaces->{$if};
|
||||
next unless defined $desc;
|
||||
|
||||
my $name = 'unknown';
|
||||
$name = 'Ethernet Interface' if $desc =~ /dp/i;
|
||||
$name = 'Wireless Interface B' if $desc =~ /ndc/i;
|
||||
$name = 'Wireless Interface A' if $desc =~ /ar/i;
|
||||
|
||||
$i_name{$if} = $name;
|
||||
}
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
# dot1dBasePortTable does not exist and dot1dTpFdbPort does not map to ifIndex
|
||||
sub bp_index {
|
||||
my $nap222x = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $nap222x->interfaces($partial) || {};
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $desc = $interfaces->{$iid};
|
||||
next unless defined $desc;
|
||||
next unless $desc =~ /(ndc|ar)/i;
|
||||
|
||||
my $port = 1;
|
||||
$port = 2 if $desc =~ /ndc/i;
|
||||
|
||||
$bp_index{$port} = $iid;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
# Indicies don't match anywhere in these devices! Need to override to match
|
||||
# IfIndex.
|
||||
sub i_ssidlist {
|
||||
my $nap222x = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# modify partial to match index
|
||||
if ( defined $partial ) {
|
||||
$partial = $partial - 2;
|
||||
}
|
||||
my $ssids = $nap222x->orig_i_ssidlist($partial) || {};
|
||||
|
||||
my %i_ssidlist;
|
||||
foreach my $iid ( keys %$ssids ) {
|
||||
my $port = $iid + 2;
|
||||
my $ssid = $ssids->{$iid};
|
||||
next unless defined $ssid;
|
||||
|
||||
$i_ssidlist{$port} = $ssid;
|
||||
}
|
||||
return \%i_ssidlist;
|
||||
}
|
||||
|
||||
sub i_ssidbcast {
|
||||
my $nap222x = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# modify partial to match index
|
||||
if ( defined $partial ) {
|
||||
$partial = $partial - 2;
|
||||
}
|
||||
my $bcast = $nap222x->nt_i_broadcast($partial) || {};
|
||||
|
||||
my %i_ssidbcast;
|
||||
foreach my $iid ( keys %$bcast ) {
|
||||
my $port = $iid + 2;
|
||||
my $bc = $bcast->{$iid};
|
||||
next unless defined $bc;
|
||||
|
||||
$i_ssidbcast{$port} = $bc;
|
||||
}
|
||||
return \%i_ssidbcast;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
my $nap222x = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# modify partial to match index
|
||||
if ( defined $partial ) {
|
||||
$partial = $partial - 2;
|
||||
}
|
||||
my $phy_type = $nap222x->dot11_phy_type($partial) || {};
|
||||
my $cur_freq = $nap222x->dot11_cur_freq() || {};
|
||||
my $cur_ch = $nap222x->dot11_cur_ch() || {};
|
||||
|
||||
my %i_80211channel;
|
||||
foreach my $iid ( keys %$phy_type ) {
|
||||
my $port = $iid + 2;
|
||||
my $type = $phy_type->{$iid};
|
||||
next unless defined $type;
|
||||
if ( $type =~ /dsss/ ) {
|
||||
my $ch = $cur_ch->{1};
|
||||
next unless defined $ch;
|
||||
$i_80211channel{$port} = $ch;
|
||||
}
|
||||
elsif ( $type =~ /ofdm/ ) {
|
||||
my $ch = $cur_freq->{0};
|
||||
next unless defined $ch;
|
||||
$i_80211channel{$port} = $ch;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
return \%i_80211channel;
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $nap222x = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# modify partial to match index
|
||||
if ( defined $partial ) {
|
||||
$partial = $partial - 2;
|
||||
}
|
||||
my $vlans = $nap222x->nt_i_vlan($partial) || {};
|
||||
|
||||
my %i_vlan;
|
||||
foreach my $iid ( keys %$vlans ) {
|
||||
my $port = $iid + 2;
|
||||
my $vlan = $vlans->{$iid};
|
||||
next unless defined $vlan;
|
||||
|
||||
$i_vlan{$port} = $vlan;
|
||||
}
|
||||
return \%i_vlan;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::NAP222x - SNMP Interface to Nortel 2220 Series Access
|
||||
Points
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $nap222x = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $nap222x->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a Nortel
|
||||
2220 series wireless Access Points through SNMP.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
=item SNMP::Info::IEEE802dot11
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<NORTEL-WLAN-AP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $nap222x->model()
|
||||
|
||||
Returns the model extracted from C<sysDescr>.
|
||||
|
||||
=item $nap222x->os()
|
||||
|
||||
Returns 'nortel'
|
||||
|
||||
=item $nap222x->os_bin()
|
||||
|
||||
Returns the firmware version extracted from C<ntWlanSwBootRomVer>.
|
||||
|
||||
=item $nap222x->mac()
|
||||
|
||||
Returns the MAC address of the first Ethernet Interface.
|
||||
|
||||
=item $nap222x->serial()
|
||||
|
||||
Returns the MAC address of the first Ethernet Interface.
|
||||
|
||||
=item $nap222x->nt_hw_ver()
|
||||
|
||||
Returns the hardware version.
|
||||
|
||||
(C<ntWlanSwHardwareVer>)
|
||||
|
||||
=item $nap222x->nt_cc()
|
||||
|
||||
Returns the country code of the AP.
|
||||
|
||||
(C<ntWlanSwHardwareVer>)
|
||||
|
||||
=item $nap222x->tftp_action()
|
||||
|
||||
(C<ntWlanTransferStart>)
|
||||
|
||||
=item $nap222x->tftp_host()
|
||||
|
||||
(C<ntWlanFileServer>)
|
||||
|
||||
=item $nap222x->tftp_file()
|
||||
|
||||
(C<ntWlanDestFile>)
|
||||
|
||||
=item $nap222x->tftp_type()
|
||||
|
||||
(C<ntWlanFileType>)
|
||||
|
||||
=item $nap222x->tftp_result()
|
||||
|
||||
(C<ntWlanFileTransferStatus>)
|
||||
|
||||
=item $nap222x->tftp_xtype()
|
||||
|
||||
(C<ntWlanTransferType>)
|
||||
|
||||
=item $nap222x->tftp_src_file()
|
||||
|
||||
(C<ntWlanSrcFile>)
|
||||
|
||||
=item $nap222x->ftp_user()
|
||||
|
||||
(C<ntWlanUserName>)
|
||||
|
||||
=item $nap222x->ftp_pass()
|
||||
|
||||
(C<ntWlanPassword>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::SONMP
|
||||
|
||||
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $nap222x->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to physical ports.
|
||||
|
||||
=item $nap222x->i_duplex()
|
||||
|
||||
Returns reference to hash. Maps port operational duplexes to IIDs.
|
||||
|
||||
(C<ntWlanPortSpeedDpxStatus>)
|
||||
|
||||
=item $nap222x->i_duplex_admin()
|
||||
|
||||
Returns reference to hash. Maps port admin duplexes to IIDs.
|
||||
|
||||
(C<ntWlanPortCapabilities>)
|
||||
|
||||
=item $nap222x->i_name()
|
||||
|
||||
Returns a human name based upon port description.
|
||||
|
||||
=item $nap222x->bp_index()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the Bridge Table. This does not
|
||||
exist in the MIB and bridge port index is not the same as C<ifIndex> so it is
|
||||
created.
|
||||
|
||||
=item $nap222x->i_ssidlist()
|
||||
|
||||
Returns reference to hash. SSID's recognized by the radio interface.
|
||||
|
||||
=item $nap222x->i_ssidbcast()
|
||||
|
||||
Returns reference to hash. Indicates whether the SSID is broadcast.
|
||||
|
||||
=item $nap222x->i_80211channel()
|
||||
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface.
|
||||
|
||||
=item $nap222x->i_vlan()
|
||||
|
||||
The default Vlan ID of the radio interfaces.
|
||||
|
||||
(C<ntWlanApVlanDefaultVid>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
1287
lib/SNMP/Info/Layer2/NWSS2300.pm
Normal file
1287
lib/SNMP/Info/Layer2/NWSS2300.pm
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user