Compare commits
745 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
@@ -1,5 +1,5 @@
|
||||
All code from version 0.7 on
|
||||
Copyright (c) 2003,2004 Max Baker
|
||||
Copyright (c) 2003-2009 Max Baker and SNMP::Info Developers
|
||||
All rights reserved.
|
||||
|
||||
Original Code
|
||||
|
||||
460
ChangeLog
460
ChangeLog
@@ -1,5 +1,445 @@
|
||||
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
|
||||
ChangeLog $Id$
|
||||
|
||||
version 3.03 (2013-07-11)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Add missing =back to POD (A. Hartmaier)
|
||||
|
||||
version 3.02 (2013-07-08)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Properly pull os_ver from Netgear GS series switches.
|
||||
* Support Alcatel devices with layer3 features.
|
||||
* Identify Cisco Aironet 1140 APs as Layer2::Aironet
|
||||
* LAN switch support added to Layer3::Aruba class
|
||||
* [RT#86725] - Identify Cisco Catalyst 3850 as Layer3::C6500 (C. Causer)
|
||||
|
||||
version 3.01 (2013-04-13)
|
||||
|
||||
[API Changes]
|
||||
|
||||
* The methods c_ip(), c_if(), c_port(), c_id(), and c_platform() now
|
||||
represent common topology methods and will try to return a combined
|
||||
hash of data from all L2 topology protocols either running on the
|
||||
device or specified in the method call. The topology specific methods
|
||||
have been been prefixed with the protocol name in lowercase so that
|
||||
they can be called directly, sonmp_ip(), cdp_ip(), etc.
|
||||
* L2::Bay and L2::Foundry have been removed from the distribution. Both
|
||||
classes were depreciated and all functionality is available through
|
||||
L2::Baystack and L3::Foundry.
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* [3160037] - Support _raw suffix on methods to skip munging
|
||||
* [3185391] - Support for F5 devices in new class L3::F5
|
||||
* [3323814] - Arp support for Netscreen (David Baldwin)
|
||||
* [3323821] - Support for Netscreen w/ WLAN (eg SSG5) (David Baldwin)
|
||||
* [3599277] - Q-BRIDGE Support to collect VLAN in macsuck
|
||||
* [3033731] - Alcatel-Lucent OmniSwich AMAP Support in new AMAP class
|
||||
* [3598896] - Lantronix device support (J R Binks)
|
||||
* [3598337] - Lantronix SLC support
|
||||
* Support for Cisco ASA in L3::CiscoASA (Kraus/Hartmaier/Bernstein)
|
||||
* Support for Avaya VSP 9000 series in L3::Passport
|
||||
* Support for Avaya VSP 7000 series in L2::Baystack
|
||||
* Support Avaya (Trapeze) Wireless Controllers in new class L2::NWSS2300
|
||||
* Support Juniper (Trapeze) Wireless Controllers in new class L2::Trapeze
|
||||
* Support for newer Radware Alteon ADC switches 4408/4416/5412/5224 and
|
||||
older AWS 2000/3000 series in existing L3::AlteonAD
|
||||
* Support for H3C & HP A-series in new class L3::H3C
|
||||
* Support for Citrix Netscaler appliances in new class L7::Netscaler
|
||||
* New configuration option IgnoreNetSNMPConf will ignore Net-SNMP
|
||||
configuration files on object initialization
|
||||
* Two new utilities added in t/util to assist in developing device
|
||||
support; make_snmpdata.pl gathers SNMP data (snmpwalk) in a format that
|
||||
can be used with test_class_mocked.pl which mocks an SNMP agent to
|
||||
enable testing with no network access to a device.
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* UNIVERSAL::can() now works with dynamic methods
|
||||
* Dynamically generated methods are added to symbol table to avoid
|
||||
AUTOLOAD on subsequent calls
|
||||
* L2::Airespace now supports 802.11n client tx rates
|
||||
* L2::Airespace now reports AP Ethernet MAC as port MAC for radio ports
|
||||
* CiscoStats improvements to determine os versions, eg IOS XE ver on Sup7L-E
|
||||
* CiscoStats now reports 'ios-xe' if the device runs IOS XE (used to be 'ios')
|
||||
* Improved support of XOS based Extreme devices
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [3564920] - lldp_if gives wrong data for Enterasys
|
||||
|
||||
version 2.11 (2012-12-09)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Add fall-back for sysDescr on Force10
|
||||
|
||||
version 2.10 (2012-12-08)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Support for Force10 devices (W. Bulley)
|
||||
|
||||
version 2.09 (2012-11-28)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* New method i_ssidmac() to get BSSID's from AP's with initial support
|
||||
in L2::Aironet and Airespace classes
|
||||
* Support for Avaya Secure Routers in new class L3::Tasman
|
||||
* Add EDP and LLDP L2 Topology to L3::Extreme
|
||||
* [3185393] Support for Juniper SSL VPN in new class L7::Neoteris
|
||||
* [3381027] Support for Cisco Nexus in new class L3::Nexus
|
||||
* [1424336] Support for Extreme Discovery Protocol (EDP)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* [3017571] Add LLDP support for NetSNMP device class (begemot)
|
||||
* [3418918] Extreme devices now report OS as either extremeware or xos
|
||||
* [2809045] Strip preceding netscreen from model name in L3::Netscreen
|
||||
* [] Classify Linksys 2024 as L3::Dell (Rogier Krieger)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Fixed logic to return cached data for table methods when available and
|
||||
not a partial fetch
|
||||
* Fix typo in PoD for Bridge.pm and CiscoConfig.pm (William Bulley)
|
||||
* Fix/improve IPv6 neighbor cache handling, especially for Cisco Nexus
|
||||
|
||||
version 2.08 (2012-07-15)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Basic support for APC UPS devices
|
||||
* [2993691] Support for SonicWALL devices in new class L3::SonicWALL (phishphreek)
|
||||
* [2996795] Support for Kentrox devices in new class L2::Kentrox (phishphreek)
|
||||
* [] Basic support for Blue Coat proxy devices in new class L3::BlueCoatSG (jeroenvi)
|
||||
* [] Support Cisco 6500 / Sup2T in L3::C6500 class (jeroenvi)
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* Pseudo ENTITY-MIB methods added to L3::Juniper for hardware information
|
||||
* Add method to report current transmit power of the radio interface,
|
||||
dot11_cur_tx_pwr_mw(), in Airespace class
|
||||
* [3085411] Activate L3 properties for Netgear GSM7224v2 (phishphreek)
|
||||
* [3085413] SNMP OIDs for Netgear Serial and OS Ver (phishphreek)
|
||||
* [3286549] Dell LLDP Support (Nico Giefing)
|
||||
* [3469527] Netgear LLDP Support (Nic Bernstein)
|
||||
* [3472052] moduleSerialNumber support for Cisco Stack (Slava)
|
||||
* [3523320] Better VLAN support in Juniper class (Web Bulley)
|
||||
* [3532261] LLDP support in C6500 and related (Carlos Vicente)
|
||||
* [3538949] Updated switch models in L2::HP (jeroenvi)
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* Get OS version for Juniper devices not reporting in sysDescr
|
||||
* Correct base MAC reporting for Juniper devices
|
||||
* Correct reporting of SSID broadcast status in Airespace class
|
||||
* [3541442] Change L2::Catalyst port names to what is reported in CDP
|
||||
* [2132349] Add an additional check to get Foundry OS version
|
||||
* [2929883] [3413999] LLDP interface mapping issue
|
||||
* [3297786] LLDP TimeMark component defaults to zero (David Baldwin)
|
||||
* [2988163] Detect Juniper SSG firewalls as Layer3::Netscreen (R. Kerr)
|
||||
* [3317739] Fix for Baystack without POE on stack member 1 (David Baldwin)
|
||||
* [2037444] os_ver fails on some Extreme versions (Robert Kerr)
|
||||
* [2980789] Fix root_ip to try OSPF RouterID first (Brian De Wolf)
|
||||
* [2986858] Fix the patch from this ticket (Oliver Gorwits)
|
||||
* [3136084] Rename Allied Telesyn to Allied Telesis (Oliver Gorwits)
|
||||
* [3268104] CiscoVTP.pm i_vlan_membership() array bounds (Michael Sanderson)
|
||||
* [3497004] Clarify POD description of default values (a2w)
|
||||
* [3502533] Layer2/Baystack interface indexes > 513 (Robert Nyqvist)
|
||||
|
||||
version 2.06 (2011-09-28)
|
||||
|
||||
[NEW FEATURES]
|
||||
|
||||
* Support for PacketFront devices in new class L3::PacketFront
|
||||
* Support for Mikrotik devices in new class L3::Mikrotik
|
||||
* Support for HP VirtualConnect switches in new class L2::HPVC
|
||||
* Support for ADSL-LINE-MIB in new class AdslLine
|
||||
|
||||
[ENHANCEMENTS]
|
||||
|
||||
* POD clarification on i_speed() munging by Info.pm
|
||||
* Added i_stack_status method that can be used for finding the parent
|
||||
interface for e.g. ADSL interface speed determination
|
||||
|
||||
[BUG FIXES]
|
||||
|
||||
* [3344843] Fix returning serial() and os_ver() for web-managable HP
|
||||
switches, introduced by HP/HP4000 class split, reported by J R Binks
|
||||
* [2809033] Put L2-only Cisco blade switches in L3::C6500
|
||||
* [3408506] Fix uninitialized value in IPv6 when neighbor state is
|
||||
incomplete (Michael Borgelt)
|
||||
|
||||
version 2.05 (2011-06-23)
|
||||
+ Fix broken function call in L2::Aironet
|
||||
+ Promote L2::Aruba to L3::Aruba, as Aruba devices can be L3 entities and
|
||||
provide L3 information.
|
||||
|
||||
version 2.04 (2011-03-31)
|
||||
+ Support for older HP switch models moved to new L2::HP4000 class
|
||||
+ Fix VLAN changing in L2::HP and L2::HP4000 classes
|
||||
* Updated model lists in HP classes
|
||||
+ [2980782] Added L3::CiscoFWSM for Cisco Firewall Services Modules
|
||||
(Brian De Wolf)
|
||||
+ Added L3::Pf for FreeBSD PFSense Firewalls (max)
|
||||
* Added specific functions for neighbor mgmt addresses to CDP class
|
||||
* Implemented os_bin() method in CiscoStats
|
||||
+ [2980787] Fix for C1900 bp_index not containing interfaces.
|
||||
(Brian De Wolf)
|
||||
+ [2599795] Added vendor_i_type() method to HP and HP4000 clases
|
||||
+ [2688801] Minor modification for obscure Proxim/Orinoco device
|
||||
(jrbinks)
|
||||
+ [3051443] Add PoE measured power per port to Cisco, Extrme and HP
|
||||
classes (jeroenvi)
|
||||
* Minor tweaks to support devices without sysServices
|
||||
* Added Cisco CBS3xxx blade switches to L3::C6500
|
||||
* Fix for FWSMs not being detected properly. Special thanks goes to
|
||||
Jukka Pirhonen for pointing it out. (Brian De Wolf)
|
||||
+ Added support for IPv6 to physical address mapping
|
||||
* Added ME340x to L3::C3550
|
||||
* Added new ProCurve models to HP class
|
||||
* Fixed i_speed_raw not returning raw values (Alexander Hartmaier)
|
||||
|
||||
version 2.01 (06/12/09)
|
||||
+ Added CiscoStpExtensions Class (Carlos Vicente)
|
||||
+ Added Layer3::Arista (fenner)
|
||||
+ [2020353] Added L3::Altiga for Cisco (Altiga) VPN3000 Concentrators
|
||||
(Jeroen van Ingen)
|
||||
|
||||
* Fixed RFC1213-MIB vs IF-MIB collision in ifOperStatus
|
||||
* Updated test_class.pl for better debug info and relative path
|
||||
* Add cisco vendor detection by OID in Layer3.pm (Sam Stickland)
|
||||
* Fix CaSe of EtherLike-MIB in EtherLike.pm (Alexander Hartmaier)
|
||||
* Added Cisco FWSM to L3::Cisco
|
||||
* Added s222_rp to L3::C6500
|
||||
* Added CIGESM to L2::C2900
|
||||
* Added Airespace WLC to L2::Airespace
|
||||
* Updated POD and DeviceMatrix quite a bit
|
||||
* Added ENTITY-MIB to CiscoStats for better model handling above
|
||||
* Fix networkaddress handling in LLDP-MIB
|
||||
* Added CiscoConfig to L2::Aironet, L3::C3550 classes
|
||||
* Better SSID capabilities for L2::Aironet
|
||||
* Fix CDP vs LLDP in c_id() for HP Class
|
||||
* test_class.pl improvements
|
||||
|
||||
version 2.00 (08/01/08)
|
||||
+ Support for Alcatel-Lucent OmniSwitch via L3::AlcatelLucent
|
||||
+ Support for Alcatel-Lucent Service Router via L3::Timetra
|
||||
+ Support for Alcatel-Lucent OmniAccess via L2::Aruba
|
||||
|
||||
* Silence warnings in MAU due to uninitialized variables
|
||||
|
||||
version 1.09 (07/22/08) - Beta/developer release
|
||||
+ Added support for HP ProCurve Foundry OEM switches, such as the 9300
|
||||
series, in new class L3::HP9300 (contributions from Douglas McKeown and
|
||||
Ivan Auger)
|
||||
+ Added support for CISCO-PAE-MIB in CiscoPortSecurity (Kesy)
|
||||
+ Support for D-Link devices through L3::Dell
|
||||
+ Support for Linksys SRW2048 through L3::Dell
|
||||
+ Support for IBM BladeCenter 4-Port GB Ethernet Switch Module through
|
||||
L3::Dell (Alex Kramarov)
|
||||
+ Support for newer Nortel Alteon switches and Nortel BladeCenter Switch
|
||||
Modules in L3::AlteonAD
|
||||
+ Support for Cisco 1250 series through L2::Aironet
|
||||
+ Updates to fan, power supply, and serial number methods in
|
||||
L2::HP (Jeroen van Ingen)
|
||||
+ Use Cisco Client Association MIBs for Aironet client reporting
|
||||
via fw_mac
|
||||
+ Support VLANs on Aironet
|
||||
+ Get the proper radio MAC address from aironet in MBSS mode
|
||||
+ Additional wireless statistics from Aironet
|
||||
+ Add support to specify MIB to resolve leaf names conflicts in
|
||||
%GLOBALS and %FUNCS.
|
||||
+ Added munge_port_list() and modify_port_list() methods to assist in
|
||||
working with PortList objects.
|
||||
+ Added set_multi() method to enable a SNMP set command on several new
|
||||
values in one request. Required for complex set operations
|
||||
on some agents.
|
||||
+ Infrastructure for SNMPv3 support:
|
||||
+ Save the SecName passed into the constructor
|
||||
+ Create an update() function, which replaces the underlying
|
||||
SNMP session using different parameters.
|
||||
+ Return the SecName instead of community from snmp_comm() when using
|
||||
SNMPv3.
|
||||
|
||||
* L2::HP now isa Layer3 instead of Layer2 to support arpnip
|
||||
(Dudley Freeman)
|
||||
* Silence warnings from Cisco devices which don't return values for
|
||||
extended VLAN range (1024-4096)
|
||||
* Documentation coverage, spelling, and syntax updates
|
||||
* set_i_pvid(), set_i_vlan(), set_add_i_vlan_tagged(),
|
||||
set_remove_i_vlan_tagged() removed from Bridge and HP classes due to
|
||||
incompatibility across devices.
|
||||
|
||||
version 1.07 (11/26/07) - Beta/developer release
|
||||
|
||||
version 1.05 (11/25/07) - CVS only. No official release
|
||||
+ Added support for LLDP in new class LLDP (contributions from Bernhard
|
||||
Augenstein)
|
||||
+ Added device specific support for LLDP in L2::HP, L2::Baystack,
|
||||
L3::Enterasys and L3::Foundry
|
||||
+ Added support for Enterasys devices as new class L3::Enterasys
|
||||
+ Added support for Dell PowerConnect switches as new class L3::Dell
|
||||
+ Added basic support for generic routers running Microsoft Windows OS
|
||||
as new class L3::Microsoft (begemot)
|
||||
+ Added basic support for Sun routers as new class L3::Sun (begemot)
|
||||
+ Added basic support for Juniper NetScreen devices as new class
|
||||
L3::Netscreen (Kent Hamilton)
|
||||
+ Added support for Cyclades terminal servers as new class L1::Cyclades
|
||||
+ Added support for Cisco (Airespace) wireless controllers as new class
|
||||
L2::Airespace
|
||||
+ Added support for Nortel Ethernet Routing Switch 2500 series and
|
||||
Business Ethernet Switches (David Sieb<65>rger)
|
||||
+ Update of L3::Foundry to support all Foundry devices including newer
|
||||
switches. Depreciate L2::Foundry.
|
||||
+ Added generic device type detection using IANA assigned enterpise
|
||||
number extracted from sysObjectID
|
||||
+ Added ifDiscards and other missing entries from IF-MIB::ifEntry (Greg King)
|
||||
+ Added CGESM devices to L2::C2900 class (Alexander Hartmaier)
|
||||
+ Added support for dual speed 10/100 hubs and i_speed() in L1::Bayhub
|
||||
+ Added i_ssidlist(), i_ssidbcast(), and i_80211channel() methods to
|
||||
L2::Aruba, Airespace, and L2::NAP222x classes
|
||||
+ New class IEEE802dot11 class for generic standards based wireless AP
|
||||
support to include i_ssidlist()and i_80211channel() methods.
|
||||
+ L2::Orinoco inherits from new IEEE802dot11 for i_ssidlist()and
|
||||
i_80211channel() support.
|
||||
+ Added new VLAN methods i_pvid(), i_vlan_membership(), set_i_pvid(),
|
||||
set_i_vlan(), set_add_i_vlan_tagged(), set_remove_i_vlan_tagged() to
|
||||
Bridge, CiscoVTP, Extreme, HP, and RapidCity classes.
|
||||
+ Added set_i_speed_admin() method to RapidCity class,
|
||||
+ Added set_i_duplex_admin() method to RapidCity class,
|
||||
+ Added OSPF Neighbor Tables, SF Patch 1577918 to Layer 3 (Andrew Herrick)
|
||||
+ Added CiscoConfig class, SF Patch 1555001 (Justin Hunter)
|
||||
+ Enable load_ methods for %GLOBALS and MIB Leaf node names.
|
||||
+ Enable dynamic methods in AUTOLOAD with MIB Leaf node names for loaded
|
||||
MIBs without definition in %FUNCS or %GLOBALS. Single instance mib leafs
|
||||
will be treated as a GLOBAL and returna scalar while mib leafs which
|
||||
reside in a table will be treated as a FUNC and return a reference to a
|
||||
hash.
|
||||
+ Enable load_ methods for %GLOBALS and MIB Leaf node names.
|
||||
+ Add loop detect option and code for getnext table column walks.
|
||||
+ Add Layer3::NetSNMP for Net-SNMP-based hosts, part of
|
||||
SF patch 1557529 (Bradley Baetz).
|
||||
+ Add EIGRP Neighbor Tables to L3::Cisco SF Patch 1577927 (Andrew Herrick)
|
||||
+ Additions to CiscoQOS and CiscoStats (Alexander Hartmaier)
|
||||
+ Emulate ENTITY-MIB Physical Table methods for devices which don't
|
||||
have ENTITY-MIB support in Airespace, Bayhub, Baystack, BayRS,
|
||||
NortelStack, and Passport classes.
|
||||
+ Enable use of MIB Leaf node names in SNMP sets.
|
||||
+ Add POWER-ETHERNET-MIB and CISCO-POWER-ETHERNET-EXT-MIB support.
|
||||
|
||||
* Fix for bug where an SNMP error in any operation would cause subsequent
|
||||
table get operations to fail while using the same session, originally
|
||||
identified by Nicolai Petri.
|
||||
* Enable single instance partial table fetches (Alexander Hartmaier)
|
||||
* Enable partial table fetches in overriden table methods (Justin Hunter)
|
||||
* Allow partial table fetches with load_ methods.
|
||||
* Fixed vlan trunk port handling bug in L2:HP (Michael Robbert)
|
||||
* Correct bp_port() definition in Bridge class (Reported by Nicolai Petri)
|
||||
* Remove port security definitions from CiscoStack and move into new class
|
||||
CiscoPortSecurity. Needed to support devices such a L3::C4000 which
|
||||
support CISCO-PORT-SECURITY-MIB, but not CISCO-STACK-MIB.
|
||||
(Reported by Prakash RudraRaju)
|
||||
* Correct port numbering for Nortel 8110, 1100, 1150 in L3:Passport
|
||||
(Reported by David Pinkoski)
|
||||
* Documentation updates
|
||||
* Translate OIDs returned by Entity MIB e_type
|
||||
* Modify inheritance to use Cisco classes before generic classes
|
||||
* Create e_index method in ENTITY-MIB to facilitate emulation methods in
|
||||
other classes as entPhysicalIndex is not-accessible.
|
||||
* Only return MAC from munge_mac() if it actually is a MAC. Fix for
|
||||
netdisco where device would not be inserted in DB due to malformed MAC.
|
||||
* Enable SUPER class calls to find autoloaded methods (Bernhard Augenstein)
|
||||
* Clear attribute cache on sucessful SNMP set.
|
||||
* Improve accuracy of operational and administrative duplex reporting on
|
||||
devices using CiscoStack.
|
||||
* All i_type() methods now use standard IANAifType values.
|
||||
* Report bridge groups (VLANs) in L2::C1900.
|
||||
* Turn on bulkwalk for C6500. Users with buggy OS versions can turn
|
||||
it off when creating the object.
|
||||
* c_ip() now attempts to return only IPV4 addresses, use c_addr() for all
|
||||
address types.
|
||||
|
||||
version 1.04 (07/08/06)
|
||||
+ Added C1130 and C1240 to L2::Aironet (Ralf Gross)
|
||||
+ Added detection for Cisco 2960, 2940, 3400 w/ MetroBase
|
||||
+ Added generic L2::Cisco Class
|
||||
* Corrected detection for Cisco Supervisor Engine 2 and 32 (IOS).
|
||||
* Fixed warnings in CiscoStack
|
||||
* Updated ProCurve HP device detection for newer firmwares
|
||||
|
||||
version 1.03 (04/14/06) - Beta/developer release
|
||||
* Use ipNetToMedia table instead of atTable for ARP
|
||||
* Remove CiscoStack from Layer3::C4000
|
||||
* Fixed bug in MAU class when polling devices without MAU-MIB support
|
||||
|
||||
version 1.01 (04/08/06) - Beta/developer release
|
||||
+ Change version numbers to X.XX format. Odd releases are beta
|
||||
or developer only releases. Even are official releases.
|
||||
|
||||
version 1.0 (04/07/06) - CVS only. No official release
|
||||
+ Added Interface FlowControl status to CiscoStack (Nicolai Petri)
|
||||
+ Added CiscoImage class (Matthew Tuttle)
|
||||
+ Added C1200 and C350 IOS devices to L2::Aironet (Matthew Tuttle)
|
||||
+ Added support for Foundry IronWare and gave L3::Foundry CPR
|
||||
+ Added support for Foundry EdgeIrons as new class L2::Foundry
|
||||
+ Added BulkWalk and BulkRepeaters options to new()
|
||||
+ Added DebugSNMP option to new()
|
||||
+ Added CISCO-ENTITY-VENDORTYPE-OID-MIB,CISCO-PRODUCTS-MIB,CISCO-STACK-MIB
|
||||
to CiscoStats.pm for model()
|
||||
+ Check for bulkwalk_no() method
|
||||
+ Added Entity.pm to L3 and L2 classes per N. Petri's suggestion.
|
||||
+ Added support for Passport/Accelar 1100 and 1200 series in L3::Passport
|
||||
+ Added support for Passport/Accelar 8100 series in L3::Passport
|
||||
+ Added support for Passport 1600 series as new class, L3::N1600
|
||||
+ Added support for Extreme Alpine and Summit switches as new class
|
||||
L3:Extreme (Mike Hunter and Eric Miller)
|
||||
+ Added support for Aruba wireless switches (Eric Miller and Brian Chow)
|
||||
+ Added support for Nortel 2700 series (Airespace) wireless switches
|
||||
+ Added support for Synoptics hubs as new class L1:S3000
|
||||
+ Added Cisco QOS and RTT classes (Alexander Hartmaier)
|
||||
+ Added BGP Peer Table to L3 class (Carlos Vicente)
|
||||
+ Added ipforwarding status to Info base class (Carlos Vicente)
|
||||
+ Added STP port state to Bridge class (Alexander Barthel)
|
||||
+ Added L3 support (arpnip) to Baystack class for routing capable switches
|
||||
+ Added set_i_duplex_admin() and set_i_speed_admin() to C2900 class
|
||||
(Justin Hunter)
|
||||
+ Added set_i_duplex_admin() and set_i_speed_admin() to CiscoStack class
|
||||
+ CDP added to Aironet class
|
||||
+ Added Juniper class
|
||||
+ Added support for Catalyst 4000 and 4500, get admin. duplex
|
||||
and speed properly
|
||||
+ Added i_speed_high(), which i_speed() uses if needed to support
|
||||
interfaces >4Gbps
|
||||
|
||||
* More error checking in _load_attr() around bulkwalk code
|
||||
* Minor warning fix in L3::Aironet::os_ver()
|
||||
* Abstracted remaining Cisco stuff from L3 to L3::Cisco
|
||||
* Removed all Cisco stuff from L2
|
||||
* Expanded Entity.pm to cover the whole ENTITY-MIB and improved docs.
|
||||
* changed all refs to $DEBUG to $self->debug() for reentrant code
|
||||
* [ 1111284 ] Parameters not being set with AutoSpecify - fixed.
|
||||
* Turned off BULKWALK for C1900 and C6500 classes.
|
||||
* Added exception handling for V2 ENDOFMIBVIEW
|
||||
* Fix in SONMP when topology not enabled
|
||||
* Fix in L3::Passport root_ip()
|
||||
* Fix in L3::Passport bp_index() some devices not returning complete index.
|
||||
* Enable set_i_up_admin() in Bayhub
|
||||
* Recognize new Nortel model names in Baystack and Passport classes
|
||||
* Orinoco class should now recognize more models
|
||||
* Cleanup model recognition in Baystack class, recognize more models
|
||||
* Modify Catalyst class to use CISCO-STACK-MIB for brige port index mapping
|
||||
some devices having problems returning complete index from BRIDGE-MIB
|
||||
* Check root ip for reachability before assignment
|
||||
* HP class should recognize more models
|
||||
* Fix in HP class for models not returning full bp_index
|
||||
* [ 1436103 ] L2::Aironet devices weren't getting their model
|
||||
translated properly
|
||||
|
||||
verison 0.9 (11/15/04)
|
||||
+ ** Added full Nortel/Bay/BayStack support
|
||||
@@ -14,7 +454,8 @@ verison 0.9 (11/15/04)
|
||||
+ Added i_lastchange() per suggestion of Nicolai Petri
|
||||
+ Added BULKWALK patch by Bradley Baetz - This should
|
||||
greatly speed up requests on SNMPv2c devices.
|
||||
+ Added MibDirs option to new() to allow specifying non-system MIB directories.
|
||||
+ Added MibDirs option to new() to allow specifying non-system MIB
|
||||
directories.
|
||||
|
||||
* Added C3560s to the C3550 class. Thanks to Nicolai.
|
||||
* Fixed Bug where older Cisco's would append nulls to certain
|
||||
@@ -22,7 +463,7 @@ verison 0.9 (11/15/04)
|
||||
* Changed so a failed _global() call is cached so it won't retry
|
||||
an error over and over again if the same global is used.
|
||||
* Added check in _set() to see if data came from sub or FUNCS/GLOBALS
|
||||
Fails if came from sub.
|
||||
Fails if came from sub.
|
||||
|
||||
version 0.8 (03/21/04)
|
||||
+ Added Q-BRIDGE-MIB support to SNMP::Info::Bridge
|
||||
@@ -69,8 +510,10 @@ version 0.4 (04/29/03)
|
||||
* Added clear_cache() method
|
||||
* Added NO_SUCH support for snmpget (TABLE) calls to get SNMP MIB II data
|
||||
from SNMP Version 1 devices.
|
||||
* Methods load_all() and all() have changed their return value. Sorry but the API had to change.
|
||||
* New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch() to make it more OO happy.
|
||||
* Methods load_all() and all() have changed their return value. Sorry but
|
||||
the API had to change.
|
||||
* New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch()
|
||||
to make it more OO happy.
|
||||
* Globals are now cached
|
||||
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
|
||||
detected in device_type()
|
||||
@@ -83,8 +526,8 @@ version 0.4 (04/29/03)
|
||||
|
||||
version 0.3 (03/06/03)
|
||||
* Fixed HP model() warning
|
||||
* Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE in _global
|
||||
and _load_attr
|
||||
* Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE
|
||||
in _global and _load_attr
|
||||
* Added more debugging
|
||||
* Added info and munging for c_capabilities in SNMP::Info::CD
|
||||
Thanks to Martin Lorensen <martin /at- lorensen.dk>
|
||||
@@ -101,7 +544,8 @@ version 0.2 (02/19/03)
|
||||
* Added Spanning Tree Protocol (STP) methods to SNMP::Info::Bridge
|
||||
* Removed HP Specific MIBS in SNMP::Info::Layer2 and cleaned up model()
|
||||
* Added poke for Bay 450 Switches
|
||||
* Mapped HP Part Numbers to model numbers J4812A => 2512 in SNMP::Info::Layer2::HP
|
||||
* Mapped HP Part Numbers to model numbers J4812A => 2512 in
|
||||
SNMP::Info::Layer2::HP
|
||||
|
||||
version 0.1 (12/30/02)
|
||||
* Initial Release
|
||||
|
||||
29
DEVELOP
Normal file
29
DEVELOP
Normal file
@@ -0,0 +1,29 @@
|
||||
SNMP::Info Developer Guidelines
|
||||
|
||||
Coding Guidelines:
|
||||
- tab-width of 4, no tab characters
|
||||
- keep POD documentation up-to-date
|
||||
- always update ChangeLog before committing
|
||||
- always update DeviceMatrix.txt before committing
|
||||
- check-in required mibs to netdisco-mibs and release new package if needed
|
||||
|
||||
Release and Testing Instructions:
|
||||
- Please see misc/RELEASE in Netdisco
|
||||
( http://netdisco.cvs.sourceforge.net/viewvc/netdisco/misc/RELEASE?view=markup )
|
||||
and follow all testing and release guidelines
|
||||
|
||||
FAQ:
|
||||
- Do I have to update the version number and timestamp in modified files before committing?
|
||||
-> No. These are RCS tags that are automatically updated by CVS when you commit
|
||||
|
||||
- Should I add changes at the top of the ChangeLog?
|
||||
-> Yes. The changelog is created one commit at a time. If there isn't a
|
||||
section for the current version, then add one at the top and put your
|
||||
changes after. You can leave the date field for the release empty ().
|
||||
|
||||
- What should I change the $VERSION to?
|
||||
-> If you are the first person to get to a file after a release, update it
|
||||
to either release++ or "release++ dash cvs".
|
||||
Example: File is marked 2.01, change it to 2.02-cvs with your new changes.
|
||||
Example: File is marked 2.02-cvs, no change until packaging for release when the -cvs is removed.
|
||||
TODO: Is there still an odd/even scheme as introduced by Eric?
|
||||
1021
DeviceMatrix.txt
1021
DeviceMatrix.txt
File diff suppressed because it is too large
Load Diff
341
Info/AMAP.pm
Normal file
341
Info/AMAP.pm
Normal file
@@ -0,0 +1,341 @@
|
||||
# SNMP::Info::AMAP
|
||||
#
|
||||
# Copyright (c) 2013 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::AMAP;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::LLDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::LLDP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS
|
||||
= ( 'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType', );
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# EXTREME-EDP-MIB::extremeEdpTable
|
||||
'amap_rem_sysname' => 'aipAMAPRemHostname',
|
||||
);
|
||||
|
||||
%MUNGE = ( 'amap_rem_sysname' => \&SNMP::Info::munge_null, );
|
||||
|
||||
sub hasAMAP {
|
||||
my $amap = shift;
|
||||
|
||||
my $amap_ip = $amap->aipAMAPIpAddr() || {};
|
||||
|
||||
return 1 if ( scalar( keys %$amap_ip ) );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
# Break up the aipAMAPhostsTable INDEX into MAC and IP address.
|
||||
sub _hosts_table_index {
|
||||
my $idx = shift;
|
||||
my @oids = split( /\./, $idx );
|
||||
my $mac = join( '.', splice( @oids, 0, 6 ) );
|
||||
|
||||
return ( $mac, join( '.', @oids ) );
|
||||
}
|
||||
|
||||
# Break up the aipAMAPportConnectionTable INDEX and return MAC
|
||||
sub _conn_table_mac {
|
||||
my $idx = shift;
|
||||
my @oids = split( /\./, $idx );
|
||||
my $local_idx = shift @oids;
|
||||
my $mac = join( '.', splice( @oids, 0, 6 ) );
|
||||
|
||||
return ($mac);
|
||||
}
|
||||
|
||||
# Since we need to get IP Addresses from the aipAMAPhostsTable which has
|
||||
# a different index (MAC, IP) than the aipAMAPportConnectionTable which holds
|
||||
# the remote device details we create a combined index and skip any
|
||||
# IPs which have an address of 0.0.0.0. Would like to include only one
|
||||
# address since they should all originate from the same device, but we don't
|
||||
# know if they would all be reachable from the network management application.
|
||||
#
|
||||
# We don't inplement partials since this is private index function
|
||||
sub _amap_index {
|
||||
my $amap = shift;
|
||||
|
||||
my $amap_ip = $amap->aipAMAPIpAddr() || {};
|
||||
my $amap_rport = $amap->aipAMAPLocalPort() || {};
|
||||
|
||||
my %amap_index;
|
||||
foreach my $key ( keys %$amap_ip ) {
|
||||
my ( $mac, $ip ) = _hosts_table_index($key);
|
||||
|
||||
next if ( $ip eq '0.0.0.0' );
|
||||
next unless $ip;
|
||||
|
||||
foreach my $idx ( keys %$amap_rport ) {
|
||||
my $c_mac = _conn_table_mac($idx);
|
||||
|
||||
if ( $mac eq $c_mac ) {
|
||||
my $index = "$idx.$ip";
|
||||
$amap_index{$index} = $index;
|
||||
}
|
||||
}
|
||||
}
|
||||
return \%amap_index;
|
||||
}
|
||||
|
||||
# Break up _amap_index INDEX into local index, MAC, remote index, and
|
||||
# IP address
|
||||
sub _amap_index_parts {
|
||||
my $idx = shift;
|
||||
my @oids = split( /\./, $idx );
|
||||
my $local_idx = shift @oids;
|
||||
my $mac = join( '.', splice( @oids, 0, 6 ) );
|
||||
my $rem_idx = shift @oids;
|
||||
|
||||
return ( $local_idx, $mac, $rem_idx, join( '.', @oids ) );
|
||||
}
|
||||
|
||||
sub amap_if {
|
||||
my $amap = shift;
|
||||
|
||||
my $index = $amap->_amap_index() || {};
|
||||
my $if_idx = $amap->aipAMAPLocalIfindex() || {};
|
||||
|
||||
my %amap_if;
|
||||
foreach my $key ( keys %$index ) {
|
||||
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
|
||||
my $if_key = "$local_idx.$mac.$rem_idx";
|
||||
|
||||
if ( $key =~ /^$if_key/ ) {
|
||||
my $if = $if_idx->{$if_key};
|
||||
$amap_if{$key} = $if;
|
||||
}
|
||||
}
|
||||
|
||||
return \%amap_if;
|
||||
}
|
||||
|
||||
sub amap_ip {
|
||||
my $amap = shift;
|
||||
|
||||
my $index = $amap->_amap_index() || {};
|
||||
|
||||
my %amap_ip;
|
||||
foreach my $key ( keys %$index ) {
|
||||
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
|
||||
|
||||
# MIB says should only be IPv4
|
||||
next unless ( $ip =~ /\d+(\.\d+){3}/ );
|
||||
$amap_ip{$key} = $ip;
|
||||
}
|
||||
return \%amap_ip;
|
||||
}
|
||||
|
||||
sub amap_port {
|
||||
my $amap = shift;
|
||||
|
||||
my $index = $amap->_amap_index() || {};
|
||||
my $amap_rport = $amap->aipAMAPLocalPort() || {};
|
||||
my $amap_rslot = $amap->aipAMAPLocalSlot() || {};
|
||||
|
||||
my %amap_port;
|
||||
foreach my $key ( sort keys %$index ) {
|
||||
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
|
||||
my $p_key = "$local_idx.$mac.$rem_idx";
|
||||
|
||||
if ( $key =~ /^$p_key/ ) {
|
||||
my $port = $amap_rport->{$p_key};
|
||||
my $slot = $amap_rslot->{$p_key} || 0;
|
||||
next unless $port;
|
||||
$amap_port{$key} = defined $slot ? "$slot\/$port" : $port;
|
||||
}
|
||||
}
|
||||
return \%amap_port;
|
||||
}
|
||||
|
||||
sub amap_id {
|
||||
my $amap = shift;
|
||||
|
||||
my $index = $amap->_amap_index() || {};
|
||||
my $amap_name = $amap->amap_rem_sysname() || {};
|
||||
|
||||
my %amap_name;
|
||||
foreach my $key ( sort keys %$index ) {
|
||||
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
|
||||
my $id_key = "$local_idx.$mac.$rem_idx";
|
||||
|
||||
if ( $key =~ /^$id_key/ ) {
|
||||
my $name = $amap_name->{$id_key} || 0;
|
||||
next unless $name;
|
||||
$amap_name{$key} = $name;
|
||||
}
|
||||
}
|
||||
return \%amap_name;
|
||||
}
|
||||
|
||||
sub amap_platform {
|
||||
my $amap = shift;
|
||||
|
||||
my $index = $amap->_amap_index() || {};
|
||||
my $amap_topo_platform = $amap->aipAMAPRemDeviceType() || {};
|
||||
|
||||
my %amap_platform;
|
||||
foreach my $key ( keys %$index ) {
|
||||
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
|
||||
my $pf_key = "$local_idx.$mac.$rem_idx";
|
||||
|
||||
if ( $key =~ /^$pf_key/ ) {
|
||||
my $platform = $amap_topo_platform->{$pf_key};
|
||||
next unless $platform;
|
||||
$amap_platform{$key} = $platform;
|
||||
}
|
||||
}
|
||||
return \%amap_platform;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::AMAP - SNMP Interface to Alcatel Mapping Adjacency Protocol (AMAP)
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $amap = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $amap->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
$hasamap = $amap->hasAMAP() ? 'yes' : 'no';
|
||||
|
||||
# Print out a map of device ports with LLDP neighbors:
|
||||
my $interfaces = $amap->interfaces();
|
||||
my $amap_if = $amap->amap_if();
|
||||
my $amap_ip = $amap->amap_ip();
|
||||
my $amap_port = $amap->amap_port();
|
||||
|
||||
foreach my $amap_key (keys %$amap_ip){
|
||||
my $iid = $amap_if->{$amap_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $amap_ip->{$amap_key};
|
||||
my $neighbor_port = $amap_port->{$amap_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to Alcatel Mapping Adjacency Protocol (AMAP) information through
|
||||
SNMP.
|
||||
|
||||
AMAP is a Layer 2 protocol that allows a network device to advertise its
|
||||
identity and capabilities on the local network providing topology information.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBAL METHODS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $amap->hasAMAP()
|
||||
|
||||
Is AMAP is active in this device?
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $amap->amap_id()
|
||||
|
||||
Returns the string value used to identify the remote system.
|
||||
|
||||
=item $amap->amap_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
=item $amap->amap_ip()
|
||||
|
||||
Returns remote IPv4 addresses. Note: AMAP returns all IP addresses associated
|
||||
with the remote device. It would be preferable to include only one address
|
||||
since they should all originate from the same device, but amap_ip() can not
|
||||
determine if all addresses are reachable from the network management
|
||||
application therefore all addresses are returned and the calling application
|
||||
must determine which address to use and if they are in fact from the same
|
||||
device.
|
||||
|
||||
=item $amap->amap_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
=item $amap->amap_platform()
|
||||
|
||||
Returns remote platform ID
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
172
Info/AdslLine.pm
Normal file
172
Info/AdslLine.pm
Normal file
@@ -0,0 +1,172 @@
|
||||
# SNMP::Info::AdslLine
|
||||
#
|
||||
# Copyright (c) 2009 Alexander Hartmaier
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::AdslLine;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::AdslLine::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::AdslLine::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
# ADSL-LINE-MIB::adslAtucChanTable
|
||||
'adsl_atuc_interleave_delay' => 'adslAtucChanInterleaveDelay',
|
||||
'adsl_atuc_curr_tx_rate' => 'adslAtucChanCurrTxRate',
|
||||
'adsl_atuc_prev_tx_rate' => 'adslAtucChanPrevTxRate',
|
||||
'adsl_atuc_crc_block_len' => 'adslAtucChanCrcBlockLength',
|
||||
|
||||
# ADSL-LINE-MIB::adslAturChanTable
|
||||
'adsl_atur_interleave_delay' => 'adslAturChanInterleaveDelay',
|
||||
'adsl_atur_curr_tx_rate' => 'adslAturChanCurrTxRate',
|
||||
'adsl_atur_prev_tx_rate' => 'adslAturChanPrevTxRate',
|
||||
'adsl_atur_crc_block_len' => 'adslAturChanCrcBlockLength',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::AdslLine - SNMP Interface to the F<ADSL-LINE-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Alexander Hartmaier
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::AdslLine is a subclass of SNMP::Info that provides
|
||||
information about the adsl interfaces of a device.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ADSL-LINE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item none
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 ATUC channel table (C<adslAtucChanTable>)
|
||||
|
||||
This table provides one row for each ATUC channel.
|
||||
ADSL channel interfaces are those C<ifEntries> where C<ifType>
|
||||
is equal to adslInterleave(124) or adslFast(125).
|
||||
|
||||
=over
|
||||
|
||||
=item $info->adsl_atuc_interleave_delay()
|
||||
|
||||
(C<adslAtucChanInterleaveDelay>)
|
||||
|
||||
=item $info->adsl_atuc_curr_tx_rate()
|
||||
|
||||
(C<adslAtucChanCurrTxRate>)
|
||||
|
||||
=item $info->adsl_atuc_prev_tx_rate()
|
||||
|
||||
(C<adslAtucChanPrevTxRate>)
|
||||
|
||||
=item $info->adsl_atuc_crc_block_len()
|
||||
|
||||
(C<adslAtucChanCrcBlockLength>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 ATUR channel table (C<adslAturChanTable>)
|
||||
|
||||
This table provides one row for each ATUR channel.
|
||||
ADSL channel interfaces are those C<ifEntries> where C<ifType>
|
||||
is equal to adslInterleave(124) or adslFast(125).
|
||||
|
||||
=over
|
||||
|
||||
=item $info->adsl_atur_interleave_delay()
|
||||
|
||||
(C<adslAturChanInterleaveDelay>)
|
||||
|
||||
=item $info->adsl_atur_curr_tx_rate()
|
||||
|
||||
(C<adslAturChanCurrTxRate>)
|
||||
|
||||
=item $info->adsl_atur_prev_tx_rate()
|
||||
|
||||
(C<adslAturChanPrevTxRate>)
|
||||
|
||||
=item $info->adsl_atur_crc_block_len()
|
||||
|
||||
(C<adslAturChanCrcBlockLength>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
1822
Info/Airespace.pm
Normal file
1822
Info/Airespace.pm
Normal file
File diff suppressed because it is too large
Load Diff
819
Info/Bridge.pm
819
Info/Bridge.pm
File diff suppressed because it is too large
Load Diff
376
Info/CDP.pm
376
Info/CDP.pm
@@ -1,149 +1,163 @@
|
||||
# SNMP::Info::CDP
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
|
||||
# All rights reserved.
|
||||
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CDP;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use Carp;
|
||||
|
||||
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CDP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MIBS_V1 %MUNGE $INIT/;
|
||||
# Debug
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
# Five data structures required by SNMP::Info
|
||||
$INIT = 0;
|
||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
|
||||
%MIBS_V1 = ( 'CISCO-CDP-MIB-V1SMI' => 'cdpGlobalRun' );
|
||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
|
||||
|
||||
# Notice we dont inherit the default GLOBALS and FUNCS
|
||||
# only the default MUNGE.
|
||||
%GLOBALS = (
|
||||
'cdp_run' => 'cdpGlobalRun',
|
||||
'cdp_interval' => 'cdpGlobalMessageInterval',
|
||||
'cdp_holdtime' => 'cdpGlobalHoldTime',
|
||||
'cdp_id' => 'cdpGlobalDeviceId',
|
||||
);
|
||||
'cdp_run' => 'cdpGlobalRun',
|
||||
'cdp_interval' => 'cdpGlobalMessageInterval',
|
||||
'cdp_holdtime' => 'cdpGlobalHoldTime',
|
||||
'cdp_gid' => 'cdpGlobalDeviceId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
'c_index' => 'cdpCacheIfIndex',
|
||||
'c_proto' => 'cdpCacheAddressType',
|
||||
'c_ip' => 'cdpCacheAddress',
|
||||
'c_ver' => 'cdpCacheVersion',
|
||||
'c_id' => 'cdpCacheDeviceId',
|
||||
'c_port' => 'cdpCacheDevicePort',
|
||||
'c_platform' => 'cdpCachePlatform',
|
||||
'c_capabilities' => 'cdpCacheCapabilities',
|
||||
'c_domain' => 'cdpCacheVTPMgmtDomain',
|
||||
'c_vlan' => 'cdpCacheNativeVLAN',
|
||||
'c_duplex' => 'cdpCacheDuplex'
|
||||
);
|
||||
%FUNCS = (
|
||||
'cdp_index' => 'cdpCacheIfIndex',
|
||||
'cdp_proto' => 'cdpCacheAddressType',
|
||||
'cdp_addr' => 'cdpCacheAddress',
|
||||
'cdp_ver' => 'cdpCacheVersion',
|
||||
'cdp_id' => 'cdpCacheDeviceId',
|
||||
'cdp_port' => 'cdpCacheDevicePort',
|
||||
'cdp_platform' => 'cdpCachePlatform',
|
||||
'cdp_capabilities' => 'cdpCacheCapabilities',
|
||||
'cdp_domain' => 'cdpCacheVTPMgmtDomain',
|
||||
'cdp_vlan' => 'cdpCacheNativeVLAN',
|
||||
'cdp_duplex' => 'cdpCacheDuplex',
|
||||
'cdp_power' => 'cdpCachePowerConsumption',
|
||||
'cdp_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
|
||||
'cdp_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
|
||||
'cdp_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
|
||||
'cdp_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'c_capabilities' => \&munge_caps,
|
||||
'c_platform' => \&munge_null,
|
||||
'c_domain' => \&munge_null,
|
||||
'c_port' => \&munge_null,
|
||||
'c_id' => \&munge_null,
|
||||
'c_ver' => \&munge_null,
|
||||
'c_ip' => \&SNMP::Info::munge_ip
|
||||
);
|
||||
'cdp_capabilities' => \&SNMP::Info::munge_caps,
|
||||
'cdp_platform' => \&SNMP::Info::munge_null,
|
||||
'cdp_domain' => \&SNMP::Info::munge_null,
|
||||
'cdp_port' => \&SNMP::Info::munge_null,
|
||||
'cdp_id' => \&SNMP::Info::munge_null,
|
||||
'cdp_ver' => \&SNMP::Info::munge_null,
|
||||
'cdp_ip' => \&SNMP::Info::munge_ip,
|
||||
'cdp_power' => \&munge_power,
|
||||
|
||||
# munge_null() - removes nulls (\0)
|
||||
sub munge_null {
|
||||
my $text = shift || return;
|
||||
|
||||
$text =~ s/\0//g;
|
||||
return $text;
|
||||
);
|
||||
|
||||
sub munge_power {
|
||||
my $power = shift;
|
||||
my $decimal = substr( $power, -3 );
|
||||
$power =~ s/$decimal$/\.$decimal/;
|
||||
return $power;
|
||||
}
|
||||
|
||||
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();
|
||||
if ( defined $ver and $ver == 1 ) {
|
||||
my $cdp_ip = $cdp->cdp_ip();
|
||||
|
||||
# See if anything in cdp cache, if so we have cdp
|
||||
return 1 if (defined $c_ip and scalar(keys %$c_ip)) ;
|
||||
return undef;
|
||||
return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
return $cdp->cdp_run();
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
my $cdp = shift;
|
||||
sub cdp_if {
|
||||
my $cdp = shift;
|
||||
|
||||
# See if by some miracle Cisco implemented the cdpCacheIfIndex entry
|
||||
my $c_index = $cdp->c_index();
|
||||
return $c_index if defined $c_index;
|
||||
my $cdp_index = $cdp->cdp_index();
|
||||
return $cdp_index if defined $cdp_index;
|
||||
|
||||
# Nope, didn't think so. Now we fake it.
|
||||
my $c_ip = $cdp->c_ip();
|
||||
unless (defined $c_ip){
|
||||
$cdp->{error} = "SNMP::Info::CDP::c_if() - Device doesn't have c_ip() data. Can't fake c_index()";
|
||||
$DEBUG and carp($cdp->error(1));
|
||||
return undef;
|
||||
my $cdp_ip = $cdp->cdp_ip();
|
||||
unless ( defined $cdp_ip ) {
|
||||
$cdp->error_throw(
|
||||
"SNMP::Info::CDP:cdp_if() - Device doesn't have cdp_ip() data. Can't fake cdp_index()"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
my %c_if;
|
||||
foreach my $key (keys %$c_ip){
|
||||
next unless defined $key;
|
||||
my $iid = $key;
|
||||
# Truncate .1 from cdp cache entry
|
||||
$iid =~ s/\.\d+$//;
|
||||
$c_if{$key} = $iid;
|
||||
my %cdp_if;
|
||||
foreach my $key ( keys %$cdp_ip ) {
|
||||
next unless defined $key;
|
||||
my $iid = $key;
|
||||
|
||||
# Truncate .1 from cdp cache entry
|
||||
$iid =~ s/\.\d+$//;
|
||||
$cdp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%c_if;
|
||||
return \%cdp_if;
|
||||
}
|
||||
|
||||
sub cdp_ip {
|
||||
my $cdp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $cdp_addr = $cdp->cdp_addr($partial) || {};
|
||||
my $cdp_proto = $cdp->cdp_proto($partial) || {};
|
||||
|
||||
my %cdp_ip;
|
||||
foreach my $key ( keys %$cdp_addr ) {
|
||||
my $addr = $cdp_addr->{$key};
|
||||
my $proto = $cdp_proto->{$key};
|
||||
next unless defined $addr;
|
||||
next if ( defined $proto and $proto ne 'ip' );
|
||||
|
||||
my $ip = join( '.', unpack( 'C4', $addr ) );
|
||||
$cdp_ip{$key} = $ip;
|
||||
}
|
||||
return \%cdp_ip;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -151,11 +165,11 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CDP - Perl5 Interface to Cisco Discovery Protocol (CDP) using SNMP
|
||||
SNMP::Info::CDP - SNMP Interface to Cisco Discovery Protocol (CDP) using SNMP
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -174,15 +188,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
# Print out a map of device ports with CDP neighbors:
|
||||
my $interfaces = $cdp->interfaces();
|
||||
my $c_if = $cdp->c_if();
|
||||
my $c_ip = $cdp->c_ip();
|
||||
my $c_port = $cdp->c_port();
|
||||
my $cdp_if = $cdp->cdp_if();
|
||||
my $cdp_ip = $cdp->cdp_ip();
|
||||
my $cdp_port = $cdp->cdp_port();
|
||||
|
||||
foreach my $cdp_key (keys %$c_ip){
|
||||
my $iid = $c_if->{$cdp_key};
|
||||
foreach my $cdp_key (keys %$cdp_ip){
|
||||
my $iid = $cdp_if->{$cdp_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $c_ip->{$cdp_key};
|
||||
my $neighbor_port = $c_port->{$cdp_key};
|
||||
my $neighbor = $cdp_ip->{$cdp_key};
|
||||
my $neighbor_port = $cdp_port->{$cdp_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
@@ -191,10 +205,12 @@ Max Baker (C<max@warped.org>)
|
||||
SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to CDP information through SNMP.
|
||||
|
||||
CDP is a Layer 2 protocol that supplies topology information of devices that also speak CDP,
|
||||
mostly switches and routers. CDP is implemented in Cisco and some HP devices.
|
||||
CDP is a Layer 2 protocol that supplies topology information of devices that
|
||||
also speak CDP, mostly switches and routers. CDP is implemented in Cisco and
|
||||
some HP devices.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use directly.
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
Each device implements a subset of the global and cache entries.
|
||||
Check the return value to see if that data is held by the device.
|
||||
@@ -207,7 +223,7 @@ None.
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-CDP-MIB
|
||||
=item F<CISCO-CDP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -227,30 +243,31 @@ Accounts for SNMP version 1 devices which may have CDP but not cdp_run()
|
||||
|
||||
=item $cdp->cdp_run()
|
||||
|
||||
Is CDP enabled on this device? Note that a lot of Cisco devices that implement
|
||||
CDP don't implement this value. @#%$!
|
||||
Is CDP enabled on this device? Note that a lot of Cisco devices that
|
||||
implement CDP don't implement this value. @#%$!
|
||||
|
||||
(B<cdpGlobalRun>)
|
||||
(C<cdpGlobalRun>)
|
||||
|
||||
=item $cdp->cdp_interval()
|
||||
|
||||
Interval in seconds at which CDP messages are generated.
|
||||
|
||||
(B<cdpGlobalMessageInterval>)
|
||||
(C<cdpGlobalMessageInterval>)
|
||||
|
||||
=item $cdp->cdp_holdtime()
|
||||
|
||||
Time in seconds that CDP messages are kept.
|
||||
|
||||
(B<cdpGlobalHoldTime>)
|
||||
(C<cdpGlobalHoldTime>)
|
||||
|
||||
=item $cdp->cdp_id()
|
||||
=item $cdp->cdp_gid()
|
||||
|
||||
Returns CDP device ID.
|
||||
|
||||
This is the device id broadcast via CDP to other devices, and is what is retrieved from remote devices with $cdp->id().
|
||||
This is the device id broadcast via CDP to other devices, and is what is
|
||||
retrieved from remote devices with $cdp->id().
|
||||
|
||||
(B<cdpGlobalDeviceId>)
|
||||
(C<cdpGlobalDeviceId>)
|
||||
|
||||
=back
|
||||
|
||||
@@ -263,7 +280,7 @@ to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $cdp->c_capabilities()
|
||||
=item $cdp->cdp_capabilities()
|
||||
|
||||
Returns Device Functional Capabilities. Results are munged into an ascii
|
||||
binary string, 7 digits long, MSB. Each digit represents a bit from the
|
||||
@@ -277,115 +294,148 @@ From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#1884
|
||||
|
||||
=item (0x40) - Provides level 1 functionality.
|
||||
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on nonrouter ports.
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
|
||||
non router ports.
|
||||
|
||||
=item (0x10) - Sends and receives packets for at least one network layer protocol. If the device is routing the protocol, this bit should not be set.
|
||||
=item (0x10) - Sends and receives packets for at least one network layer
|
||||
protocol. If the device is routing the protocol, this bit should not be set.
|
||||
|
||||
=item (0x08) - Performs level 2 switching. The difference between this bit and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This device is assumed to be deployed in a physical loop-free topology.
|
||||
=item (0x08) - Performs level 2 switching. The difference between this bit
|
||||
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
|
||||
device is assumed to be deployed in a physical loop-free topology.
|
||||
|
||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge would set both this bit and bit 0x02.
|
||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
|
||||
would set both this bit and bit 0x02.
|
||||
|
||||
=item (0x02) - Performs level 2 transparent bridging.
|
||||
|
||||
=item (0x01) - Performs level 3 routing for at least one network layer protocol.
|
||||
=item (0x01) - Performs level 3 routing for at least one network layer
|
||||
protocol.
|
||||
|
||||
=back
|
||||
|
||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this information.
|
||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this
|
||||
information.
|
||||
|
||||
(B<cdpCacheCapabilities>)
|
||||
(C<cdpCacheCapabilities>)
|
||||
|
||||
=item $cdp->c_domain()
|
||||
=item $cdp->cdp_domain()
|
||||
|
||||
Returns remote VTP Management Domain as defined in CISCO-VTP-MIB::managementDomainName
|
||||
Returns remote VTP Management Domain as defined in
|
||||
C<CISCO-VTP-MIB::managementDomainName>
|
||||
|
||||
(B<cdpCacheVTPMgmtDomain>)
|
||||
(C<cdpCacheVTPMgmtDomain>)
|
||||
|
||||
=item $cdp->c_duplex()
|
||||
=item $cdp->cdp_duplex()
|
||||
|
||||
Returns the port duplex status from remote devices.
|
||||
|
||||
(B<cdpCacheDuplex>)
|
||||
(C<cdpCacheDuplex>)
|
||||
|
||||
=item $cdp->c_id()
|
||||
=item $cdp->cdp_id()
|
||||
|
||||
Returns remote device id string
|
||||
|
||||
(B<cdpCacheDeviceId>)
|
||||
(C<cdpCacheDeviceId>)
|
||||
|
||||
=item $cdp->c_if()
|
||||
=item $cdp->cdp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
Note that a lot devices don't implement $cdp->c_index(), So if it isn't around,
|
||||
we fake it.
|
||||
Note that a lot devices don't implement $cdp->cdp_index(), So if it isn't
|
||||
around, we fake it.
|
||||
|
||||
In order to map the cdp table entry back to the interfaces() entry, we truncate the last number
|
||||
off of it :
|
||||
In order to map the cdp table entry back to the interfaces() entry, we
|
||||
truncate the last number off of it :
|
||||
|
||||
# it exists, yay.
|
||||
my $c_index = $device->c_index();
|
||||
return $c_index if defined $c_index;
|
||||
my $cdp_index = $device->cdp_index();
|
||||
return $cdp_index if defined $cdp_index;
|
||||
|
||||
# if not, let's fake it
|
||||
my $c_ip = $device->c_ip();
|
||||
my $cdp_ip = $device->cdp_ip();
|
||||
|
||||
my %c_if
|
||||
foreach my $key (keys %$c_ip){
|
||||
my %cdp_if
|
||||
foreach my $key (keys %$cdp_ip){
|
||||
$iid = $key;
|
||||
## Truncate off .1 from cdp response
|
||||
$iid =~ s/\.\d+$//;
|
||||
$c_if{$key} = $iid;
|
||||
$cdp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%c_if;
|
||||
return \%cdp_if;
|
||||
|
||||
|
||||
=item $cdp->c_index()
|
||||
=item $cdp->cdp_index()
|
||||
|
||||
Returns the mapping to the SNMP2 Interface table for CDP Cache Entries.
|
||||
|
||||
Most devices don't implement this, so you probably want to use $cdp->c_if() instead.
|
||||
Most devices don't implement this, so you probably want to use $cdp->cdp_if()
|
||||
instead.
|
||||
|
||||
See c_if() entry.
|
||||
See cdp_if() entry.
|
||||
|
||||
(B<cdpCacheIfIndex>)
|
||||
(C<cdpCacheIfIndex>)
|
||||
|
||||
=item $cdp->c_ip()
|
||||
=item $cdp->cdp_ip()
|
||||
|
||||
Returns remote IP address
|
||||
If $cdp->cdp_proto() is supported, returns remote IPV4 address only. Otherwise
|
||||
it will return all addresses.
|
||||
|
||||
(B<cdpCacheAddress>)
|
||||
(C<cdpCacheAddress>)
|
||||
|
||||
=item $cdp->c_platform()
|
||||
=item $cdp->cdp_addr()
|
||||
|
||||
Returns remote address
|
||||
|
||||
(C<cdpCacheAddress>)
|
||||
|
||||
=item $cdp->cdp_platform()
|
||||
|
||||
Returns remote platform id
|
||||
|
||||
(B<cdpCachePlatform>)
|
||||
(C<cdpCachePlatform>)
|
||||
|
||||
=item $cdp->c_port()
|
||||
=item $cdp->cdp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
(B<cdpDevicePort>)
|
||||
(C<cdpDevicePort>)
|
||||
|
||||
=item $cdp->c_proto()
|
||||
=item $cdp->cdp_proto()
|
||||
|
||||
Returns remote address type received. Usually IP.
|
||||
|
||||
(B<cdpCacheAddressType>)
|
||||
(C<cdpCacheAddressType>)
|
||||
|
||||
=item $cdp->c_ver()
|
||||
=item $cdp->cdp_ver()
|
||||
|
||||
Returns remote hardware version
|
||||
|
||||
(B<cdpCacheVersion>)
|
||||
(C<cdpCacheVersion>)
|
||||
|
||||
=item $cdp->c_vlan()
|
||||
=item $cdp->cdp_vlan()
|
||||
|
||||
Returns the remote interface native VLAN.
|
||||
|
||||
(B<cdpCacheNativeVLAN>)
|
||||
(C<cdpCacheNativeVLAN>)
|
||||
|
||||
=item $cdp->cdp_power()
|
||||
|
||||
Returns the amount of power consumed by remote device in milliwatts munged
|
||||
for decimal placement.
|
||||
|
||||
(C<cdpCachePowerConsumption>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $cdp->munge_power()
|
||||
|
||||
Inserts a decimal at the proper location.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
473
Info/CiscoConfig.pm
Normal file
473
Info/CiscoConfig.pm
Normal file
@@ -0,0 +1,473 @@
|
||||
# SNMP::Info::CiscoConfig
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoConfig;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoConfig::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoConfig::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
|
||||
'CISCO-FLASH-MIB' => 'ciscoFlashCopyTable',
|
||||
'OLD-CISCO-SYS-MIB' => 'writeMem',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
# OLD-CISCO-SYS-MIB
|
||||
'old_write_mem' => 'writeMem',
|
||||
'old_write_net' => 'writeNet',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-COPY-CONFIG-MIB::ccCopyTable
|
||||
'config_protocol' => 'ccCopyProtocol',
|
||||
'config_source_type' => 'ccCopySourceFileType',
|
||||
'config_dest_type' => 'ccCopyDestFileType',
|
||||
'config_server_addr' => 'ccCopyServerAddress',
|
||||
'config_filename' => 'ccCopyFileName',
|
||||
'config_username' => 'ccCopyUserName',
|
||||
'config_password' => 'ccCopyUserPassword',
|
||||
'config_notify_complete' => 'ccCopyNotificationOnCompletion',
|
||||
'config_copy_state' => 'ccCopyState',
|
||||
'config_copy_start_time' => 'ccCopyTimeStarted',
|
||||
'config_copy_complete_time' => 'ccCopyTimeCompleted',
|
||||
'config_fail_cause' => 'ccCopyFailCause',
|
||||
'config_row_status' => 'ccCopyEntryRowStatus',
|
||||
|
||||
# CISCO-FLASH-MIB::ciscoFlashCopyTable
|
||||
'flash_copy_cmd' => 'ciscoFlashCopyCommand',
|
||||
'flash_copy_protocol' => 'ciscoFlashCopyProtocol',
|
||||
'flash_copy_address' => 'ciscoFlashCopyServerAddress',
|
||||
'flash_copy_source' => 'ciscoFlashCopySourceName',
|
||||
'flash_copy_dest' => 'ciscoFlashCopyDestinationName',
|
||||
'flash_copy_row_status' => 'ciscoFlashCopyEntryStatus',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub copy_run_tftp {
|
||||
my $ciscoconfig = shift;
|
||||
my ( $tftphost, $tftpfile ) = @_;
|
||||
|
||||
srand( time() ^ ( $$ + ( $$ << 15 ) ) );
|
||||
my $rand = int( rand( 1 << 24 ) );
|
||||
|
||||
print "Saving running config to $tftphost as $tftpfile\n"
|
||||
if $ciscoconfig->debug();
|
||||
|
||||
#Try new method first fall back to old method
|
||||
if ( $ciscoconfig->set_config_protocol( 1, $rand ) ) {
|
||||
print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
|
||||
|
||||
#Check each set, delete created row if any fail
|
||||
unless ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Setting source type failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Setting source type failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_dest_type( 1, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Setting destination type failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Setting dest type failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_server_addr( $tftphost, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Setting tftp server failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Setting tftp server failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_filename( $tftpfile, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Setting file name failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Setting file name failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_row_status( 1, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Initiating transfer failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Initiating transfer failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
my $status = 0;
|
||||
my $timer = 0;
|
||||
|
||||
# Hard-coded timeout of approximately 5 minutes, we can wrap this in an
|
||||
# option later if needed
|
||||
my $timeout = 300;
|
||||
while ( $status !~ /successful|failed/ ) {
|
||||
my $t = $ciscoconfig->config_copy_state($rand);
|
||||
$status = $t->{$rand};
|
||||
last if $status =~ /successful|failed/;
|
||||
$timer += 1;
|
||||
if ( $timer >= $timeout ) {
|
||||
$status = 'failed';
|
||||
last;
|
||||
}
|
||||
sleep 1;
|
||||
}
|
||||
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
print "Failed deleting row, iid $rand\n" if $ciscoconfig->debug();
|
||||
}
|
||||
|
||||
if ( $status eq 'successful' ) {
|
||||
print "Save operation successful\n" if $ciscoconfig->debug();
|
||||
return 1;
|
||||
}
|
||||
if ( $status eq 'failed' ) {
|
||||
$ciscoconfig->error_throw("Save operation failed");
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
print "Using old method\n" if $ciscoconfig->debug();
|
||||
unless ( $ciscoconfig->set_old_write_net( $tftpfile, $tftphost ) ) {
|
||||
$ciscoconfig->error_throw("Save operation failed");
|
||||
return;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub copy_run_start {
|
||||
my $ciscoconfig = shift;
|
||||
|
||||
srand( time() ^ ( $$ + ( $$ << 15 ) ) );
|
||||
my $rand = int( rand( 1 << 24 ) );
|
||||
|
||||
print "Saving running config to memory\n" if $ciscoconfig->debug();
|
||||
|
||||
if ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
|
||||
print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
|
||||
|
||||
#Check each set, delete created row if any fail
|
||||
unless ( $ciscoconfig->set_config_dest_type( 3, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Setting dest type failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Setting dest type failed and failed to delete row $rand"
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
unless ( $ciscoconfig->set_config_row_status( 1, $rand ) ) {
|
||||
$ciscoconfig->error_throw("Initiating save failed");
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
$ciscoconfig->error_throw(
|
||||
"Initiating save failed and failed to delete row $rand");
|
||||
}
|
||||
return;
|
||||
}
|
||||
my $status = 0;
|
||||
my $timer = 0;
|
||||
|
||||
# Hard-coded timeout of approximately 5 minutes, we can wrap this in an
|
||||
# option later if needed
|
||||
my $timeout = 300;
|
||||
while ( $status !~ /successful|failed/ ) {
|
||||
my $t = $ciscoconfig->config_copy_state($rand);
|
||||
$status = $t->{$rand};
|
||||
last if $status =~ /successful|failed/;
|
||||
$timer += 1;
|
||||
if ( $timer >= $timeout ) {
|
||||
$status = 'failed';
|
||||
last;
|
||||
}
|
||||
sleep 1;
|
||||
}
|
||||
|
||||
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
|
||||
print "Failed deleting row, iid $rand\n" if $ciscoconfig->debug();
|
||||
}
|
||||
|
||||
if ( $status eq 'successful' ) {
|
||||
print "Save operation successful\n" if $ciscoconfig->debug();
|
||||
return 1;
|
||||
}
|
||||
if ( $status eq 'failed' ) {
|
||||
$ciscoconfig->error_throw("Save operation failed");
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
print "Using old method\n" if $ciscoconfig->debug();
|
||||
unless ( $ciscoconfig->set_old_write_mem(1) ) {
|
||||
$ciscoconfig->error_throw("Save operation failed");
|
||||
return;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoConfig - SNMP Interface to Cisco Configuration Files
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Justin Hunter, Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $ciscoconfig = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ciscoconfig->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoConfig is a subclass of SNMP::Info that provides an interface
|
||||
to F<CISCO-CONFIG-COPY-MIB>, F<CISCO-FLASH-MIB>, and F<OLD-CISCO-SYS-MIB>.
|
||||
These MIBs facilitate the writing of configuration files.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one.
|
||||
Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
None.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-CONFIG-COPY-MIB>
|
||||
|
||||
=item F<CISCO-FLASH-MIB>
|
||||
|
||||
=item F<OLD-CISCO-SYS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscoconfig->old_write_mem()
|
||||
|
||||
(C<writeMem>)
|
||||
|
||||
=item $ciscoconfig->old_write_net()
|
||||
|
||||
(C<writeNet>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Config Copy Request Table (C<ccCopyTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscoconfig->config_protocol()
|
||||
|
||||
(C<ccCopyProtocol>)
|
||||
|
||||
=item $ciscoconfig->config_source_type()
|
||||
|
||||
(C<ccCopySourceFileType>)
|
||||
|
||||
=item $ciscoconfig->config_dest_type()
|
||||
|
||||
(C<ccCopyDestFileType>)
|
||||
|
||||
=item $ciscoconfig->config_server_addr()
|
||||
|
||||
(C<ccCopyServerAddress>)
|
||||
|
||||
=item $ciscoconfig->config_filename()
|
||||
|
||||
(C<ccCopyFileName>)
|
||||
|
||||
=item $ciscoconfig->config_username()
|
||||
|
||||
(C<ccCopyUserName>)
|
||||
|
||||
=item $ciscoconfig->config_password()
|
||||
|
||||
(C<ccCopyUserPassword>)
|
||||
|
||||
=item $ciscoconfig->config_notify_complete()
|
||||
|
||||
(C<ccCopyNotificationOnCompletion>)
|
||||
|
||||
=item $ciscoconfig->config_copy_state()
|
||||
|
||||
(C<ccCopyState>)
|
||||
|
||||
=item $ciscoconfig->config_copy_start_time()
|
||||
|
||||
(C<ccCopyTimeStarted>)
|
||||
|
||||
=item $ciscoconfig->config_copy_complete_time()
|
||||
|
||||
(C<ccCopyTimeCompleted>)
|
||||
|
||||
=item $ciscoconfig->config_fail_cause()
|
||||
|
||||
(C<ccCopyFailCause>)
|
||||
|
||||
=item $ciscoconfig->config_row_status()
|
||||
|
||||
(C<ccCopyEntryRowStatus>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Flash Copy Table (C<ciscoFlashCopyTable>)
|
||||
|
||||
Table of Flash copy operation entries.
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscoconfig->flash_copy_cmd()
|
||||
|
||||
(C<ciscoFlashCopyCommand>)
|
||||
|
||||
=item $ciscoconfig->flash_copy_protocol()
|
||||
|
||||
(C<ciscoFlashCopyProtocol>)
|
||||
|
||||
=item $ciscoconfig->flash_copy_address()
|
||||
|
||||
(C<ciscoFlashCopyServerAddress>)
|
||||
|
||||
=item $ciscoconfig->flash_copy_source()
|
||||
|
||||
(C<ciscoFlashCopySourceName>)
|
||||
|
||||
=item $ciscoconfig->flash_copy_dest()
|
||||
|
||||
(C<ciscoFlashCopyDestinationName>)
|
||||
|
||||
=item $ciscoconfig->flash_copy_row_status()
|
||||
|
||||
(C<ciscoFlashCopyEntryStatus>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscoconfig->copy_run_tftp (tftpserver, tftpfilename )
|
||||
|
||||
Store the running configuration on a TFTP server. Equivalent to the CLI
|
||||
commands "copy running-config tftp" or "write net".
|
||||
|
||||
This method attempts to use newer "copy running-config tftp" procedure first
|
||||
and then the older "write net" procedure if that fails. The newer procedure
|
||||
is supported Cisco devices with the F<CISCO-CONFIG-COPY-MIB> available, Cisco
|
||||
IOS software release 12.0 or on some devices as early as release 11.2P. The
|
||||
older procedure has been depreciated by Cisco and is utilized only to support
|
||||
devices running older code revisions.
|
||||
|
||||
Example:
|
||||
$ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig')
|
||||
or die "Couldn't save config. ",$ciscoconfig->error(1);
|
||||
|
||||
=item $ciscoconfig->copy_run_start()
|
||||
|
||||
Copy the running configuration to the start up configuration. Equivalent to
|
||||
the CLI command C<"copy running-config startup-config"> or C<"write mem">.
|
||||
|
||||
This method attempts to use newer C<"copy running-config startup-config">
|
||||
procedure first and then the older C<"write mem"> procedure if that fails.
|
||||
The newer procedure is supported Cisco devices with the
|
||||
F<CISCO-CONFIG-COPY-MIB> available, Cisco IOS software release 12.0 or on
|
||||
some devices as early as release 11.2P. The older procedure has been
|
||||
depreciated by Cisco and is utilized only to support devices running older
|
||||
code revisions.
|
||||
|
||||
Example:
|
||||
$ciscoconfig->copy_run_start()
|
||||
or die "Couldn't save config. ",$ciscoconfig->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
115
Info/CiscoImage.pm
Normal file
115
Info/CiscoImage.pm
Normal file
@@ -0,0 +1,115 @@
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2005 Matt Tuttle
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoImage;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoImage::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoImage::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( 'CISCO-IMAGE-MIB' => 'ciscoImageString', );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = ( 'ci_images' => 'ciscoImageString', );
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoImage - SNMP Interface to image strings for Cisco Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Matt Tuttle (C<mtuttle@americanhebrewacademy.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ci = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ci->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoImage is a subclass of SNMP::Info that provides access to
|
||||
image strings embedded in an image running on Cisco Devices.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-IMAGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
None.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=over
|
||||
|
||||
=item $ci->ci_images()
|
||||
|
||||
Returns the table of image strings.
|
||||
|
||||
C<ciscoImageString>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
388
Info/CiscoPortSecurity.pm
Normal file
388
Info/CiscoPortSecurity.pm
Normal file
@@ -0,0 +1,388 @@
|
||||
# SNMP::Info::CiscoPortSecurity
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoPortSecurity;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
|
||||
@SNMP::Info::CiscoPortSecurity::ISA = qw/Exporter/;
|
||||
@SNMP::Info::CiscoPortSecurity::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',
|
||||
'CISCO-PAE-MIB' => 'ciscoPaeMIB',
|
||||
'IEEE8021-PAE-MIB' => 'dot1xAuthLastEapolFrameSource',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
# CISCO-PORT-SECURITY-MIB
|
||||
'cps_clear' => 'cpsGlobalClearSecureMacAddresses',
|
||||
'cps_notify' => 'cpsGlobalSNMPNotifControl',
|
||||
'cps_rate' => 'cpsGlobalSNMPNotifRate',
|
||||
'cps_enable' => 'cpsGlobalPortSecurityEnable',
|
||||
'cps_mac_count' => 'cpsGlobalTotalSecureAddress',
|
||||
'cps_mac_max' => 'cpsGlobalMaxSecureAddress',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-PORT-SECURITY-MIB::cpsIfConfigTable
|
||||
'cps_i_limit_val' => 'cpsIfInvalidSrcRateLimitValue',
|
||||
'cps_i_limit' => 'cpsIfInvalidSrcRateLimitEnable',
|
||||
'cps_i_sticky' => 'cpsIfStickyEnable',
|
||||
'cps_i_clear_type' => 'cpsIfClearSecureMacAddresses',
|
||||
'cps_i_shutdown' => 'cpsIfShutdownTimeout',
|
||||
'cps_i_flood' => 'cpsIfUnicastFloodingEnable',
|
||||
'cps_i_clear' => 'cpsIfClearSecureAddresses',
|
||||
'cps_i_mac' => 'cpsIfSecureLastMacAddress',
|
||||
'cps_i_count' => 'cpsIfViolationCount',
|
||||
'cps_i_action' => 'cpsIfViolationAction',
|
||||
'cps_i_mac_static' => 'cpsIfStaticMacAddrAgingEnable',
|
||||
'cps_i_mac_type' => 'cpsIfSecureMacAddrAgingType',
|
||||
'cps_i_mac_age' => 'cpsIfSecureMacAddrAgingTime',
|
||||
'cps_i_mac_count' => 'cpsIfCurrentSecureMacAddrCount',
|
||||
'cps_i_mac_max' => 'cpsIfMaxSecureMacAddr',
|
||||
'cps_i_status' => 'cpsIfPortSecurityStatus',
|
||||
'cps_i_enable' => 'cpsIfPortSecurityEnable',
|
||||
|
||||
# CISCO-PORT-SECURITY-MIB::cpsIfVlanTable
|
||||
'cps_i_v_mac_count' => 'cpsIfVlanCurSecureMacAddrCount',
|
||||
'cps_i_v_mac_max' => 'cpsIfVlanMaxSecureMacAddr',
|
||||
'cps_i_v' => 'cpsIfVlanIndex',
|
||||
|
||||
# CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable
|
||||
'cps_i_v_mac_status' => 'cpsIfVlanSecureMacAddrRowStatus',
|
||||
'cps_i_v_mac_age' => 'cpsIfVlanSecureMacAddrRemainAge',
|
||||
'cps_i_v_mac_type' => 'cpsIfVlanSecureMacAddrType',
|
||||
'cps_i_v_vlan' => 'cpsIfVlanSecureVlanIndex',
|
||||
'cps_i_v_mac' => 'cpsIfVlanSecureMacAddress',
|
||||
|
||||
# CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable
|
||||
'cps_m_status' => 'cpsSecureMacAddrRowStatus',
|
||||
'cps_m_age' => 'cpsSecureMacAddrRemainingAge',
|
||||
'cps_m_type' => 'cpsSecureMacAddrType',
|
||||
'cps_m_mac' => 'cpsSecureMacAddress',
|
||||
|
||||
# IEEE8021-PAE-MIB::dot1xPaePortEntry
|
||||
'pae_i_capabilities' => 'dot1xPaePortCapabilities',
|
||||
'pae_i_last_eapol_frame_source' => 'dot1xAuthLastEapolFrameSource',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'cps_i_mac' => \&SNMP::Info::munge_mac,
|
||||
'cps_m_mac' => \&SNMP::Info::munge_mac,
|
||||
'cps_i_v_mac' => \&SNMP::Info::munge_mac,
|
||||
'pae_i_last_eapol_frame_source' => \&SNMP::Info::munge_mac,
|
||||
'pae_i_capabilities' => \&munge_pae_capabilities,
|
||||
);
|
||||
|
||||
%PAECAPABILITIES = (
|
||||
0 => 'dot1xPaePortAuthCapable',
|
||||
1 => 'dot1xPaePortSuppCapable'
|
||||
);
|
||||
|
||||
sub munge_pae_capabilities {
|
||||
my $bits = shift;
|
||||
|
||||
return unless defined $bits;
|
||||
my @vals
|
||||
= map( $PAECAPABILITIES{$_}, sprintf( "%x", unpack( 'b*', $bits ) ) );
|
||||
return join( ' ', @vals );
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoPortSecurity - SNMP Interface to data from
|
||||
F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $cps = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $cps->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoPortSecurity is a subclass of SNMP::Info that provides
|
||||
an interface to the F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB>. These
|
||||
MIBs are used across the Catalyst family under CatOS and IOS.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-PORT-SECURITY-MIB>
|
||||
|
||||
=item F<CISCO-PAE-MIB>
|
||||
|
||||
=item F<IEEE8021-PAE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 F<CISCO-PORT-SECURITY-MIB> globals
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cps_clear()
|
||||
|
||||
(C<cpsGlobalClearSecureMacAddresses>)
|
||||
|
||||
=item $cps->cps_notify()
|
||||
|
||||
(C<cpsGlobalSNMPNotifControl>)
|
||||
|
||||
=item $cps->cps_rate()
|
||||
|
||||
(C<cpsGlobalSNMPNotifRate>)
|
||||
|
||||
=item $cps->cps_enable()
|
||||
|
||||
(C<cpsGlobalPortSecurityEnable>)
|
||||
|
||||
=item $cps->cps_mac_count()
|
||||
|
||||
(C<cpsGlobalTotalSecureAddress>)
|
||||
|
||||
=item $cps->cps_mac_max()
|
||||
|
||||
(C<cpsGlobalMaxSecureAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 C<CISCO-PORT-SECURITY-MIB> - Interface Config Table
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cps_i_limit_val()
|
||||
|
||||
(C<cpsIfInvalidSrcRateLimitValue>)
|
||||
|
||||
=item $cps->cps_i_limit()
|
||||
|
||||
(C<cpsIfInvalidSrcRateLimitEnable>)
|
||||
|
||||
=item $cps->cps_i_sticky()
|
||||
|
||||
(C<cpsIfStickyEnable>)
|
||||
|
||||
=item $cps->cps_i_clear_type()
|
||||
|
||||
(C<cpsIfClearSecureMacAddresses>)
|
||||
|
||||
=item $cps->cps_i_shutdown()
|
||||
|
||||
(C<cpsIfShutdownTimeout>)
|
||||
|
||||
=item $cps->cps_i_flood()
|
||||
|
||||
(C<cpsIfUnicastFloodingEnable>)
|
||||
|
||||
=item $cps->cps_i_clear()
|
||||
|
||||
(C<cpsIfClearSecureAddresses>)
|
||||
|
||||
=item $cps->cps_i_mac()
|
||||
|
||||
(C<cpsIfSecureLastMacAddress>)
|
||||
|
||||
=item $cps->cps_i_count()
|
||||
|
||||
(C<cpsIfViolationCount>)
|
||||
|
||||
=item $cps->cps_i_action()
|
||||
|
||||
(C<cpsIfViolationAction>)
|
||||
|
||||
=item $cps->cps_i_mac_static()
|
||||
|
||||
(C<cpsIfStaticMacAddrAgingEnable>)
|
||||
|
||||
=item $cps->cps_i_mac_type()
|
||||
|
||||
(C<cpsIfSecureMacAddrAgingType>)
|
||||
|
||||
=item $cps->cps_i_mac_age()
|
||||
|
||||
(C<cpsIfSecureMacAddrAgingTime>)
|
||||
|
||||
=item $cps->cps_i_mac_count()
|
||||
|
||||
(C<cpsIfCurrentSecureMacAddrCount>)
|
||||
|
||||
=item $cps->cps_i_mac_max()
|
||||
|
||||
(C<cpsIfMaxSecureMacAddr>)
|
||||
|
||||
=item $cps->cps_i_status()
|
||||
|
||||
(C<cpsIfPortSecurityStatus>)
|
||||
|
||||
=item $cps->cps_i_enable()
|
||||
|
||||
(C<cpsIfPortSecurityEnable>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanTable>
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cps_i_v_mac_count()
|
||||
|
||||
(C<cpsIfVlanCurSecureMacAddrCount>)
|
||||
|
||||
=item $cps->cps_i_v_mac_max()
|
||||
|
||||
(C<cpsIfVlanMaxSecureMacAddr>)
|
||||
|
||||
=item $cps->cps_i_v()
|
||||
|
||||
(C<cpsIfVlanIndex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable>
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cps_i_v_mac_status()
|
||||
|
||||
(C<cpsIfVlanSecureMacAddrRowStatus>)
|
||||
|
||||
=item $cps->cps_i_v_mac_age()
|
||||
|
||||
(C<cpsIfVlanSecureMacAddrRemainAge>)
|
||||
|
||||
=item $cps->cps_i_v_mac_type()
|
||||
|
||||
(C<cpsIfVlanSecureMacAddrType>)
|
||||
|
||||
=item $cps->cps_i_v_vlan()
|
||||
|
||||
(C<cpsIfVlanSecureVlanIndex>)
|
||||
|
||||
=item $cps->cps_i_v_mac()
|
||||
|
||||
(C<cpsIfVlanSecureMacAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 C<CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable>
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->cps_m_status()
|
||||
|
||||
(C<cpsSecureMacAddrRowStatus>)
|
||||
|
||||
=item $cps->cps_m_age()
|
||||
|
||||
(C<cpsSecureMacAddrRemainingAge>)
|
||||
|
||||
=item $cps->cps_m_type()
|
||||
|
||||
(C<cpsSecureMacAddrType>)
|
||||
|
||||
=item $cps->cps_m_mac()
|
||||
|
||||
(C<cpsSecureMacAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 C<IEEE8021-PAE-MIB::dot1xPaePortEntry>
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->pae_i_capabilities()
|
||||
|
||||
C<dot1xPaePortCapabilities>
|
||||
|
||||
Indicates the PAE functionality that this Port supports
|
||||
and that may be managed through this MIB munged to return either
|
||||
C<'dot1xPaePortAuthCapable'> or C<'dot1xPaePortSuppCapable'>.
|
||||
|
||||
=item $cps->pae_i_last_eapol_frame_source()
|
||||
|
||||
C<dot1xAuthLastEapolFrameSource>
|
||||
|
||||
The source MAC address carried in the most recently received EAPOL frame.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $cps->munge_pae_capabilities()
|
||||
|
||||
Return either C<'dot1xPaePortAuthCapable'> or C<'dot1xPaePortSuppCapable'>
|
||||
based upon bit value.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
193
Info/CiscoPower.pm
Normal file
193
Info/CiscoPower.pm
Normal file
@@ -0,0 +1,193 @@
|
||||
# SNMP::Info::CiscoPower
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoPower;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoPower::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoPower::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
|
||||
'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
'cpeth_ent_phy' => 'cpeExtPsePortEntPhyIndex',
|
||||
'peth_port_power' => 'cpeExtPsePortPwrConsumption',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
# Cisco overcame the limitation of the module.port index of the
|
||||
# pethPsePortTable by adding another mapping table, which maps
|
||||
# a pethPsePortTable row to an entPhysicalTable index, which can
|
||||
# then be mapped to ifIndex.
|
||||
sub peth_port_ifindex {
|
||||
my $cpeth = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ent_phy = $cpeth->cpeth_ent_phy($partial);
|
||||
my $e_port = $cpeth->e_port();
|
||||
|
||||
my $peth_port_ifindex = {};
|
||||
foreach my $i ( keys %$ent_phy ) {
|
||||
if ( $e_port->{ $ent_phy->{$i} } ) {
|
||||
$peth_port_ifindex->{$i} = $e_port->{ $ent_phy->{$i} };
|
||||
}
|
||||
}
|
||||
return $peth_port_ifindex;
|
||||
}
|
||||
|
||||
# peth_port_neg_power uses the same index as the other peth_port_* tables.
|
||||
# However, cdpCachePowerConsumption uses <ifIndex>.<neighbor>.
|
||||
# Therefore, we have to invert peth_port_ifindex, to get to
|
||||
# the index that is expected and the rest of the code can re-invert it.
|
||||
sub peth_port_neg_power {
|
||||
my $cpeth = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Ignoring partial, since it's not easy to implement properly.
|
||||
my $index = $cpeth->peth_port_ifindex();
|
||||
my %inverse_index;
|
||||
foreach my $i ( keys %$index ) {
|
||||
$inverse_index{ $index->{$i} } = $i;
|
||||
}
|
||||
my $neg_power = $cpeth->cdpCachePowerConsumption();
|
||||
my $peth_port_neg_power = {};
|
||||
foreach my $i ( keys %$neg_power ) {
|
||||
my( $ifIndex, $nbrIndex ) = split( /\./, $i );
|
||||
if ( defined( $inverse_index{ $ifIndex } ) ) {
|
||||
$peth_port_neg_power->{ $inverse_index{ $ifIndex } } = $neg_power->{ $i };
|
||||
}
|
||||
}
|
||||
return $peth_port_neg_power;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoPower - SNMP Interface to data stored in
|
||||
F<CISCO-POWER-ETHERNET-EXT-MIB>.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $poe = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $poe->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The Info::PowerEthernet class needs a per-device helper function to
|
||||
properly map the C<pethPsePortTable> to C<ifIndex> values. This class
|
||||
provides that helper, using F<CISCO-POWER-ETHERNET-EXT-MIB>.
|
||||
It does not define any helpers for the extra values that this MIB
|
||||
contains.
|
||||
|
||||
Create or use a device subclass that inherit this class. Do not use directly.
|
||||
|
||||
For debugging purposes you can call this class directly as you would
|
||||
SNMP::Info
|
||||
|
||||
my $poe = new SNMP::Info::CiscoPower (...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
Note that it requires that the device inherits from Info::Entity.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-POWER-ETHERNET-EXT-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
none.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Power Port Table
|
||||
|
||||
=over
|
||||
|
||||
=item $poe->peth_port_ifindex()
|
||||
|
||||
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
|
||||
|
||||
=item $poe->peth_port_power()
|
||||
|
||||
Power supplied by PoE ports, in milliwatts
|
||||
(C<cpeExtPsePortPwrConsumption>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 CDP Port table
|
||||
|
||||
=over
|
||||
|
||||
=item $poe->peth_port_neg_power()
|
||||
|
||||
Power negotiated using CDP, in milliwatts
|
||||
(C<cdpCachePowerConsumption>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
218
Info/CiscoQOS.pm
Normal file
218
Info/CiscoQOS.pm
Normal file
@@ -0,0 +1,218 @@
|
||||
# SNMP::Info::CiscoQOS
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2005 Alexander Hartmaier
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoQOS;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoQOS::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoQOS::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-CLASS-BASED-QOS-MIB::cbQosServicePolicyTable
|
||||
'qos_i_index' => 'cbQosIfIndex',
|
||||
'qos_i_type' => 'cbQosIfType',
|
||||
'qos_pol_direction' => 'cbQosPolicyDirection',
|
||||
|
||||
# CISCO-CLASS-BASED-QOS-MIB::cbQosObjectsTable
|
||||
'qos_obj_conf_index' => 'cbQosConfigIndex',
|
||||
'qos_obj_type' => 'cbQosObjectsType',
|
||||
'qos_obj_parent' => 'cbQosParentObjectsIndex',
|
||||
|
||||
# CISCO-CLASS-BASED-QOS-MIB::cbQosCMCfgTable
|
||||
'qos_cm_name' => 'cbQosCMName',
|
||||
'qos_cm_desc' => 'cbQosCMDesc',
|
||||
'qos_cm_info' => 'cbQosCMInfo',
|
||||
|
||||
# CISCO-CLASS-BASED-QOS-MIB::cbQosCMStatsTable
|
||||
'qos_octet_pre' => 'cbQosCMPrePolicyByte',
|
||||
'qos_octet_post' => 'cbQosCMPostPolicyByte',
|
||||
|
||||
# CISCO-CLASS-BASED-QOS-MIB::cbQosQueueingCfgTable
|
||||
'qos_queueingcfg_bw' => 'cbQosQueueingCfgBandwidth',
|
||||
'qos_queueingcfg_bw_units' => 'cbQosQueueingCfgBandwidthUnits',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoQOS - SNMP Interface to Cisco's Quality of Service MIBs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Alexander Hartmaier
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $qos = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $qos->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoQOS is a subclass of SNMP::Info that provides
|
||||
information about a cisco device's QoS config.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-CLASS-BASED-QOS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
=item none
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Service Policy Table (C<cbQosServicePolicyTable>)
|
||||
|
||||
This table describes the interfaces/media types and the policy map that are
|
||||
attached to it.
|
||||
|
||||
=over
|
||||
|
||||
=item $qos->qos_i_index()
|
||||
|
||||
(C<cbQosIfIndex>)
|
||||
|
||||
=item $qos->qos_i_type()
|
||||
|
||||
(C<cbQosIfType>)
|
||||
|
||||
=item $qos->qos_pol_direction()
|
||||
|
||||
(C<cbQosPolicyDirection>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Class Map Objects Table (C<cbQosObjectsTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $qos->qos_obj_index()
|
||||
|
||||
(C<cbQosConfigIndex>)
|
||||
|
||||
=item $qos->qos_obj_type()
|
||||
|
||||
(C<cbQosObjectsType>)
|
||||
|
||||
=item $qos->qos_obj_parent()
|
||||
|
||||
(C<cbQosParentObjectsIndex>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Class Map Configuration Table (C<cbQosCMCfgTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $qos->qos_cm_name()
|
||||
|
||||
(C<cbQosCMName>)
|
||||
|
||||
=item $qos->qos_cm_desc()
|
||||
|
||||
(C<cbQosCMDesc>)
|
||||
|
||||
=item $qos->qos_cm_info()
|
||||
|
||||
(C<cbQosCMInfo>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Class Map Stats Table (C<cbQosCMStatsTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $qos->qos_octet_pre()
|
||||
|
||||
(C<cbQosCMPrePolicyByte>)
|
||||
|
||||
=item $qos->qos_octet_post()
|
||||
|
||||
(C<cbQosCMPostPolicyByte>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Queueing Configuration Table (C<cbQosQueueingCfgTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $qos->qos_queueingcfg_bw()
|
||||
|
||||
(C<cbQosQueueingCfgBandwidth>)
|
||||
|
||||
=item $qos->qos_queueingcfg_bw_units()
|
||||
|
||||
(C<cbQosQueueingCfgBandwidthUnits>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
138
Info/CiscoRTT.pm
Normal file
138
Info/CiscoRTT.pm
Normal file
@@ -0,0 +1,138 @@
|
||||
# SNMP::Info::CiscoRTT
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2005 Alexander Hartmaier
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoRTT;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::CiscoRTT::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoRTT::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-RTTMON-MIB
|
||||
'rtt_desc' => 'rttMonCtrlAdminOwner',
|
||||
'rtt_last' => 'rttMonLatestRttOperCompletionTime',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoRTT - SNMP Interface to Cisco's Round Trip Time MIBs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Alexander Hartmaier
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $rtt = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $rtt->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoRTT is a subclass of SNMP::Info that provides
|
||||
information about a cisco device's RTT values.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-RTTMON-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=over
|
||||
|
||||
None
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overall Control Group Table
|
||||
|
||||
This table is from C<CISCO-RTTMAN-MIB::rttMonCtrlAdminTable>
|
||||
|
||||
=over
|
||||
|
||||
=item $rtt->rtt_desc()
|
||||
|
||||
(C<rttMonCtrlAdminOwner>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overall Control Group Table
|
||||
|
||||
This table is from C<CISCO-RTTMON-MIB::rttMonCtrl>
|
||||
|
||||
=over
|
||||
|
||||
=item $rtt->rtt_last()
|
||||
|
||||
(C<rttMonLatestRttOperCompletionTime>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,110 +1,234 @@
|
||||
# SNMP::Info::CiscoStats
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
|
||||
# All rights reserved.
|
||||
# Changes since Version 0.7 Copyright (c) 2008-2009 Max Baker and SNMP::Info Developers
|
||||
# All rights reserved.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoStats;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStats::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
%MIBS = (
|
||||
'RFC1213-MIB' => 'sysDescr',
|
||||
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
|
||||
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed'
|
||||
);
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
'SNMPv2-MIB' => 'sysDescr',
|
||||
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
|
||||
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed',
|
||||
'OLD-CISCO-SYSTEM-MIB' => 'writeMem',
|
||||
'CISCO-PRODUCTS-MIB' => 'sysName',
|
||||
'ENTITY-MIB' => 'entPhysicalSoftwareRev',
|
||||
'CISCO-IMAGE-MIB' => 'ciscoImageString',
|
||||
|
||||
# some older catalysts live here
|
||||
'CISCO-STACK-MIB' => 'wsc1900sysID',
|
||||
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevChassis',
|
||||
'CISCO-FLASH-MIB' => 'ciscoFlashDeviceSize',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
'description' => 'sysDescr',
|
||||
# We will use the numeric OID's so that we don't require people
|
||||
# to install v1 MIBs, which can conflict.
|
||||
# OLD-CISCO-CPU-MIB:avgBusyPer
|
||||
'ios_cpu' => '1.3.6.1.4.1.9.2.1.56.0',
|
||||
'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
|
||||
'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
|
||||
# CISCO-PROCESS-MIB
|
||||
'cat_cpu' => 'cpmCPUTotal5sec.9',
|
||||
'cat_cpu_1min' => 'cpmCPUTotal1min.9',
|
||||
'cat_cpu_5min' => 'cpmCPUTotal5min.9',
|
||||
# CISCO-MEMORY-POOL-MIB
|
||||
'mem_free' => 'ciscoMemoryPoolFree.1',
|
||||
'mem_used' => 'ciscoMemoryPoolUsed.1',
|
||||
);
|
||||
'description' => 'sysDescr',
|
||||
'ent_physical_software_rev' => 'entPhysicalSoftwareRev.1',
|
||||
|
||||
%FUNCS = (
|
||||
);
|
||||
# We will use the numeric OID's so that we don't require people
|
||||
# to install v1 MIBs, which can conflict.
|
||||
# OLD-CISCO-CPU-MIB:avgBusyPer
|
||||
'ios_cpu' => '1.3.6.1.4.1.9.2.1.56.0',
|
||||
'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
|
||||
'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
|
||||
|
||||
%MUNGE = (
|
||||
);
|
||||
# CISCO-PROCESS-MIB
|
||||
'cat_cpu' => 'cpmCPUTotal5sec.9',
|
||||
'cat_cpu_1min' => 'cpmCPUTotal1min.9',
|
||||
'cat_cpu_5min' => 'cpmCPUTotal5min.9',
|
||||
|
||||
# OLD-CISCO-SYSTEM-MIB
|
||||
'write_mem' => 'writeMem',
|
||||
'rom_id' => 'romId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolTable
|
||||
'cisco_mem_free' => 'ciscoMemoryPoolFree',
|
||||
'cisco_mem_used' => 'ciscoMemoryPoolUsed',
|
||||
|
||||
# CISCO-FLASH-MIB::ciscoFlashDeviceTable
|
||||
'cisco_flash_size' => 'ciscoFlashDeviceSize',
|
||||
);
|
||||
|
||||
%MUNGE = ();
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $l2 = shift;
|
||||
my $descr = $l2->description();
|
||||
my $descr = $l2->description() || '';
|
||||
|
||||
# order here matters - there are Catalysts that run IOS and have catalyst in their description field.
|
||||
return 'ios' if ($descr =~ /IOS/);
|
||||
return 'catalyst' if ($descr =~ /catalyst/i);
|
||||
return undef;
|
||||
# order here matters - there are Catalysts that run IOS and have catalyst
|
||||
# in their description field, as well as Catalysts that run IOS-XE.
|
||||
return 'ios-xe' if ( $descr =~ /IOS-XE/ );
|
||||
return 'ios' if ( $descr =~ /IOS/ );
|
||||
return 'catalyst' if ( $descr =~ /catalyst/i );
|
||||
return 'css' if ( $descr =~ /Content Switch SW/ );
|
||||
return 'css-sca' if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
|
||||
return 'pix' if ( $descr =~ /Cisco PIX Security Appliance/ );
|
||||
return 'asa' if ( $descr =~ /Cisco Adaptive Security Appliance/ );
|
||||
return 'san-os' if ( $descr =~ /Cisco SAN-OS/ );
|
||||
|
||||
if ( $descr =~ /Application Control Engine Service Module/ ) {
|
||||
# Only the admin context implements the entity MIB
|
||||
return 'ace-admin' if defined $l2->ent_physical_software_rev();
|
||||
return 'ace-context';
|
||||
}
|
||||
|
||||
# Pre-version 3 FWSMs
|
||||
return 'fwsm' if ( $descr =~ /Cisco Secure FWSM Firewall/ );
|
||||
|
||||
# Version 3+ FWSMs (currently untested against version 4)
|
||||
if ( $descr =~ /Firewall Services Module/ ) {
|
||||
|
||||
my $model = $l2->model();
|
||||
|
||||
if ( defined $model && $model eq "WsSvcFwm1sc" ) {
|
||||
# Only the admin context implements the entity MIB
|
||||
return 'fwsm-admin' if defined $l2->ent_physical_software_rev();
|
||||
return 'fwsm-context';
|
||||
}
|
||||
|
||||
# Non context mode FWSM
|
||||
return 'fwsm';
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $l2 = shift;
|
||||
my $os = $l2->os();
|
||||
my $descr = $l2->description();
|
||||
|
||||
|
||||
# Older Catalysts
|
||||
if (defined $os and $os eq 'catalyst' and defined $descr and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/){
|
||||
if ( defined $os
|
||||
and $os eq 'catalyst'
|
||||
and defined $descr
|
||||
and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Newer Catalysts and IOS devices
|
||||
if (defined $descr and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ ){
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'css'
|
||||
and defined $descr
|
||||
and $descr =~ m/Content Switch SW Version ([0-9\.\(\)]+) with SNMPv1\/v2c Agent/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'css-sca'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco Systems Inc CSS-SCA-2FE-K9, ([0-9\.\(\)]+) Release / )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'pix'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco PIX Security Appliance Version ([0-9\.\(\)]+)/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os eq 'asa'
|
||||
and defined $descr
|
||||
and $descr =~ m/Cisco Adaptive Security Appliance Version ([0-9\.\(\)]+)/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os =~ /^ace/ )
|
||||
{
|
||||
return $l2->ent_physical_software_rev();
|
||||
}
|
||||
|
||||
if ( defined $os
|
||||
and $os =~ /^fwsm/
|
||||
and defined $descr
|
||||
and $descr =~ m/Version (\d+\.\d+(\(\d+\)){0,1})/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
|
||||
# Newer Catalysts and IOS devices
|
||||
if ( defined $descr
|
||||
and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ )
|
||||
{
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Generic fallback: try to determine running image from CISCO-IMAGE-MIB
|
||||
my $image_info = $l2->ciscoImageString() || {};
|
||||
foreach my $row (keys %$image_info) {
|
||||
my $info_string = $image_info->{$row};
|
||||
if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $self = shift;
|
||||
my $rom_id = $self->rom_id();
|
||||
if ($rom_id =~ m/Version ([^,]+),/) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub cpu {
|
||||
my $self = shift;
|
||||
my $self = shift;
|
||||
my $ios_cpu = $self->ios_cpu();
|
||||
return $ios_cpu if defined $ios_cpu;
|
||||
my $cat_cpu = $self->cat_cpu();
|
||||
@@ -112,7 +236,7 @@ sub cpu {
|
||||
}
|
||||
|
||||
sub cpu_1min {
|
||||
my $self = shift;
|
||||
my $self = shift;
|
||||
my $ios_cpu_1min = $self->ios_cpu_1min();
|
||||
return $ios_cpu_1min if defined $ios_cpu_1min;
|
||||
my $cat_cpu_1min = $self->cat_cpu_1min();
|
||||
@@ -120,19 +244,69 @@ sub cpu_1min {
|
||||
}
|
||||
|
||||
sub cpu_5min {
|
||||
my $self = shift;
|
||||
my $self = shift;
|
||||
my $ios_cpu_5min = $self->ios_cpu_5min();
|
||||
return $ios_cpu_5min if defined $ios_cpu_5min;
|
||||
my $cat_cpu_5min = $self->cat_cpu_5min();
|
||||
return $cat_cpu_5min;
|
||||
}
|
||||
|
||||
sub mem_free {
|
||||
my $self = shift;
|
||||
|
||||
my $mem_free;
|
||||
|
||||
my $cisco_mem_free = $self->cisco_mem_free() || {};
|
||||
|
||||
foreach my $mem_free_val ( values %$cisco_mem_free ) {
|
||||
$mem_free += $mem_free_val;
|
||||
}
|
||||
|
||||
return $mem_free;
|
||||
}
|
||||
|
||||
sub mem_used {
|
||||
my $self = shift;
|
||||
|
||||
my $mem_used;
|
||||
|
||||
my $cisco_mem_used = $self->cisco_mem_used() || {};
|
||||
|
||||
foreach my $mem_used_val ( values %$cisco_mem_used ) {
|
||||
$mem_used += $mem_used_val;
|
||||
}
|
||||
|
||||
return $mem_used;
|
||||
}
|
||||
|
||||
sub mem_total {
|
||||
my $self = shift;
|
||||
my $mem_free = $self->mem_free();
|
||||
my $mem_used = $self->mem_used();
|
||||
return undef unless defined $mem_free and defined $mem_used;
|
||||
return $mem_free + $mem_used;
|
||||
|
||||
my $mem_total;
|
||||
|
||||
my $cisco_mem_free = $self->cisco_mem_free() || {};
|
||||
my $cisco_mem_used = $self->cisco_mem_used() || {};
|
||||
|
||||
foreach my $mem_entry ( keys %$cisco_mem_free ) {
|
||||
my $mem_free = $cisco_mem_free->{$mem_entry} || 0;
|
||||
my $mem_used = $cisco_mem_used->{$mem_entry} || 0;
|
||||
$mem_total += ( $mem_free + $mem_used );
|
||||
}
|
||||
return $mem_total;
|
||||
}
|
||||
|
||||
sub flashmem_total {
|
||||
my $self = shift;
|
||||
|
||||
my $flashmem_total;
|
||||
|
||||
my $flash_sizes = $self->cisco_flash_size;
|
||||
|
||||
foreach my $flash_index ( keys %$flash_sizes ) {
|
||||
$flashmem_total += $flash_sizes->{$flash_index};
|
||||
}
|
||||
|
||||
return $flashmem_total;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -140,23 +314,24 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco Devices
|
||||
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco
|
||||
Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Eric Miller, Max Baker, Sam Stickland
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ciscostats = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ciscostats->class();
|
||||
@@ -164,24 +339,38 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory, os and
|
||||
version information about Cisco Devices.
|
||||
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory,
|
||||
os and version information about Cisco Devices.
|
||||
|
||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-PROCESS-MIB
|
||||
=item F<CISCO-PRODUCTS-MIB>
|
||||
|
||||
=item CISCO-MEMORY-POOL-MIB
|
||||
=item F<CISCO-PROCESS-MIB>
|
||||
|
||||
=item RFC1213-MIB
|
||||
=item F<CISCO-MEMORY-POOL-MIB>
|
||||
|
||||
=item F<SNMPv2-MIB>
|
||||
|
||||
=item F<OLD-CISCO-SYSTEM-MIB>
|
||||
|
||||
=item F<CISCO-STACK-MIB>
|
||||
|
||||
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
=item F<CISCO-FLASH-MIB>
|
||||
|
||||
=item F<ENTITY-MIB>
|
||||
|
||||
=item F<CISCO-IMAGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -207,67 +396,138 @@ Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
|
||||
|
||||
Returns mem_free() + mem_used()
|
||||
|
||||
=item $ciscostats->vendor()
|
||||
|
||||
'cisco'
|
||||
|
||||
=item $ciscostats->os()
|
||||
|
||||
Trys to parse if device is running IOS or CatOS from description()
|
||||
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
|
||||
from description()
|
||||
|
||||
Available values:
|
||||
|
||||
'ios' for Cisco IOS
|
||||
'ios-xe' for Cisco IOS XE
|
||||
'pix' for Cisco PIX
|
||||
'asa' for Cisco ASA
|
||||
'fwsm' for Single-mode FWSM
|
||||
'fwsm-admin' for Admin context of multi-context FWSM
|
||||
'fwsm-context' for Standard context of multi-context FWSM
|
||||
'ace-admin' for Admin context of ACE module
|
||||
'ace-context' for Standard context of ACE module (NB: No OS version
|
||||
detection is available, but will be the same as it's
|
||||
'ace admin')
|
||||
'css' for Cisco Content Switch
|
||||
'css-sca' for Cisco Content Switch Secure Content Acceleration
|
||||
'san-os' for Cisco SAN-OS
|
||||
|
||||
=item $ciscostats->os_ver()
|
||||
|
||||
Trys to parse device operating system version from description()
|
||||
Tries to parse device operating system version from description(), falls back
|
||||
to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed
|
||||
|
||||
=item $ciscostats->os_bin()
|
||||
|
||||
Tries to parse C<ROMMON> version from rom_id() string
|
||||
|
||||
=item $ciscostats->ios_cpu()
|
||||
|
||||
Current CPU usage in percents of device.
|
||||
Current CPU usage in percent.
|
||||
|
||||
B<1.3.6.1.4.1.9.2.1.56.0> =
|
||||
B<OLD-CISCO-CPU-MIB:avgBusyPer>
|
||||
C<1.3.6.1.4.1.9.2.1.56.0> =
|
||||
C<OLD-CISCO-CPU-MIB:avgBusyPer>
|
||||
|
||||
=item $ciscostats->ios_cpu_1min()
|
||||
|
||||
Average CPU Usage in percents of device over last minute.
|
||||
Average CPU Usage in percent over the last minute.
|
||||
|
||||
B<1.3.6.1.4.1.9.2.1.57.0>
|
||||
C<1.3.6.1.4.1.9.2.1.57.0>
|
||||
|
||||
=item $ciscostats->ios_cpu_5min()
|
||||
|
||||
Average CPU Usage in percents of device over last 5 minutes.
|
||||
Average CPU Usage in percent over the last 5 minutes.
|
||||
|
||||
B<1.3.6.1.4.1.9.2.1.58.0>
|
||||
C<1.3.6.1.4.1.9.2.1.58.0>
|
||||
|
||||
=item $ciscostats->cat_cpu()
|
||||
|
||||
Current CPU usage in percents of device.
|
||||
Current CPU usage in percent.
|
||||
|
||||
B<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
|
||||
C<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
|
||||
|
||||
=item $ciscostats->cat_cpu_1min()
|
||||
|
||||
Average CPU Usage in percents of device over last minute.
|
||||
Average CPU Usage in percent over the last minute.
|
||||
|
||||
B<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
|
||||
C<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
|
||||
|
||||
=item $ciscostats->cat_cpu_5min()
|
||||
|
||||
Average CPU Usage in percents of device over last 5 minutes.
|
||||
Average CPU Usage in percent over the last 5 minutes.
|
||||
|
||||
B<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
|
||||
C<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
|
||||
|
||||
=item $ciscostats->mem_free()
|
||||
|
||||
Main DRAM free in device. In bytes.
|
||||
Main DRAM free of the device in bytes.
|
||||
|
||||
B<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree.1>
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree>
|
||||
|
||||
=item $ciscostats->mem_used()
|
||||
|
||||
Main DRAM used in device. In bytes.
|
||||
Main DRAM used of the device in bytes.
|
||||
|
||||
B<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed.1>
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
|
||||
|
||||
=item $ciscostats->mem_total()
|
||||
|
||||
Main DRAM of the device in bytes.
|
||||
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree> +
|
||||
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
|
||||
|
||||
=item $ciscostats->flashmem_total()
|
||||
|
||||
Flash memory of the device in bytes.
|
||||
|
||||
C<CISCO-FLASH-MIB::ciscoFlashDeviceSize>
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
None.
|
||||
=head2 Cisco Memory Pool Table (C<ciscoMemoryPoolTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscostats->cisco_mem_free()
|
||||
|
||||
The number of bytes from the memory pool that are currently unused on the
|
||||
managed device.
|
||||
|
||||
(C<ciscoMemoryPoolFree>)
|
||||
|
||||
=item $ciscostats->cisco_mem_used()
|
||||
|
||||
The number of bytes from the memory pool that are currently in use by
|
||||
applications on the managed device.
|
||||
|
||||
(C<ciscoMemoryPoolUsed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Cisco Flash Device Table (C<ciscoFlashDeviceTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $ciscostats->cisco_flash_size()
|
||||
|
||||
Total size of the Flash device. For a removable device, the size will be
|
||||
zero if the device has been removed.
|
||||
|
||||
(C<ciscoFlashDeviceSize>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
355
Info/CiscoStpExtensions.pm
Normal file
355
Info/CiscoStpExtensions.pm
Normal file
@@ -0,0 +1,355 @@
|
||||
# SNMP::Info::CiscoStpExtensions
|
||||
#
|
||||
# Copyright (c)2009 Carlos Vicente
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the author nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::CiscoStpExtensions;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
@SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/;
|
||||
@SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//;
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
'CISCO-STP-EXTENSIONS-MIB' => 'stpxSpanningTreeType',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
'stpx_mst_config_digest' => 'stpxSMSTConfigDigest',
|
||||
'stpx_mst_region_name' => 'stpxMSTRegionName',
|
||||
'stpx_mst_region_rev' => 'stpxSMSTRegionRevision',
|
||||
'stpx_stp_type' => 'stpxSpanningTreeType',
|
||||
'stpx_bpduguard_enable' => 'stpxFastStartBpduGuardEnable',
|
||||
'stpx_bpdufilter_enable' => 'stpxFastStartBpduFilterEnable',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
'stpx_rootguard_enabled' => 'stpxRootGuardConfigEnabled',
|
||||
'stpx_loopguard_enabled' => 'stpxLoopGuardConfigEnabled',
|
||||
'stpx_port_bpduguard_mode' => 'stpxFastStartPortBpduGuardMode',
|
||||
'stpx_port_bpdufilter_mode' => 'stpxFastStartPortBpduFilterMode',
|
||||
'stpx_smst_root' => 'stpxSMSTInstanceCISTRegionalRoot',
|
||||
'stpx_smst_vlans_mapped_1k2k' => 'stpxSMSTInstanceVlansMapped1k2k',
|
||||
'stpx_smst_vlans_mapped_3k4k' => 'stpxSMSTInstanceVlansMapped3k4k',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
'stpx_mst_config_digest' => \&SNMP::Info::CiscoStpExtensions::oct2str,
|
||||
);
|
||||
|
||||
|
||||
# Report version of STP via standard method
|
||||
sub stp_ver {
|
||||
my $self = shift;
|
||||
my $stp_ver = $self->SUPER::stp_ver();
|
||||
if ( !defined($stp_ver) || $stp_ver eq 'unknown' ){
|
||||
if ( defined $self->stpx_stp_type() ){
|
||||
$stp_ver = $self->stpx_stp_type();
|
||||
}
|
||||
}
|
||||
return $stp_ver;
|
||||
}
|
||||
|
||||
sub mst_config_digest {
|
||||
my $self = shift;
|
||||
return $self->stpx_mst_config_digest;
|
||||
}
|
||||
|
||||
sub mst_region_name {
|
||||
my $self = shift;
|
||||
return $self->stpx_mst_region_name;
|
||||
}
|
||||
|
||||
sub mst_region_rev {
|
||||
my $self = shift;
|
||||
return $self->stpx_mst_region_rev;
|
||||
}
|
||||
|
||||
|
||||
sub mst_vlan2instance {
|
||||
my $self = shift;
|
||||
|
||||
# Get MST vlan-to-instance mapping
|
||||
my $m1k2k = $self->stpx_smst_vlans_mapped_1k2k;
|
||||
my $m3k4k = $self->stpx_smst_vlans_mapped_3k4k;
|
||||
|
||||
# Get list of VLANs
|
||||
my $vlan_membership = $self->i_vlan_membership;
|
||||
my @vlans;
|
||||
foreach my $iid ( keys %$vlan_membership ){
|
||||
if ( my $vm = $vlan_membership->{$iid} ){
|
||||
foreach my $vid ( @$vm ){
|
||||
push @vlans, $vid;
|
||||
}
|
||||
}
|
||||
}
|
||||
my %res;
|
||||
foreach my $vlan ( @vlans ){
|
||||
if ( $vlan < 2048 ){
|
||||
foreach my $inst ( keys %$m1k2k ){
|
||||
my $list = $m1k2k->{$inst};
|
||||
my $vlanlist = [split(//, unpack("B*", $list))];
|
||||
if ( @$vlanlist[$vlan] ){
|
||||
$res{$vlan} = $inst;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
foreach my $inst ( keys %$m3k4k ){
|
||||
my $list = $m3k4k->{$inst};
|
||||
my $vlanlist = [split(//, unpack("B*", $list))];
|
||||
if ( @$vlanlist[$vlan-2048] ){
|
||||
$res{$vlan} = $inst;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
sub i_rootguard_enabled {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rg_enabled = $self->stpx_rootguard_enabled();
|
||||
my $bp_index = $self->bp_index($partial);
|
||||
|
||||
my %res;
|
||||
foreach my $index ( keys %$rg_enabled ){
|
||||
my $enabled = $rg_enabled->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $enabled;
|
||||
$res{$iid} = $enabled;
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
sub i_loopguard_enabled {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $lg_enabled = $self->stpx_loopguard_enabled();
|
||||
my $bp_index = $self->bp_index($partial);
|
||||
|
||||
my %res;
|
||||
foreach my $index ( keys %$lg_enabled ){
|
||||
my $enabled = $lg_enabled->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $enabled;
|
||||
$res{$iid} = $enabled;
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
sub i_bpduguard_enabled {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $bpdugm_default = $self->stpx_bpduguard_enable();
|
||||
my $bp_index = $self->bp_index($partial);
|
||||
my $bpdugm = $self->stpx_port_bpduguard_mode();
|
||||
|
||||
my %res;
|
||||
foreach my $index ( keys %$bpdugm ){
|
||||
my $mode = $bpdugm->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $mode;
|
||||
if ( $mode eq 'default' ){
|
||||
$res{$iid} = $bpdugm_default;
|
||||
}else{
|
||||
$res{$iid} = $mode;
|
||||
}
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
sub i_bpdufilter_enabled {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $bpdufm_default = $self->stpx_bpdufilter_enable();
|
||||
my $bp_index = $self->bp_index($partial);
|
||||
my $bpdufm = $self->stpx_port_bpdufilter_mode();
|
||||
|
||||
my %res;
|
||||
foreach my $index ( keys %$bpdufm ){
|
||||
my $mode = $bpdufm->{$index};
|
||||
my $iid = $bp_index->{$index};
|
||||
next unless defined $iid;
|
||||
next unless defined $mode;
|
||||
if ( $mode eq 'default' ){
|
||||
$res{$iid} = $bpdufm_default;
|
||||
}else{
|
||||
$res{$iid} = $mode;
|
||||
}
|
||||
}
|
||||
return \%res;
|
||||
}
|
||||
|
||||
|
||||
sub oct2str {
|
||||
my ($v) = @_;
|
||||
return sprintf('%s', unpack('H*', $v));
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::CiscoStpExtensions - SNMP Interface to C<CISCO-STP-EXTENSIONS-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Carlos Vicente
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Create or use a subclass of SNMP::Info that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
For debugging you can call new() directly as you would in SNMP::Info
|
||||
|
||||
my $stpx = new SNMP::Info::CiscoStpExtensions(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
|
||||
=head1 GLOBAL METHODS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $stpx->stp_ver()
|
||||
|
||||
Returns the particular STP version running on this device.
|
||||
Meant to override SNMP::Info::Brigde::stp_ver()
|
||||
|
||||
Values: C<pvstPlus>, C<mistp>, C<mistpPvstPlus>, C<mst>, C<rapidPvstPlus>
|
||||
|
||||
(C<stpxSpanningTreeType>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $stpx->mst_config_digest()
|
||||
|
||||
Returns the Multiple Spanning Tree (MST) configuration digest
|
||||
|
||||
(C<stpxSMSTConfigDigest>)
|
||||
|
||||
=item $stpx->mst_region_name()
|
||||
|
||||
Returns the Multiple Spanning Tree (MST) region name
|
||||
|
||||
(C<stpxMSTRegionName>)
|
||||
|
||||
=item $stpx->mst_region_rev()
|
||||
|
||||
Returns the Multiple Spanning Tree (MST) region name
|
||||
|
||||
(C<stpxSMSTRegionRevision>)
|
||||
|
||||
=item $stpx->mst_vlan2instance()
|
||||
|
||||
Returns the mapping of vlan to MST instance in the form of a hash reference
|
||||
with key = VLAN id, value = STP instance
|
||||
|
||||
=item $stpx->i_rootguard_enabled()
|
||||
|
||||
Returns 1 or 0 depending on whether C<RootGuard> is enabled on a given port.
|
||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
|
||||
|
||||
(C<stpxRootGuardConfigEnabled>)
|
||||
|
||||
=item $stpx->i_loopguard_enabled()
|
||||
|
||||
Returns 1 or 0 depending on whether C<LoopGuard> is enabled on a given port.
|
||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
|
||||
|
||||
(C<stpxLoopGuardConfigEnabled>)
|
||||
|
||||
=item $stpx->i_bpduguard_enabled()
|
||||
|
||||
Returns 1 or 0 depending on whether C<BpduGuard> is enabled on a given port.
|
||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
|
||||
|
||||
(C<stpxFastStartPortBpduGuardMode>)
|
||||
|
||||
=item $stpx->i_bpdufilter_enabled()
|
||||
|
||||
Returns 1 or 0 depending on whether C<BpduFilter> is enabled on a given port.
|
||||
Format is a hash reference with key = C<ifIndex>, value = [1|0]
|
||||
|
||||
(C<stpxFastStartBpduFilterEnable>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item oct2str()
|
||||
|
||||
Unpacks H* into a string
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
787
Info/CiscoVTP.pm
787
Info/CiscoVTP.pm
File diff suppressed because it is too large
Load Diff
295
Info/EDP.pm
Normal file
295
Info/EDP.pm
Normal file
@@ -0,0 +1,295 @@
|
||||
# SNMP::Info::EDP
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
package SNMP::Info::EDP;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::LLDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::LLDP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
'EXTREME-EDP-MIB' => 'extremeEdpPortIfIndex',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
# EXTREME-EDP-MIB::extremeEdpTable
|
||||
'edp_rem_sysname' => 'extremeEdpNeighborName',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'edp_rem_sysname' => \&SNMP::Info::munge_null,
|
||||
);
|
||||
|
||||
sub hasEDP {
|
||||
my $edp = shift;
|
||||
|
||||
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
|
||||
|
||||
return 1 if ( scalar( keys %$edp_ip ) );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
# Since we need to get IP Addresses from the extremeEdpNeighborTable which has
|
||||
# a different index (adds VLAN name) than the extremeEdpTable which holds
|
||||
# the remote device details use the index from extremeEdpNeighborTable but skip
|
||||
# indexes which have an address of 0.0.0.0. Would like to include only one
|
||||
# address since they should all originate from the same device, but we don't
|
||||
# know if they would all be reachable from the network management application.
|
||||
#
|
||||
# We don't inplement partials since this is private index function
|
||||
sub _edp_index {
|
||||
my $edp = shift;
|
||||
|
||||
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
|
||||
|
||||
my %edp_index;
|
||||
foreach my $key ( keys %$edp_ip ) {
|
||||
my $ip = $edp_ip->{$key};
|
||||
next if ($ip eq '0.0.0.0');
|
||||
next unless $ip;
|
||||
$edp_index{$key} = $key;
|
||||
}
|
||||
return \%edp_index;
|
||||
}
|
||||
|
||||
sub edp_if {
|
||||
my $edp = shift;
|
||||
|
||||
my $index = $edp->_edp_index() || {};
|
||||
|
||||
my %edp_if;
|
||||
foreach my $key (keys %$index) {
|
||||
my $iid = $key;
|
||||
# ifIndex is first part of the iid
|
||||
$iid = $1 if $iid =~ /^(\d+)\./;
|
||||
$edp_if{$key} = $iid;
|
||||
}
|
||||
|
||||
return \%edp_if;
|
||||
}
|
||||
|
||||
sub edp_ip {
|
||||
my $edp = shift;
|
||||
|
||||
my $index = $edp->_edp_index() || {};
|
||||
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
|
||||
|
||||
my %edp_ip;
|
||||
foreach my $key ( keys %$index ) {
|
||||
my $ip = $edp_ip->{$key};
|
||||
# MIB says should only be IPv4
|
||||
next unless ($ip =~ /\d+(\.\d+){3}/);
|
||||
$edp_ip{$key} = $ip;
|
||||
}
|
||||
return \%edp_ip;
|
||||
}
|
||||
|
||||
sub edp_port {
|
||||
my $edp = shift;
|
||||
|
||||
my $index = $edp->_edp_index() || {};
|
||||
my $edp_rport = $edp->extremeEdpNeighborPort() || {};
|
||||
my $edp_rslot = $edp->extremeEdpNeighborSlot() || {};
|
||||
|
||||
my %edp_port;
|
||||
foreach my $key ( sort keys %$edp_rport ) {
|
||||
my $port = $edp_rport->{$key};
|
||||
my $slot = $edp_rslot->{$key} || 0;
|
||||
next unless $port;
|
||||
my $slotport = defined $slot ? "$slot\/$port" : $port;
|
||||
|
||||
foreach my $iid ( sort keys %$index ) {
|
||||
$edp_port{$iid} = $slotport if ($iid =~ /^$key/);
|
||||
}
|
||||
}
|
||||
return \%edp_port;
|
||||
}
|
||||
|
||||
sub edp_id {
|
||||
my $edp = shift;
|
||||
|
||||
my $index = $edp->_edp_index() || {};
|
||||
my $edp_name = $edp->edp_rem_sysname() || {};
|
||||
|
||||
my %edp_name;
|
||||
foreach my $key ( sort keys %$edp_name ) {
|
||||
my $name = $edp_name->{$key} || 0;
|
||||
next unless $name;
|
||||
|
||||
foreach my $iid ( sort keys %$index ) {
|
||||
$edp_name{$iid} = $name if ($iid =~ /^$key/);
|
||||
}
|
||||
}
|
||||
return \%edp_name;
|
||||
}
|
||||
|
||||
sub edp_ver {
|
||||
my $edp = shift;
|
||||
|
||||
my $index = $edp->_edp_index() || {};
|
||||
my $edp_ver = $edp->extremeEdpNeighborSoftwareVersion() || {};
|
||||
|
||||
my %edp_ver;
|
||||
foreach my $key ( sort keys %$edp_ver ) {
|
||||
my $ver = $edp_ver->{$key} || 0;
|
||||
next unless $ver;
|
||||
|
||||
foreach my $iid ( sort keys %$index ) {
|
||||
$edp_ver{$iid} = $ver if ($iid =~ /^$key/);
|
||||
}
|
||||
}
|
||||
return \%edp_ver;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::EDP - SNMP Interface to the Extreme Discovery Protocol (EDP)
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $edp = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $edp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
$haslldp = $edp->hasLLDP() ? 'yes' : 'no';
|
||||
|
||||
# Print out a map of device ports with LLDP neighbors:
|
||||
my $interfaces = $edp->interfaces();
|
||||
my $edp_if = $edp->edp_if();
|
||||
my $edp_ip = $edp->edp_ip();
|
||||
my $edp_port = $edp->edp_port();
|
||||
|
||||
foreach my $edp_key (keys %$edp_ip){
|
||||
my $iid = $edp_if->{$edp_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $edp_ip->{$edp_key};
|
||||
my $neighbor_port = $edp_port->{$edp_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to EDP information through SNMP.
|
||||
|
||||
EDP is a Layer 2 protocol that allows a network device to advertise its
|
||||
identity and capabilities on the local network providing topology information.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<EXTREME-EDP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBAL METHODS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $edp->hasEDP()
|
||||
|
||||
Is EDP is active in this device?
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $edp->edp_id()
|
||||
|
||||
Returns the string value used to identify the chassis component associated
|
||||
with the remote system.
|
||||
|
||||
(C<extremeEdpNeighborName>)
|
||||
|
||||
=item $edp->edp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
=item $edp->edp_ip()
|
||||
|
||||
Returns remote IPv4 address.
|
||||
|
||||
=item $edp->edp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
=item $edp->edp_ver()
|
||||
|
||||
Returns the operating system version of the remote system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<extremeEdpNeighborSoftwareVersion>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
192
Info/Entity.pm
192
Info/Entity.pm
@@ -1,77 +1,102 @@
|
||||
# SNMP::Info::Entity
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Entity;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Entity::EXPORT_OK = qw//;
|
||||
|
||||
$INIT = 0;
|
||||
%MIBS = ('ENTITY-MIB' => 'entPhysicalSerialNum');
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
%GLOBALS = (
|
||||
);
|
||||
$VERSION = '3.03';
|
||||
|
||||
%FUNCS = (
|
||||
'e_class' => 'entPhysicalClass',
|
||||
'e_descr' => 'entPhysicalDescr',
|
||||
'e_fwver' => 'entPhysicalFirmwareRev',
|
||||
'e_hwver' => 'entPhysicalHardwareRev',
|
||||
'e_map' => 'entAliasMappingIdentifier',
|
||||
'e_model' => 'entPhysicalModelName',
|
||||
'e_name' => 'entPhysicalName',
|
||||
'e_parent' => 'entPhysicalContainedIn',
|
||||
'e_serial' => 'entPhysicalSerialNum',
|
||||
'e_swver' => 'entPhysicalSoftwareRev',
|
||||
'e_type' => 'entPhysicalVendorType',
|
||||
);
|
||||
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
|
||||
|
||||
%MUNGE = (
|
||||
);
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
'e_alias' => 'entPhysicalAlias',
|
||||
'e_class' => 'entPhysicalClass',
|
||||
'e_descr' => 'entPhysicalDescr',
|
||||
'e_fwver' => 'entPhysicalFirmwareRev',
|
||||
'e_fru' => 'entPhysicalIsFRU',
|
||||
'e_hwver' => 'entPhysicalHardwareRev',
|
||||
'e_id' => 'entPhysicalAssetID',
|
||||
'e_map' => 'entAliasMappingIdentifier',
|
||||
'e_model' => 'entPhysicalModelName',
|
||||
'e_name' => 'entPhysicalName',
|
||||
'e_parent' => 'entPhysicalContainedIn',
|
||||
'e_pos' => 'entPhysicalParentRelPos',
|
||||
'e_serial' => 'entPhysicalSerialNum',
|
||||
'e_swver' => 'entPhysicalSoftwareRev',
|
||||
'e_type' => 'entPhysicalVendorType',
|
||||
'e_vendor' => 'entPhysicalMfgName',
|
||||
);
|
||||
|
||||
%MUNGE = ( 'e_type' => \&SNMP::Info::munge_e_type, );
|
||||
|
||||
# entPhysicalIndex is not-accessible. Create to facilitate emulation methods
|
||||
# in other classes
|
||||
|
||||
sub e_index {
|
||||
my $entity = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Force use of MIB leaf to avoid inheritance issues in psuedo classes
|
||||
my $e_descr = $entity->entPhysicalDescr($partial);
|
||||
|
||||
return unless ($e_descr);
|
||||
|
||||
my %e_index;
|
||||
|
||||
foreach my $iid ( keys %$e_descr ) {
|
||||
$e_index{$iid} = $iid;
|
||||
}
|
||||
return \%e_index;
|
||||
}
|
||||
|
||||
sub e_port {
|
||||
my $entity = shift;
|
||||
my $e_map = $entity->e_map();
|
||||
my $entity = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $e_map = $entity->e_map($partial);
|
||||
|
||||
my %e_port;
|
||||
|
||||
foreach my $e_id (keys %$e_map) {
|
||||
foreach my $e_id ( keys %$e_map ) {
|
||||
my $id = $e_id;
|
||||
$id =~ s/\.0$//;
|
||||
|
||||
@@ -83,15 +108,18 @@ sub e_port {
|
||||
|
||||
return \%e_port;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Entity - Perl5 Interface to SNMP data stored in ENTITY-MIB.
|
||||
SNMP::Info::Entity - SNMP Interface to data stored in F<ENTITY-MIB>. RFC 2737
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -99,7 +127,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $entity = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -111,11 +138,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
ENTITY-MIB is used by some Layer 2 devices like HP Switches and Aironet Access Points
|
||||
F<ENTITY-MIB> is used by Layer 2 devices from Brocade, Cisco, HP,
|
||||
and more.
|
||||
|
||||
See RFC 2737 for full details.
|
||||
|
||||
Create or use a device subclass that inherit this class. Do not use directly.
|
||||
|
||||
For debugging purposes you can call this class directly as you would SNMP::Info
|
||||
For debugging purposes you can call this class directly as you would
|
||||
SNMP::Info
|
||||
|
||||
my $entity = new SNMP::Info::Entity (...);
|
||||
|
||||
@@ -127,7 +158,7 @@ none.
|
||||
|
||||
=over
|
||||
|
||||
=item ENTITY-MIB
|
||||
=item F<ENTITY-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -146,43 +177,85 @@ to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $entity->e_index()
|
||||
|
||||
Index
|
||||
|
||||
(C<entPhysicalIndex>)
|
||||
|
||||
=item $entity->e_alias()
|
||||
|
||||
Human entered, not usually used.
|
||||
|
||||
(C<entPhysicalAlias>)
|
||||
|
||||
=item $entity->e_class()
|
||||
|
||||
Stack, Module, Container, Port ...
|
||||
|
||||
(C<entPhysicalClass>)
|
||||
|
||||
=item $entity->e_descr()
|
||||
|
||||
Human Friendly
|
||||
|
||||
(C<entPhysicalClass>)
|
||||
|
||||
=item $entity->e_fwver()
|
||||
|
||||
(C<entPhysicalFirmwareRev>)
|
||||
|
||||
=item $entity->e_fru()
|
||||
|
||||
BOOLEAN. Is a Field Replaceable unit?
|
||||
|
||||
(C<entPhysicalFRU>)
|
||||
|
||||
=item $entity->e_hwver()
|
||||
|
||||
(C<entPhysicalHardwareRev>)
|
||||
|
||||
=item $entity->e_id()
|
||||
|
||||
This is human entered and not normally used.
|
||||
|
||||
(C<entPhysicalAssetID>)
|
||||
|
||||
=item $entity->e_map()
|
||||
|
||||
See MIB.
|
||||
|
||||
(C<entAliasMappingIdentifier>)
|
||||
|
||||
=item $entity->e_model()
|
||||
|
||||
Model Name of Entity.
|
||||
|
||||
(C<entPhysicalModelName>)
|
||||
|
||||
=item $entity->e_name()
|
||||
|
||||
More computer friendly name of entity. Parse me.
|
||||
|
||||
(C<entPhysicalName>)
|
||||
|
||||
=item $entity->e_parent()
|
||||
|
||||
0 if root.
|
||||
|
||||
(C<entPhysicalContainedIn>)
|
||||
|
||||
=item $entity->e_port()
|
||||
|
||||
Maps EntityTable entries to the Interface Table (IfTable) using
|
||||
Maps Entity Table entries to the Interface Table (C<IfTable>) using
|
||||
$entity->e_map()
|
||||
|
||||
=item $entity->e_pos()
|
||||
|
||||
The relative position among all entities sharing the same parent.
|
||||
|
||||
(C<entPhysicalParentRelPos>)
|
||||
|
||||
=item $entity->e_serial()
|
||||
|
||||
(C<entPhysicalSerialNum>)
|
||||
@@ -193,8 +266,17 @@ $entity->e_map()
|
||||
|
||||
=item $entity->e_type()
|
||||
|
||||
This is an OID, which gets munged into the object name if the right
|
||||
MIB is loaded.
|
||||
|
||||
(C<entPhysicalVendorType>)
|
||||
|
||||
=item $entity->e_vendor()
|
||||
|
||||
Vendor of Module.
|
||||
|
||||
(C<entPhysicalMfgName>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,81 +1,86 @@
|
||||
# SNMP::Info::EtherLike
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::EtherLike;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::EtherLike::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::EtherLike::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::EtherLike::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
# Same info in both rfc1398 and this?
|
||||
%MIBS = ('ETHERLIKE-MIB' => 'etherMIB' );
|
||||
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
# EtherLike StatsTable
|
||||
'el_chipset' => 'dot3StatsEtherChipSet',
|
||||
'el_coll_excess' => 'dot3StatsExcessiveCollisions',
|
||||
'el_coll_late' => 'dot3StatsLateCollisions',
|
||||
'el_coll_mult' => 'dot3StatsMultipleCollisionFrames',
|
||||
'el_coll_single' => 'dot3StatsSingleCollisionFrames',
|
||||
'el_duplex' => 'dot3StatsDuplexStatus',
|
||||
'el_error_alignment' => 'dot3StatsAlignmentErrors',
|
||||
'el_error_fcs' => 'dot3StatsFCSErrors',
|
||||
'el_error_cs' => 'dot3StatsCarrierSenseErrors',
|
||||
'el_error_frame' => 'dot3StatsFrameTooLongs',
|
||||
'el_error_mac_rec' => 'dot3StatsInternalMacReceiveErrors',
|
||||
'el_error_mac_xmit' => 'dot3StatsInternalMacTransmitErrors',
|
||||
'el_error_sqe' => 'dot3StatsSQETestErrors',
|
||||
'el_error_symbol' => 'dot3StatsSymbolErrors',
|
||||
'el_index' => 'dot3StatsIndex',
|
||||
'el_xmit_defer' => 'dot3StatsDeferredTransmissions',
|
||||
# Ethernet-like Collision Statistics Group
|
||||
'el_coll_count' => 'dot3CollCount',
|
||||
'el_coll_freq' => 'dot3CollFrequencies'
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::MUNGE );
|
||||
# EtherLike StatsTable
|
||||
'el_chipset' => 'dot3StatsEtherChipSet',
|
||||
'el_coll_excess' => 'dot3StatsExcessiveCollisions',
|
||||
'el_coll_late' => 'dot3StatsLateCollisions',
|
||||
'el_coll_mult' => 'dot3StatsMultipleCollisionFrames',
|
||||
'el_coll_single' => 'dot3StatsSingleCollisionFrames',
|
||||
'el_duplex' => 'dot3StatsDuplexStatus',
|
||||
'el_error_alignment' => 'dot3StatsAlignmentErrors',
|
||||
'el_error_fcs' => 'dot3StatsFCSErrors',
|
||||
'el_error_cs' => 'dot3StatsCarrierSenseErrors',
|
||||
'el_error_frame' => 'dot3StatsFrameTooLongs',
|
||||
'el_error_mac_rec' => 'dot3StatsInternalMacReceiveErrors',
|
||||
'el_error_mac_xmit' => 'dot3StatsInternalMacTransmitErrors',
|
||||
'el_error_sqe' => 'dot3StatsSQETestErrors',
|
||||
'el_error_symbol' => 'dot3StatsSymbolErrors',
|
||||
'el_index' => 'dot3StatsIndex',
|
||||
'el_xmit_defer' => 'dot3StatsDeferredTransmissions',
|
||||
|
||||
# Ethernet-like Collision Statistics Group
|
||||
'el_coll_count' => 'dot3CollCount',
|
||||
'el_coll_freq' => 'dot3CollFrequencies'
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::MUNGE, 'el_duplex' => \&munge_el_duplex, );
|
||||
|
||||
sub munge_el_duplex {
|
||||
my $duplex = shift;
|
||||
return unless defined $duplex;
|
||||
|
||||
$duplex =~ s/Duplex$//;
|
||||
return $duplex;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
@@ -83,11 +88,11 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::EtherLike - Perl5 Interface to SNMP ETHERLIKE-MIB
|
||||
SNMP::Info::EtherLike - SNMP Interface to SNMP F<ETHERLIKE-MIB> RFC 1398
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -102,7 +107,8 @@ Max Baker (C<max@warped.org>)
|
||||
my $class = $cdp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
# Find the duplex setting for a port on a device that implements ETHERLIKE-MIB
|
||||
# Find the duplex setting for a port on a device that implements
|
||||
# ETHERLIKE-MIB
|
||||
my $interfaces = $el->interfaces();
|
||||
my $el_index = $el->el_index();
|
||||
my $el_duplex = $el->el_duplex();
|
||||
@@ -112,19 +118,19 @@ Max Baker (C<max@warped.org>)
|
||||
my $iid = $el_index->{$el_port};
|
||||
my $port = $interfaces->{$iid};
|
||||
|
||||
$duplex = 'half' if $duplex =~/half/i;
|
||||
$duplex = 'full' if $duplex =~/full/i;
|
||||
$duplex = 'auto' if $duplex =~/auto/i;
|
||||
|
||||
print "PORT:$port set to duplex:$duplex\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies
|
||||
access to the ETHERLIKE-MIB used by some Layer 3 Devices such as Cisco routers.
|
||||
access to the F<ETHERLIKE-MIB> used by some Layer 3 Devices such as
|
||||
Cisco routers.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one. Do not use directly.
|
||||
See RFC 1398 for more details.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one. Do not use
|
||||
directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
@@ -134,7 +140,7 @@ None.
|
||||
|
||||
=over
|
||||
|
||||
=item ETHERLIKE-MIB
|
||||
=item F<ETHERLIKE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -155,7 +161,7 @@ These are methods that return scalar values from SNMP
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 ETHERLIKE STATS TABLE (dot3StatsTable)
|
||||
=head2 ETHERLIKE STATS TABLE (C<dot3StatsTable>)
|
||||
|
||||
=over
|
||||
|
||||
@@ -163,77 +169,87 @@ to a hash.
|
||||
|
||||
Returns reference to hash. Indexes Stats Table to the interface index (iid).
|
||||
|
||||
(B<dot3StatsIndex>)
|
||||
(C<dot3StatsIndex>)
|
||||
|
||||
=item $el->el_duplex()
|
||||
|
||||
Returns reference to hash. Indexes Stats Table to Duplex Status of port.
|
||||
|
||||
(B<dot3StatsDuplexStatus>)
|
||||
(C<dot3StatsDuplexStatus>)
|
||||
|
||||
=item $el->el_chipset()
|
||||
|
||||
(B<dot3StatsEtherChipSet>)
|
||||
(C<dot3StatsEtherChipSet>)
|
||||
|
||||
=item $el->el_coll_excess()
|
||||
|
||||
(B<dot3StatsExcessiveCollisions>)
|
||||
(C<dot3StatsExcessiveCollisions>)
|
||||
|
||||
=item $el->el_coll_late()
|
||||
|
||||
(B<dot3StatsLateCollisions>)
|
||||
(C<dot3StatsLateCollisions>)
|
||||
|
||||
=item $el->el_coll_mult()
|
||||
|
||||
(B<dot3StatsMultipleCollisionFrames>)
|
||||
(C<dot3StatsMultipleCollisionFrames>)
|
||||
|
||||
=item $el->el_coll_single()
|
||||
|
||||
(B<dot3StatsSingleCollisionFrames>)
|
||||
(C<dot3StatsSingleCollisionFrames>)
|
||||
|
||||
=item $el->el_error_alignment()
|
||||
|
||||
(B<dot3StatsAlignmentErrors>)
|
||||
(C<dot3StatsAlignmentErrors>)
|
||||
|
||||
=item $el->el_error_fcs()
|
||||
|
||||
(B<dot3StatsFCSErrors>)
|
||||
(C<dot3StatsFCSErrors>)
|
||||
|
||||
=item $el->el_error_cs()
|
||||
|
||||
(B<dot3StatsCarrierSenseErrors>)
|
||||
(C<dot3StatsCarrierSenseErrors>)
|
||||
|
||||
=item $el->el_error_frame()
|
||||
|
||||
(B<dot3StatsFrameTooLongs>)
|
||||
(C<dot3StatsFrameTooLongs>)
|
||||
|
||||
=item $el->el_error_mac_rec()
|
||||
|
||||
(B<dot3StatsInternalMacReceiveErrors>)
|
||||
(C<dot3StatsInternalMacReceiveErrors>)
|
||||
|
||||
=item $el->el_error_mac_xmit()
|
||||
|
||||
(B<dot3StatsInternalMacTransmitErrors>)
|
||||
(C<dot3StatsInternalMacTransmitErrors>)
|
||||
|
||||
=item $el->el_error_sqe()
|
||||
|
||||
(B<dot3StatsSQETestErrors>)
|
||||
(C<dot3StatsSQETestErrors>)
|
||||
|
||||
=item $el->el_error_symbol()
|
||||
|
||||
(B<dot3StatsSymbolErrors>)
|
||||
(C<dot3StatsSymbolErrors>)
|
||||
|
||||
=item $el->el_xmit_defer()
|
||||
|
||||
(B<dot3StatsDeferredTransmissions>)
|
||||
(C<dot3StatsDeferredTransmissions>)
|
||||
|
||||
=item $el->el_coll_count()
|
||||
|
||||
(B<dot3CollCount>)
|
||||
(C<dot3CollCount>)
|
||||
|
||||
=item $el->el_coll_freq()
|
||||
|
||||
(B<dot3CollFrequencies>)
|
||||
(C<dot3CollFrequencies>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $el->munge_el_duplex()
|
||||
|
||||
Removes 'Duplex' from the end of a string.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
289
Info/FDP.pm
289
Info/FDP.pm
@@ -1,144 +1,129 @@
|
||||
# SNMP::Info::FDP
|
||||
# Bruce Rodger
|
||||
# $Id$
|
||||
#
|
||||
# (c) 2004 Bruce Rodger, Max Baker
|
||||
# All rights reserved.
|
||||
# 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
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * 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::FDP;
|
||||
$VERSION = 0.9;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use Carp;
|
||||
|
||||
@SNMP::Info::FDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::FDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::FDP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
|
||||
# Debug
|
||||
$DEBUG=1;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
# Five data structures required by SNMP::Info
|
||||
$INIT = 0;
|
||||
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
|
||||
|
||||
# Notice we dont inherit the default GLOBALS and FUNCS
|
||||
# only the default MUNGE.
|
||||
%GLOBALS = (
|
||||
# CDP-Compatibility
|
||||
'cdp_run' => 'snFdpGlobalRun',
|
||||
'cdp_interval' => 'snFdpGlobalMessageInterval',
|
||||
'cdp_holdtime' => 'snFdpGlobalHoldTime',
|
||||
'cdp_id' => 'snFdpGlobalDeviceId',
|
||||
#
|
||||
'fdp_run' => 'snFdpGlobalRun',
|
||||
'fdp_interval' => 'snFdpGlobalMessageInterval',
|
||||
'fdp_holdtime' => 'snFdpGlobalHoldTime',
|
||||
'fdp_id' => 'snFdpGlobalDeviceId',
|
||||
);
|
||||
'fdp_run' => 'snFdpGlobalRun',
|
||||
'fdp_interval' => 'snFdpGlobalMessageInterval',
|
||||
'fdp_holdtime' => 'snFdpGlobalHoldTime',
|
||||
'fdp_id' => 'snFdpGlobalDeviceId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
'c_index' => 'snFdpCacheIfIndex',
|
||||
'c_proto' => 'snFdpCacheAddressType',
|
||||
'c_ip' => 'snFdpCacheAddress',
|
||||
'c_ver' => 'snFdpCacheVersion',
|
||||
'c_id' => 'snFdpCacheDeviceId',
|
||||
'c_port' => 'snFdpCacheDevicePort',
|
||||
'c_platform' => 'snFdpCachePlatform',
|
||||
'c_capabilities' => 'snFdpCacheCapabilities',
|
||||
'c_domain' => 'snFdpCacheVTPMgmtDomain',
|
||||
'c_vlan' => 'snFdpCacheNativeVLAN',
|
||||
'c_duplex' => 'snFdpCacheDuplex'
|
||||
);
|
||||
%FUNCS = (
|
||||
'fdp_index' => 'snFdpCacheIfIndex',
|
||||
'fdp_proto' => 'snFdpCacheAddressType',
|
||||
'fdp_ip' => 'snFdpCacheAddress',
|
||||
'fdp_ver' => 'snFdpCacheVersion',
|
||||
'fdp_id' => 'snFdpCacheDeviceId',
|
||||
'fdp_port' => 'snFdpCacheDevicePort',
|
||||
'fdp_platform' => 'snFdpCachePlatform',
|
||||
'fdp_capabilities' => 'snFdpCacheCapabilities',
|
||||
'fdp_domain' => 'snFdpCacheVTPMgmtDomain',
|
||||
'fdp_vlan' => 'snFdpCacheNativeVLAN',
|
||||
'fdp_duplex' => 'snFdpCacheDuplex',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'c_capabilities' => \&munge_caps,
|
||||
'c_ip' => \&SNMP::Info::munge_ip
|
||||
);
|
||||
'fdp_capabilities' => \&SNMP::Info::munge_caps,
|
||||
'fdp_ip' => \&SNMP::Info::munge_ip
|
||||
);
|
||||
|
||||
sub fdp_run {
|
||||
my $fdp = shift;
|
||||
my $fdp_run = $fdp->orig_fdp_run();
|
||||
|
||||
sub munge_caps {
|
||||
my $caps = shift;
|
||||
return undef unless defined $caps;
|
||||
|
||||
my $bits = substr(unpack("B*",$caps),-7);
|
||||
return $bits;
|
||||
|
||||
|
||||
# if fdp_run isn't implemented on device, assume FDP is on
|
||||
return $fdp_run if defined $fdp_run;
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub hasFDP {
|
||||
my $fdp = shift;
|
||||
|
||||
my $ver = $fdp->{_version};
|
||||
|
||||
#my $ver = $fdp->fdp_ver;
|
||||
|
||||
|
||||
|
||||
# SNMP v1 clients dont have the globals
|
||||
if (defined $ver and $ver == 1){
|
||||
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 undef;
|
||||
return 1 if ( defined $fdp_ip and scalar( keys %$fdp_ip ) );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
return $fdp->fdp_run();
|
||||
}
|
||||
|
||||
sub c_if {
|
||||
my $fdp = shift;
|
||||
|
||||
|
||||
sub fdp_if {
|
||||
my $fdp = shift;
|
||||
|
||||
# See if by some miracle Cisco implemented the fdpCacheIfIndex entry
|
||||
my $fdp_index = $fdp->fdp_index();
|
||||
my $fdp_index = $fdp->fdp_index();
|
||||
return $fdp_index if defined $fdp_index;
|
||||
|
||||
# Nope, didn't think so. Now we fake it.
|
||||
my $fdp_ip = $fdp->c_ip();
|
||||
unless (defined $fdp_ip){
|
||||
$fdp->{error} = "SNMP::Info::FDP:fdp_if() - Device doesn't have fdp_ip() data. Can't fake fdp_index()";
|
||||
$DEBUG and carp($fdp->error(1));
|
||||
return undef;
|
||||
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;
|
||||
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;
|
||||
@@ -149,11 +134,12 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::FDP - Perl5 Interface to Foundry Discovery Protocol (FDP) using SNMP
|
||||
SNMP::Info::FDP - SNMP Interface to Foundry Discovery Protocol (FDP) using
|
||||
SNMP
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Bruce Rodger, Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -192,10 +178,10 @@ interface to FDP information through SNMP.
|
||||
FDP is a Layer 2 protocol that supplies topology information of
|
||||
devices that also speak FDP, mostly switches and routers. It has
|
||||
similar functionality to Cisco's CDP, and the SNMP interface is
|
||||
virtually identical. FDP is implemented in Foundry devices, including
|
||||
the Bigiron and Fastiron range.
|
||||
virtually identical. FDP is implemented in Brocade (Foundry) devices.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use directly.
|
||||
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.
|
||||
@@ -208,17 +194,13 @@ None.
|
||||
|
||||
=over
|
||||
|
||||
=item FOUNDRY-SN-SWITCH-GROUP-MIB
|
||||
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
|
||||
|
||||
Needs a reasonably recent MIB. Works OK with B2R07604A.mib, but doesn't
|
||||
work with B2R07600C.
|
||||
|
||||
|
||||
=back
|
||||
|
||||
MIBs are normally distributed with each code update. Contact your vendor,
|
||||
or trawl through google...
|
||||
|
||||
=head1 GLOBAL METHODS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
@@ -235,27 +217,61 @@ Accounts for SNMP version 1 devices which may have FDP but not fdp_run()
|
||||
|
||||
Is FDP enabled on this device?
|
||||
|
||||
(B<fdpGlobalRun>)
|
||||
(C<fdpGlobalRun>)
|
||||
|
||||
=item $fdp->fdp_interval()
|
||||
|
||||
Interval in seconds at which FDP messages are generated.
|
||||
|
||||
(B<fdpGlobalMessageInterval>)
|
||||
(C<fdpGlobalMessageInterval>)
|
||||
|
||||
=item $fdp->fdp_holdtime()
|
||||
|
||||
Time in seconds that FDP messages are kept.
|
||||
|
||||
(B<fdpGlobalHoldTime>)
|
||||
(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().
|
||||
This is the device id broadcast via FDP to other devices, and is what is
|
||||
retrieved from remote devices with $fdp->id().
|
||||
|
||||
(B<fdpGlobalDeviceId>)
|
||||
(C<fdpGlobalDeviceId>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
CDP compatibility
|
||||
|
||||
=over
|
||||
|
||||
=item $fdp->fdp_interval()
|
||||
|
||||
Interval in seconds at which FDP messages are generated.
|
||||
|
||||
(C<fdpGlobalMessageInterval>)
|
||||
|
||||
=item $fdp->fdp_holdtime()
|
||||
|
||||
Time in seconds that FDP messages are kept.
|
||||
|
||||
(C<fdpGlobalHoldTime>)
|
||||
|
||||
=item $fdp->fdp_id()
|
||||
|
||||
Returns FDP device ID.
|
||||
|
||||
This is the device id broadcast via FDP to other devices, and is what is
|
||||
retrieved from remote devices with $fdp->id().
|
||||
|
||||
(C<fdpGlobalDeviceId>)
|
||||
|
||||
=item $fdp->fdp_run()
|
||||
|
||||
Is FDP enabled on this device?
|
||||
|
||||
=back
|
||||
|
||||
@@ -264,7 +280,9 @@ This is the device id broadcast via FDP to other devices, and is what is retriev
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 FDP CACHE ENTRIES
|
||||
=head2 Overrides
|
||||
|
||||
CDP compatibility
|
||||
|
||||
=over
|
||||
|
||||
@@ -282,51 +300,59 @@ From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#1884
|
||||
|
||||
=item (0x40) - Provides level 1 functionality.
|
||||
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on nonrouter ports.
|
||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
|
||||
non router ports.
|
||||
|
||||
=item (0x10) - Sends and receives packets for at least one network layer protocol. If the device is routing the protocol, this bit should not be set.
|
||||
=item (0x10) - Sends and receives packets for at least one network layer
|
||||
protocol. If the device is routing the protocol, this bit should not be set.
|
||||
|
||||
=item (0x08) - Performs level 2 switching. The difference between this bit and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This device is assumed to be deployed in a physical loop-free topology.
|
||||
=item (0x08) - Performs level 2 switching. The difference between this bit
|
||||
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
|
||||
device is assumed to be deployed in a physical loop-free topology.
|
||||
|
||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge would set both this bit and bit 0x02.
|
||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
|
||||
would set both this bit and bit 0x02.
|
||||
|
||||
=item (0x02) - Performs level 2 transparent bridging.
|
||||
|
||||
=item (0x01) - Performs level 3 routing for at least one network layer protocol.
|
||||
=item (0x01) - Performs level 3 routing for at least one network layer
|
||||
protocol.
|
||||
|
||||
=back
|
||||
|
||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this information.
|
||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to
|
||||
this information.
|
||||
|
||||
(B<fdpCacheCapabilities>)
|
||||
(C<fdpCacheCapabilities>)
|
||||
|
||||
=item $fdp->fdp_domain()
|
||||
|
||||
The CDP version of this returns remote VTP Management Domain as defined in CISCO-VTP-MIB::managementDomainName
|
||||
The CDP version of this returns remote VTP Management Domain as defined
|
||||
in C<CISCO-VTP-MIB::managementDomainName>
|
||||
|
||||
(B<fdpCacheVTPMgmtDomain>)
|
||||
(C<fdpCacheVTPMgmtDomain>)
|
||||
|
||||
=item $fdp->fdp_duplex()
|
||||
|
||||
Returns the port duplex status from remote devices.
|
||||
|
||||
(B<fdpCacheDuplex>)
|
||||
(C<fdpCacheDuplex>)
|
||||
|
||||
=item $fdp->fdp_id()
|
||||
|
||||
Returns remote device id string
|
||||
|
||||
(B<fdpCacheDeviceId>)
|
||||
(C<fdpCacheDeviceId>)
|
||||
|
||||
=item $fdp->fdp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table.
|
||||
|
||||
Note that a lot devices don't implement $fdp->fdp_index(), So if it isn't around,
|
||||
we fake it.
|
||||
Note that a lot devices don't implement $fdp->fdp_index(), So if it isn't
|
||||
around, we fake it.
|
||||
|
||||
In order to map the fdp table entry back to the interfaces() entry, we truncate the last number
|
||||
off of it :
|
||||
In order to map the fdp table entry back to the interfaces() entry, we
|
||||
truncate the last number off of it :
|
||||
|
||||
# it exists, yay.
|
||||
my $fdp_index = $device->fdp_index();
|
||||
@@ -350,47 +376,48 @@ off of it :
|
||||
|
||||
Returns the mapping to the SNMP2 Interface table for FDP Cache Entries.
|
||||
|
||||
Most devices don't implement this, so you probably want to use $fdp->fdp_if() instead.
|
||||
Most devices don't implement this, so you probably want to use $fdp->fdp_if()
|
||||
instead.
|
||||
|
||||
See fdp_if() entry.
|
||||
|
||||
(B<fdpCacheIfIndex>)
|
||||
(C<fdpCacheIfIndex>)
|
||||
|
||||
=item $fdp->fdp_ip()
|
||||
|
||||
Returns remote IP address
|
||||
|
||||
(B<fdpCacheAddress>)
|
||||
(C<fdpCacheAddress>)
|
||||
|
||||
=item $fdp->fdp_platform()
|
||||
|
||||
Returns remote platform id
|
||||
|
||||
(B<fdpCachePlatform>)
|
||||
(C<fdpCachePlatform>)
|
||||
|
||||
=item $fdp->fdp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
(B<fdpDevicePort>)
|
||||
(C<fdpDevicePort>)
|
||||
|
||||
=item $fdp->fdp_proto()
|
||||
|
||||
Returns remote address type received. Usually IP.
|
||||
|
||||
(B<fdpCacheAddressType>)
|
||||
(C<fdpCacheAddressType>)
|
||||
|
||||
=item $fdp->fdp_ver()
|
||||
|
||||
Returns remote hardware version
|
||||
|
||||
(B<fdpCacheVersion>)
|
||||
(C<fdpCacheVersion>)
|
||||
|
||||
=item $fdp->fdp_vlan()
|
||||
|
||||
Returns the remote interface native VLAN.
|
||||
|
||||
(B<fdpCacheNativeVLAN>)
|
||||
(C<fdpCacheNativeVLAN>)
|
||||
|
||||
=back
|
||||
|
||||
|
||||
407
Info/IEEE802dot11.pm
Normal file
407
Info/IEEE802dot11.pm
Normal file
@@ -0,0 +1,407 @@
|
||||
# SNMP::Info::IEEE802dot11
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::IEEE802dot11;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
|
||||
@SNMP::Info::IEEE802dot11::ISA = qw/Exporter/;
|
||||
@SNMP::Info::IEEE802dot11::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# dot11PhyOFDMTable
|
||||
'dot11_cur_freq' => 'dot11CurrentFrequency',
|
||||
|
||||
# dot11PhyDSSSTable
|
||||
'dot11_cur_ch' => 'dot11CurrentChannel',
|
||||
|
||||
# dot11PhyOperationTable
|
||||
'dot11_phy_type' => 'dot11PHYType',
|
||||
'dot11_reg_dom' => 'dot11CurrentRegDomain',
|
||||
|
||||
# dot11ResourceInfoTable
|
||||
'dot11_prod_ver' => 'dot11manufacturerProductVersion',
|
||||
'dot11_prod_name' => 'dot11manufacturerProductName',
|
||||
'dot11_man_name' => 'dot11manufacturerName',
|
||||
|
||||
# dot11OperationTable
|
||||
'dot11_mac' => 'dot11MACAddress',
|
||||
|
||||
# dot11StationConfigTable
|
||||
'dot11_bss_type' => 'dot11DesiredBSSType',
|
||||
'i_ssidlist' => 'dot11DesiredSSID',
|
||||
'dot11_pwr_mode' => 'dot11PowerManagementMode',
|
||||
'dot11_sta_id' => 'dot11StationID',
|
||||
|
||||
# dot11PhyTxPowerTable
|
||||
'dot11_cur_tx_pwr' => 'dot11CurrentTxPowerLevel',
|
||||
'dot11_tx_pwr_level_1' => 'dot11TxPowerLevel1',
|
||||
'dot11_tx_pwr_level_2' => 'dot11TxPowerLevel2',
|
||||
'dot11_tx_pwr_level_3' => 'dot11TxPowerLevel3',
|
||||
'dot11_tx_pwr_level_4' => 'dot11TxPowerLevel4',
|
||||
'dot11_tx_pwr_level_5' => 'dot11TxPowerLevel5',
|
||||
'dot11_tx_pwr_level_6' => 'dot11TxPowerLevel6',
|
||||
'dot11_tx_pwr_level_7' => 'dot11TxPowerLevel7',
|
||||
'dot11_tx_pwr_level_8' => 'dot11TxPowerLevel8',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'dot11_mac' => \&SNMP::Info::munge_mac,
|
||||
'dot11_sta_id' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $names = $dot11->dot11_man_name();
|
||||
|
||||
foreach my $iid ( keys %$names ) {
|
||||
my $vendor = $names->{$iid};
|
||||
next unless defined $vendor;
|
||||
if ( $vendor =~ /^(\S+)/ ) {
|
||||
return lc($1);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $names = $dot11->dot11_prod_name();
|
||||
|
||||
foreach my $iid ( keys %$names ) {
|
||||
my $prod = $names->{$iid};
|
||||
next unless defined $prod;
|
||||
return lc($prod);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $versions = $dot11->dot11_prod_ver();
|
||||
|
||||
foreach my $iid ( keys %$versions ) {
|
||||
my $ver = $versions->{$iid};
|
||||
next unless defined $ver;
|
||||
if ( $ver =~ /([\d\.]+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
my $dot11 = shift;
|
||||
|
||||
my $phy_type = $dot11->dot11_phy_type() || {};
|
||||
my $cur_freq = $dot11->dot11_cur_freq() || {};
|
||||
my $cur_ch = $dot11->dot11_cur_ch() || {};
|
||||
|
||||
my %i_80211channel;
|
||||
foreach my $iid ( keys %$phy_type ) {
|
||||
my $type = $phy_type->{$iid};
|
||||
next unless defined $type;
|
||||
if ( $type =~ /dsss/ ) {
|
||||
my $ch = $cur_ch->{$iid};
|
||||
next unless defined $ch;
|
||||
$i_80211channel{$iid} = $ch;
|
||||
}
|
||||
elsif ( $type =~ /ofdm/ ) {
|
||||
my $ch = $cur_freq->{$iid};
|
||||
next unless defined $ch;
|
||||
$i_80211channel{$iid} = $ch;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
return \%i_80211channel;
|
||||
}
|
||||
|
||||
sub dot11_cur_tx_pwr_mw {
|
||||
my $dot11 = shift;
|
||||
my $partial = shift;
|
||||
my $cur = $dot11->dot11_cur_tx_pwr($partial);
|
||||
my $dot11_cur_tx_pwr_mw = {};
|
||||
foreach my $idx ( keys %$cur ) {
|
||||
my $pwr = $cur->{$idx};
|
||||
if ( $pwr >= 1 && $pwr <= 8 ) {
|
||||
|
||||
# ToDo - Look at string eval
|
||||
my $mw
|
||||
= eval "\$dot11->dot11_tx_pwr_level_$pwr(\$idx)"; ## no critic
|
||||
$dot11_cur_tx_pwr_mw->{$idx} = $mw->{$idx};
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return $dot11_cur_tx_pwr_mw;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::IEEE802dot11 - SNMP Interface to data from F<IEEE802dot11-MIB>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $dot11 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $dot11->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::IEEE802dot11 is a subclass of SNMP::Info that provides an
|
||||
interface to F<IEEE802dot11-MIB>. This MIB is used in standards based
|
||||
802.11 wireless devices.
|
||||
|
||||
Use or create a subclass of SNMP::Info that inherits this one.
|
||||
Do not use directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
None.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<IEEE802dot11-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->vendor()
|
||||
|
||||
Tries to discover the vendor from dot11_man_name() - returns lower case
|
||||
of the first word in the first instance found.
|
||||
|
||||
=item $dot11->model()
|
||||
|
||||
Tries to discover the model from dot11_prod_name() - returns lower case
|
||||
of the first instance found.
|
||||
|
||||
=item $dot11->os_ver()
|
||||
|
||||
Tries to discover the operating system version from dot11_prod_ver() - returns
|
||||
string of numeric and decimals in the first instance found.
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->i_ssidlist()
|
||||
|
||||
Returns reference to hash. SSID's recognized by the radio interface.
|
||||
|
||||
(C<dot11DesiredSSID>)
|
||||
|
||||
=item $dot11->i_80211channel()
|
||||
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface.
|
||||
|
||||
=item $dot11->dot11_cur_tx_pwr_mw()
|
||||
|
||||
Returns reference to hash. Current transmit power, in milliwatts, of the
|
||||
radio interface.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Phy OFDM Table (C<dot11PhyOFDMTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_cur_freq()
|
||||
|
||||
(C<dot11CurrentFrequency>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Phy DSSS Table (C<dot11PhyDSSSTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_cur_ch()
|
||||
|
||||
(C<dot11CurrentChannel>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Phy Operation Table (C<dot11PhyOperationTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_phy_type()
|
||||
|
||||
(C<dot11PHYType>)
|
||||
|
||||
=item $dot11->dot11_reg_dom()
|
||||
|
||||
(C<dot11CurrentRegDomain>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Resource Information Table (C<dot11ResourceInfoTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_prod_ver()
|
||||
|
||||
(C<dot11manufacturerProductVersion>)
|
||||
|
||||
=item $dot11->dot11_prod_name()
|
||||
|
||||
(C<dot11manufacturerProductName>)
|
||||
|
||||
=item $dot11->dot11_man_name()
|
||||
|
||||
(C<dot11manufacturerName>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Operation Table (C<dot11OperationTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_mac()
|
||||
|
||||
(C<dot11MACAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Station Configuration Table (C<dot11StationConfigTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_bss_type()
|
||||
|
||||
(C<dot11DesiredBSSType>)
|
||||
|
||||
=item $dot11->dot11_pwr_mode()
|
||||
|
||||
(C<dot11PowerManagementMode>)
|
||||
|
||||
=item $dot11->dot11_sta_id()
|
||||
|
||||
(C<dot11StationID>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Dot11 Transmission Power Table (C<dot11PhyTxPowerTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->dot11_cur_tx_pwr()
|
||||
|
||||
(C<dot11CurrentTxPowerLevel>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_1()
|
||||
|
||||
(C<dot11TxPowerLevel1>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_2()
|
||||
|
||||
(C<dot11TxPowerLevel2>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_3()
|
||||
|
||||
(C<dot11TxPowerLevel3>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_4()
|
||||
|
||||
(C<dot11TxPowerLevel4>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_5()
|
||||
|
||||
(C<dot11TxPowerLevel5>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_6()
|
||||
|
||||
(C<dot11TxPowerLevel6>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_7()
|
||||
|
||||
(C<dot11TxPowerLevel7>)
|
||||
|
||||
=item $dot11->dot11_tx_pwr_level_8()
|
||||
|
||||
(C<dot11TxPowerLevel8>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
485
Info/IPv6.pm
Normal file
485
Info/IPv6.pm
Normal file
@@ -0,0 +1,485 @@
|
||||
# SNMP::Info::IPv6
|
||||
#
|
||||
# Copyright (c) 2010 Jeroen van Ingen and Carlos Vicente
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::IPv6;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::IPv6::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::IPv6::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE $METHOD/;
|
||||
|
||||
use constant {
|
||||
IPMIB => 1,
|
||||
CISCO => 2,
|
||||
IPV6MIB => 3,
|
||||
};
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
|
||||
|
||||
%MIBS = (
|
||||
'IP-MIB' => 'ipv6InterfaceTableLastChange',
|
||||
'IPV6-MIB' => 'ipv6IfTableLastChange',
|
||||
'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress',
|
||||
);
|
||||
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
'ip_n2p_phys_addr' => 'ipNetToPhysicalPhysAddress', # IP-MIB
|
||||
'c_inet_phys_addr' => 'cInetNetToMediaPhysAddress', # CISCO-IETF-IP-MIB
|
||||
'i6_n2p_phys_addr' => 'ipv6NetToMediaPhysAddress', # IPV6-MIB
|
||||
|
||||
'ip_n2p_phys_type' => 'ipNetToPhysicalType', # IP-MIB
|
||||
'c_inet_phys_type' => 'cInetNetToMediaType', # CISCO-IETF-IP-MIB
|
||||
'i6_n2p_phys_type' => 'ipv6NetToMediaType', # IPV6-MIB
|
||||
|
||||
'ip_n2p_phys_state' => 'ipNetToPhysicalState', # IP-MIB
|
||||
'c_inet_phys_state' => 'cInetNetToMediaState', # CISCO-IETF-IP-MIB
|
||||
'i6_n2p_phys_state' => 'ipv6NetToMediaState', # IPV6-MIB
|
||||
|
||||
'ip_pfx_origin' => 'ipAddressPrefixOrigin', # IP-MIB
|
||||
'c_pfx_origin' => 'cIpAddressPfxOrigin', # CISCO-IETF-IP-MIB
|
||||
|
||||
'ip_addr6_pfx' => 'ipAddressPrefix', # IP-MIB
|
||||
'c_addr6_pfx' => 'cIpAddressPrefix', # CISCO-IETF-IP-MIB
|
||||
|
||||
'ip_addr6_index' => 'ipAddressIfIndex', # IP-MIBw
|
||||
'c_addr6_index' => 'cIpAddressIfIndex', # CISCO-IETF-IP-MIB
|
||||
|
||||
'ip_addr6_type' => 'ipAddressType', # IP-MIB
|
||||
'c_addr6_type' => 'cIpAddressType', # CISCO-IETF-IP-MIB
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'ip_n2p_phys_addr' => \&SNMP::Info::munge_mac,
|
||||
'c_inet_phys_addr' => \&munge_physaddr,
|
||||
'i6_n2p_phys_addr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
|
||||
sub ipv6_n2p_mac {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_addr;
|
||||
foreach my $row (keys %$phys_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if (($addrtype == 2) && (defined $phys_addr->{$row})) { # IPv6
|
||||
$return->{$row} = substr($phys_addr->{$row}, 0, 17);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_addr {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $net_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $net_addr;
|
||||
foreach my $row (keys %$net_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
my $v6_packed = pack("C*", split(/\./, $v6addr));
|
||||
if (length($v6_packed) == 15) {
|
||||
# Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize,
|
||||
# so what we've collected in that variable is actually the first byte of the address.
|
||||
$v6_packed = pack('C', $addrsize) . $v6_packed;
|
||||
}
|
||||
if (length($v6_packed) == 16) {
|
||||
$v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
|
||||
$return->{$row} = $v6addr;
|
||||
} else {
|
||||
printf("Invalid size for IPv6 address: expected 16 bytes, got %d (%s = %s)\n", length($v6_packed), $row, $net_addr->{$row});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_if {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_addr = &_test_methods( $info, {
|
||||
ip_n2p_phys_addr => IPMIB,
|
||||
c_inet_phys_addr => CISCO,
|
||||
i6_n2p_phys_addr => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_addr;
|
||||
foreach my $row (keys %$phys_addr) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ifindex;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_type {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_type = &_test_methods( $info, {
|
||||
ip_n2p_phys_type => IPMIB,
|
||||
c_inet_phys_type => CISCO,
|
||||
i6_n2p_phys_type => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_type;
|
||||
foreach my $row (keys %$phys_type) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $phys_type->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_n2p_state {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $phys_state = &_test_methods( $info, {
|
||||
ip_n2p_phys_state => IPMIB,
|
||||
c_inet_phys_state => CISCO,
|
||||
i6_n2p_phys_state => IPV6MIB,
|
||||
});
|
||||
return unless defined $phys_state;
|
||||
foreach my $row (keys %$phys_state) {
|
||||
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
|
||||
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
|
||||
if ($info::METHOD == IPV6MIB) {
|
||||
# IPV6-MIB doesn't include the addrtype in the index;
|
||||
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
|
||||
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
|
||||
$addrtype = 2;
|
||||
}
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $phys_state->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_index {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_index = &_test_methods( $info, {
|
||||
ip_addr6_index => IPMIB,
|
||||
c_addr6_index => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_index;
|
||||
foreach my $row (keys %$ipv6_index){
|
||||
if ($row =~ /^(\d+)\.([\d\.]+)$/) {
|
||||
my $addrtype = $1; my $v6addr = $2;
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_index->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_type {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_type = &_test_methods( $info, {
|
||||
ip_addr6_type => IPMIB,
|
||||
c_addr6_type => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_type;
|
||||
foreach my $row (keys %$ipv6_type){
|
||||
if ($row =~ /^(\d+)\.([\d\.]+)$/) {
|
||||
my $addrtype = $1; my $v6addr = $2;
|
||||
if ($addrtype == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_type->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_pfx_origin {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_pfx_origin = &_test_methods( $info, {
|
||||
ip_pfx_origin => IPMIB,
|
||||
c_pfx_origin => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_pfx_origin;
|
||||
foreach my $row (keys %$ipv6_pfx_origin){
|
||||
if ($row =~ /^(\d+)\.(\d+)\.([\d\.]+)\.(\d+)$/) {
|
||||
my $ifindex = $1; my $type = $2; my $pfx = $3; my $len = $4;
|
||||
if ($type == 2) { # IPv6
|
||||
$return->{$row} = $ipv6_pfx_origin->{$row};
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub ipv6_addr_prefix {
|
||||
my $info = shift;
|
||||
my $return;
|
||||
my $ipv6_addr_prefix = &_test_methods( $info, {
|
||||
ip_addr6_pfx => IPMIB,
|
||||
c_addr6_pfx => CISCO,
|
||||
});
|
||||
return unless defined $ipv6_addr_prefix;
|
||||
foreach my $row (keys %$ipv6_addr_prefix){
|
||||
if ($row =~ /^(\d+)\.[\d\.]+$/) {
|
||||
my $type = $1;
|
||||
if ($type == 2) { # IPv6
|
||||
# Remove the OID part from the value
|
||||
my $val = $ipv6_addr_prefix->{$row};
|
||||
if ( $val =~ /^.+?((?:\d+\.){19}\d+)$/ ){
|
||||
$val = $1;
|
||||
$return->{$row} = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub _method_used {
|
||||
my $info = shift;
|
||||
my $return = 'none of the MIBs';
|
||||
if (defined $info::METHOD) {
|
||||
if ($info::METHOD eq IPMIB) {
|
||||
$return = 'IP-MIB';
|
||||
} elsif ($info::METHOD eq IPV6MIB) {
|
||||
$return = 'IPV6-MIB';
|
||||
} elsif ($info::METHOD eq CISCO) {
|
||||
$return = 'CISCO-IETF-IP-MIB';
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub _test_methods {
|
||||
my $info = shift;
|
||||
my $test = shift;
|
||||
my $return = {};
|
||||
foreach my $method (sort {$test->{$a} <=> $test->{$b}} keys %$test) {
|
||||
$return = $info->$method || {};
|
||||
if (scalar keys %$return) {
|
||||
$info::METHOD = $test->{$method};
|
||||
last;
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
sub _my_sub_name {
|
||||
my @callinfo = caller(1);
|
||||
return $callinfo[3];
|
||||
}
|
||||
|
||||
sub munge_physaddr {
|
||||
my $addr = shift;
|
||||
return unless defined $addr;
|
||||
return unless length $addr;
|
||||
$addr = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $addr ) );
|
||||
return $addr;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::IPv6 - SNMP Interface for obtaining IPv6 addresses and IPv6
|
||||
address mappings
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen and Carlos Vicente
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $info = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $info->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses
|
||||
to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>,
|
||||
F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the
|
||||
device.
|
||||
|
||||
This class is inherited by Info::Layer3 to provide IPv6 node tracking across
|
||||
device classes.
|
||||
|
||||
For debugging purposes you can call this class directly as you would
|
||||
SNMP::Info
|
||||
|
||||
my $info = new SNMP::Info::IPv6 (...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
none.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<IP-MIB>
|
||||
=item F<IPV6-MIB>
|
||||
=item F<CISCO-IETF-IP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
none.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Internet Address Table
|
||||
|
||||
=over
|
||||
|
||||
=item $info->ipv6_n2p_addr()
|
||||
|
||||
=item $info->ipv6_n2p_if()
|
||||
|
||||
=item $info->ipv6_n2p_mac()
|
||||
|
||||
=item $info->ipv6_n2p_state()
|
||||
|
||||
=item $info->ipv6_n2p_type()
|
||||
|
||||
=item $info->ipv6_index()
|
||||
|
||||
Maps an IPv6 address to an interface C<ifIndex>
|
||||
|
||||
=item $info->ipv6_type()
|
||||
|
||||
Maps an IPv6 address to its type (unicast, anycast, etc.)
|
||||
|
||||
=item $info->ipv6_pfx_origin()
|
||||
|
||||
Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.)
|
||||
|
||||
=item $info->ipv6_addr_prefix()
|
||||
|
||||
Maps IPv6 addresses with their prefixes
|
||||
|
||||
=back
|
||||
|
||||
=head2 Internet Address Translation Table
|
||||
|
||||
=over
|
||||
|
||||
=item $info->c_inet_phys_address()
|
||||
|
||||
Maps an address of type C<cInetNetToMediaNetAddressType> on interface C<ifIndex> to a physical address.
|
||||
|
||||
=back
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item munge_physaddr()
|
||||
|
||||
Takes an octet stream (HEX-STRING) and returns a colon separated ASCII hex
|
||||
string.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
533
Info/LLDP.pm
Normal file
533
Info/LLDP.pm
Normal file
@@ -0,0 +1,533 @@
|
||||
# SNMP::Info::LLDP
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::LLDP;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::LLDP::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::LLDP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
'LLDP-MIB' => 'lldpLocSysCapEnabled',
|
||||
'LLDP-EXT-DOT1-MIB' => 'lldpXdot1MIB',
|
||||
'LLDP-EXT-DOT3-MIB' => 'lldpXdot3MIB',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
'lldp_sysname' => 'lldpLocSysName',
|
||||
'lldp_sysdesc' => 'lldpLocSysDesc',
|
||||
'lldp_sys_cap' => 'lldpLocSysCapEnabled',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
|
||||
# LLDP-MIB::lldpLocManAddrTable
|
||||
'lldp_lman_addr' => 'lldpLocManAddrIfId',
|
||||
|
||||
# LLDP-MIB::lldpRemTable
|
||||
'lldp_rem_id_type' => 'lldpRemChassisIdSubtype',
|
||||
'lldp_rem_id' => 'lldpRemChassisId',
|
||||
'lldp_rem_pid_type' => 'lldpRemPortIdSubtype',
|
||||
'lldp_rem_pid' => 'lldpRemPortId',
|
||||
'lldp_rem_desc' => 'lldpRemPortDesc',
|
||||
'lldp_rem_sysname' => 'lldpRemSysName',
|
||||
'lldp_rem_sysdesc' => 'lldpRemSysDesc',
|
||||
'lldp_rem_sys_cap' => 'lldpRemSysCapEnabled',
|
||||
|
||||
# LLDP-MIB::lldpRemManAddrTable
|
||||
'lldp_rman_addr' => 'lldpRemManAddrIfSubtype',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
'lldp_sysdesc' => \&SNMP::Info::munge_null,
|
||||
'lldp_sysname' => \&SNMP::Info::munge_null,
|
||||
'lldp_rem_sysname' => \&SNMP::Info::munge_null,
|
||||
'lldp_rem_sysdesc' => \&SNMP::Info::munge_null,
|
||||
'lldp_rem_port_desc' => \&SNMP::Info::munge_null,
|
||||
'lldp_sys_cap' => \&SNMP::Info::munge_bits,
|
||||
'lldp_rem_sys_cap' => \&SNMP::Info::munge_bits,
|
||||
);
|
||||
|
||||
sub hasLLDP {
|
||||
my $lldp = shift;
|
||||
|
||||
# We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
|
||||
# so we could be running LLDP but not return any useful information
|
||||
my $lldp_cap = $lldp->lldp_sys_cap();
|
||||
|
||||
return 1 if defined $lldp_cap;
|
||||
return;
|
||||
}
|
||||
|
||||
sub lldp_if {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $addr = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $i_descr = $lldp->i_description() || {};
|
||||
my $i_alias = $lldp->i_alias() || {};
|
||||
my %r_i_descr = reverse %$i_descr;
|
||||
my %r_i_alias = reverse %$i_alias;
|
||||
|
||||
my %lldp_if;
|
||||
foreach my $key ( keys %$addr ) {
|
||||
my @aOID = split( '\.', $key );
|
||||
my $port = $aOID[1];
|
||||
next unless $port;
|
||||
# Local LLDP port may not equate to ifIndex, see LldpPortNumber TEXTUAL-CONVENTION in LLDP-MIB.
|
||||
# Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex,
|
||||
# prefer ifDescr over ifAlias because using cross ref with description is correct behavior
|
||||
# according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though.
|
||||
my $lldp_desc = $lldp->lldpLocPortDesc($port);
|
||||
my $desc = $lldp_desc->{$port};
|
||||
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
|
||||
if ( exists $r_i_descr{$desc} ) {
|
||||
$port = $r_i_descr{$desc};
|
||||
} elsif ( exists $r_i_alias{$desc} ) {
|
||||
$port = $r_i_alias{$desc};
|
||||
}
|
||||
|
||||
$lldp_if{$key} = $port;
|
||||
}
|
||||
return \%lldp_if;
|
||||
}
|
||||
|
||||
sub lldp_ip {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ip;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
next unless $proto == 1;
|
||||
$lldp_ip{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ip;
|
||||
}
|
||||
|
||||
sub lldp_addr {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
|
||||
|
||||
my %lldp_ip;
|
||||
foreach my $key ( keys %$rman_addr ) {
|
||||
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
|
||||
next unless defined $index;
|
||||
$lldp_ip{$index} = $addr;
|
||||
}
|
||||
return \%lldp_ip;
|
||||
}
|
||||
|
||||
sub lldp_port {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $pdesc = $lldp->lldp_rem_desc($partial) || {};
|
||||
my $pid = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $ptype = $lldp->lldp_rem_pid_type($partial) || {};
|
||||
|
||||
my %lldp_port;
|
||||
foreach my $key ( sort keys %$pid ) {
|
||||
my $port = $pdesc->{$key};
|
||||
unless ($port) {
|
||||
$port = $pid->{$key};
|
||||
next unless $port;
|
||||
my $type = $ptype->{$key};
|
||||
next unless $type;
|
||||
|
||||
# May need to format other types in the future, i.e. Network address
|
||||
if ( $type =~ /mac/ ) {
|
||||
$port = join( ':',
|
||||
map { sprintf "%02x", $_ } unpack( 'C*', $port ) );
|
||||
}
|
||||
}
|
||||
|
||||
# Avaya/Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
|
||||
# figure out slot.port based upon lldpRemPortDesc
|
||||
if ( $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ ) {
|
||||
$port = defined $1 ? "$2.$3" : "$3";
|
||||
}
|
||||
|
||||
$lldp_port{$key} = $port;
|
||||
}
|
||||
return \%lldp_port;
|
||||
}
|
||||
|
||||
sub lldp_id {
|
||||
my $lldp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $ch_type = $lldp->lldp_rem_id_type($partial) || {};
|
||||
my $ch = $lldp->lldp_rem_id($partial) || {};
|
||||
|
||||
my %lldp_id;
|
||||
foreach my $key ( keys %$ch ) {
|
||||
my $id = $ch->{$key};
|
||||
next unless $id;
|
||||
my $type = $ch_type->{$key};
|
||||
next unless $type;
|
||||
|
||||
# May need to format other types in the future
|
||||
if ( $type =~ /mac/ ) {
|
||||
$id = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) );
|
||||
}
|
||||
elsif ($type eq 'networkAddress') {
|
||||
if ( length(unpack('H*', $id)) == 10 ) {
|
||||
# IP address (first octet is sign, I guess)
|
||||
my @octets = (map { sprintf "%02x",$_ } unpack('C*', $id))[1..4];
|
||||
$id = join '.', map { hex($_) } @octets;
|
||||
}
|
||||
}
|
||||
$lldp_id{$key} = $id;
|
||||
}
|
||||
return \%lldp_id;
|
||||
}
|
||||
|
||||
#sub root_ip {
|
||||
# my $lldp = shift;
|
||||
#
|
||||
# my $man_addr = $lldp->lldp_lman_addr() || {};
|
||||
#
|
||||
# foreach my $key (keys %$man_addr) {
|
||||
# my @oids = split(/\./, $key);
|
||||
# my $proto = shift(@oids);
|
||||
# my $length = shift(@oids);
|
||||
# # IPv4
|
||||
# if ($proto == 1) {
|
||||
# my $addr = join('.',@oids);
|
||||
# return $addr if (defined $addr and $lldp->snmp_connect_ip($addr));
|
||||
# }
|
||||
# }
|
||||
# return;
|
||||
#}
|
||||
|
||||
# Break up the lldpRemManAddrTable INDEX into common index, protocol,
|
||||
# and address.
|
||||
sub _lldp_addr_index {
|
||||
my $idx = shift;
|
||||
my @oids = split( /\./, $idx );
|
||||
my $index = join( '.', splice( @oids, 0, 3 ) );
|
||||
my $proto = shift(@oids);
|
||||
my $length = shift(@oids);
|
||||
|
||||
# IPv4
|
||||
if ( $proto == 1 ) {
|
||||
return ( $index, $proto, join( '.', @oids ) );
|
||||
}
|
||||
|
||||
# MAC
|
||||
elsif ( $proto == 6 ) {
|
||||
return ( $index, $proto,
|
||||
join( ':', map { sprintf "%02x", $_ } @oids ) );
|
||||
}
|
||||
|
||||
# TODO - Need to handle other protocols, i.e. IPv6
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::LLDP - SNMP Interface to the Link Layer Discovery Protocol (LLDP)
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $lldp = new SNMP::Info (
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'router',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
);
|
||||
|
||||
my $class = $lldp->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
$haslldp = $lldp->hasLLDP() ? 'yes' : 'no';
|
||||
|
||||
# Print out a map of device ports with LLDP neighbors:
|
||||
my $interfaces = $lldp->interfaces();
|
||||
my $lldp_if = $lldp->lldp_if();
|
||||
my $lldp_ip = $lldp->lldp_ip();
|
||||
my $lldp_port = $lldp->lldp_port();
|
||||
|
||||
foreach my $lldp_key (keys %$lldp_ip){
|
||||
my $iid = $lldp_if->{$lldp_key};
|
||||
my $port = $interfaces->{$iid};
|
||||
my $neighbor = $lldp_ip->{$lldp_key};
|
||||
my $neighbor_port = $lldp_port->{$lldp_key};
|
||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::LLDP is a subclass of SNMP::Info that provides an object oriented
|
||||
interface to LLDP information through SNMP.
|
||||
|
||||
LLDP is a Layer 2 protocol that allows a network device to advertise its
|
||||
identity and capabilities on the local network providing topology information.
|
||||
The protocol is defined in the IEEE standard 802.1AB.
|
||||
|
||||
Create or use a device subclass that inherits this class. Do not use
|
||||
directly.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
None.
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<LLDP-MIB>
|
||||
|
||||
=item F<LLDP-EXT-DOT1-MIB>
|
||||
|
||||
=item F<LLDP-EXT-DOT3-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBAL METHODS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $lldp->hasLLDP()
|
||||
|
||||
Is LLDP is active in this device?
|
||||
|
||||
Note: LLDP may be active, but nothing in C<lldpRemoteSystemsData> Tables so
|
||||
the device would not return any useful topology information.
|
||||
|
||||
=item $lldp->lldp_sysname()
|
||||
|
||||
The string value used to identify the system name of the local system. If the
|
||||
local agent supports IETF RFC 3418, C<lldpLocSysName> object should have the
|
||||
same value of C<sysName> object.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpLocSysName>)
|
||||
|
||||
=item $lldp->lldp_sysdesc()
|
||||
|
||||
The string value used to identify the system description of the local system.
|
||||
If the local agent supports IETF RFC 3418, C<lldpLocSysDesc> object should
|
||||
have the same value of C<sysDesc> object.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpLocSysDesc>)
|
||||
|
||||
=item $lldp->lldp_sys_cap()
|
||||
|
||||
Returns which system capabilities are enabled on the local system. Results
|
||||
are munged into an ascii binary string, LSB. Each digit represents a bit
|
||||
from the table below:
|
||||
|
||||
=over
|
||||
|
||||
=item Bit 'other(0)' indicates that the system has capabilities other than
|
||||
those listed below.
|
||||
|
||||
=item Bit 'repeater(1)' indicates that the system has repeater capability.
|
||||
|
||||
=item Bit 'bridge(2)' indicates that the system has bridge capability.
|
||||
|
||||
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
|
||||
point capability.
|
||||
|
||||
=item Bit 'router(4)' indicates that the system has router capability.
|
||||
|
||||
=item Bit 'telephone(5)' indicates that the system has telephone capability.
|
||||
|
||||
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
|
||||
Device capability (IETF RFC 2669 & 2670).
|
||||
|
||||
=item Bit 'stationOnly(7)' indicates that the system has only station
|
||||
capability and nothing else."
|
||||
|
||||
=back
|
||||
|
||||
(C<lldpLocSysCapEnabled>)
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $lldp->lldp_id()
|
||||
|
||||
Returns the string value used to identify the chassis component associated
|
||||
with the remote system.
|
||||
|
||||
(C<lldpRemChassisId>)
|
||||
|
||||
=item $lldp->lldp_if()
|
||||
|
||||
Returns the mapping to the SNMP Interface Table. Tries to cross reference
|
||||
(C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>),
|
||||
if unable defaults to (C<lldpRemLocalPortNum>).
|
||||
|
||||
=item $lldp->lldp_ip()
|
||||
|
||||
Returns remote IPv4 address. Returns for all other address types, use
|
||||
lldp_addr if you want any return address type.
|
||||
|
||||
=item $lldp->lldp_addr()
|
||||
|
||||
Returns remote address. Type may be any IANA Address Family Number.
|
||||
Currently only returns IPv4 or MAC addresses.
|
||||
|
||||
=item $lldp->lldp_port()
|
||||
|
||||
Returns remote port ID
|
||||
|
||||
=back
|
||||
|
||||
=head2 LLDP Remote Table (C<lldpRemTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $lldp->lldp_rem_id_type()
|
||||
|
||||
Returns the type of encoding used to identify the chassis associated with
|
||||
the remote system.
|
||||
|
||||
(C<lldpRemChassisIdSubtype>)
|
||||
|
||||
=item $lldp->lldp_rem_id()
|
||||
|
||||
Returns the string value used to identify the chassis component associated
|
||||
with the remote system.
|
||||
|
||||
(C<lldpRemChassisId>)
|
||||
|
||||
=item $lldp->lldp_rem_pid_type()
|
||||
|
||||
Returns the type of port identifier encoding used in the associated
|
||||
C<lldpRemPortId> object.
|
||||
|
||||
(C<lldpRemPortIdSubtype>)
|
||||
|
||||
=item $lldp->lldp_rem_pid()
|
||||
|
||||
Returns the string value used to identify the port component associated with
|
||||
the remote system.
|
||||
|
||||
(C<lldpRemPortId>)
|
||||
|
||||
=item $lldp->lldp_rem_desc()
|
||||
|
||||
Returns the string value used to identify the description of the given port
|
||||
associated with the remote system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpRemPortDesc>)
|
||||
|
||||
=item $lldp->lldp_rem_sysname()
|
||||
|
||||
Returns the string value used to identify the system name of the remote
|
||||
system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpRemSysName>)
|
||||
|
||||
=item $lldp->lldp_rem_sysdesc()
|
||||
|
||||
Returns the string value used to identify the system description of the
|
||||
remote system.
|
||||
|
||||
Nulls are removed before the value is returned.
|
||||
|
||||
(C<lldpRemSysDesc>)
|
||||
|
||||
=item $lldp->lldp_rem_sys_cap()
|
||||
|
||||
Returns which system capabilities are enabled on the local system. Results
|
||||
are munged into an ascii binary string, LSB. Each digit
|
||||
represents a bit from the table below:
|
||||
|
||||
=over
|
||||
|
||||
=item Bit 'other(0)' indicates that the system has capabilities other than
|
||||
those listed below.
|
||||
|
||||
=item Bit 'repeater(1)' indicates that the system has repeater capability.
|
||||
|
||||
=item Bit 'bridge(2)' indicates that the system has bridge capability.
|
||||
|
||||
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
|
||||
point capability.
|
||||
|
||||
=item Bit 'router(4)' indicates that the system has router capability.
|
||||
|
||||
=item Bit 'telephone(5)' indicates that the system has telephone capability.
|
||||
|
||||
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
|
||||
Device capability (IETF RFC 2669 & 2670).
|
||||
|
||||
=item Bit 'stationOnly(7)' indicates that the system has only station
|
||||
capability and nothing else."
|
||||
|
||||
=back
|
||||
|
||||
(C<lldpRemSysCapEnabled>)
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
236
Info/Layer1.pm
236
Info/Layer1.pm
@@ -1,81 +1,73 @@
|
||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
|
||||
# Max Baker <max@warped.org>
|
||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
|
||||
|
||||
@SNMP::Info::Layer1::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer1::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer1::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex'
|
||||
);
|
||||
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
'ports_managed' => 'ifNumber',
|
||||
'rptr_slots' => 'rptrGroupCapacity',
|
||||
'slots' => 'rptrGroupCapacity'
|
||||
);
|
||||
%SNMP::Info::GLOBALS,
|
||||
'ports_managed' => 'ifNumber',
|
||||
'rptr_slots' => 'rptrGroupCapacity',
|
||||
'slots' => 'rptrGroupCapacity'
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
'i_up2' => 'ifOperStatus',
|
||||
'i_up_admin2' => 'ifAdminStatus',
|
||||
'rptr_ports' => 'rptrGroupPortCapacity',
|
||||
'rptr_port' => 'rptrPortIndex',
|
||||
'rptr_slot' => 'rptrPortGroupIndex',
|
||||
'rptr_up_admin' => 'rptrPortAdminStatus',
|
||||
'rptr_up' => 'rptrPortOperStatus',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
'rptr_ports' => 'rptrGroupPortCapacity',
|
||||
'rptr_port' => 'rptrPortIndex',
|
||||
'rptr_slot' => 'rptrPortGroupIndex',
|
||||
'rptr_up_admin' => 'rptrPortAdminStatus',
|
||||
'rptr_up' => 'rptrPortOperStatus',
|
||||
'rptr_last_src' => 'rptrAddrTrackNewLastSrcAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
);
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
'rptr_last_src' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
@@ -83,23 +75,23 @@ $INIT = 0;
|
||||
sub ports {
|
||||
my $l1 = shift;
|
||||
|
||||
my $ports = $l1->ports_managed();
|
||||
my $rptr_ports = $l1->rptr_ports();
|
||||
my $ports = $l1->ports_managed();
|
||||
my $rptr_ports = $l1->rptr_ports();
|
||||
|
||||
foreach my $group (keys %$rptr_ports){
|
||||
$ports += $rptr_ports->{$group};
|
||||
foreach my $group ( keys %$rptr_ports ) {
|
||||
$ports += $rptr_ports->{$group};
|
||||
}
|
||||
|
||||
return $ports;
|
||||
}
|
||||
|
||||
# $l1->model() - Looks at sysObjectID which gives the oid of the system
|
||||
# name, contained in a propriatry MIB.
|
||||
# name, contained in a propriatry MIB.
|
||||
sub model {
|
||||
my $l1 = shift;
|
||||
my $id = $l1->id();
|
||||
my $l1 = shift;
|
||||
my $id = $l1->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
|
||||
# HP
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
@@ -110,66 +102,73 @@ sub model {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l1 = shift;
|
||||
my $l1 = shift;
|
||||
my $descr = $l1->description();
|
||||
|
||||
return 'hp' if ($descr =~ /hp/i);
|
||||
return 'cisco' if ($descr =~ /(catalyst|cisco|ios)/i);
|
||||
return 'allied' if ($descr =~ /allied/i);
|
||||
return 'asante' if ($descr =~ /asante/i);
|
||||
return 'hp' if ( $descr =~ /hp/i );
|
||||
return 'cisco' if ( $descr =~ /(catalyst|cisco|ios)/i );
|
||||
return 'allied' if ( $descr =~ /allied/i );
|
||||
return 'asante' if ( $descr =~ /asante/i );
|
||||
|
||||
return 'unknown';
|
||||
|
||||
}
|
||||
|
||||
# By Default we'll use the description field
|
||||
sub interfaces {
|
||||
my $l1 = shift;
|
||||
my $interfaces = $l1->i_index();
|
||||
my $rptr_port = $l1->rptr_port();
|
||||
my $l1 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
foreach my $port (keys %$rptr_port){
|
||||
my $interfaces = $l1->i_index($partial) || {};
|
||||
my $rptr_port = $l1->rptr_port($partial) || {};
|
||||
|
||||
foreach my $port ( keys %$rptr_port ) {
|
||||
$interfaces->{$port} = $port;
|
||||
}
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $l1 = shift;
|
||||
my $l1 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up_admin = $l1->i_up_admin2();
|
||||
my $rptr_up_admin = $l1->rptr_up_admin();
|
||||
my $i_up_admin = $l1->SUPER::i_up_admin($partial) || {};
|
||||
my $rptr_up_admin = $l1->rptr_up_admin($partial) || {};
|
||||
|
||||
foreach my $key (keys %$rptr_up_admin){
|
||||
foreach my $key ( keys %$rptr_up_admin ) {
|
||||
my $up = $rptr_up_admin->{$key};
|
||||
$i_up_admin->{$key} = 'up' if $up =~ /enabled/;
|
||||
$i_up_admin->{$key} = 'down' if $up =~ /disabled/;
|
||||
$i_up_admin->{$key} = 'up' if $up =~ /enabled/;
|
||||
$i_up_admin->{$key} = 'down' if $up =~ /disabled/;
|
||||
}
|
||||
|
||||
return $i_up_admin;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $l1 = shift;
|
||||
my $i_up = $l1->i_up2();
|
||||
my $rptr_up = $l1->rptr_up();
|
||||
my $l1 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
foreach my $key (keys %$rptr_up){
|
||||
my $i_up = $l1->SUPER::i_up($partial) || {};
|
||||
my $rptr_up = $l1->rptr_up($partial) || {};
|
||||
|
||||
foreach my $key ( keys %$rptr_up ) {
|
||||
my $up = $rptr_up->{$key};
|
||||
$i_up->{$key} = 'up' if $up =~ /operational/;
|
||||
$i_up->{$key} = 'up' if $up =~ /operational/;
|
||||
}
|
||||
|
||||
return $i_up;
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1 - Perl5 Interface to network devices serving Layer1 only.
|
||||
SNMP::Info::Layer1 - SNMP Interface to network devices serving Layer1 only.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -177,14 +176,13 @@ Max Baker (C<max@warped.org>)
|
||||
my $l1 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l1->class();
|
||||
my $class = $l1->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
@@ -201,14 +199,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes listed under
|
||||
SNMP::Info::Layer1::* Please read all docs under SNMP::Info first.
|
||||
This class is usually used as a superclass for more specific device classes
|
||||
listed under SNMP::Info::Layer1::* Please read all docs under SNMP::Info
|
||||
first.
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Layer1 device through SNMP. Information is stored in a number of MIBs.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $l1 = new SNMP::Info::Layer1(...);
|
||||
|
||||
@@ -224,15 +223,16 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP-REPEATER-MIB
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required for SNMP::Info
|
||||
=item F<SNMP-REPEATER-MIB>
|
||||
|
||||
=back
|
||||
|
||||
SNMP-REPEATER-MIB needs to be extracted from ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
|
||||
MIBs required for L<SNMP::Info/"Required MIBs">
|
||||
|
||||
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
F<SNMP-REPEATER-MIB> needs to be extracted from
|
||||
ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -244,7 +244,7 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
Gets the number of ports under the interface mib
|
||||
|
||||
(B<ifNumber>)
|
||||
(C<ifNumber>)
|
||||
|
||||
=back
|
||||
|
||||
@@ -252,9 +252,17 @@ Gets the number of ports under the interface mib
|
||||
|
||||
=over
|
||||
|
||||
=item $l1->model()
|
||||
|
||||
Cross references $l1->id() with product IDs.
|
||||
|
||||
For HP devices, removes C<'hpswitch'> from the name
|
||||
|
||||
For Cisco devices, removes C<'sysid'> from the name
|
||||
|
||||
=item $l1->vendor()
|
||||
|
||||
Trys to discover the vendor from $l1->model() and $l1->vendor()
|
||||
Tries to discover the vendor from $l1->model() and $l1->vendor()
|
||||
|
||||
=item $l1->ports()
|
||||
|
||||
@@ -264,15 +272,15 @@ Adds the values from rptr_ports() and ports_managed()
|
||||
|
||||
Number of 'groups' in the Repeater MIB
|
||||
|
||||
(B<rptrGroupCapacity>)
|
||||
(C<rptrGroupCapacity>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
=head2 Global Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -283,10 +291,16 @@ to a hash.
|
||||
|
||||
=item $l1->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $l1->i_up()
|
||||
|
||||
Returns reference to map of IIDs to link status.
|
||||
|
||||
=item $l1->i_up_admin()
|
||||
|
||||
Returns reference to map of IIDs to administrative link status.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Repeater MIB
|
||||
@@ -297,32 +311,36 @@ to a hash.
|
||||
|
||||
Number of ports in each group.
|
||||
|
||||
(B<rptrGroupPortCapacity>)
|
||||
(C<rptrGroupPortCapacity>)
|
||||
|
||||
=item $l1->rptr_port()
|
||||
|
||||
Port number in Group
|
||||
|
||||
(B<rptrPortIndex>)
|
||||
(C<rptrPortIndex>)
|
||||
|
||||
=item $l1->rptr_slot()
|
||||
|
||||
Group (slot) Number for given port.
|
||||
|
||||
(B<rptrPortGroupIndex>)
|
||||
(C<rptrPortGroupIndex>)
|
||||
|
||||
=item $l1->rptr_up_admin()
|
||||
|
||||
(B<rptrPortAdminStatus>)
|
||||
(C<rptrPortAdminStatus>)
|
||||
|
||||
=item $l1->rptr_up()
|
||||
|
||||
(B<rptrPortOperStatus>)
|
||||
(C<rptrPortOperStatus>)
|
||||
|
||||
=item $l1->rptr_last_src()
|
||||
|
||||
(C<rptrAddrTrackNewLastSrcAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,66 +1,60 @@
|
||||
# SNMP::Info::Layer1::Allied
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# 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.9;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer1::Allied::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Allied::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Allied::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
# 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';
|
||||
@@ -72,9 +66,9 @@ sub os {
|
||||
|
||||
sub os_ver {
|
||||
my $allied = shift;
|
||||
my $descr = $allied->description();
|
||||
|
||||
if ($descr =~ m/version (\d+\.\d+)/){
|
||||
my $descr = $allied->description();
|
||||
|
||||
if ( $descr =~ m/version (\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
@@ -84,39 +78,40 @@ sub model {
|
||||
|
||||
my $desc = $allied->description();
|
||||
|
||||
if ($desc =~ /(AT-\d{4}\S{1}?)/){
|
||||
if ( $desc =~ /(AT-\d{4}\S{1}?)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_name{
|
||||
my $allied = shift;
|
||||
sub i_name {
|
||||
my $allied = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $allied->i_name2();
|
||||
my $i_name = $allied->orig_i_name($partial) || {};
|
||||
my $ati_p_name = $allied->ati_p_name($partial) || {};
|
||||
|
||||
my $ati_p_name = $allied->ati_p_name();
|
||||
|
||||
foreach my $port (keys %$ati_p_name){
|
||||
foreach my $port ( keys %$ati_p_name ) {
|
||||
my $name = $ati_p_name->{$port};
|
||||
$i_name->{$port} = $name if (defined $name and $name !~ /^\s*$/);
|
||||
$i_name->{$port} = $name if ( defined $name and $name !~ /^\s*$/ );
|
||||
}
|
||||
|
||||
|
||||
return $i_name;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $allied = shift;
|
||||
my $allied = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up = SNMP::Info::Layer1::i_up($allied);
|
||||
my $ati_up = $allied->ati_up();
|
||||
my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
|
||||
my $ati_up = $allied->ati_up($partial) || {};
|
||||
|
||||
foreach my $port (keys %$ati_up){
|
||||
foreach my $port ( keys %$ati_up ) {
|
||||
my $up = $ati_up->{$port};
|
||||
$i_up->{$port} = 'down' if $up eq 'linktesterror';
|
||||
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
|
||||
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
|
||||
}
|
||||
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
1;
|
||||
@@ -128,7 +123,7 @@ SNMP::Info::Layer1::Allied - SNMP Interface to old Allied Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -136,14 +131,13 @@ Max Baker (C<max@warped.org>)
|
||||
my $allied = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myhub',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l1->class();
|
||||
my $class = $allied->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -164,16 +158,14 @@ inherited methods.
|
||||
|
||||
=over
|
||||
|
||||
=item ATI-MIB
|
||||
|
||||
Download for your device from http://www.allied-telesyn.com/allied/support/
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs listed in SNMP::Info::Layer1 and its inherited classes.
|
||||
=item F<ATI-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -198,19 +190,19 @@ Culls Version from description()
|
||||
|
||||
Returns IP Address of Managed Hub.
|
||||
|
||||
(B<actualIpAddr>)
|
||||
(C<actualIpAddr>)
|
||||
|
||||
=item $allied->model()
|
||||
|
||||
Trys to cull out AT-nnnnX out of the description field.
|
||||
Tries to cull out C<AT-nnnnX> out of the description field.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
@@ -233,16 +225,16 @@ the values of ati_up() to 'up' and 'down'.
|
||||
|
||||
=item $allied->ati_p_name()
|
||||
|
||||
(B<portName>)
|
||||
(C<portName>)
|
||||
|
||||
=item $allied->ati_up()
|
||||
|
||||
(B<linkTestLED>)
|
||||
(C<linkTestLED>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,81 +1,72 @@
|
||||
# SNMP::Info::Layer1::Asante
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::Asante;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer1::Asante::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Asante::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Asante::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer1::GLOBALS,
|
||||
);
|
||||
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer1::FUNCS,
|
||||
'i_speed2' => 'ifSpeed',
|
||||
'i_mac2' => 'ifPhysAddress',
|
||||
'i_descr2' => 'ifDescr',
|
||||
'i_name2' => 'ifName',
|
||||
'asante_port' => 'ePortIndex',
|
||||
'asante_group' => 'ePortGrpIndex',
|
||||
'i_type' => 'ePortStateType',
|
||||
'asante_up' => 'ePortStateLinkStatus',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer1::FUNCS,
|
||||
'asante_port' => 'ePortIndex',
|
||||
'asante_group' => 'ePortGrpIndex',
|
||||
'i_type' => 'ePortStateType',
|
||||
'asante_up' => 'ePortStateLinkStatus',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer1::MIBS,
|
||||
'ASANTE-HUB1012-MIB' => 'asante'
|
||||
);
|
||||
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-HUB1012-MIB' => 'asante' );
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer1::MUNGE,
|
||||
'i_mac2' => \&SNMP::Info::munge_mac,
|
||||
'i_speed2' => \&SNMP::Info::munge_speed,
|
||||
);
|
||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
|
||||
|
||||
sub interfaces {
|
||||
my $asante = shift;
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $rptr_port = $asante->rptr_port();
|
||||
my $rptr_port = $asante->rptr_port($partial) || {};
|
||||
|
||||
my %interfaces;
|
||||
|
||||
foreach my $port (keys %$rptr_port){
|
||||
foreach my $port ( keys %$rptr_port ) {
|
||||
$interfaces{$port} = $port;
|
||||
}
|
||||
|
||||
@@ -88,13 +79,13 @@ sub os {
|
||||
|
||||
sub os_ver {
|
||||
my $asante = shift;
|
||||
my $descr = $asante->description();
|
||||
|
||||
if ($descr =~ /software v(\d+\.\d+)/){
|
||||
my $descr = $asante->description();
|
||||
|
||||
if ( $descr =~ /software v(\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
sub vendor {
|
||||
return 'asante';
|
||||
}
|
||||
@@ -102,31 +93,33 @@ sub vendor {
|
||||
sub model {
|
||||
my $asante = shift;
|
||||
|
||||
my $id = $asante->id();
|
||||
my $id = $asante->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $asante = shift;
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $asante_up = $asante->asante_up();
|
||||
my $asante_up = $asante->asante_up($partial) || {};
|
||||
|
||||
my $i_up = {};
|
||||
foreach my $port (keys %$asante_up){
|
||||
foreach my $port ( keys %$asante_up ) {
|
||||
my $up = $asante_up->{$port};
|
||||
$i_up->{$port} = 'down' if $up =~ /on/;
|
||||
$i_up->{$port} = 'up' if $up =~ /off/;
|
||||
$i_up->{$port} = 'up' if $up =~ /off/;
|
||||
}
|
||||
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $asante = shift;
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_speed = $asante->i_speed2();
|
||||
my $i_speed = $asante->orig_i_speed($partial) || {};
|
||||
|
||||
my %i_speed;
|
||||
|
||||
@@ -136,9 +129,10 @@ sub i_speed {
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $asante = shift;
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_mac = $asante->i_mac2();
|
||||
my $i_mac = $asante->orig_i_mac($partial) || {};
|
||||
|
||||
my %i_mac;
|
||||
|
||||
@@ -148,13 +142,14 @@ sub i_mac {
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $asante = shift;
|
||||
my $asante = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $asante->i_descr2();
|
||||
my $i_name = $asante->orig_i_descr($partial) || {};
|
||||
|
||||
my %i_name;
|
||||
|
||||
@@ -162,7 +157,9 @@ sub i_name {
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
@@ -171,7 +168,7 @@ SNMP::Info::Layer1::Asante - SNMP Interface to old Asante 1012 Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -179,14 +176,13 @@ Max Baker (C<max@warped.org>)
|
||||
my $asante = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $asante->class();
|
||||
my $class = $asante->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -206,14 +202,14 @@ Asante device through SNMP.
|
||||
|
||||
=over
|
||||
|
||||
=item ASANTE-HUB1012-MIB
|
||||
|
||||
Download from http://www.mibdepot.com
|
||||
|
||||
=item MIBs listed in SNMP::Info::Layer1
|
||||
=item F<ASANTE-HUB1012-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=head2 Overrides
|
||||
@@ -232,28 +228,36 @@ Culls software version from description()
|
||||
|
||||
Returns 'asante' :)
|
||||
|
||||
=item $asante->root_ip()
|
||||
|
||||
Returns IP Address of Managed Hub.
|
||||
|
||||
(B<actualIpAddr>)
|
||||
|
||||
=item $asante->model()
|
||||
|
||||
Trys to cull out AT-nnnnX out of the description field.
|
||||
Cross references $asante->id() to the F<ASANTE-HUB1012-MIB> and returns
|
||||
the results.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals inherited from SNMP::Info::Layer1
|
||||
=head2 Global Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $asante->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $asante->i_description()
|
||||
|
||||
Description of the interface.
|
||||
|
||||
=item $asante->i_mac()
|
||||
|
||||
MAC address of the interface. Note this is just the MAC of the port, not
|
||||
anything connected to it.
|
||||
|
||||
=item $asante->i_name()
|
||||
|
||||
Returns reference to map of IIDs to human-set port name.
|
||||
@@ -261,7 +265,11 @@ Returns reference to map of IIDs to human-set port name.
|
||||
=item $asante->i_up()
|
||||
|
||||
Returns reference to map of IIDs to link status. Changes
|
||||
the values of ati_up() to 'up' and 'down'.
|
||||
the values of asante_up() to 'up' and 'down'.
|
||||
|
||||
=item $asante->i_speed()
|
||||
|
||||
Speed of the link, human format.
|
||||
|
||||
=back
|
||||
|
||||
@@ -271,16 +279,16 @@ the values of ati_up() to 'up' and 'down'.
|
||||
|
||||
=item $asante->ati_p_name()
|
||||
|
||||
(B<portName>)
|
||||
(C<portName>)
|
||||
|
||||
=item $asante->ati_up()
|
||||
|
||||
(B<linkTestLED>)
|
||||
(C<linkTestLED>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,88 +1,88 @@
|
||||
# SNMP::Info::Layer1::Bayhub
|
||||
# Eric Miller <eric@jeneric.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# Copyright (c) 2008 Eric Miller, Max Baker
|
||||
# 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::Bayhub;
|
||||
$VERSION = 0.9;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::NortelStack;
|
||||
use SNMP::Info::SONMP;
|
||||
use SNMP::Info::NortelStack;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer1::Bayhub::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/;
|
||||
@SNMP::Info::Layer1::Bayhub::ISA
|
||||
= qw/SNMP::Info::SONMP SNMP::Info::NortelStack SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer1::Bayhub::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::NortelStack::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
'S5-ETHERNET-COMMON-MIB' => 's5EnPortTable',
|
||||
'S5-COMMON-STATS-MIB' => 's5CmStat',
|
||||
);
|
||||
$VERSION = '3.03';
|
||||
|
||||
%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::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::NortelStack::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS,
|
||||
);
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::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-COMMON-STATS-MIB::s5CmSNodeTable
|
||||
'bayhub_nb_index' => 's5CmSNodeBrdIndx',
|
||||
'bayhub_np_index' => 's5CmSNodePortIndx',
|
||||
'fw_mac' => 's5CmSNodeMacAddr',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::NortelStack::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::NortelStack::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
);
|
||||
# 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';
|
||||
@@ -93,72 +93,83 @@ sub os {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $bayhub = shift;
|
||||
my $id = $bayhub->id();
|
||||
return undef unless defined $id;
|
||||
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 =~ /BayStackEth/);
|
||||
return '5000' if ($model =~ /5000/);
|
||||
return '5005' if ($model =~ /5005/);
|
||||
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
|
||||
# and port status
|
||||
|
||||
sub i_index {
|
||||
my $bayhub = shift;
|
||||
my $b_index = $bayhub->bayhub_pb_index();
|
||||
my $p_index = $bayhub->bayhub_pp_index();
|
||||
my $model = $bayhub->model();
|
||||
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){
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid}||0;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
if ($model eq 'Baystack Hub') {
|
||||
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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
|
||||
$i_index{$iid} = $index;
|
||||
$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 $i_index = $bayhub->i_index();
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $bayhub->i_index() || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid (keys %$i_index){
|
||||
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);
|
||||
# Index numbers are deterministic slot * 256 + port
|
||||
my $port = $index % 256;
|
||||
my $slot = int( $index / 256 );
|
||||
|
||||
my $slotport = "$slot.$port";
|
||||
|
||||
|
||||
$if{$index} = $slotport;
|
||||
}
|
||||
|
||||
@@ -166,147 +177,195 @@ sub interfaces {
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $bayhub = shift;
|
||||
my $port_index = $bayhub->i_index();
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $bayhub->i_index() || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $iid (keys %$port_index){
|
||||
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;
|
||||
$i_duplex{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $bayhub = shift;
|
||||
my $port_index = $bayhub->i_index();
|
||||
my $bayhub = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $bayhub->i_index() || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $iid (keys %$port_index){
|
||||
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;
|
||||
$i_duplex_admin{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $bayhub = shift;
|
||||
my $port_index = $bayhub->i_index();
|
||||
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){
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
my $speed = '10 Mbps';
|
||||
$i_speed{$index}=$speed;
|
||||
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 $port_index = $bayhub->i_index();
|
||||
my $link_stat = $bayhub->bayhub_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){
|
||||
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;
|
||||
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;
|
||||
|
||||
$i_up{$index} = $link_stat;
|
||||
}
|
||||
return \%i_up;
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $bayhub = shift;
|
||||
my $i_index = $bayhub->i_index();
|
||||
my $link_stat = $bayhub->bayhub_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;
|
||||
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;
|
||||
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 $b_index = $bayhub->bayhub_nb_index();
|
||||
my $p_index = $bayhub->bayhub_np_index();
|
||||
my $model = $bayhub->model();
|
||||
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){
|
||||
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 $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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
$bp_index{$index} = $index;
|
||||
$bp_index{$index} = $index;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $bayhub = shift;
|
||||
my $b_index = $bayhub->bayhub_nb_index();
|
||||
my $p_index = $bayhub->bayhub_np_index();
|
||||
my $model = $bayhub->model();
|
||||
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){
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid}||0;
|
||||
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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
$fw_port{$iid} = $index;
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
|
||||
$fw_port{$iid} = $index;
|
||||
}
|
||||
return \%fw_port;
|
||||
}
|
||||
@@ -319,16 +378,102 @@ 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 Hubs
|
||||
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay/Nortel/Avaya Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller (C<eric@jeneric.org>)
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -337,7 +482,6 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
my $bayhub = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -351,10 +495,11 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Bayhub device through SNMP. Also provides device MAC to port mapping through the propietary MIB.
|
||||
Bay hub device through SNMP. Also provides device MAC to port mapping through
|
||||
the proprietary MIB.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $bayhub = new SNMP::Info::Layer1::Bayhub(...);
|
||||
|
||||
@@ -362,9 +507,7 @@ my $bayhub = new SNMP::Info::Layer1::Bayhub(...);
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::NortelStack
|
||||
|
||||
@@ -376,28 +519,19 @@ my $bayhub = new SNMP::Info::Layer1::Bayhub(...);
|
||||
|
||||
=over
|
||||
|
||||
=item S5-ETHERNET-COMMON-MIB
|
||||
=item F<S5-ETHERNET-COMMON-MIB>
|
||||
|
||||
=item S5-COMMON-STATS-MIB
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::Bridge for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::NortelStack for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::SONMP for its own MIB requirements.
|
||||
=item F<S5-COMMON-STATS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found on the CD that came with your product.
|
||||
=head2 Inherited MIBs
|
||||
|
||||
Or, they can be downloaded directly from Nortel Networks regardless of support
|
||||
contract status. Go to http://www.nortelnetworks.com Technical Support, Browse Technical Support,
|
||||
Select by Product Families, BayStack, BayStack: Hubs - 150 Series, 10BASE-T,
|
||||
Software. Filter on mibs and download the latest version's archive.
|
||||
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
|
||||
|
||||
@@ -407,18 +541,18 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $bayhub->vendor()
|
||||
|
||||
Returns 'Nortel'
|
||||
Returns 'avaya'
|
||||
|
||||
=item $bayhub->os()
|
||||
|
||||
Returns 'Bay Hub'
|
||||
Returns 'bay_hub'
|
||||
|
||||
=item $bayhub->model()
|
||||
|
||||
Cross references $bayhub->id() to the SYNOPTICS-MIB and returns
|
||||
Cross references $bayhub->id() to the F<SYNOPTICS-MIB> and returns
|
||||
the results.
|
||||
|
||||
Removes sreg- from the model name
|
||||
Removes either Baystack Hub, 5000, or 5005 depending on the model.
|
||||
|
||||
=back
|
||||
|
||||
@@ -428,7 +562,8 @@ Removes sreg- from the model name
|
||||
|
||||
=item $bayhub->layers()
|
||||
|
||||
Returns 00000011. Class emulates Layer 2 functionality through proprietary MIBs.
|
||||
Returns 00000011. Class emulates Layer 2 functionality through proprietary
|
||||
MIBs.
|
||||
|
||||
=item $bayhub->index_factor()
|
||||
|
||||
@@ -442,23 +577,19 @@ start at 0. Returns 0.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::NortelStack
|
||||
|
||||
See documentation in SNMP::Info::NortelStack for details.
|
||||
See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in SNMP::Info::SONMP for details.
|
||||
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -471,7 +602,7 @@ to a hash.
|
||||
|
||||
Returns reference to map of IIDs to Interface index.
|
||||
|
||||
Since hubs do not support ifIndex, the interface index is created using the
|
||||
Since hubs do not support C<ifIndex>, the interface index is created using the
|
||||
formula (board * 256 + port).
|
||||
|
||||
=item $bayhub->interfaces()
|
||||
@@ -488,15 +619,26 @@ Returns half, hubs do not support full duplex.
|
||||
|
||||
=item $bayhub->i_speed()
|
||||
|
||||
Currently returns 10 Mbps. The class does not currently support 100 Mbps hubs.
|
||||
Returns interface speed.
|
||||
|
||||
=item $bayhub->i_up()
|
||||
|
||||
Returns (B<s5EnPortLinkStatus>) for each port. Translates on/off to up/down.
|
||||
Returns (C<s5EnPortLinkStatus>) for each port. Translates on/off to up/down.
|
||||
|
||||
=item $bayhub->i_up_admin()
|
||||
|
||||
Returns (B<s5EnPortPartStatus>) for each port.
|
||||
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()
|
||||
|
||||
@@ -505,29 +647,83 @@ both the keys and values.
|
||||
|
||||
=item $bayhub->fw_port()
|
||||
|
||||
Returns reference to map of IIDs of the S5-COMMON-STATS-MIB::s5CmSNodeTable
|
||||
Returns reference to map of IIDs of the C<S5-COMMON-STATS-MIB::s5CmSNodeTable>
|
||||
to the Interface index.
|
||||
|
||||
=item $bayhub->fw_mac()
|
||||
|
||||
(B<s5CmSNodeMacAddr>)
|
||||
(C<s5CmSNodeMacAddr>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
=head2 Pseudo F<ENTITY-MIB> Information
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
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.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
=over
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
=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 documentation in SNMP::Info::NortelStack for details.
|
||||
See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in SNMP::Info::SONMP for details.
|
||||
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
444
Info/Layer1/Cyclades.pm
Normal file
444
Info/Layer1/Cyclades.pm
Normal file
@@ -0,0 +1,444 @@
|
||||
# SNMP::Info::Layer1::Cyclades
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::Cyclades;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer1::Cyclades::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||
@SNMP::Info::Layer1::Cyclades::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer1::MIBS,
|
||||
'CYCLADES-ACS-SYS-MIB' => 'cyACSversion',
|
||||
'CYCLADES-ACS-CONF-MIB' => 'cyEthIPaddr',
|
||||
'CYCLADES-ACS-INFO-MIB' => 'cyISPortTty',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
|
||||
# CYCLADES-ACS-SYS-MIB
|
||||
%SNMP::Info::Layer1::GLOBALS,
|
||||
'os_ver' => 'cyACSversion',
|
||||
'cy_model' => 'cyACSpname',
|
||||
'serial' => 'cyACSDevId',
|
||||
'root_ip' => 'cyEthIPaddr',
|
||||
'ps1_status' => 'cyACSPw1',
|
||||
'ps2_status' => 'cyACSPw2',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer1::FUNCS,
|
||||
|
||||
# CYCLADES-ACS-INFO-MIB::cyInfoSerialTable
|
||||
'cy_port_tty' => 'cyISPortTty',
|
||||
'cy_port_name' => 'cyISPortName',
|
||||
'cy_port_speed' => 'cyISPortSpeed',
|
||||
'cy_port_cd' => 'cyISPortSigCD',
|
||||
|
||||
# CYCLADES-ACS-CONF-MIB::cySerialPortTable
|
||||
'cy_port_socket' => 'cySPortSocketPort',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
|
||||
|
||||
# These devices don't have a FDB and we probably don't want to poll for ARP
|
||||
# cache so turn off reported L2/L3.
|
||||
sub layers {
|
||||
return '01000001';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'cyclades';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'cyclades';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $cyclades = shift;
|
||||
|
||||
my $model = $cyclades->cy_model();
|
||||
|
||||
return unless defined $model;
|
||||
|
||||
return lc($model);
|
||||
}
|
||||
|
||||
# Extend interface methods to include serial ports
|
||||
#
|
||||
# Partials don't really help in this class, but implemented
|
||||
# for consistency
|
||||
|
||||
sub i_index {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $orig_index = $cyclades->orig_i_index($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
|
||||
my %i_index;
|
||||
foreach my $iid ( keys %$orig_index ) {
|
||||
my $index = $orig_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
$i_index{$iid} = $index;
|
||||
}
|
||||
|
||||
# Use alternative labeling system for the serial port, listening socket
|
||||
# to avoid conflicts with ifIndex.
|
||||
foreach my $iid ( keys %$cy_index ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
$i_index{$index} = $index;
|
||||
}
|
||||
|
||||
return \%i_index;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $cyclades->orig_i_description($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
my $cy_p_tty = $cyclades->cy_port_tty() || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
my $descr = $i_descr->{$iid};
|
||||
next unless defined $descr;
|
||||
|
||||
$if{$iid} = $descr;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$cy_p_tty ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $name = $cy_p_tty->{$iid};
|
||||
next unless defined $name;
|
||||
|
||||
$if{$index} = $name;
|
||||
}
|
||||
|
||||
return \%if;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_speed = $cyclades->orig_i_speed($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
my $cy_p_speed = $cyclades->cy_port_speed() || {};
|
||||
|
||||
my %i_speed;
|
||||
foreach my $iid ( keys %$i_speed ) {
|
||||
my $speed = $i_speed->{$iid};
|
||||
next unless defined $speed;
|
||||
|
||||
$i_speed{$iid} = $speed;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$cy_p_speed ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $speed = $cy_p_speed->{$iid};
|
||||
next unless defined $speed;
|
||||
|
||||
$i_speed{$index} = $speed;
|
||||
}
|
||||
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up = $cyclades->orig_i_up($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
my $cy_p_up = $cyclades->cy_port_cd() || {};
|
||||
|
||||
my %i_up;
|
||||
foreach my $iid ( keys %$i_up ) {
|
||||
my $up = $i_up->{$iid};
|
||||
next unless defined $up;
|
||||
|
||||
$i_up{$iid} = $up;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$cy_p_up ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $up = $cy_p_up->{$iid};
|
||||
next unless defined $up;
|
||||
|
||||
$i_up{$index} = $up;
|
||||
}
|
||||
|
||||
return \%i_up;
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_desc = $cyclades->orig_i_description($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
my $cy_p_desc = $cyclades->cy_port_name() || {};
|
||||
|
||||
my %descr;
|
||||
foreach my $iid ( keys %$i_desc ) {
|
||||
my $desc = $i_desc->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
$descr{$iid} = $desc;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$cy_p_desc ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $desc = $cy_p_desc->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
$descr{$index} = $desc;
|
||||
}
|
||||
|
||||
return \%descr;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $cyclades = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $cyclades->orig_i_name($partial) || {};
|
||||
my $cy_index = $cyclades->cy_port_socket() || {};
|
||||
my $cy_p_desc = $cyclades->cy_port_name() || {};
|
||||
|
||||
my %i_name;
|
||||
foreach my $iid ( keys %$i_name ) {
|
||||
my $name = $i_name->{$iid};
|
||||
next unless defined $name;
|
||||
|
||||
$i_name{$iid} = $name;
|
||||
}
|
||||
|
||||
foreach my $iid ( keys %$cy_p_desc ) {
|
||||
my $index = $cy_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $name = $cy_p_desc->{$iid};
|
||||
next unless defined $name;
|
||||
|
||||
$i_name{$index} = $name;
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1::Cyclades - SNMP Interface to Cyclades terminal servers
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $cyclades = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $cyclades->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Cyclades device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $cyclades = new SNMP::Info::Layer1::Cyclades(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer1
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CYCLADES-ACS-SYS-MIB>
|
||||
|
||||
=item F<CYCLADES-ACS-CONF-MIB>
|
||||
|
||||
=item F<CYCLADES-ACS-INFO-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cyclades->os_ver()
|
||||
|
||||
(C<cyACSversion>)
|
||||
|
||||
=item $cyclades->serial()
|
||||
|
||||
(C<cyACSDevId>)
|
||||
|
||||
=item $cyclades->root_ip()
|
||||
|
||||
(C<cyEthIPaddr>)
|
||||
|
||||
=item $cyclades->ps1_status()
|
||||
|
||||
(C<cyACSPw1>)
|
||||
|
||||
=item $cyclades->ps2_status()
|
||||
|
||||
(C<cyACSPw2>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $cyclades->layers()
|
||||
|
||||
Returns 01000001. These devices don't have a FDB and we probably don't want
|
||||
to poll for an ARP cache so turn off reported Layer 2 and Layer 3.
|
||||
|
||||
=item $cyclades->vendor()
|
||||
|
||||
Returns 'cyclades'
|
||||
|
||||
=item $cyclades->os()
|
||||
|
||||
Returns 'cyclades'
|
||||
|
||||
=item $cyclades->model()
|
||||
|
||||
Returns lower case (C<cyACSpname>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer1
|
||||
|
||||
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $cyclades->i_index()
|
||||
|
||||
Returns reference to map of IIDs to Interface index.
|
||||
|
||||
Extended to include serial ports. Serial ports are indexed with the
|
||||
alternative labeling system for the serial port, the listening socket port
|
||||
C<cySPortSocketPort> to avoid conflicts with C<ifIndex>.
|
||||
|
||||
=item $cyclades->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to physical ports. Extended to include
|
||||
serial ports, C<cyISPortTty>.
|
||||
|
||||
=item $cyclades->i_speed()
|
||||
|
||||
Returns interface speed. Extended to include serial ports, C<cyISPortSpeed>.
|
||||
|
||||
=item $cyclades->i_up()
|
||||
|
||||
Returns link status for each port. Extended to include serial ports,
|
||||
C<cyISPortSigCD>.
|
||||
|
||||
=item $cyclades->i_description()
|
||||
|
||||
Returns description of each port. Extended to include serial ports,
|
||||
C<cyISPortName>.
|
||||
|
||||
=item $cyclades->i_name()
|
||||
|
||||
Returns name of each port. Extended to include serial ports, C<cyISPortName>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
||||
|
||||
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
548
Info/Layer1/S3000.pm
Normal file
548
Info/Layer1/S3000.pm
Normal file
@@ -0,0 +1,548 @@
|
||||
# SNMP::Info::Layer1::S3000
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer1::S3000;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer1::S3000::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer1::S3000::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'SYNOPTICS-ETHERNET-MIB' => 's3EnetPortTable',
|
||||
'SYNOPTICS-COMMON-MIB' => 's3AgentType',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
|
||||
# From SYNOPTICS-COMMON-MIB
|
||||
'os_bin' => 's3AgentFwVer',
|
||||
's3000_major_ver' => 's3AgentSwMajorVer',
|
||||
's3000_minor_ver' => 's3AgentSwMinorVer',
|
||||
's3000_maint_ver' => 's3AgentSwMaintVer',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
|
||||
# SYNOPTICS-ETHERNET-MIB::s3EnetPortTable
|
||||
's3000_pb_index' => 's3EnetPortBoardIndex',
|
||||
's3000_pp_index' => 's3EnetPortIndex',
|
||||
's3000_up_admin' => 's3EnetPortPartStatus',
|
||||
's3000_up' => 's3EnetPortLinkStatus',
|
||||
|
||||
# SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable
|
||||
's3000_nb_index' => 's3EnetShowNodesSlotIndex',
|
||||
's3000_np_index' => 's3EnetShowNodesPortIndex',
|
||||
'fw_mac' => 's3EnetShowNodesMacAddress',
|
||||
|
||||
# SYNOPTICS-ETHERNET-MIB::s3EnetTopNmmTable
|
||||
's3000_topo_port' => 's3EnetTopNmmPort',
|
||||
's3000_topo_mac' => 's3EnetTopNmmMacAddr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, 's3000_topo_mac' => \&SNMP::Info::munge_mac
|
||||
);
|
||||
|
||||
sub layers {
|
||||
return '00000011';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'synoptics';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $s3000 = shift;
|
||||
my $id = $s3000->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
$model =~ s/^s3reg-//i;
|
||||
|
||||
return $1 if ( $model =~ /((\d+){3}[\dX])/ );
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $s3000 = shift;
|
||||
my $major_ver = $s3000->s3000_major_ver() || 0;
|
||||
my $minor_ver = $s3000->s3000_minor_ver() || 0;
|
||||
my $maint_ver = $s3000->s3000_maint_ver() || 0;
|
||||
|
||||
my $ver = "$major_ver.$minor_ver.$maint_ver";
|
||||
return $ver;
|
||||
}
|
||||
|
||||
sub mac {
|
||||
my $s3000 = shift;
|
||||
my $topo_port = $s3000->s3000_topo_port();
|
||||
my $topo_mac = $s3000->s3000_topo_mac();
|
||||
|
||||
foreach my $entry ( keys %$topo_port ) {
|
||||
my $port = $topo_port->{$entry};
|
||||
next unless $port == 0;
|
||||
my $mac = $topo_mac->{$entry};
|
||||
return $mac;
|
||||
}
|
||||
|
||||
# Topology turned off, not supported.
|
||||
return;
|
||||
}
|
||||
|
||||
# Hubs do not support ifMIB requirements for get MAC
|
||||
# and port status
|
||||
|
||||
sub i_index {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $s3000->s3000_pb_index($partial) || {};
|
||||
my $p_index = $s3000->s3000_pp_index($partial) || {};
|
||||
|
||||
my %i_index;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
# We need to make up an index for multiple board instances.
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
|
||||
$i_index{$iid} = $index;
|
||||
}
|
||||
return \%i_index;
|
||||
}
|
||||
|
||||
# Partials don't really help in this class, but implemented
|
||||
# for consistency
|
||||
|
||||
sub interfaces {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $s3000->i_index() || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# Index numbers are deterministic slot * 256 + port - see i_index()
|
||||
my $port = $index % 256;
|
||||
my $slot = int( $index / 256 );
|
||||
|
||||
my $slotport = "$slot.$port";
|
||||
|
||||
$if{$index} = $slotport;
|
||||
}
|
||||
|
||||
return \%if;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# Hubs only function half duplex
|
||||
my $duplex = 'half';
|
||||
$i_duplex{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# Hubs only function half duplex
|
||||
my $duplex = 'half';
|
||||
$i_duplex_admin{$index} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
|
||||
my %i_speed;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
# These hubs only support 10 Mbs
|
||||
my $speed = '10000000';
|
||||
$i_speed{$index} = $speed;
|
||||
}
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $port_index = $s3000->i_index() || {};
|
||||
my $link_stat = $s3000->s3000_up() || {};
|
||||
|
||||
my %i_up;
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $link_stat = $link_stat->{$iid};
|
||||
next unless defined $link_stat;
|
||||
|
||||
$link_stat = 'up' if $link_stat =~ /on/i;
|
||||
$link_stat = 'down' if $link_stat =~ /off/i;
|
||||
|
||||
$i_up{$index} = $link_stat;
|
||||
}
|
||||
return \%i_up;
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $s3000->i_index() || {};
|
||||
my $link_stat = $s3000->s3000_up_admin() || {};
|
||||
|
||||
my %i_up_admin;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
my $link_stat = $link_stat->{$iid};
|
||||
next unless defined $link_stat;
|
||||
|
||||
$i_up_admin{$index} = $link_stat;
|
||||
}
|
||||
return \%i_up_admin;
|
||||
}
|
||||
|
||||
sub set_i_up_admin {
|
||||
|
||||
# map setting to those the hub will understand
|
||||
my %setting = qw/up 2 down 3/;
|
||||
|
||||
my $s3000 = shift;
|
||||
my ( $setting, $iid ) = @_;
|
||||
|
||||
my $i_index = $s3000->i_index() || {};
|
||||
my %reverse_i_index = reverse %$i_index;
|
||||
|
||||
$setting = lc($setting);
|
||||
|
||||
return 0 unless defined $setting{$setting};
|
||||
|
||||
$iid = $reverse_i_index{$iid};
|
||||
|
||||
return $s3000->set_s3000_up_admin( $setting{$setting}, $iid );
|
||||
}
|
||||
|
||||
# Hubs do not support the standard Bridge MIB
|
||||
sub bp_index {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $s3000->s3000_nb_index() || {};
|
||||
my $p_index = $s3000->s3000_np_index() || {};
|
||||
my $model = $s3000->model();
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||
|
||||
$bp_index{$index} = $index;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $s3000 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $b_index = $s3000->s3000_nb_index($partial) || {};
|
||||
my $p_index = $s3000->s3000_np_index($partial) || {};
|
||||
my $model = $s3000->model();
|
||||
|
||||
my %fw_port;
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $board = $b_index->{$iid};
|
||||
next unless defined $board;
|
||||
my $port = $p_index->{$iid} || 0;
|
||||
|
||||
my $index = ( $board * 256 ) + $port;
|
||||
|
||||
$fw_port{$iid} = $index;
|
||||
}
|
||||
return \%fw_port;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer1::S3000 - SNMP Interface to Synoptics / Nortel Hubs
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $s3000 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $s3000->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Bay hub device through SNMP. Also provides device MAC to port mapping through
|
||||
the proprietary MIB.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $s3000 = new SNMP::Info::Layer1::S3000(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<SYNOPTICS-COMMON-MIB>
|
||||
|
||||
=item F<SYNOPTICS-ETHERNET-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $s3000->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
|
||||
=item $s3000->os()
|
||||
|
||||
Returns 'synoptics'
|
||||
|
||||
=item $s3000->model()
|
||||
|
||||
Cross references $s3000->id() to the F<SYNOPTICS-MIB> and returns
|
||||
the results.
|
||||
|
||||
Removes C<sreg-> from the model name and returns only the numeric model
|
||||
identifier.
|
||||
|
||||
=item $stack->os_ver()
|
||||
|
||||
Returns the software version specified as major.minor.maint.
|
||||
|
||||
(C<s3AgentSwMajorVer>).(C<s3AgentSwMinorVer>).(C<s3AgentSwMaintVer>)
|
||||
|
||||
=item $stack->os_bin()
|
||||
|
||||
Returns the firmware version. (C<s3AgentFwVer>)
|
||||
|
||||
=item $s3000->mac()
|
||||
|
||||
Returns MAC of the advertised IP address of the device.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $s3000->layers()
|
||||
|
||||
Returns 00000011. Class emulates Layer 2 functionality through proprietary
|
||||
MIBs.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $s3000->i_index()
|
||||
|
||||
Returns reference to map of IIDs to Interface index.
|
||||
|
||||
Since hubs do not support C<ifIndex>, the interface index is created using the
|
||||
formula (board * 256 + port). This is required to support devices with more
|
||||
than one module.
|
||||
|
||||
=item $s3000->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to physical ports.
|
||||
|
||||
=item $s3000->i_duplex()
|
||||
|
||||
Returns half, hubs do not support full duplex.
|
||||
|
||||
=item $s3000->i_duplex_admin()
|
||||
|
||||
Returns half, hubs do not support full duplex.
|
||||
|
||||
=item $s3000->i_speed()
|
||||
|
||||
Returns 10000000. The hubs only support 10 Mbs Ethernet.
|
||||
|
||||
=item $s3000->i_up()
|
||||
|
||||
Returns (C<s3EnetPortLinkStatus>) for each port. Translates on/off to
|
||||
up/down.
|
||||
|
||||
=item $s3000->i_up_admin()
|
||||
|
||||
Returns (C<s3EnetPortPartStatus>) for each port.
|
||||
|
||||
=item $s3000->set_i_up_admin(state, ifIndex)
|
||||
|
||||
Sets port state, must be supplied with state and port C<ifIndex>
|
||||
|
||||
State choices are 'up' or 'down'
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$s3000->interfaces()};
|
||||
$s3000->set_i_up_admin('down', $if_map{'1.1'})
|
||||
or die "Couldn't change port state. ",$s3000->error(1);
|
||||
|
||||
=item $s3000->bp_index()
|
||||
|
||||
Simulates bridge MIB by returning reference to a hash containing the index for
|
||||
both the keys and values.
|
||||
|
||||
=item $s3000->fw_port()
|
||||
|
||||
Returns reference to map of IIDs of the
|
||||
C<SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable> to the Interface index.
|
||||
|
||||
=item $s3000->fw_mac()
|
||||
|
||||
(C<s3EnetShowNodesMacAddress>)
|
||||
|
||||
=item $s3000->s3000_topo_port()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Port Number
|
||||
(interface iid)
|
||||
|
||||
(C<s3EnetTopNmmPort>)
|
||||
|
||||
=item $s3000->s3000_topo_mac()
|
||||
|
||||
(C<s3EnetTopNmmMacAddr>)
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value:Remote MAC address
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
264
Info/Layer2.pm
264
Info/Layer2.pm
@@ -1,101 +1,89 @@
|
||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
|
||||
# Max Baker <max@warped.org>
|
||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker -- All changes from Version 0.7 on
|
||||
# Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::PowerEthernet;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
|
||||
|
||||
@SNMP::Info::Layer2::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::CDP SNMP::Info::CiscoStats Exporter/;
|
||||
@SNMP::Info::Layer2::ISA
|
||||
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet Exporter/;
|
||||
@SNMP::Info::Layer2::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
'CISCO-PRODUCTS-MIB' => 'sysName', # for model()
|
||||
'CISCO-STACK-MIB' => 'wsc1900sysID', # some older catalysts live here
|
||||
'ENTITY-MIB' => 'entPhysicalName', # for serial stuff
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
'serial1' => '.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||
);
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::PowerEthernet::GLOBALS,
|
||||
'serial1' =>
|
||||
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
'ent_serial' => 'entPhysicalSerialNum',
|
||||
'ent_chassis'=> 'entPhysicalDescr',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
);
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::PowerEthernet::MUNGE,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
# $l2->model() - Looks at sysObjectID which gives the oid of the system
|
||||
# name, contained in a propriatry MIB.
|
||||
# name, contained in a propriatry MIB.
|
||||
sub model {
|
||||
my $l2 = shift;
|
||||
my $id = $l2->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
my $l2 = shift;
|
||||
my $id = $l2->id();
|
||||
my $model = &SNMP::translateObj($id) || $id || '';
|
||||
|
||||
# HP
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
@@ -108,15 +96,15 @@ sub model {
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l2 = shift;
|
||||
my $l2 = shift;
|
||||
my $model = $l2->model();
|
||||
my $descr = $l2->description();
|
||||
|
||||
if ($model =~ /hp/i or $descr =~ /hp/i) {
|
||||
if ( $model =~ /hp/i or $descr =~ /\bhp\b/i ) {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
if ($model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i) {
|
||||
if ( $model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i ) {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
@@ -124,64 +112,55 @@ sub vendor {
|
||||
|
||||
sub serial {
|
||||
my $l2 = shift;
|
||||
|
||||
my $serial1 = $l2->serial1();
|
||||
my $ent_chassis = $l2->ent_chassis() || {};
|
||||
my $ent_serial = $l2->ent_serial() || {};
|
||||
|
||||
my $serial2 = $ent_serial->{1} || undef;
|
||||
my $chassis = $ent_chassis->{1} || undef;
|
||||
|
||||
my $serial1 = $l2->serial1();
|
||||
my $e_descr = $l2->e_descr() || {};
|
||||
my $e_serial = $l2->e_serial() || {};
|
||||
|
||||
my $serial2 = $e_serial->{1} || undef;
|
||||
my $chassis = $e_descr->{1} || undef;
|
||||
|
||||
# precedence
|
||||
# serial2,chassis parse,serial1
|
||||
return $serial2 if (defined $serial2 and $serial2 !~ /^\s*$/);
|
||||
return $1 if (defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i);
|
||||
return $serial1 if (defined $serial1 and $serial1 !~ /^\s*$/);
|
||||
return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
|
||||
return $1
|
||||
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
|
||||
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
|
||||
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l2 = shift;
|
||||
my $l2 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_type = $l2->i_type();
|
||||
my $i_type = $l2->i_type($partial) || {};
|
||||
|
||||
my %i_ignore = ();
|
||||
|
||||
foreach my $if (keys %$i_type){
|
||||
foreach my $if ( keys %$i_type ) {
|
||||
my $type = $i_type->{$if};
|
||||
$i_ignore{$if}++
|
||||
if $type =~ /(loopback|propvirtual|other|cpu)/i;
|
||||
$i_ignore{$if}++
|
||||
if $type =~ /(loopback|other|cpu)/i;
|
||||
}
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
}
|
||||
|
||||
# By Default we'll use the description field
|
||||
sub interfaces {
|
||||
my $l2 = shift;
|
||||
my $interfaces = $l2->i_index();
|
||||
my $i_descr = $l2->i_description();
|
||||
my $i_name = $l2->i_name();
|
||||
my $l2 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %if;
|
||||
foreach my $iid (keys %$interfaces){
|
||||
my $interfaces = $l2->i_index($partial) || {};
|
||||
my $i_descr = $l2->i_description($partial) || {};
|
||||
|
||||
# Replace the Index with the ifDescr field.
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
my $port = $i_descr->{$iid};
|
||||
my $name = $i_name->{$iid};
|
||||
$port = $name if (defined $name and $name !~ /^\s*$/);
|
||||
next unless defined $port;
|
||||
|
||||
# Cisco 1900 has a space in some of its port descr.
|
||||
# get rid of any weird characters
|
||||
$port =~ s/[^\d\/,()\w]+//gi;
|
||||
|
||||
# Translate Cisco 2926,etc. from 1/5 to 1.5
|
||||
$port =~ s/\//\./ if ($port =~ /^\d+\/\d+$/);
|
||||
|
||||
$if{$iid} = $port;
|
||||
$interfaces->{$iid} = $port;
|
||||
}
|
||||
|
||||
return \%if
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -189,11 +168,11 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2 - Perl5 Interface to network devices serving Layer2 only.
|
||||
SNMP::Info::Layer2 - SNMP Interface to network devices serving Layer2 only.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -201,7 +180,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $l2 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -224,14 +202,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes listed under
|
||||
SNMP::Info::Layer2::* Please read all docs under SNMP::Info first.
|
||||
This class is usually used as a superclass for more specific device classes
|
||||
listed under SNMP::Info::Layer2::* Please read all docs under SNMP::Info
|
||||
first.
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Layer2 device through SNMP. Information is stored in a number of MIBs.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $l2 = new SNMP::Info::Layer2(...);
|
||||
|
||||
@@ -243,9 +222,7 @@ a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=back
|
||||
|
||||
@@ -253,21 +230,13 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-PRODUCTS-MIB
|
||||
|
||||
Needed for ID of Cisco Products
|
||||
|
||||
=item CISCO-STACK-MIB
|
||||
|
||||
Needed for ID of Cisco Products
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
MIBs can be found in netdisco-mibs package.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -282,31 +251,31 @@ These are methods that return scalar value from SNMP
|
||||
Cross references $l2->id() with product IDs in the
|
||||
Cisco MIBs.
|
||||
|
||||
For HP devices, removes 'hpswitch' from the name
|
||||
For HP devices, removes C<'hpswitch'> from the name
|
||||
|
||||
For Cisco devices, removes 'sysid' from the name
|
||||
For Cisco devices, removes c<'sysid'> from the name
|
||||
|
||||
=item $l2->vendor()
|
||||
|
||||
Trys to discover the vendor from $l2->model() and $l2->description()
|
||||
Tries to discover the vendor from $l2->model() and $l2->description()
|
||||
|
||||
=item $l2->serial()
|
||||
|
||||
Returns serial number if available through SNMP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
=head2 Globals imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
@@ -319,32 +288,29 @@ to a hash.
|
||||
|
||||
=item $l2->interfaces()
|
||||
|
||||
Creates a map between the interface identifier (iid) and the physical port name.
|
||||
Creates a map between the interface identifier (iid) and the physical port
|
||||
name.
|
||||
|
||||
Defaults to B<ifDescr> but checks and overrides with B<ifName>
|
||||
Defaults to C<ifDescr> but checks and overrides with C<ifName>
|
||||
|
||||
=item $l2->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores ports with B<ifType> of loopback,propvirtual,other, and cpu
|
||||
Ignores ports with C<ifType> of loopback, propvirtual, other, and cpu
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
385
Info/Layer2/Airespace.pm
Normal file
385
Info/Layer2/Airespace.pm
Normal file
@@ -0,0 +1,385 @@
|
||||
# SNMP::Info::Layer2::Airespace
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Airespace;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::Airespace;
|
||||
|
||||
@SNMP::Info::Layer2::Airespace::ISA
|
||||
= qw/SNMP::Info::Airespace SNMP::Info::CDP SNMP::Info::Bridge Exporter/;
|
||||
@SNMP::Info::Layer2::Airespace::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::CDP::MIBS, %SNMP::Info::Airespace::MIBS,
|
||||
'CISCO-LWAPP-DOT11-CLIENT-MIB' => 'cldcClientCurrentTxRateSet',
|
||||
'CISCO-LWAPP-DOT11-MIB' => 'cldHtDot11nChannelBandwidth',
|
||||
'CISCO-LWAPP-AP-MIB' => 'cLApIfMacAddress',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS, %SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS, %SNMP::Info::Airespace::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS, %SNMP::Info::Airespace::FUNCS,
|
||||
# CISCO-LWAPP-AP-MIB::cLApTable
|
||||
'ap_if_mac' => 'cLApIfMacAddress',
|
||||
# CISCO-LWAPP-DOT11-CLIENT-MIB::cldcClientTable
|
||||
'client_txrate' => 'cldcClientCurrentTxRateSet',
|
||||
'cd11_proto' => 'cldcClientProtocol',
|
||||
'cd11_rateset' => 'cldcClientDataRateSet',
|
||||
# CISCO-LWAPP-DOT11-MIB::cldHtMacOperationsTable
|
||||
'cd11n_ch_bw' => 'cldHtDot11nChannelBandwidth',
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::MUNGE, %SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE, %SNMP::Info::Airespace::MUNGE,
|
||||
'ap_if_mac' => \&SNMP::Info::munge_mac,
|
||||
'cd11n_ch_bw' => \&munge_cd11n_ch_bw,
|
||||
'cd11_rateset' => \&munge_cd11_rateset,
|
||||
'cd11_proto' => \&munge_cd11_proto,
|
||||
);
|
||||
|
||||
# 802.11n Modulation and Coding Scheme (MCS)
|
||||
my $mcs_index = {
|
||||
20 => {
|
||||
m0 => '6.5',
|
||||
m1 => '13',
|
||||
m2 => '19.5',
|
||||
m3 => '26',
|
||||
m4 => '39',
|
||||
m5 => '52',
|
||||
m6 => '58.5',
|
||||
m7 => '65',
|
||||
m8 => '13',
|
||||
m9 => '26',
|
||||
m10 => '39',
|
||||
m11 => '52',
|
||||
m12 => '78',
|
||||
m13 => '104',
|
||||
m14 => '117',
|
||||
m15 => '130',
|
||||
# This is a cheat for 802.11a bonded
|
||||
m108 => '108',
|
||||
},
|
||||
40 => {
|
||||
m0 => '15',
|
||||
m1 => '30',
|
||||
m2 => '45',
|
||||
m3 => '60',
|
||||
m4 => '90',
|
||||
m5 => '120',
|
||||
m6 => '135',
|
||||
m7 => '157.5',
|
||||
m8 => '30',
|
||||
m9 => '60',
|
||||
m10 => '90',
|
||||
m11 => '120',
|
||||
m12 => '180',
|
||||
m13 => '240',
|
||||
m14 => '270',
|
||||
m15 => '300',
|
||||
}
|
||||
};
|
||||
|
||||
sub os {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $airespace = shift;
|
||||
my $model = $airespace->airespace_model();
|
||||
return unless defined $model;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub cd11_mac {
|
||||
my $airespace = shift;
|
||||
my $cd11_sigstrength = $airespace->cd11_sigstrength();
|
||||
|
||||
my $ret = {};
|
||||
foreach my $idx ( keys %$cd11_sigstrength ) {
|
||||
my $mac = join( ":", map { sprintf "%02x", $_ } split /\./, $idx );
|
||||
$ret->{$idx} = $mac
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub cd11_txrate {
|
||||
my $airespace = shift;
|
||||
|
||||
my $rates = $airespace->client_txrate() || {};
|
||||
my $protos = $airespace->cd11_proto() || {};
|
||||
my $bws = $airespace->cd11n_ch_bw() || {};
|
||||
|
||||
my $cd11_txrate = {};
|
||||
foreach my $idx ( keys %$rates ) {
|
||||
my $rate = $rates->{$idx} || '0.0';
|
||||
|
||||
if ( $rate =~ /^\d+/ ) {
|
||||
$cd11_txrate->{$idx} = [ $rate * 1.0 ];
|
||||
}
|
||||
elsif ( $rate =~ /^m/ ) {
|
||||
my $band = $protos->{$idx};
|
||||
my $bw = $bws->{$band};
|
||||
$cd11_txrate->{$idx} = [ $mcs_index->{$bw}->{$rate} || '0.0' ];
|
||||
}
|
||||
else {
|
||||
$cd11_txrate->{$idx} = [ $rate ];
|
||||
}
|
||||
}
|
||||
return $cd11_txrate;
|
||||
}
|
||||
|
||||
sub munge_cd11n_ch_bw {
|
||||
my $bw = shift;
|
||||
|
||||
if ( $bw =~ /forty/ ) {
|
||||
return 40;
|
||||
}
|
||||
return 20;
|
||||
}
|
||||
|
||||
sub munge_cd11_proto {
|
||||
my $bw = shift;
|
||||
|
||||
return 2 if ( $bw eq 'dot11n5' );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub munge_cd11_rateset {
|
||||
my $rates = shift;
|
||||
return [ map { $_ * 1.0 } split /,/, $rates ];
|
||||
}
|
||||
|
||||
# Cisco provides the AP's Ethernet MAC via
|
||||
# CISCO-LWAPP-AP-MIB::cLApIfMacAddress this was not available pre-Cisco
|
||||
sub i_mac {
|
||||
my $airespace = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $airespace->i_index($partial) || {};
|
||||
my $ap_mac = $airespace->ap_if_mac() || {};
|
||||
|
||||
my $i_mac = $airespace->SUPER::i_mac() || {};
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
$index =~ s/\.\d+$//;
|
||||
next unless defined $index;
|
||||
my $sys_mac = join( '.', map { hex($_) } split( ':', $index ) );
|
||||
my $mac = $ap_mac->{$sys_mac};
|
||||
$i_mac->{$iid} = $mac;
|
||||
}
|
||||
}
|
||||
return $i_mac;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Airespace - SNMP Interface to Cisco (Airespace) Wireless
|
||||
Controllers
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $airespace = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $airespace->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from
|
||||
Cisco (Airespace) Wireless Controllers through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $airespace = new SNMP::Info::Layer2::Airespace(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Airespace
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-LWAPP-DOT11-CLIENT-MIB>
|
||||
|
||||
=item F<CISCO-LWAPP-DOT11-MIB>
|
||||
|
||||
=item F<CISCO-LWAPP-AP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $airespace->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $airespace->os()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $airespace->model()
|
||||
|
||||
(C<agentInventoryMachineModel>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Airespace
|
||||
|
||||
See documentation in L<SNMP::Info::Airespace/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item cd11_mac()
|
||||
|
||||
Returns client radio interface MAC addresses.
|
||||
|
||||
=item cd11_txrate()
|
||||
|
||||
Returns client transmission speed in Mbs.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item i_mac()
|
||||
|
||||
Adds AP Ethernet MAC as port mac on radio ports from C<CISCO-LWAPP-AP-MIB>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Airespace
|
||||
|
||||
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item munge_cd11n_ch_bw()
|
||||
|
||||
Converts 802.11n channel bandwidth to either 20 or 40.
|
||||
|
||||
=item munge_cd11_proto()
|
||||
|
||||
Converts 802.11n 2.4Ghz to 1 and 5Ghz to 2 to correspond to the
|
||||
(C<cldHtMacOperationsTable>) index.
|
||||
|
||||
=item munge_cd11_rateset()
|
||||
|
||||
Converts rate set to array.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
@@ -1,89 +1,132 @@
|
||||
# SNMP::Info::Layer2::Aironet
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Aironet;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::EtherLike;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::IEEE802dot11;
|
||||
|
||||
@SNMP::Info::Layer2::Aironet::ISA = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
|
||||
SNMP::Info::CiscoVTP Exporter/;
|
||||
@SNMP::Info::Layer2::Aironet::ISA
|
||||
= qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
|
||||
@SNMP::Info::Layer2::Aironet::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
'serial' => 'entPhysicalSerialNum.1',
|
||||
'descr' => 'sysDescr'
|
||||
);
|
||||
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'serial' => 'entPhysicalSerialNum.1',
|
||||
'descr' => 'sysDescr'
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
'i_80211channel' => 'cd11IfPhyDsssCurrentChannel',
|
||||
'c_dot11subif' => 'cDot11ClientSubIfIndex',
|
||||
'cd11_rateset' => 'cDot11ClientDataRateSet',
|
||||
'cd11_txrate' => 'cDot11ClientCurrentTxRateSet',
|
||||
'cd11_uptime' => 'cDot11ClientUpTime',
|
||||
'cd11_sigstrength' => 'cDot11ClientSignalStrength',
|
||||
'cd11_sigqual' => 'cDot11ClientSigQuality',
|
||||
'cd11_rxpkt' => 'cDot11ClientPacketsReceived',
|
||||
'cd11_txpkt' => 'cDot11ClientPacketsSent',
|
||||
'cd11_rxbyte' => 'cDot11ClientBytesReceived',
|
||||
'cd11_txbyte' => 'cDot11ClientBytesSent',
|
||||
'mbss_mac_addr' => 'cdot11MbssidIfMacAddress',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::IEEE802dot11::MIBS,
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
'CISCO-DOT11-IF-MIB' => 'cd11IfAuxSsid',
|
||||
'CISCO-DOT11-ASSOCIATION-MIB' => 'cDot11ClientSubIfIndex',
|
||||
'CISCO-DOT11-SSID-SECURITY-MIB' => 'cdot11SecVlanNameId',
|
||||
'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
%MUNGE = (
|
||||
%SNMP::Info::IEEE802dot11::MUNGE,
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
'cd11_txrate' => \&munge_cd11_txrate,
|
||||
'cd11_rateset' => \&munge_cd11_txrate,
|
||||
'mbss_mac_addr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Use 802.11 power level without putting IEEE802dot11 in @ISA
|
||||
*SNMP::Info::Layer2::Aironet::dot11_cur_tx_pwr_mw
|
||||
= \&SNMP::Info::IEEE802dot11::dot11_cur_tx_pwr_mw;
|
||||
|
||||
sub vendor {
|
||||
|
||||
# Sorry, but it's true.
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $aironet = shift;
|
||||
my $i_description = $aironet->i_description();
|
||||
my $partial = shift;
|
||||
|
||||
my $i_description = $aironet->i_description($partial);
|
||||
|
||||
return $i_description;
|
||||
}
|
||||
@@ -91,7 +134,7 @@ sub interfaces {
|
||||
# Tag on e_descr.1
|
||||
sub description {
|
||||
my $aironet = shift;
|
||||
my $descr = $aironet->descr();
|
||||
my $descr = $aironet->descr();
|
||||
my $e_descr = $aironet->e_descr();
|
||||
|
||||
$descr = "$e_descr->{1} $descr" if defined $e_descr->{1};
|
||||
@@ -102,10 +145,12 @@ sub description {
|
||||
# Fetch duplex from EtherLike
|
||||
sub i_duplex {
|
||||
my $aironet = shift;
|
||||
my $el_duplex = $aironet->el_duplex();
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $aironet->el_duplex($partial);
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $d (keys %$el_duplex){
|
||||
foreach my $d ( keys %$el_duplex ) {
|
||||
my $val = $el_duplex->{$d};
|
||||
next unless defined $val;
|
||||
$i_duplex{$d} = 'full' if $val =~ /full/i;
|
||||
@@ -115,16 +160,314 @@ sub i_duplex {
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
#
|
||||
# IOS 12.3 introduces the cDot11ClientSubIfIndex in the
|
||||
# cDot11ClientConfigInfoTable, which supplies the ifIndex
|
||||
# of the VLAN Subinterface if one exists, or of the primary
|
||||
# interface if there are not subinterfaces. 12.2 used the
|
||||
# Q-BRIDGE-MIB dot1qTpFdbTable but that was removed in 12.3.
|
||||
sub _aironet_special {
|
||||
my $aironet = shift;
|
||||
my $os_ver = $aironet->os_ver();
|
||||
if ( defined($os_ver)
|
||||
&& $os_ver =~ /^(\d+)\.(\d+)(\D|$)/
|
||||
&& ( ( $1 == 12 && $2 >= 3 ) || $1 > 12 ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# INDEX { ifIndex, cd11IfAuxSsid, cDot11ClientAddress }
|
||||
sub _aironet_breakout_dot11idx {
|
||||
my $oid = shift;
|
||||
|
||||
my @parts = split( /\./, $oid );
|
||||
my $ifindex = shift(@parts);
|
||||
my $ssidlen = shift(@parts);
|
||||
my $ssid = pack( "C*", splice( @parts, 0, $ssidlen ) );
|
||||
my $mac = join( ":", map { sprintf "%02x", $_ } @parts );
|
||||
return ( $ifindex, $ssid, $mac );
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->qb_fw_mac() unless _aironet_special($aironet);
|
||||
my $c_dot11subif = $aironet->c_dot11subif();
|
||||
my $fw_mac = {};
|
||||
|
||||
foreach my $i ( keys %$c_dot11subif ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
|
||||
$fw_mac->{$i} = $mac;
|
||||
}
|
||||
return $fw_mac;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->qb_fw_port() unless _aironet_special($aironet);
|
||||
my $c_dot11subif = $aironet->c_dot11subif();
|
||||
my $fw_port = {};
|
||||
|
||||
foreach my $i ( keys %$c_dot11subif ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
|
||||
$fw_port->{$i} = $c_dot11subif->{$i} || $ifindex;
|
||||
}
|
||||
return $fw_port;
|
||||
}
|
||||
|
||||
sub bp_index {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->orig_bp_index() unless _aironet_special($aironet);
|
||||
my $c_dot11subif = $aironet->c_dot11subif();
|
||||
my $bp_index = {};
|
||||
|
||||
foreach my $i ( keys %$c_dot11subif ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
|
||||
my ($i) = $c_dot11subif->{$i} || $ifindex;
|
||||
$bp_index->{$i} = $i;
|
||||
}
|
||||
return $bp_index;
|
||||
}
|
||||
|
||||
###
|
||||
#
|
||||
# VLAN support
|
||||
#
|
||||
sub v_name {
|
||||
my $aironet = shift;
|
||||
|
||||
my $v_name = {};
|
||||
my $vlan_nameid = $aironet->cdot11SecVlanNameId();
|
||||
foreach my $i ( keys %$vlan_nameid ) {
|
||||
my @parts = split( /\./, $i );
|
||||
my $namelen = shift(@parts);
|
||||
|
||||
my $name = pack( "C*", @parts );
|
||||
$v_name->{$i} = $name;
|
||||
}
|
||||
return $v_name;
|
||||
}
|
||||
|
||||
sub v_index {
|
||||
my $aironet = shift;
|
||||
|
||||
return $aironet->cdot11SecVlanNameId();
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $aironet = shift;
|
||||
|
||||
my $i_vlan = {};
|
||||
my $idxmap = $aironet->cviRoutedVlanIfIndex();
|
||||
foreach my $i ( keys %$idxmap ) {
|
||||
my @parts = split( /\./, $i );
|
||||
$i_vlan->{ $idxmap->{$i} } = $parts[0];
|
||||
}
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
# The MIB reports in units of half a megabit, e.g.,
|
||||
# 5.5Mbps is reported as 11.
|
||||
sub munge_cd11_txrate {
|
||||
my $txrates = shift;
|
||||
my @units = unpack( "C*", $txrates );
|
||||
my @rates = map {
|
||||
my $unit = $_;
|
||||
$unit *= 0.5;
|
||||
} @units;
|
||||
|
||||
return \@rates;
|
||||
}
|
||||
|
||||
# cd11 INDEX
|
||||
sub cd11_port {
|
||||
my $aironet = shift;
|
||||
my $cd11_sigstrength = $aironet->cd11_sigstrength();
|
||||
my $interfaces = $aironet->interfaces();
|
||||
my %ret;
|
||||
foreach ( keys %$cd11_sigstrength ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
|
||||
$ret{$_} = $interfaces->{$ifindex};
|
||||
}
|
||||
return \%ret;
|
||||
}
|
||||
|
||||
sub cd11_ssid {
|
||||
my $aironet = shift;
|
||||
my $cd11_sigstrength = $aironet->cd11_sigstrength();
|
||||
my %ret;
|
||||
foreach ( keys %$cd11_sigstrength ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
|
||||
$ret{$_} = $ssid;
|
||||
}
|
||||
return \%ret;
|
||||
}
|
||||
|
||||
sub cd11_mac {
|
||||
my $aironet = shift;
|
||||
my $cd11_sigstrength = $aironet->cd11_sigstrength();
|
||||
my %ret;
|
||||
foreach ( keys %$cd11_sigstrength ) {
|
||||
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
|
||||
$ret{$_} = $mac;
|
||||
}
|
||||
return \%ret;
|
||||
}
|
||||
|
||||
# Map VLAN N on interface I to its actual ifIndex.
|
||||
sub _vlan_map_n_stack {
|
||||
my $aironet = shift;
|
||||
my $vlan_idx = $aironet->cviRoutedVlanIfIndex();
|
||||
|
||||
my $vlan_map = {};
|
||||
foreach my $idx ( keys %$vlan_idx ) {
|
||||
my ( $vlan, $num ) = split( /\./, $idx );
|
||||
$vlan_map->{$vlan}->{$num} = $vlan_idx->{$idx};
|
||||
}
|
||||
return $vlan_map;
|
||||
}
|
||||
|
||||
# When using MBSS, the ifTable reports the
|
||||
# base MAC address, but the actual association is
|
||||
# with a different MAC address for MBSS.
|
||||
# This convoluted path seems to be necessary
|
||||
# to get the right overrides.
|
||||
sub i_mac {
|
||||
my $aironet = shift;
|
||||
|
||||
# no partial is possible due to the levels
|
||||
# of indirection.
|
||||
|
||||
# Start with the ifPhysAddress, and override
|
||||
my $mbss_mac = $aironet->orig_i_mac();
|
||||
|
||||
my $mbss_mac_addr = $aironet->mbss_mac_addr();
|
||||
my $ssid_vlan = $aironet->cdot11SecAuxSsidVlan();
|
||||
my $vlan_map = $aironet->cviRoutedVlanIfIndex();
|
||||
my $ifstack = $aironet->ifStackStatus();
|
||||
|
||||
my $vlan_list = {};
|
||||
foreach my $idx ( keys %$vlan_map ) {
|
||||
my ( $vlan, $num ) = split( /\./, $idx );
|
||||
push( @{ $vlan_list->{$vlan} }, $vlan_map->{$idx} );
|
||||
}
|
||||
|
||||
my $stack = {};
|
||||
foreach my $idx ( keys %$ifstack ) {
|
||||
my ( $upper, $lower ) = split( /\./, $idx );
|
||||
$stack->{$upper}->{$lower} = $ifstack->{$idx};
|
||||
}
|
||||
|
||||
# mbss_mac_addr index is (radio, ssid).
|
||||
# ssid_vlan maps ssid->vlan.
|
||||
# vlan_map maps vlan->[list of interfaces]
|
||||
# ifstack allows us to pick the right interface
|
||||
foreach my $idx ( keys %$mbss_mac_addr ) {
|
||||
my ( $interface, @ssid ) = split( /\./, $idx );
|
||||
my $vlan = $ssid_vlan->{ join( ".", scalar(@ssid), @ssid ) };
|
||||
next unless defined($vlan);
|
||||
foreach my $vlanif ( @{ $vlan_list->{$vlan} } ) {
|
||||
if ( defined( $stack->{$vlanif}->{$interface} ) ) {
|
||||
$mbss_mac->{$vlanif} = $mbss_mac_addr->{$idx};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $mbss_mac;
|
||||
}
|
||||
|
||||
sub i_ssidlist {
|
||||
my $aironet = shift;
|
||||
|
||||
# no partial is possible due to the levels
|
||||
# of indirection.
|
||||
my $ssid_row = $aironet->cdot11SecInterfSsidRowStatus();
|
||||
my $ssid_vlan = $aironet->cdot11SecAuxSsidVlan();
|
||||
if ( !defined($ssid_row) || !defined($ssid_vlan) ) {
|
||||
return $aironet->cd11IfAuxSsid();
|
||||
}
|
||||
my $ssidlist = {};
|
||||
my $if_ssidcount = {};
|
||||
my $vlan_map = $aironet->_vlan_map_n_stack();
|
||||
foreach my $idx ( keys %$ssid_row ) {
|
||||
next unless $ssid_row->{$idx} eq 'active';
|
||||
|
||||
# ssid_row index is radio.ssid
|
||||
my ( $interface, $ssid ) = split( /\./, $idx, 2 );
|
||||
my ( $len, @ssidt ) = split( /\./, $ssid );
|
||||
my $mappedintf = $vlan_map->{ $ssid_vlan->{$ssid} }->{$interface};
|
||||
next unless $mappedintf;
|
||||
if ( !$if_ssidcount->{$mappedintf} ) {
|
||||
$if_ssidcount->{$mappedintf} = 1;
|
||||
}
|
||||
my $ssidlist_idx
|
||||
= sprintf( "%s.%d", $mappedintf, $if_ssidcount->{$mappedintf} );
|
||||
$ssidlist->{$ssidlist_idx} = pack( "C*", @ssidt );
|
||||
$if_ssidcount->{$mappedintf}++;
|
||||
}
|
||||
return $ssidlist;
|
||||
}
|
||||
|
||||
sub i_ssidbcast {
|
||||
my $aironet = shift;
|
||||
my $partial = shift;
|
||||
my $mbss_bcast = $aironet->cdot11SecAuxSsidMbssidBroadcast();
|
||||
if ( !defined($mbss_bcast) ) {
|
||||
return $aironet->cd11IfAuxSsidBroadcastSsid($partial);
|
||||
}
|
||||
my $map = {};
|
||||
foreach my $key ( keys %$mbss_bcast ) {
|
||||
my (@idx) = split( /\./, $key );
|
||||
my $len = shift(@idx);
|
||||
$map->{ pack( "C*", @idx ) } = $mbss_bcast->{$key};
|
||||
}
|
||||
|
||||
# This needs to return the same indexes as i_ssidlist.
|
||||
# mbss_bcast maps ssid -> broadcasting
|
||||
# so we just replace the i_ssidlist values with the mbss_bcast ones.
|
||||
my $i_ssidlist = $aironet->i_ssidlist();
|
||||
my $i_ssidbcast = {};
|
||||
foreach my $key ( keys %$i_ssidlist ) {
|
||||
$i_ssidbcast->{$key} = $map->{ $i_ssidlist->{$key} };
|
||||
}
|
||||
return $i_ssidbcast;
|
||||
}
|
||||
|
||||
sub i_ssidmac {
|
||||
my $aironet = shift;
|
||||
my $partial = shift;
|
||||
my $mbss_mac_addr = $aironet->mbss_mac_addr();
|
||||
|
||||
# Same logic as i_ssidbcast to return same indexes as i_ssidlist
|
||||
my $map = {};
|
||||
foreach my $key ( keys %$mbss_mac_addr ) {
|
||||
my ( $interface, @idx ) = split( /\./, $key );
|
||||
$map->{ pack( "C*", @idx ) } = $mbss_mac_addr->{$key};
|
||||
}
|
||||
|
||||
my $i_ssidlist = $aironet->i_ssidlist();
|
||||
my $i_ssidmac = {};
|
||||
foreach my $key ( keys %$i_ssidlist ) {
|
||||
$i_ssidmac->{$key} = $map->{ $i_ssidlist->{$key} };
|
||||
}
|
||||
return $i_ssidmac;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running IOS.
|
||||
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running
|
||||
IOS.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -132,7 +475,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $aironet = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -144,7 +486,8 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides interface to SNMP Data available on newer Aironet devices running Cisco IOS.
|
||||
Provides interface to SNMP Data available on newer Aironet devices running
|
||||
Cisco IOS.
|
||||
|
||||
Note there are two classes for Aironet devices :
|
||||
|
||||
@@ -160,8 +503,8 @@ This class is for devices running Cisco IOS software (newer)
|
||||
|
||||
=back
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $aironet = new SNMP::Info::Layer2::Aironet(...);
|
||||
|
||||
@@ -175,7 +518,9 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...);
|
||||
|
||||
=item SNMP::Info::EtherLike
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=back
|
||||
|
||||
@@ -201,23 +546,47 @@ Adds info from method e_descr() from SNMP::Info::Entity
|
||||
|
||||
=item $aironet->vendor()
|
||||
|
||||
Returns 'cisco' :)
|
||||
Returns 'cisco'
|
||||
|
||||
=item $aironet->description()
|
||||
|
||||
System description
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::Entity for details.
|
||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->cd11_port()
|
||||
|
||||
Returns radio interfaces.
|
||||
|
||||
=item $aironet->cd11_mac()
|
||||
|
||||
Returns client radio interface MAC addresses.
|
||||
|
||||
=item $aironet->cd11_ssid()
|
||||
|
||||
Returns radio interface ssid.
|
||||
|
||||
=item $aironet->dot11_cur_tx_pwr_mw()
|
||||
|
||||
Current transmit power, in milliwatts, of the radio interface.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
@@ -227,22 +596,80 @@ See documentation in SNMP::Info::EtherLike for details.
|
||||
|
||||
Uses the i_description() field.
|
||||
|
||||
=item $aironet->i_mac()
|
||||
|
||||
MAC address of the interface. Note this is just the MAC of the port, not
|
||||
anything connected to it.
|
||||
|
||||
=item $aironet->i_duplex()
|
||||
|
||||
Crosses information from SNMP::Info::EtherLike to get duplex info for interfaces.
|
||||
Crosses information from SNMP::Info::EtherLike to get duplex info for
|
||||
interfaces.
|
||||
|
||||
=item $aironet->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (iid)
|
||||
|
||||
=item $aironet->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses
|
||||
|
||||
=item $aironet->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
=item $aironet->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=item $aironet->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
=item $aironet->v_name()
|
||||
|
||||
Returns VLAN names
|
||||
|
||||
=item $aironet->i_ssidlist()
|
||||
|
||||
Returns a list of SSIDs associated with interfaces. This function
|
||||
is C<MBSSID> aware, so when using C<MBSSID> can map SSIDs to the sub-interface
|
||||
to which they belong.
|
||||
|
||||
=item $aironet->i_ssidbcast()
|
||||
|
||||
With the same keys as i_ssidlist, returns whether the given SSID is
|
||||
being broadcast.
|
||||
|
||||
=item $aironet->i_ssidmac()
|
||||
|
||||
With the same keys as i_ssidlist, returns the Basic service set
|
||||
identification (BSSID), MAC address, the AP is using for the SSID.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::Entity for details.
|
||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 Data Munging Callback Subroutines
|
||||
|
||||
=over
|
||||
|
||||
=item $aironet->munge_cd11_txrate()
|
||||
|
||||
Converts units of half a megabit to human readable string.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,65 +1,62 @@
|
||||
# SNMP::Info::Layer2::Allied
|
||||
# Max Baker <max@warped.org>, Dmitry Sergienko <dmitry@trifle.net>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker
|
||||
# Copyright (c) 2008 Max Baker
|
||||
# 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 Netdisco nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Allied;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::Layer1;
|
||||
|
||||
@SNMP::Info::Layer2::Allied::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Allied::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Allied::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS
|
||||
);
|
||||
$VERSION = '3.03';
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
'ip_adresses'=> 'atNetAddress',
|
||||
'ip_mac' => 'atPhysAddress',
|
||||
'i_name' => 'ifName',
|
||||
'i_up2' => 'ifOperStatus',
|
||||
);
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'AtiSwitch-MIB' => 'atiswitchProductType',
|
||||
'AtiStackInfo-MIB' => 'atiswitchEnhancedStacking',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
'ip_adresses' => 'atNetAddress',
|
||||
'ip_mac' => 'atPhysAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'AtiSwitch-MIB' => 'atiswitchProductType',
|
||||
'AtiStackInfo-MIB' => 'atiswitchEnhancedStacking',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'allied';
|
||||
@@ -71,9 +68,9 @@ sub os {
|
||||
|
||||
sub os_ver {
|
||||
my $allied = shift;
|
||||
my $descr = $allied->description();
|
||||
|
||||
if ($descr =~ m/version (\d+\.\d+)/){
|
||||
my $descr = $allied->description();
|
||||
|
||||
if ( $descr =~ m/version (\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
@@ -83,50 +80,48 @@ sub model {
|
||||
|
||||
my $desc = $allied->description();
|
||||
|
||||
if ($desc =~ /(AT-80\d{2}\S*)/){
|
||||
if ( $desc =~ /(AT-80\d{2}\S*)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub ip {
|
||||
my $allied = shift;
|
||||
sub root_ip {
|
||||
my $allied = shift;
|
||||
my $ip_hash = $allied->ip_addresses();
|
||||
my $ip;
|
||||
my $found_ip;
|
||||
|
||||
foreach $ip (values %{$ip_hash}) {
|
||||
my $found_ip = SNMP::Info::munge_ip($ip) if (defined $ip);
|
||||
last; # this is only one IP address
|
||||
|
||||
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;
|
||||
sub mac {
|
||||
my $allied = shift;
|
||||
my $mac_hash = $allied->ip_mac();
|
||||
my $mac;
|
||||
my $found_mac;
|
||||
|
||||
foreach $mac (values %{$mac_hash}) {
|
||||
|
||||
foreach my $mac ( values %{$mac_hash} ) {
|
||||
$found_mac = SNMP::Info::munge_mac($mac);
|
||||
last; # this is only one MAC address
|
||||
last; # this is only one MAC address
|
||||
}
|
||||
return $found_mac;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $allied = shift;
|
||||
my $allied = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_up = SNMP::Info::Layer1::i_up($allied);
|
||||
my $i_up2 = $allied->i_up2();
|
||||
my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
|
||||
|
||||
foreach my $port (keys %$ati_up){
|
||||
my $up = $ati_up->{$port};
|
||||
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';
|
||||
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
|
||||
}
|
||||
|
||||
|
||||
return $i_up;
|
||||
}
|
||||
1;
|
||||
@@ -134,11 +129,11 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesyn switches
|
||||
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesis switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker, Dmitry Sergienko <dmitry@trifle.net>
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -146,14 +141,13 @@ Max Baker (C<max@warped.org>)
|
||||
my $allied = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myhub',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l1->class();
|
||||
my $class = $allied->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -166,7 +160,7 @@ inherited methods.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer1
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
@@ -174,16 +168,18 @@ inherited methods.
|
||||
|
||||
=over
|
||||
|
||||
=item ATI-MIB
|
||||
=item F<AtiSwitch-MIB>
|
||||
|
||||
Download for your device from http://www.allied-telesyn.com/allied/support/
|
||||
=item F<AtiStackInfo-MIB>
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs listed in SNMP::Info::Layer1 and its inherited classes.
|
||||
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
|
||||
@@ -206,30 +202,30 @@ Culls Version from description()
|
||||
|
||||
=item $allied->root_ip()
|
||||
|
||||
Returns IP Address of Managed Hub.
|
||||
Returns IP Address of Managed Device.
|
||||
|
||||
(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.
|
||||
|
||||
=item $allied->mac()
|
||||
|
||||
Returns device MAC.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer1
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer1 for details.
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $allied->i_name()
|
||||
|
||||
Returns reference to map of IIDs to human-set port name.
|
||||
|
||||
=item $allied->i_up()
|
||||
|
||||
Returns reference to map of IIDs to link status. Changes
|
||||
@@ -237,10 +233,8 @@ the values of ati_up() to 'up' and 'down'.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Allied MIB
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,474 +0,0 @@
|
||||
# SNMP::Info::Layer2::Bay
|
||||
# Max Baker <max@warped.org>
|
||||
# This module depricated. See Layer2::BayStack
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Bay;
|
||||
$VERSION = 0.9;
|
||||
# $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();
|
||||
return undef unless defined $descr;
|
||||
|
||||
# 303 / 304
|
||||
if ($descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
|
||||
# 450
|
||||
if ($descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $bay = shift;
|
||||
my $descr = $bay->description();
|
||||
return undef unless defined $descr;
|
||||
|
||||
# 303 / 304
|
||||
if ($descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/){
|
||||
return $1;
|
||||
}
|
||||
|
||||
# 450
|
||||
if ($descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
return 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();
|
||||
return undef unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
$model =~ s/^sreg-//i;
|
||||
|
||||
my $descr = $bay->description();
|
||||
|
||||
return '303' if ($descr =~ /\D303\D/);
|
||||
return '304' if ($descr =~ /\D304\D/);
|
||||
return '450' if ($model =~ /BayStack450/);
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Hack in some CDP type stuff
|
||||
|
||||
sub c_if {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
|
||||
my %c_if;
|
||||
foreach my $entry (keys %$bay_topo_port){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if $port == 0;
|
||||
$c_if{"$port.1"} = $port;
|
||||
}
|
||||
return \%c_if;
|
||||
}
|
||||
|
||||
sub c_ip {
|
||||
my $bay = shift;
|
||||
my $bay_topo_ip = $bay->bay_topo_ip();
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $ip = $bay->cdp_ip();
|
||||
|
||||
# Count the number of devices seen on each port.
|
||||
# more than one device seen means connected to a non-bay
|
||||
# device, but other bay devices are squawking further away.
|
||||
my %ip_port;
|
||||
foreach my $entry (keys %$bay_topo_ip){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if ($port =~ /^[\d\.]+$/ and $port == 0);
|
||||
my $ip = $bay_topo_ip->{$entry};
|
||||
push(@{$ip_port{$port}},$ip);
|
||||
}
|
||||
|
||||
my %c_ip;
|
||||
foreach my $port (keys %ip_port){
|
||||
my $ips = $ip_port{$port};
|
||||
if (scalar @$ips == 1) {
|
||||
$c_ip{"$port.1"} = $ips->[0];
|
||||
} else {
|
||||
$c_ip{"$port.1"} = $ips;
|
||||
}
|
||||
}
|
||||
|
||||
return \%c_ip;
|
||||
}
|
||||
|
||||
sub c_port {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $bay_topo_seg = $bay->bay_topo_seg();
|
||||
|
||||
my %c_port;
|
||||
foreach my $entry (keys %$bay_topo_seg){
|
||||
my $port = $bay_topo_port->{$entry};
|
||||
next unless defined $port;
|
||||
next if $port == 0;
|
||||
|
||||
# For fake remotes (multiple IPs for a c_ip), use first found
|
||||
next if defined $c_port{"$port.1"};
|
||||
|
||||
my $seg = $bay_topo_seg->{$entry};
|
||||
|
||||
# Segment id is (256 * remote slot_num) + (remote_port)
|
||||
my $remote_port = $seg % 256;
|
||||
|
||||
$c_port{"$port.1"} = $remote_port;
|
||||
}
|
||||
|
||||
return \%c_port;
|
||||
}
|
||||
|
||||
sub c_platform {
|
||||
my $bay = shift;
|
||||
my $bay_topo_port = $bay->bay_topo_port();
|
||||
my $bay_topo_platform = $bay->bay_topo_platform();
|
||||
|
||||
|
||||
my %c_platform;
|
||||
foreach my $entry (keys %$bay_topo_platform){
|
||||
my $port = $bay_topo_port->{$entry} || 0;
|
||||
next if $port == 0;
|
||||
|
||||
# For fake remotes (multiple IPs for a c_ip), use first found
|
||||
next if defined $c_platform{"$port.1"};
|
||||
|
||||
my $platform = $bay_topo_platform->{$entry};
|
||||
|
||||
$c_platform{"$port.1"} = $platform;
|
||||
}
|
||||
|
||||
return \%c_platform;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Bay - SNMP Interface to old Bay Network BayStack Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
This module is Depricated. Please use Layer2::BayStack instead.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Bay device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
|
||||
my $bay = new SNMP::Info::Layer2::Bay(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item 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,180 +1,166 @@
|
||||
# SNMP::Info::Layer2::Baystack
|
||||
# Eric Miller <eric@jeneric.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Baystack;
|
||||
$VERSION = 0.9;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::SONMP;
|
||||
use SNMP::Info::RapidCity;
|
||||
use SNMP::Info::NortelStack;
|
||||
use SNMP::Info::RapidCity;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer2::Baystack::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::SONMP SNMP::Info::RapidCity SNMP::Info::NortelStack Exporter/;
|
||||
@SNMP::Info::Layer2::Baystack::ISA
|
||||
= qw/SNMP::Info::SONMP SNMP::Info::NortelStack
|
||||
SNMP::Info::RapidCity SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer2::Baystack::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
%SNMP::Info::RapidCity::MIBS,
|
||||
%SNMP::Info::NortelStack::MIBS,
|
||||
);
|
||||
$VERSION = '3.03';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS,
|
||||
%SNMP::Info::RapidCity::GLOBALS,
|
||||
%SNMP::Info::NortelStack::GLOBALS,
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
%SNMP::Info::RapidCity::FUNCS,
|
||||
%SNMP::Info::NortelStack::FUNCS,
|
||||
'i_name2' => 'ifName',
|
||||
'i_mac2' => 'ifPhysAddress',
|
||||
);
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::RapidCity::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
);
|
||||
|
||||
# 450's report full duplex as speed = 20mbps?!
|
||||
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
|
||||
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
|
||||
$SNMP::Info::SPEED_MAP{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::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
%SNMP::Info::RapidCity::MUNGE,
|
||||
%SNMP::Info::NortelStack::MUNGE,
|
||||
'i_mac2' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::RapidCity::MUNGE, %SNMP::Info::NortelStack::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
);
|
||||
|
||||
sub os {
|
||||
my $baystack = shift;
|
||||
my $descr = $baystack->description();
|
||||
my $model = $baystack->model();
|
||||
my $descr = $baystack->description() || "";
|
||||
my $model = $baystack->model() || "";
|
||||
|
||||
if ((defined $model and $model =~ /(470|460|BPS|5510|5520)/) and (defined $descr and $descr =~ m/SW:v[3-5]/i)) {
|
||||
return 'boss';
|
||||
if ( $descr =~ /Business Ethernet Switch.*SW:v/i ) {
|
||||
return 'bes';
|
||||
}
|
||||
return 'baystack';
|
||||
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 undef unless defined $descr;
|
||||
my $descr = $baystack->description();
|
||||
return unless defined $descr;
|
||||
|
||||
# 303 / 304
|
||||
if ($descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/){
|
||||
if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# 450
|
||||
if ($descr =~ m/FW:V(\d+\.\d+)/){
|
||||
if ( $descr =~ m/FW:V(\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
if ($descr =~ m/FW:(\d+\.\d+\.\d+\.\d+)/i){
|
||||
if ( $descr =~ m/FW:(\d+\.\d+\.\d+\.\d+)/i ) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $baystack = shift;
|
||||
my $id = $baystack->id();
|
||||
return undef unless defined $id;
|
||||
my $id = $baystack->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
$model =~ s/^sreg-//i;
|
||||
|
||||
my $descr = $baystack->description();
|
||||
|
||||
return '303' if (defined $descr and $descr =~ /\D303\D/);
|
||||
return '304' if (defined $descr and $descr =~ /\D304\D/);
|
||||
return '350' if ($model =~ /BayStack350/);
|
||||
return '380' if ($model =~ /BayStack380/);
|
||||
return '410' if ($model =~ /BayStack410/);
|
||||
return '420' if ($model =~ /BayStack420/);
|
||||
return '425' if ($model =~ /BayStack425/);
|
||||
return '450' if ($model =~ /BayStack450/);
|
||||
return '470' if ($model =~ /BayStack470/i);
|
||||
return '460' if ($model =~ /BayStack460/i);
|
||||
return 'BPS' if ($model =~ /BPS2000/i);
|
||||
return '5510' if ($model =~ /BayStack5510/i);
|
||||
return '5520' if ($model =~ /BayStack5520/i);
|
||||
return '303' if ( defined $descr and $descr =~ /\D303\D/ );
|
||||
return '304' if ( defined $descr and $descr =~ /\D304\D/ );
|
||||
return 'BPS' if ( $model =~ /BPS2000/i );
|
||||
|
||||
# Pull sreg- from all
|
||||
$model =~ s/^sreg-//;
|
||||
# Strip ES/ERS/BayStack etc. from those families
|
||||
$model =~ s/^(E(R)?S|BayStack|Ethernet(Routing)?Switch)-?//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $baystack = shift;
|
||||
my $i_type = $baystack->i_type();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$i_type){
|
||||
my $type = $i_type->{$if};
|
||||
next unless defined $type;
|
||||
$i_ignore{$if}++ if $type =~ /(54|loopback|propvirtual|cpu)/i;
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $baystack = shift;
|
||||
my $i_index = $baystack->i_index();
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $baystack->i_index($partial) || {};
|
||||
my $index_factor = $baystack->index_factor();
|
||||
my $slot_offset = $baystack->slot_offset();
|
||||
|
||||
my $slot_offset = $baystack->slot_offset();
|
||||
|
||||
my %if;
|
||||
foreach my $iid (keys %$i_index){
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
# Ignore cascade ports
|
||||
next if $index > 513;
|
||||
|
||||
my $port = ($index % $index_factor);
|
||||
my $slot = (int($index / $index_factor)) + $slot_offset;
|
||||
# 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;
|
||||
@@ -182,64 +168,188 @@ sub interfaces {
|
||||
return \%if;
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
sub i_mac {
|
||||
my $baystack = shift;
|
||||
my $i_mac = $baystack->i_mac2();
|
||||
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){
|
||||
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;
|
||||
$i_mac{$iid} = $mac;
|
||||
}
|
||||
return \%i_mac;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $baystack = shift;
|
||||
my $i_index = $baystack->i_index();
|
||||
my $i_alias = $baystack->i_alias();
|
||||
my $i_name2 = $baystack->i_name2();
|
||||
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};
|
||||
foreach my $iid ( keys %$i_name2 ) {
|
||||
my $name = $i_name2->{$iid};
|
||||
my $alias = $i_alias->{$iid};
|
||||
$i_name{$iid} = (defined $alias and $alias !~ /^\s*$/) ?
|
||||
$alias :
|
||||
$name;
|
||||
$i_name{$iid}
|
||||
= ( defined $alias and $alias !~ /^\s*$/ )
|
||||
? $alias
|
||||
: $name;
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub index_factor {
|
||||
my $baystack = shift;
|
||||
my $model = $baystack->model();
|
||||
my $os = $baystack->os();
|
||||
my $op_mode = $baystack->ns_op_mode();
|
||||
|
||||
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 ((defined $model and $model =~ /(470)/) or ($os eq 'boss') and ($op_mode eq 'pure'));
|
||||
|
||||
$index_factor = 64
|
||||
if ( ( $model =~ /(470)/ )
|
||||
or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) );
|
||||
$index_factor = 128
|
||||
if ( ( $model =~ /(5[56]\d\d)|VSP/ )
|
||||
and ( $os_ver >= 6 ) );
|
||||
|
||||
return $index_factor;
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Newer devices support ENTITY-MIB, use if available otherwise use proprietary
|
||||
# methods.
|
||||
|
||||
sub e_index {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_index($partial) || $stack->ns_e_index($partial);
|
||||
}
|
||||
|
||||
sub e_class {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_class($partial) || $stack->ns_e_class($partial);
|
||||
}
|
||||
|
||||
sub e_descr {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_descr($partial) || $stack->ns_e_descr($partial);
|
||||
}
|
||||
|
||||
sub e_name {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_name($partial) || $stack->ns_e_name($partial);
|
||||
}
|
||||
|
||||
sub e_fwver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_fwver($partial) || $stack->ns_e_fwver($partial);
|
||||
}
|
||||
|
||||
sub e_hwver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_hwver($partial) || $stack->ns_e_hwver($partial);
|
||||
}
|
||||
|
||||
sub e_parent {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_parent($partial) || $stack->ns_e_parent($partial);
|
||||
}
|
||||
|
||||
sub e_pos {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_pos($partial) || $stack->ns_e_pos($partial);
|
||||
}
|
||||
|
||||
sub e_serial {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_serial($partial) || $stack->ns_e_serial($partial);
|
||||
}
|
||||
|
||||
sub e_swver {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_swver($partial) || $stack->ns_e_swver($partial);
|
||||
}
|
||||
|
||||
sub e_type {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_type($partial) || $stack->ns_e_type($partial);
|
||||
}
|
||||
|
||||
sub e_vendor {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $stack->SUPER::e_vendor($partial) || $stack->ns_e_vendor($partial);
|
||||
}
|
||||
|
||||
# fix for stack of switches without POE on module 1
|
||||
# https://sourceforge.net/tracker/?func=detail&aid=3317739&group_id=70362&atid=527529
|
||||
sub peth_port_ifindex {
|
||||
my $stack = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %peth_port_ifindex = ();
|
||||
my $poe_port_st = $stack->peth_port_status($partial);
|
||||
my $if_index = $stack->interfaces($partial);
|
||||
|
||||
foreach my $i (keys %$if_index) {
|
||||
next unless defined $poe_port_st->{$if_index->{$i}};
|
||||
$peth_port_ifindex{$if_index->{$i}} = $i;
|
||||
}
|
||||
return \%peth_port_ifindex;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Baystack - SNMP Interface to Nortel Networks' Baystack Switches
|
||||
SNMP::Info::Layer2::Baystack - SNMP Interface to Avaya Ethernet Switch
|
||||
(Baystack) and VSP 7000 series switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>),
|
||||
Eric Miller (C<eric@jeneric.org>)
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -247,7 +357,6 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
my $baystack = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -259,11 +368,12 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a Nortel Networks'
|
||||
Baystack device through SNMP.
|
||||
Provides abstraction to the configuration information obtainable from an
|
||||
Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series
|
||||
through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $baystack = new SNMP::Info::Layer2::Baystack(...);
|
||||
|
||||
@@ -271,36 +381,30 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...);
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
=item SNMP::Info::NortelStack
|
||||
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
=item SNMP::Info::RapidCity
|
||||
|
||||
=back
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::Bridge for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::NortelStack for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::SONMP for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::RapidCity for its own MIB requirements.
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::NortelStack/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::RapidCity/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -309,23 +413,25 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $baystack->vendor()
|
||||
|
||||
Returns 'Nortel'
|
||||
Returns 'avaya'
|
||||
|
||||
=item $baystack->model()
|
||||
|
||||
Cross references $baystack->id() to the SYNOPTICS-MIB and returns
|
||||
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.
|
||||
to return depending on which it is.
|
||||
|
||||
Removes sreg- from the model name
|
||||
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.
|
||||
Returns 'baystack' or 'boss' depending on software version.
|
||||
|
||||
=item $baystack->os_bin()
|
||||
|
||||
Returns the firmware version extracted from B<sysDescr>.
|
||||
Returns the firmware version extracted from C<sysDescr>.
|
||||
|
||||
=back
|
||||
|
||||
@@ -339,34 +445,34 @@ 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))
|
||||
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 Globals imported from SNMP::Info
|
||||
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::NortelStack
|
||||
|
||||
See documentation in SNMP::Info::NortelStack for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in SNMP::Info::SONMP for details.
|
||||
See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::RapidCity
|
||||
|
||||
See documentation in SNMP::Info::RapidCity for details.
|
||||
See L<SNMP::Info::RapidCity/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -379,7 +485,8 @@ to a hash.
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
Slot and port numbers on the Baystack switches are determined by the formula:
|
||||
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
|
||||
@@ -392,35 +499,108 @@ Returns reference to hash of IIDs to ignore.
|
||||
|
||||
=item $baystack->i_mac()
|
||||
|
||||
Returns the B<ifPhysAddress> table entries.
|
||||
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 ifName with ifAlias and returns the human set port name if exists.
|
||||
Crosses C<ifName> with C<ifAlias> and returns the human set port name if
|
||||
exists.
|
||||
|
||||
=item $poe->peth_port_ifindex()
|
||||
|
||||
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
=head2 F<ENTITY-MIB> Information
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
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.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
=over
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
=item $baystack->e_index()
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::NortelStack
|
||||
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().
|
||||
|
||||
See documentation in SNMP::Info::NortelStack for details.
|
||||
=item $baystack->e_class()
|
||||
|
||||
If the device doesn't support C<entPhysicalClass>, this will try ns_e_class().
|
||||
|
||||
=item $baystack->e_descr()
|
||||
|
||||
If the device doesn't support C<entPhysicalDescr>, this will try ns_e_descr().
|
||||
|
||||
=item $baystack->e_name()
|
||||
|
||||
If the device doesn't support C<entPhysicalName>, this will try ns_e_name().
|
||||
|
||||
=item $baystack->e_fwver()
|
||||
|
||||
If the device doesn't support C<entPhysicalFirmwareRev>, this will try
|
||||
ns_e_fwver().
|
||||
|
||||
=item $baystack->e_hwver()
|
||||
|
||||
If the device doesn't support C<entPhysicalHardwareRev>, this will try
|
||||
ns_e_hwver().
|
||||
|
||||
=item $baystack->e_parent()
|
||||
|
||||
If the device doesn't support C<entPhysicalContainedIn>, this will try
|
||||
ns_e_parent().
|
||||
|
||||
=item $baystack->e_pos()
|
||||
|
||||
If the device doesn't support C<entPhysicalParentRelPos>, this will try
|
||||
ns_e_pos().
|
||||
|
||||
=item $baystack->e_serial()
|
||||
|
||||
If the device doesn't support C<entPhysicalSerialNum>, this will try
|
||||
ns_e_serial().
|
||||
|
||||
=item $baystack->e_swver()
|
||||
|
||||
If the device doesn't support C<entPhysicalSoftwareRev>, this will try
|
||||
ns_e_swver().
|
||||
|
||||
=item $baystack->e_type()
|
||||
|
||||
If the device doesn't support C<entPhysicalVendorType>, this will try
|
||||
ns_e_type().
|
||||
|
||||
=item $baystack->e_vendor()
|
||||
|
||||
If the device doesn't support C<entPhysicalMfgName>, this will try
|
||||
ns_e_vendor().
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in SNMP::Info::SONMP for details.
|
||||
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 documentation in SNMP::Info::RapidCity for details.
|
||||
See L<SNMP::Info::RapidCity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,84 +1,100 @@
|
||||
# SNMP::Info::Layer2::C1900
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::C1900;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
|
||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::Layer2 SNMP::Info::CiscoVTP Exporter/;
|
||||
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoConfig SNMP::Info::Layer2
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
'c1900_flash_status' => 'upgradeFlashBankStatus',
|
||||
);
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'c1900_flash_status' => 'upgradeFlashBankStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
'i_name2' => 'ifName',
|
||||
# ESSWITCH-MIB
|
||||
'c1900_p_index' => 'swPortIndex',
|
||||
'c1900_p_ifindex' => 'swPortIfIndex',
|
||||
'c1900_p_duplex' => 'swPortDuplexStatus',
|
||||
'c1900_p_duplex_admin' => 'swPortFullDuplex',
|
||||
'c1900_p_name' => 'swPortName',
|
||||
'c1900_p_up_admin' => 'swPortAdminStatus',
|
||||
'c1900_p_type' => 'swPortMediaCapability',
|
||||
'c1900_p_media' => 'swPortConnectorType',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
# Also known as the ESSWITCH-MIB
|
||||
'STAND-ALONE-ETHERNET-SWITCH-MIB' => 'series2000'
|
||||
);
|
||||
# ESSWITCH-MIB
|
||||
'c1900_p_index' => 'swPortIndex',
|
||||
'c1900_p_ifindex' => 'swPortIfIndex',
|
||||
'c1900_p_duplex' => 'swPortDuplexStatus',
|
||||
'c1900_p_duplex_admin' => 'swPortFullDuplex',
|
||||
'c1900_p_name' => 'swPortName',
|
||||
'c1900_p_up_admin' => 'swPortAdminStatus',
|
||||
'c1900_p_type' => 'swPortMediaCapability',
|
||||
'c1900_p_media' => 'swPortConnectorType',
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
|
||||
# Also known as the ESSWITCH-MIB
|
||||
'STAND-ALONE-ETHERNET-SWITCH-MIB' => 'series2000'
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
);
|
||||
|
||||
sub bulkwalk_no { return 1; }
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'catalyst';
|
||||
}
|
||||
@@ -89,128 +105,175 @@ sub os_ver {
|
||||
# Check for superclass one
|
||||
my $os_ver = $c1900->SUPER::os_ver();
|
||||
return $os_ver if defined $os_ver;
|
||||
|
||||
|
||||
my $c1900_flash_status = $c1900->c1900_flash_status();
|
||||
return undef unless defined $c1900_flash_status;
|
||||
return unless defined $c1900_flash_status;
|
||||
|
||||
if ($c1900_flash_status =~ m/V(\d+\.\d+(\.\d+)?)/){
|
||||
if ( $c1900_flash_status =~ m/V(\d+\.\d+(\.\d+)?)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $c1900 = shift;
|
||||
my $i_descr = $c1900->i_description();
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
foreach my $iid (keys %$i_descr){
|
||||
my $i_descr = $c1900->i_description($partial) || {};
|
||||
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
$i_descr->{$iid} =~ s/\s*$//;
|
||||
}
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $c1900 = shift;
|
||||
|
||||
my $interfaces = $c1900->interfaces();
|
||||
my $c1900_p_index = $c1900->c1900_p_index();
|
||||
my $c1900_p_duplex = $c1900->c1900_p_duplex();
|
||||
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %reverse_1900 = reverse %$c1900_p_index;
|
||||
my $c1900_p_duplex = $c1900->c1900_p_duplex($partial) || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if (keys %$interfaces){
|
||||
my $port_1900 = $reverse_1900{$if};
|
||||
next unless defined $port_1900;
|
||||
my $duplex = $c1900_p_duplex->{$port_1900};
|
||||
next unless defined $duplex;
|
||||
|
||||
foreach my $if ( keys %$c1900_p_duplex ) {
|
||||
my $duplex = $c1900_p_duplex->{$if};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$if}=$duplex;
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c1900 = shift;
|
||||
|
||||
my $interfaces = $c1900->interfaces();
|
||||
my $c1900_p_index = $c1900->c1900_p_index();
|
||||
my $c1900_p_admin = $c1900->c1900_p_duplex_admin();
|
||||
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my %reverse_1900 = reverse %$c1900_p_index;
|
||||
my $c1900_p_admin = $c1900->c1900_p_duplex_admin($partial) || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if (keys %$interfaces){
|
||||
my $port_1900 = $reverse_1900{$if};
|
||||
next unless defined $port_1900;
|
||||
my $duplex = $c1900_p_admin->{$port_1900};
|
||||
next unless defined $duplex;
|
||||
|
||||
foreach my $if ( keys %$c1900_p_admin ) {
|
||||
my $duplex = $c1900_p_admin->{$if};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /disabled/i;
|
||||
$duplex = 'full' if $duplex =~ /flow control/i;
|
||||
$duplex = 'full' if $duplex =~ /enabled/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex_admin{$if}=$duplex;
|
||||
$i_duplex_admin{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $c1900 = shift;
|
||||
|
||||
my $i_type = $c1900->i_type2();
|
||||
my $c1900_p_index = $c1900->c1900_p_index();
|
||||
my $c1900_p_type = $c1900->c1900_p_type();
|
||||
my $c1900_p_media = $c1900->c1900_p_media();
|
||||
|
||||
foreach my $p_iid (keys %$c1900_p_index){
|
||||
my $port = $c1900_p_index->{$p_iid};
|
||||
my $type = $c1900_p_type->{$p_iid};
|
||||
my $media = $c1900_p_media->{$p_iid};
|
||||
|
||||
next unless defined $port;
|
||||
next unless defined $type;
|
||||
next unless defined $media;
|
||||
|
||||
$i_type->{$port} = "$type $media";
|
||||
}
|
||||
|
||||
return $i_type;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $c1900 = shift;
|
||||
my $i_name = $c1900->i_name2();
|
||||
my $c1900_p_name = $c1900->c1900_p_name();
|
||||
|
||||
foreach my $port (keys %$c1900_p_name){
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name = $c1900->orig_i_name($partial) || {};
|
||||
my $c1900_p_name = $c1900->c1900_p_name($partial) || {};
|
||||
|
||||
foreach my $port ( keys %$c1900_p_name ) {
|
||||
my $name = $c1900_p_name->{$port};
|
||||
next unless defined $name;
|
||||
next unless $name !~ /^\s*$/;
|
||||
$i_name->{$port} = $name;
|
||||
}
|
||||
|
||||
|
||||
return $i_name;
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
my $c1900 = shift;
|
||||
my ( $duplex, $port ) = @_;
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/full 1 half 2 auto 3/;
|
||||
|
||||
my $iid = $c1900->c1900_p_ifindex($port);
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return 0 unless defined $duplexes{$duplex};
|
||||
|
||||
return $c1900->set_c1900_p_duplex_admin( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Overlap allows more than one VLAN per port. Unable to determine default
|
||||
my $overlap = $c1900->bridgeGroupAllowMembershipOverlap()
|
||||
|| $c1900->vlanAllowMembershipOverlap()
|
||||
|| 'disabled';
|
||||
|
||||
if ( $overlap eq 'enabled' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
|
||||
|| $c1900->vlanMemberPortOfVlan();
|
||||
|
||||
my $i_pvid = {};
|
||||
foreach my $idx ( keys %$member_of ) {
|
||||
my @values = split( /\./, $idx );
|
||||
my ( $vlan, $port ) = @values;
|
||||
next unless $vlan;
|
||||
next unless $port;
|
||||
next if ( defined $partial and $port !~ /^$partial$/ );
|
||||
my $value = $member_of->{$idx};
|
||||
next if ( $value eq 'false' );
|
||||
|
||||
$i_pvid->{$port} = $vlan;
|
||||
}
|
||||
return $i_pvid;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
|
||||
|| $c1900->vlanMemberPortOfVlan();
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $idx ( keys %$member_of ) {
|
||||
my @values = split( /\./, $idx );
|
||||
my ( $vlan, $port ) = @values;
|
||||
next unless $vlan;
|
||||
next unless $port;
|
||||
next if ( defined $partial and $port !~ /^$partial$/ );
|
||||
my $value = $member_of->{$idx};
|
||||
next if ( $value eq 'false' );
|
||||
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub bp_index {
|
||||
my $c1900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $if_index = $c1900->i_index($partial);
|
||||
my $index = $c1900->orig_bp_index($partial) || {};
|
||||
foreach my $iid ( keys %$if_index ) {
|
||||
$index->{$iid} = $iid if(!defined $index->{$iid});
|
||||
}
|
||||
return $index;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::C1900 - Perl5 Interface to SNMP data from Cisco Catlyst 1900 Network Switches running CatOS
|
||||
SNMP::Info::Layer2::C1900 - SNMP Interface to data from Cisco Catalyst 1900
|
||||
Network Switches running CatOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -218,7 +281,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $c1900 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
@@ -230,13 +292,13 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a Catalyst 1900 device through SNMP.
|
||||
See SNMP::Info for full documentation
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Catalyst 1900 device through SNMP. See SNMP::Info for full documentation
|
||||
|
||||
Note that most of these devices only talk SNMP version 1, but not all.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $c1900 = new SNMP::Info::Layer2::C1900(...);
|
||||
|
||||
@@ -244,6 +306,12 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
@@ -252,18 +320,24 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)
|
||||
=item F<STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)>
|
||||
|
||||
ESSWITCH-MIB is included in the Version 1 MIBS from Cisco.
|
||||
F<ESSWITCH-MIB> is included in the Version 1 MIBs from Cisco.
|
||||
|
||||
They can be found at ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
MIBs listed in SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -275,7 +349,7 @@ These are methods that return scalar value from SNMP
|
||||
Usually contains the version of the software loaded in flash.
|
||||
Used by os_ver()
|
||||
|
||||
B<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
|
||||
C<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
|
||||
|
||||
=item $c1900->os()
|
||||
|
||||
@@ -294,43 +368,92 @@ Returns 'cisco' :)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=item $c1900->bulkwalk_no
|
||||
|
||||
Return C<1>. Bulkwalk is turned off for this class.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $c1900->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
|
||||
Crosses $c1900->c1900_p_index() with $c1900->c1900_p_duplex;
|
||||
|
||||
=item $c1900->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
Crosses $c1900->c1900_p_index() with $c1900->c1900_p_duplex_admin;
|
||||
|
||||
=item $c1900->i_name()
|
||||
|
||||
Crosses ifName with c1900_p_name() and returns the human set port name if exists.
|
||||
Crosses C<ifName> with $c1900->c1900_p_name() and returns the human set port
|
||||
name if exists.
|
||||
|
||||
=item $c1900->i_type()
|
||||
=item $c1900->i_vlan()
|
||||
|
||||
Returns reference to hash of IID to port type
|
||||
Returns a mapping between the interface and the VLAN / bridge group if overlap
|
||||
is not enabled.
|
||||
|
||||
Takes the default ifType and overrides it with
|
||||
=item $c1900->i_vlan_membership()
|
||||
|
||||
c1900_p_type() and c1900_p_media() if they exist.
|
||||
Returns reference to hash of arrays: key = interface, value = array of VLAN /
|
||||
bridge group IDs.
|
||||
|
||||
Example:
|
||||
my $interfaces = $c1900->interfaces();
|
||||
my $vlans = $c1900->i_vlan_membership();
|
||||
|
||||
foreach my $iid (sort keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
|
||||
=item $c1900->bp_index()
|
||||
|
||||
Returns a bp_index that contains the original bp_index entries and extra
|
||||
entries for those interfaces listed in if_index, as some C1900 devices do not
|
||||
return complete bp_indexes.
|
||||
|
||||
=back
|
||||
|
||||
=head2 STAND-ALONE-ETHERNET-SWITCH-MIB Switch Port Table Entries:
|
||||
=head2 F<STAND-ALONE-ETHERNET-SWITCH-MIB> Switch Port Table Entries:
|
||||
|
||||
=over
|
||||
|
||||
@@ -338,48 +461,81 @@ c1900_p_type() and c1900_p_media() if they exist.
|
||||
|
||||
Maps the Switch Port Table to the IID
|
||||
|
||||
B<swPortIfIndex>
|
||||
C<swPortIfIndex>
|
||||
|
||||
=item $c1900->c1900_p_duplex()
|
||||
|
||||
Gives Port Duplex Info
|
||||
|
||||
B<swPortDuplexStatus>
|
||||
(C<swPortDuplexStatus>)
|
||||
|
||||
=item $c1900->c1900_p_duplex_admin()
|
||||
|
||||
Gives admin setting for Duplex Info
|
||||
|
||||
B<swPortFullDuplex>
|
||||
(C<swPortFullDuplex>)
|
||||
|
||||
=item $c1900->c1900_p_name()
|
||||
|
||||
Gives human set name for port
|
||||
|
||||
B<swPortName>
|
||||
(C<swPortName>)
|
||||
|
||||
=item $c1900->c1900_p_up_admin()
|
||||
|
||||
Gives Admin status of port enabled.
|
||||
|
||||
B<swPortAdminStatus>
|
||||
(C<swPortAdminStatus>)
|
||||
|
||||
=item $c1900->c1900_p_type()
|
||||
|
||||
Gives Type of port, ie. "general-ethernet"
|
||||
Gives Type of port, i.e. C<"general-ethernet">
|
||||
|
||||
B<swPortMediaCapability>
|
||||
(C<swPortMediaCapability>)
|
||||
|
||||
=item $c1900->c1900_p_media()
|
||||
|
||||
Gives the media of the port , ie "fiber-sc"
|
||||
Gives the media of the port , i.e. "C<fiber-sc>"
|
||||
|
||||
B<swPortConnectorType>
|
||||
(C<swPortConnectorType>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item $c1900->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>. Speed
|
||||
choices are 'auto', 'half', 'full'.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c1900->interfaces()};
|
||||
$c1900->set_i_duplex_admin('auto', $if_map{'1'})
|
||||
or die "Couldn't change port duplex. ",$c1900->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,148 +1,204 @@
|
||||
# SNMP::Info::Layer2::C2900
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::C2900;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::Layer2 SNMP::Info::CiscoVTP Exporter/;
|
||||
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig
|
||||
SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
'i_name' => 'ifAlias',
|
||||
# C2900PortEntry
|
||||
'c2900_p_index' => 'c2900PortIfIndex',
|
||||
'c2900_p_duplex' => 'c2900PortDuplexStatus',
|
||||
'c2900_p_duplex_admin' => 'c2900PortDuplexState',
|
||||
'c2900_p_speed_admin' => 'c2900PortAdminSpeed',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
'i_name' => 'ifAlias',
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
'CISCO-C2900-MIB' => 'ciscoC2900MIB',
|
||||
);
|
||||
# C2900PortEntry
|
||||
'c2900_p_index' => 'c2900PortIfIndex',
|
||||
'c2900_p_duplex' => 'c2900PortDuplexStatus',
|
||||
'c2900_p_duplex_admin' => 'c2900PortDuplexState',
|
||||
'c2900_p_speed_admin' => 'c2900PortAdminSpeed',
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS, 'CISCO-C2900-MIB' => 'ciscoC2900MIB',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $c2900 = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces();
|
||||
my $c2900_p_index = $c2900->c2900_p_index();
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces($partial);
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my $c2900_p_duplex = $c2900->c2900_p_duplex();
|
||||
|
||||
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if (keys %$interfaces){
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $port_2900 = $reverse_2900{$if};
|
||||
next unless defined $port_2900;
|
||||
my $duplex = $c2900_p_duplex->{$port_2900};
|
||||
next unless defined $duplex;
|
||||
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$if}=$duplex;
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c2900 = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces();
|
||||
my $c2900_p_index = $c2900->c2900_p_index();
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $c2900->interfaces($partial);
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my $c2900_p_admin = $c2900->c2900_p_duplex_admin();
|
||||
|
||||
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if (keys %$interfaces){
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $port_2900 = $reverse_2900{$if};
|
||||
next unless defined $port_2900;
|
||||
my $duplex = $c2900_p_admin->{$port_2900};
|
||||
next unless defined $duplex;
|
||||
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex_admin{$if}=$duplex;
|
||||
$i_duplex_admin{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub set_i_speed_admin {
|
||||
my $c2900 = shift;
|
||||
my ( $speed, $iid ) = @_;
|
||||
|
||||
# map speeds to those the switch will understand
|
||||
my %speeds = qw/auto 1 10 10000000 100 100000000/;
|
||||
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
$speed = lc($speed);
|
||||
|
||||
return unless defined $speeds{$speed};
|
||||
|
||||
# account for weirdness of c2900 mib
|
||||
$iid = $reverse_2900{$iid};
|
||||
|
||||
return $c2900->set_c2900_p_speed_admin( $speeds{$speed}, $iid );
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
my $c2900 = shift;
|
||||
my ( $duplex, $iid ) = @_;
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/full 1 half 2 auto 3/;
|
||||
|
||||
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||
my %reverse_2900 = reverse %$c2900_p_index;
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return unless defined $duplexes{$duplex};
|
||||
|
||||
# account for weirdness of c2900 mib
|
||||
$iid = $reverse_2900{$iid};
|
||||
|
||||
return $c2900->set_c2900_p_duplex_admin( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
|
||||
# Use i_descritption for port key, cuz i_name can be manually entered.
|
||||
sub interfaces {
|
||||
my $c2900 = shift;
|
||||
my $interfaces = $c2900->i_index();
|
||||
my $i_descr = $c2900->i_description();
|
||||
my $c2900 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $c2900->i_index($partial) || {};
|
||||
my $i_descr = $c2900->i_description($partial) || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid (keys %$interfaces){
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
|
||||
$port =~ s/\./\//g if( $port =~ /\d+\.\d+$/);
|
||||
$port =~ s/\./\//g if ( $port =~ /\d+\.\d+$/ );
|
||||
$port =~ s/[^\d\/,()\w]+//gi;
|
||||
|
||||
|
||||
$if{$iid} = $port;
|
||||
}
|
||||
|
||||
return \%if
|
||||
return \%if;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -150,26 +206,27 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches running IOS
|
||||
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches
|
||||
running IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c2900 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $c2900->class();
|
||||
my $class = $c2900->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -177,8 +234,8 @@ Max Baker (C<max@warped.org>)
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
C2900 device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $c2900 = new SNMP::Info::Layer2::C2900(...);
|
||||
|
||||
@@ -186,28 +243,40 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-C2900-MIB
|
||||
=item F<CISCO-C2900-MIB>
|
||||
|
||||
Part of the v2 MIBs from Cisco.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info::Layer2 for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::CiscoVTP for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -218,19 +287,35 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $c2900->vendor()
|
||||
|
||||
Returns 'cisco' :)
|
||||
Returns 'cisco' :)
|
||||
|
||||
=item $c2900->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in SNMP::Info::CiscoVTP for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -241,68 +326,118 @@ to a hash.
|
||||
|
||||
=item $c2900->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
On the 2900 devices i_name isn't reliable, so we override to just the description.
|
||||
On the 2900 devices i_name isn't reliable, so we override to just the
|
||||
description.
|
||||
|
||||
Next all dots are changed for forward slashes so that the physical port name
|
||||
is the same as the broadcasted CDP port name.
|
||||
(Ethernet0.1 -> Ethernet0/1)
|
||||
Next all dots are changed for forward slashes so that the physical port name
|
||||
is the same as the broad-casted CDP port name.
|
||||
(Ethernet0.1 -> Ethernet0/1)
|
||||
|
||||
Also, any weird characters are removed, as I saw a few pop up.
|
||||
Also, any weird characters are removed, as I saw a few pop up.
|
||||
|
||||
=item $c2900->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
Returns reference to map of IIDs to current link duplex
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex;
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex()
|
||||
|
||||
=item $c2900->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin;
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin()
|
||||
|
||||
=back
|
||||
|
||||
=head2 C2900-MIB Port Entry Table
|
||||
=head2 F<C2900-MIB> Port Entry Table
|
||||
|
||||
=over
|
||||
|
||||
=item $c2900->c2900_p_index()
|
||||
|
||||
Maps the Switch Port Table to the IID
|
||||
Maps the Switch Port Table to the IID
|
||||
|
||||
B<c2900PortIfIndex>
|
||||
(C<c2900PortIfIndex>)
|
||||
|
||||
=item $c2900->c2900_p_duplex()
|
||||
|
||||
Gives Port Duplex Info
|
||||
Gives Port Duplex Info
|
||||
|
||||
B<c2900PortDuplexStatus>
|
||||
(C<c2900PortDuplexStatus>)
|
||||
|
||||
=item $c2900->c2900_p_duplex_admin()
|
||||
|
||||
Gives admin setting for Duplex Info
|
||||
|
||||
B<c2900PortDuplexState>
|
||||
Gives admin setting for Duplex Info
|
||||
|
||||
(C<c2900PortDuplexState>)
|
||||
|
||||
=item $c2900->c2900_p_speed_admin()
|
||||
|
||||
Gives Admin speed of port
|
||||
Gives Admin speed of port
|
||||
|
||||
B<c2900PortAdminSpeed>
|
||||
(C<c2900PortAdminSpeed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in SNMP::Info::CiscoVTP for details.
|
||||
See L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item $c2900->set_i_speed_admin(speed, ifIndex)
|
||||
|
||||
Sets port speed, must be supplied with speed and port C<ifIndex>
|
||||
|
||||
Speed choices are 'auto', '10', '100'
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_speed_admin() to utilize
|
||||
port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c2900->interfaces()};
|
||||
$c2900->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port speed. ",$c2900->error(1);
|
||||
|
||||
=item $c2900->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>
|
||||
|
||||
Speed choices are 'auto', 'half', 'full'
|
||||
|
||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin() to utilize
|
||||
port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c2900->interfaces()};
|
||||
$c2900->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port duplex. ",$c2900->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,77 +1,82 @@
|
||||
# SNMP::Info::Layer2::Catalyst
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# Copyright (c) 2003,2004 Max Baker changes from version 0.8 and beyond
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Catalyst;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
|
||||
@SNMP::Info::Layer2::Catalyst::ISA = qw/SNMP::Info::CiscoStack SNMP::Info::Layer2
|
||||
SNMP::Info::CiscoVTP Exporter/;
|
||||
@SNMP::Info::Layer2::Catalyst::ISA
|
||||
= qw/SNMP::Info::CiscoStack SNMP::Info::CiscoVTP
|
||||
SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS,
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS, %SNMP::Info::CiscoStack::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
);
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS,
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS, %SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS, %SNMP::Info::CiscoStack::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE, %SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
|
||||
# Overidden Methods
|
||||
|
||||
@@ -82,9 +87,9 @@ sub i_physical {
|
||||
my $p_port = $cat->p_port();
|
||||
|
||||
my %i_physical;
|
||||
foreach my $port (keys %$p_port) {
|
||||
foreach my $port ( keys %$p_port ) {
|
||||
my $iid = $p_port->{$port};
|
||||
$i_physical{$iid} = 1;
|
||||
$i_physical{$iid} = 1;
|
||||
}
|
||||
return \%i_physical;
|
||||
}
|
||||
@@ -98,20 +103,74 @@ sub os {
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $cat = shift;
|
||||
my $cat = shift;
|
||||
my $os_ver = $cat->SUPER::os_ver();
|
||||
return $os_ver if defined $os_ver;
|
||||
|
||||
my $m_swver = $cat->m_swver();
|
||||
return undef unless defined $m_swver;
|
||||
return unless defined $m_swver;
|
||||
|
||||
# assume .1 entry is the chassis and the sw version we want.
|
||||
return $m_swver->{1} if defined $m_swver->{1};
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
# Workaround for incomplete bp_index
|
||||
sub bp_index {
|
||||
my $cat = shift;
|
||||
my $p_index = $cat->p_port();
|
||||
my $b_index = $cat->p_oidx();
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid ( keys %$p_index ) {
|
||||
my $ifidx = $p_index->{$iid};
|
||||
next unless defined $ifidx;
|
||||
my $bpidx = $b_index->{$iid} || 0;
|
||||
|
||||
$bp_index{$bpidx} = $ifidx;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
1;
|
||||
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;
|
||||
@@ -119,11 +178,12 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Catalyst - Perl5 Interface to Cisco Catalyst 5000 series devices.
|
||||
SNMP::Info::Layer2::Catalyst - SNMP Interface to Cisco Catalyst devices
|
||||
running Catalyst OS.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -131,7 +191,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $cat = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -143,21 +202,25 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info subclass to provide information for Cisco Catalyst 5000 series switches running CatOS.
|
||||
SNMP::Info subclass to provide information for Cisco Catalyst series switches
|
||||
running CatOS.
|
||||
|
||||
This subclass is not for all devices that have the name Catalyst. Note that some Catalyst
|
||||
switches run IOS, like the 2900 and 3550 families. Cisco Catalyst 1900 switches use their
|
||||
own MIB and have a separate subclass. Use the method above to have SNMP::Info determine the
|
||||
appropriate subclass before using this class directly.
|
||||
This class includes the Catalyst 2920, 4000, 5000, 6000 (hybrid mode)
|
||||
families.
|
||||
|
||||
This class includes the Catalyst 2950 series devices, which fall under the
|
||||
Catalyst 5000 family.
|
||||
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.
|
||||
See SNMP::Info::device_type() for specifics.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
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(...);
|
||||
|
||||
@@ -165,11 +228,17 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
@@ -179,11 +248,18 @@ a more specific class using the method above.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info::Layer2 for its own MIB requirements.
|
||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::CiscoVTP for its own MIB requirements.
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::CiscoStack for its own MIB requirements.
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -208,35 +284,93 @@ it grabs $cat->m_swver()->{1} and uses that.
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $cat->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in SNMP::Info::CiscoVTP for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in SNMP::Info::CiscoStack for details.
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head2 Globals imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
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::CiscoStack
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in SNMP::Info::CiscoVTP for details.
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2::CiscoSTack
|
||||
|
||||
See documentation in SNMP::Info::Layer2::CiscoStack for details.
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,96 +1,102 @@
|
||||
# SNMP::Info::Layer2::Centillion
|
||||
# Eric Miller <eric@jeneric.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Centillion;
|
||||
$VERSION = 0.9;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::NortelStack;
|
||||
use SNMP::Info::SONMP;
|
||||
|
||||
@SNMP::Info::Layer2::Centillion::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/;
|
||||
@SNMP::Info::Layer2::Centillion::ISA
|
||||
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/;
|
||||
@SNMP::Info::Layer2::Centillion::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
%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',
|
||||
);
|
||||
$VERSION = '3.03';
|
||||
|
||||
%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',
|
||||
);
|
||||
%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',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::NortelStack::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::NortelStack::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
);
|
||||
# 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';
|
||||
@@ -102,12 +108,13 @@ sub vendor {
|
||||
|
||||
sub i_ignore {
|
||||
my $centillion = shift;
|
||||
my $descr = $centillion->i_description();
|
||||
my $descr = $centillion->i_description();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$descr){
|
||||
foreach my $if ( keys %$descr ) {
|
||||
my $type = $descr->{$if};
|
||||
# Skip virtual interfaces
|
||||
|
||||
# Skip virtual interfaces
|
||||
$i_ignore{$if}++ if $type =~ /(VE|VID|vc|lp)/i;
|
||||
}
|
||||
return \%i_ignore;
|
||||
@@ -115,24 +122,25 @@ sub i_ignore {
|
||||
|
||||
sub interfaces {
|
||||
my $centillion = shift;
|
||||
my $i_index = $centillion->i_index();
|
||||
my $i_descr = $centillion->i_description();
|
||||
my $i_index = $centillion->i_index();
|
||||
my $i_descr = $centillion->i_description();
|
||||
|
||||
my %if;
|
||||
foreach my $iid (keys %$i_index){
|
||||
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;
|
||||
my $descr = $i_descr->{$iid};
|
||||
|
||||
# Index numbers are deterministic slot * 256 + port
|
||||
my $port = $index % 256;
|
||||
my $slot = int($index / 256);
|
||||
# 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;
|
||||
|
||||
$slotport = "$descr" if $descr =~ /(mcp)/i;
|
||||
|
||||
$if{$index} = $slotport;
|
||||
}
|
||||
|
||||
@@ -141,89 +149,89 @@ sub interfaces {
|
||||
|
||||
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){
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
my $duplex = $port_duplex->{$iid};
|
||||
next unless defined $duplex;
|
||||
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$index}=$duplex;
|
||||
$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){
|
||||
foreach my $iid ( keys %$port_index ) {
|
||||
my $index = $port_index->{$iid};
|
||||
next unless defined $index;
|
||||
my $duplex = $port_admin->{$iid};
|
||||
next unless defined $duplex;
|
||||
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex_admin{$index}=$duplex;
|
||||
$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 $cn_vlan = $centillion->centillion_i_vlan();
|
||||
|
||||
my %i_vlan;
|
||||
foreach my $iid (keys %$cn_vlan_index){
|
||||
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;
|
||||
next unless defined $vlan;
|
||||
|
||||
$i_vlan{$index} = $vlan;
|
||||
}
|
||||
return \%i_vlan;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $centillion = shift;
|
||||
my $id = $centillion->id();
|
||||
return undef unless defined $id;
|
||||
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 '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 $index = $centillion->fw_port();
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid (keys %$index){
|
||||
foreach my $iid ( keys %$index ) {
|
||||
my $b_index = $index->{$iid};
|
||||
next unless defined $b_index;
|
||||
|
||||
#Index value is the same as ifIndex
|
||||
#Index value is the same as ifIndex
|
||||
$bp_index{$b_index} = $b_index;
|
||||
}
|
||||
|
||||
@@ -238,17 +246,17 @@ sub slot_offset {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Centillion - SNMP Interface to Nortel Centillion based ATM Switches
|
||||
SNMP::Info::Layer2::Centillion - SNMP Interface to Nortel Centillion based
|
||||
ATM Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller (C<eric@jeneric.org>)
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -256,7 +264,6 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
my $centillion = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -271,8 +278,8 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Centillion device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $centillion = new SNMP::Info::Layer2::centillion(...);
|
||||
|
||||
@@ -297,35 +304,26 @@ than bridge group based.
|
||||
|
||||
=over
|
||||
|
||||
=item CENTILLION-DOT3-EXTENSIONS-MIB
|
||||
=item F<CENTILLION-DOT3-EXTENSIONS-MIB>
|
||||
|
||||
=item S5-COMMON-STATS-MIB
|
||||
=item F<S5-COMMON-STATS-MIB>
|
||||
|
||||
=item CENTILLION-VLAN-MIB
|
||||
=item F<CENTILLION-VLAN-MIB>
|
||||
|
||||
=item CENTILLION-CONFIG-MIB
|
||||
=item F<CENTILLION-CONFIG-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info for its own MIB requirements.
|
||||
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::Bridge for its own MIB requirements.
|
||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::NortelStack for its own MIB requirements.
|
||||
See L<SNMP::Info::NortelStack/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::SONMP for its own MIB requirements.
|
||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found on the CD that came with your product.
|
||||
|
||||
Or, they can be downloaded directly from Nortel Networks regardless of support
|
||||
contract status.
|
||||
|
||||
Go to http://www.nortelnetworks.com Techninal Support, Browse Technical Support,
|
||||
Select by Product Families, Centillion, Centillion C100-C50 ATM Speed Modules,
|
||||
Software. Filter on mibs and download the latest version's archive.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -338,10 +336,10 @@ Returns 'Nortel'
|
||||
|
||||
=item $centillion->model()
|
||||
|
||||
Cross references $centillion->id() to the SYNOPTICS-MIB and returns
|
||||
Cross references $centillion->id() to the F<SYNOPTICS-MIB> and returns
|
||||
the results.
|
||||
|
||||
Removes sreg- from the model name
|
||||
Removes C<sreg-> from the model name
|
||||
|
||||
=item $centillion->os()
|
||||
|
||||
@@ -349,23 +347,23 @@ Returns 'Centillion'
|
||||
|
||||
=item $centillion->tftp_action()
|
||||
|
||||
(B<sysTFTPStart>)
|
||||
(C<sysTFTPStart>)
|
||||
|
||||
=item $centillion->tftp_host()
|
||||
|
||||
(B<sysTFTPIpAddress>)
|
||||
(C<sysTFTPIpAddress>)
|
||||
|
||||
=item $centillion->tftp_file()
|
||||
|
||||
(B<sysTFTPFileName>)
|
||||
(C<sysTFTPFileName>)
|
||||
|
||||
=item $centillion->tftp_type()
|
||||
|
||||
(B<sysTFTPFileType>)
|
||||
(C<sysTFTPFileType>)
|
||||
|
||||
=item $centillion->tftp_result()
|
||||
|
||||
(B<sysTFTPResult>)
|
||||
(C<sysTFTPResult>)
|
||||
|
||||
=back
|
||||
|
||||
@@ -375,7 +373,8 @@ Returns 'Centillion'
|
||||
|
||||
=item $centillion->layers()
|
||||
|
||||
Returns 00000011. Class emulates Layer 2 functionality through proprietary MIBs.
|
||||
Returns 00000011. Class emulates Layer 2 functionality through proprietary
|
||||
MIBs.
|
||||
|
||||
=item $centillion->index_factor()
|
||||
|
||||
@@ -391,21 +390,21 @@ start at 0. Returns 0.
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::NortelStack
|
||||
|
||||
See documentation in SNMP::Info::NortelStack for details.
|
||||
See documentation in L<SNMP::Info::NortelStack/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in SNMP::Info::SONMP for details.
|
||||
See documentation in L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -418,7 +417,8 @@ to a hash.
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
Slot and port numbers on the Passport switches are determined by the formula:
|
||||
Slot and port numbers on the Passport switches are determined by the
|
||||
formula:
|
||||
port = index % 256
|
||||
slot = int(index / 256)
|
||||
|
||||
@@ -438,23 +438,23 @@ Returns reference to hash of IIDs to ignore.
|
||||
|
||||
=item $centillion->fw_mac()
|
||||
|
||||
(B<s5CmSNodeMacAddr>)
|
||||
(C<s5CmSNodeMacAddr>)
|
||||
|
||||
=item $centillion->fw_port()
|
||||
|
||||
(B<s5CmSNodeIfIndx>)
|
||||
(C<s5CmSNodeIfIndx>)
|
||||
|
||||
=item $centillion->bp_index()
|
||||
|
||||
Returns a mapping between ifIndex and the Bridge Table.
|
||||
Returns a mapping between C<ifIndex> and the Bridge Table.
|
||||
|
||||
=item $centillion->i_vlan()
|
||||
|
||||
Returns a mapping between ifIndex and the VLAN.
|
||||
Returns a mapping between C<ifIndex> and the VLAN.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Centillion 802.3 Extension Table (B<cnDot3ExtnTable>)
|
||||
=head2 Centillion 802.3 Extension Table (C<cnDot3ExtnTable>)
|
||||
|
||||
=over
|
||||
|
||||
@@ -462,23 +462,23 @@ Returns a mapping between ifIndex and the VLAN.
|
||||
|
||||
Returns reference to hash. Maps table IIDs to Interface IIDs
|
||||
|
||||
(B<cnDot3ExtnIfIndex>)
|
||||
(C<cnDot3ExtnIfIndex>)
|
||||
|
||||
=item $centillion->centillion_p_duplex()
|
||||
|
||||
Returns reference to hash. Maps port operational duplexes to IIDs
|
||||
|
||||
(B<cnDot3ExtnIfOperConnectionType>)
|
||||
(C<cnDot3ExtnIfOperConnectionType>)
|
||||
|
||||
=item $centillion->rc_centillion_p_duplex_admin()
|
||||
|
||||
Returns reference to hash. Maps port admin duplexes to IIDs
|
||||
|
||||
(B<cnDot3ExtnIfAdminConnectionType>)
|
||||
(C<cnDot3ExtnIfAdminConnectionType>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Centillion VLAN Table (B<cnVlanPortMemberTable>)
|
||||
=head2 Centillion VLAN Table (C<cnVlanPortMemberTable>)
|
||||
|
||||
=over
|
||||
|
||||
@@ -486,36 +486,36 @@ Returns reference to hash. Maps port admin duplexes to IIDs
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: Index
|
||||
|
||||
(B<cnVlanPortMemberIfIndex>)
|
||||
(C<cnVlanPortMemberIfIndex>)
|
||||
|
||||
=item $centillion->centillion_i_vlan()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: VLAN ID
|
||||
|
||||
(B<cnVlanPortMemberVID>)
|
||||
(C<cnVlanPortMemberVID>)
|
||||
|
||||
=item $centillion->centillion_i_vlan_type()
|
||||
|
||||
Returns reference to hash. Key: Table entry, Value: VLAN Type
|
||||
|
||||
(B<cnVlanPortMemberIngressType>)
|
||||
(C<cnVlanPortMemberIngressType>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::NortelStack
|
||||
|
||||
See documentation in SNMP::Info::NortelStack for details.
|
||||
See documentation in L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in SNMP::Info::SONMP for details.
|
||||
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
242
Info/Layer2/Cisco.pm
Normal file
242
Info/Layer2/Cisco.pm
Normal file
@@ -0,0 +1,242 @@
|
||||
# SNMP::Info::Layer2::Cisco
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Cisco;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoRTT;
|
||||
use SNMP::Info::CiscoQOS;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
|
||||
SNMP::Info::CiscoConfig SNMP::Info::Layer2
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoQOS::MIBS, %SNMP::Info::CiscoRTT::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS, %SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoQOS::GLOBALS, %SNMP::Info::CiscoRTT::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS, %SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoQOS::FUNCS, %SNMP::Info::CiscoRTT::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS, %SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoQOS::MUNGE, %SNMP::Info::CiscoRTT::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
|
||||
that are not covered in other classes.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $cisco = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $cisco->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoRTT
|
||||
|
||||
=item SNMP::Info::CiscoQOS
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoQOS/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $cisco->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoRTT
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoQOS
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoRTT
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoQOS
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
File diff suppressed because it is too large
Load Diff
724
Info/Layer2/HP4000.pm
Normal file
724
Info/Layer2/HP4000.pm
Normal file
@@ -0,0 +1,724 @@
|
||||
# SNMP::Info::Layer2::HP4000 - SNMP Interface to older HP ProCurve Switches (1600, 2400, 2424M, 4000 and 8000)
|
||||
#
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::HP4000;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::CDP;
|
||||
|
||||
@SNMP::Info::Layer2::HP4000::ISA
|
||||
= qw/SNMP::Info::Layer3 SNMP::Info::MAU
|
||||
SNMP::Info::CDP Exporter/;
|
||||
@SNMP::Info::Layer2::HP4000::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
'RFC1271-MIB' => 'logDescription',
|
||||
'HP-ICF-OID' => 'hpSwitch4000',
|
||||
'HP-VLAN' => 'hpVlanMemberIndex',
|
||||
'STATISTICS-MIB' => 'hpSwitchCpuStat',
|
||||
'NETSWITCH-MIB' => 'hpMsgBufFree',
|
||||
'CONFIG-MIB' => 'hpSwitchConfig',
|
||||
'SEMI-MIB' => 'hpHttpMgSerialNumber',
|
||||
'HP-ICF-CHASSIS' => 'hpicfSensorObjectId',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
'serial1' => 'hpHttpMgSerialNumber.0',
|
||||
'hp_cpu' => 'hpSwitchCpuStat.0',
|
||||
'hp_mem_total' => 'hpGlobalMemTotalBytes.1',
|
||||
'mem_free' => 'hpGlobalMemFreeBytes.1',
|
||||
'mem_used' => 'hpGlobalMemAllocBytes.1',
|
||||
'os_version' => 'hpSwitchOsVersion.0',
|
||||
'os_bin' => 'hpSwitchRomVersion.0',
|
||||
'mac' => 'hpSwitchBaseMACAddress.0',
|
||||
'hp_vlans' => 'hpVlanNumber',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
'bp_index2' => 'dot1dBasePortIfIndex',
|
||||
'i_type2' => 'ifType',
|
||||
|
||||
# RFC1271
|
||||
'l_descr' => 'logDescription',
|
||||
|
||||
# HP-VLAN-MIB
|
||||
'hp_v_index' => 'hpVlanDot1QID',
|
||||
'hp_v_name' => 'hpVlanIdentName',
|
||||
'hp_v_state' => 'hpVlanIdentState',
|
||||
'hp_v_type' => 'hpVlanIdentType',
|
||||
'hp_v_status' => 'hpVlanIdentStatus',
|
||||
'hp_v_mac' => 'hpVlanAddrPhysAddress',
|
||||
'hp_v_if_index' => 'hpVlanMemberIndex',
|
||||
'hp_v_if_tag' => 'hpVlanMemberTagged2',
|
||||
|
||||
# CONFIG-MIB::hpSwitchPortTable
|
||||
'hp_duplex' => 'hpSwitchPortEtherMode',
|
||||
'hp_duplex_admin' => 'hpSwitchPortFastEtherMode',
|
||||
'vendor_i_type' => 'hpSwitchPortType',
|
||||
|
||||
# HP-ICF-CHASSIS
|
||||
'hp_s_oid' => 'hpicfSensorObjectId',
|
||||
'hp_s_name' => 'hpicfSensorDescr',
|
||||
'hp_s_status' => 'hpicfSensorStatus',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE
|
||||
);
|
||||
|
||||
%MODEL_MAP = (
|
||||
'J4093A' => '2424M',
|
||||
'J4110A' => '8000M',
|
||||
'J4120A' => '1600M',
|
||||
'J4121A' => '4000M',
|
||||
'J4122A' => '2400M',
|
||||
'J4122B' => '2424M',
|
||||
);
|
||||
|
||||
# Method Overrides
|
||||
|
||||
sub cpu {
|
||||
my $hp = shift;
|
||||
return $hp->hp_cpu();
|
||||
}
|
||||
|
||||
sub mem_total {
|
||||
my $hp = shift;
|
||||
return $hp->hp_mem_total();
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $hp = shift;
|
||||
my $os_version = $hp->os_version();
|
||||
return $os_version if defined $os_version;
|
||||
|
||||
# Some older ones don't have this value,so we cull it from the description
|
||||
my $descr = $hp->description();
|
||||
if ( $descr =~ m/revision ([A-Z]{1}\.\d{2}\.\d{2})/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
# Lookup model number, and translate the part number to the common number
|
||||
sub model {
|
||||
my $hp = shift;
|
||||
my $id = $hp->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^hpswitch//i;
|
||||
|
||||
return defined $MODEL_MAP{$model} ? $MODEL_MAP{$model} : $model;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $hp = shift;
|
||||
my $interfaces = $hp->i_index();
|
||||
my $i_descr = $hp->i_description();
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $descr = $i_descr->{$iid};
|
||||
next unless defined $descr;
|
||||
$if{$iid} = $descr if ( defined $descr and length $descr );
|
||||
}
|
||||
|
||||
return \%if
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $hp = shift;
|
||||
my $i_alias = $hp->i_alias();
|
||||
my $e_name = $hp->e_name();
|
||||
my $e_port = $hp->e_port();
|
||||
|
||||
my %i_name;
|
||||
|
||||
foreach my $port ( keys %$e_name ) {
|
||||
my $iid = $e_port->{$port};
|
||||
next unless defined $iid;
|
||||
my $alias = $i_alias->{$iid};
|
||||
next unless defined $iid;
|
||||
$i_name{$iid} = $e_name->{$port};
|
||||
|
||||
# Check for alias
|
||||
$i_name{$iid} = $alias if ( defined $alias and length($alias) );
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $hp = shift;
|
||||
|
||||
return $hp->mau_i_duplex();
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Try HP MIB first
|
||||
my $hp_duplex = $hp->hp_duplex_admin($partial);
|
||||
if ( defined $hp_duplex and scalar( keys %$hp_duplex ) ) {
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if ( keys %$hp_duplex ) {
|
||||
my $duplex = $hp_duplex->{$if};
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
else {
|
||||
return $hp->mau_i_duplex_admin();
|
||||
}
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub log {
|
||||
my $hp = shift;
|
||||
|
||||
my $log = $hp->l_descr();
|
||||
|
||||
my $logstring = undef;
|
||||
|
||||
foreach my $val ( values %$log ) {
|
||||
next if $val =~ /^Link\s+(Up|Down)/;
|
||||
$logstring .= "$val\n";
|
||||
}
|
||||
|
||||
return $logstring;
|
||||
}
|
||||
|
||||
sub slots {
|
||||
my $hp = shift;
|
||||
|
||||
my $e_name = $hp->e_name();
|
||||
|
||||
return unless defined $e_name;
|
||||
|
||||
my $slots;
|
||||
foreach my $slot ( keys %$e_name ) {
|
||||
$slots++ if $e_name->{$slot} =~ /slot/i;
|
||||
}
|
||||
|
||||
return $slots;
|
||||
}
|
||||
|
||||
sub fan {
|
||||
my $hp = shift;
|
||||
return &_sensor( $hp, 'fan' );
|
||||
}
|
||||
|
||||
sub ps1_status {
|
||||
my $hp = shift;
|
||||
return &_sensor( $hp, 'power', '^power supply 1' )
|
||||
|| &_sensor( $hp, 'power', '^power supply sensor' );
|
||||
}
|
||||
|
||||
sub ps2_status {
|
||||
my $hp = shift;
|
||||
return &_sensor( $hp, 'power', '^power supply 2' )
|
||||
|| &_sensor( $hp, 'power', '^redundant' );
|
||||
}
|
||||
|
||||
sub _sensor {
|
||||
my $hp = shift;
|
||||
my $search_type = shift || 'fan';
|
||||
my $search_name = shift || '';
|
||||
my $hp_s_oid = $hp->hp_s_oid();
|
||||
my $result;
|
||||
foreach my $sensor ( keys %$hp_s_oid ) {
|
||||
my $sensortype = &SNMP::translateObj( $hp_s_oid->{$sensor} );
|
||||
if ( $sensortype =~ /$search_type/i ) {
|
||||
my $sensorname = $hp->hp_s_name()->{$sensor};
|
||||
my $sensorstatus = $hp->hp_s_status()->{$sensor};
|
||||
if ( $sensorname =~ /$search_name/i ) {
|
||||
$result = $sensorstatus;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
# Bridge MIB does not map Bridge Port to ifIndex correctly on older models, but Bridge Port equals ifIndex in these devices
|
||||
sub bp_index {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $if_index = $hp->i_index($partial);
|
||||
my %mod_bp_index;
|
||||
foreach my $iid ( keys %$if_index ) {
|
||||
$mod_bp_index{$iid} = $iid;
|
||||
}
|
||||
return \%mod_bp_index;
|
||||
}
|
||||
|
||||
# VLAN methods. Devices in this class use the proprietary HP-VLAN-MIB.
|
||||
|
||||
sub v_index {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $hp->hp_v_index($partial);
|
||||
}
|
||||
|
||||
sub v_name {
|
||||
my $hp = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $hp->hp_v_name($partial);
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $hp = shift;
|
||||
|
||||
# the hpvlanmembertagged2 table has an entry in the form of
|
||||
# vlan.interface = /untagged/no/tagged/auto
|
||||
my $i_vlan = {};
|
||||
my $hp_v_index = $hp->hp_v_index();
|
||||
my $hp_v_if_tag = $hp->hp_v_if_tag();
|
||||
foreach my $row ( keys %$hp_v_if_tag ) {
|
||||
my ( $index, $if ) = split( /\./, $row );
|
||||
|
||||
my $tag = $hp_v_if_tag->{$row};
|
||||
my $vlan = $hp_v_index->{$index};
|
||||
|
||||
next unless ( defined $tag and $tag =~ /untagged/ );
|
||||
|
||||
$i_vlan->{$if} = $vlan if defined $vlan;
|
||||
}
|
||||
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $hp = shift;
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
my $hp_v_index = $hp->hp_v_index();
|
||||
my $hp_v_if_tag = $hp->hp_v_if_tag();
|
||||
foreach my $row ( keys %$hp_v_if_tag ) {
|
||||
my ( $index, $if ) = split( /\./, $row );
|
||||
|
||||
my $tag = $hp_v_if_tag->{$row};
|
||||
my $vlan = $hp_v_index->{$index};
|
||||
|
||||
next unless ( defined $tag );
|
||||
next if ( $tag eq 'no' );
|
||||
|
||||
push( @{ $i_vlan_membership->{$if} }, $vlan );
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
sub set_i_vlan {
|
||||
my $hp = shift;
|
||||
my $rv;
|
||||
|
||||
my $hp_v_index = $hp->hp_v_index();
|
||||
my $hp_v_if_tag = $hp->hp_v_if_tag();
|
||||
if (defined $hp_v_index and scalar(keys %$hp_v_index)){
|
||||
my $vlan = shift;
|
||||
my $iid = shift;
|
||||
my $old_untagged;
|
||||
# Hash to lookup VLAN index of the VID (dot1q tag)
|
||||
my %vl_trans = reverse %$hp_v_index;
|
||||
|
||||
# Translate the VLAN identifier (tag) value to the index used by the HP-VLAN MIB
|
||||
my $vlan_index = $vl_trans{$vlan};
|
||||
if (defined $vlan_index) {
|
||||
|
||||
# First, loop through table to determine current untagged vlan for the port we're about to change
|
||||
foreach my $row (keys %$hp_v_if_tag){
|
||||
my ($index,$if) = split(/\./,$row);
|
||||
if ($if == $iid and $hp_v_if_tag->{$row} =~ /untagged/) {
|
||||
# Store the row information of the current untagged VLAN and temporarily set it to tagged
|
||||
$old_untagged = $row;
|
||||
$rv = $hp->set_hp_v_if_tag(1, $row);
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
# Then set our port untagged in the desired VLAN
|
||||
my $rv = $hp->set_hp_v_if_tag(2, "$vlan_index.$iid");
|
||||
if (defined $rv) {
|
||||
# If vlan change is successful, remove VLAN that used to be untagged from the port
|
||||
if (defined $old_untagged) {
|
||||
$rv = $hp->set_hp_v_if_tag(3, $old_untagged);
|
||||
$hp->error_throw("Error removing previous untagged vlan from port, should never happen...\n") unless defined $rv;
|
||||
}
|
||||
} else {
|
||||
# If vlan change was not succesful, try to revert to the old situation.
|
||||
if (defined $old_untagged) {
|
||||
$rv = $hp->set_hp_v_if_tag(2, $old_untagged) if defined $old_untagged;
|
||||
if (defined $rv) {
|
||||
$hp->error_throw("VLAN change failed, restored port to previous configuration.\n");
|
||||
} else {
|
||||
$hp->error_throw("VLAN change failed, unable to restore old configuration. Check device.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$hp->error_throw("Requested VLAN (VLAN ID: $vlan) not available on device.\n");
|
||||
}
|
||||
} else {
|
||||
$hp->error_throw("Error retrieving VLAN information from device.\n");
|
||||
}
|
||||
return $rv;
|
||||
}
|
||||
|
||||
sub set_i_vlan_tagged {
|
||||
my $hp = shift;
|
||||
my $vlan = shift;
|
||||
my $iid = shift;
|
||||
my $rv;
|
||||
|
||||
my $hp_v_index = $hp->hp_v_index();
|
||||
if (defined $hp_v_index and scalar(keys %$hp_v_index)){
|
||||
# Hash to lookup VLAN index of the VID (dot1q tag)
|
||||
my %vl_trans = reverse %$hp_v_index;
|
||||
|
||||
# Translate the VLAN identifier (tag) value to the index used by the HP-VLAN MIB
|
||||
my $vlan_index = $vl_trans{$vlan};
|
||||
if (defined $vlan_index) {
|
||||
# Set our port tagged in the desired VLAN
|
||||
$rv = $hp->set_hp_v_if_tag(1, "$vlan_index.$iid");
|
||||
} else {
|
||||
$hp->error_throw("Requested VLAN (VLAN ID: $vlan) not available on device.\n");
|
||||
}
|
||||
}
|
||||
return $rv;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::HP4000 - SNMP Interface to older HP ProCurve Switches (1600, 2400, 2424M, 4000 and 8000)
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $hp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $hp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
HP ProCurve Switch via SNMP.
|
||||
|
||||
Note: Some HP Switches will connect via SNMP version 1, but a lot of config
|
||||
data will not be available. Make sure you try and connect with Version 2
|
||||
first, and then fail back to version 1.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $hp = new SNMP::Info::Layer2::HP4000(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<RFC1271-MIB>
|
||||
|
||||
Included in V2 mibs from Cisco
|
||||
|
||||
=item F<HP-ICF-OID>
|
||||
|
||||
=item F<HP-VLAN>
|
||||
|
||||
(this MIB new with SNMP::Info 0.8)
|
||||
|
||||
=item F<STATISTICS-MIB>
|
||||
|
||||
=item F<NETSWITCH-MIB>
|
||||
|
||||
=item F<CONFIG-MIB>
|
||||
|
||||
=back
|
||||
|
||||
The last five MIBs listed are from HP and can be found at
|
||||
L<http://www.hp.com/rnd/software> or
|
||||
L<http://www.hp.com/rnd/software/MIBs.htm>
|
||||
|
||||
=head1 Change Log
|
||||
|
||||
Version 0.4 - Removed F<ENTITY-MIB> e_*() methods to separate sub-class -
|
||||
SNMP::Info::Entity
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->cpu()
|
||||
|
||||
Returns CPU Utilization in percentage.
|
||||
|
||||
=item $hp->log()
|
||||
|
||||
Returns all the log entries from the switch's log that are not Link up or
|
||||
down messages.
|
||||
|
||||
=item $hp->mem_free()
|
||||
|
||||
Returns bytes of free memory
|
||||
|
||||
=item $hp->mem_total()
|
||||
|
||||
Return bytes of total memory
|
||||
|
||||
=item $hp->mem_used()
|
||||
|
||||
Returns bytes of used memory
|
||||
|
||||
=item $hp->model()
|
||||
|
||||
Returns the model number of the HP Switch. Will translate between the HP Part
|
||||
number and the common model number with this map :
|
||||
|
||||
%MODEL_MAP = (
|
||||
'J4093A' => '2424M',
|
||||
'J4110A' => '8000M',
|
||||
'J4120A' => '1600M',
|
||||
'J4121A' => '4000M',
|
||||
'J4122A' => '2400M',
|
||||
'J4122B' => '2424M',
|
||||
);
|
||||
|
||||
=item $hp->os()
|
||||
|
||||
Returns hp
|
||||
|
||||
=item $hp->os_bin()
|
||||
|
||||
C<hpSwitchRomVersion.0>
|
||||
|
||||
=item $hp->os_ver()
|
||||
|
||||
Tries to use os_version() and if that fails will try and cull the version from
|
||||
the description field.
|
||||
|
||||
=item $hp->os_version()
|
||||
|
||||
C<hpSwitchOsVersion.0>
|
||||
|
||||
=item $hp->serial()
|
||||
|
||||
Returns serial number if available through SNMP
|
||||
|
||||
=item $hp->slots()
|
||||
|
||||
Returns number of entries in $hp->e_name that have 'slot' in them.
|
||||
|
||||
=item $hp->vendor()
|
||||
|
||||
hp
|
||||
|
||||
=item $hp->fan()
|
||||
|
||||
Returns fan status
|
||||
|
||||
=item $hp->ps1_status()
|
||||
|
||||
Power supply 1 status
|
||||
|
||||
=item $hp->ps2_status()
|
||||
|
||||
Power supply 2 status
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->interfaces()
|
||||
|
||||
Uses $hp->i_description()
|
||||
|
||||
=item $hp->i_duplex()
|
||||
|
||||
Returns reference to map of IIDs to current link duplex.
|
||||
|
||||
=item $hp->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of IIDs to admin duplex setting.
|
||||
|
||||
=item $hp->vendor_i_type()
|
||||
|
||||
Returns reference to hash of IIDs to HP specific port type
|
||||
(C<hpSwitchPortType>).
|
||||
|
||||
=item $hp->i_name()
|
||||
|
||||
Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias()
|
||||
|
||||
=item $hp->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID (default VLAN) or untagged
|
||||
port when using F<HP-VLAN>.
|
||||
|
||||
=item $hp->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the egress list for the port.
|
||||
It is the union of tagged, untagged, and auto ports.
|
||||
|
||||
Example:
|
||||
my $interfaces = $hp->interfaces();
|
||||
my $vlans = $hp->i_vlan_membership();
|
||||
|
||||
foreach my $iid (sort keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $hp->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
=item $hp->v_name()
|
||||
|
||||
Returns VLAN names
|
||||
|
||||
=item $hp->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (iid)
|
||||
|
||||
Returns (C<ifIndex>) for both key and value for 1600, 2424, 4000, and 8000
|
||||
models since they seem to have problems with F<BRIDGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=over
|
||||
|
||||
=item set_i_vlan()
|
||||
|
||||
=item set_i_vlan_tagged()
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
209
Info/Layer2/HPVC.pm
Normal file
209
Info/Layer2/HPVC.pm
Normal file
@@ -0,0 +1,209 @@
|
||||
# SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::HPVC;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::HPVC::ISA
|
||||
= qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'HPVC-MIB' => 'vcDomainName',
|
||||
'CPQSINFO-MIB' => 'cpqSiSysSerialNum',
|
||||
'HPVCMODULE-MIB' => 'vcModuleDomainName',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
'serial1' => 'cpqSiSysSerialNum.0',
|
||||
'os_ver' => 'cpqHoSWRunningVersion.1',
|
||||
'os_bin' => 'cpqHoFwVerVersion.1',
|
||||
'productname' => 'cpqSiProductName.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer2::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
# Method Overrides
|
||||
|
||||
sub os {
|
||||
return 'hpvc';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $hp = shift;
|
||||
return $hp->productname();
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::HPVC - SNMP Interface to HP Virtual Connect Switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $hp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $hp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
HP Virtual Connect Switch via SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $hp = new SNMP::Info::Layer2::HPVC(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HPVC-MIB>
|
||||
|
||||
=item F<CPQSINFO-MIB>
|
||||
|
||||
=item F<HPVCMODULE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
All required MIBs can be found in the netdisco-mibs package.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $hp->os()
|
||||
|
||||
Returns C<'hpvc'>
|
||||
|
||||
=item $hp->os_bin()
|
||||
|
||||
C<cpqHoFwVerVersion.1>
|
||||
|
||||
=item $hp->os_ver()
|
||||
|
||||
C<cpqHoSWRunningVersion.1>
|
||||
|
||||
=item $hp->serial()
|
||||
|
||||
C<cpqSiSysSerialNum.0>
|
||||
|
||||
=item $hp->vendor()
|
||||
|
||||
hp
|
||||
|
||||
=item $hp->model()
|
||||
|
||||
C<cpqSiProductName.0>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=cut
|
||||
180
Info/Layer2/Kentrox.pm
Normal file
180
Info/Layer2/Kentrox.pm
Normal file
@@ -0,0 +1,180 @@
|
||||
package SNMP::Info::Layer2::Kentrox;
|
||||
|
||||
# Copyright (c) 2011 Netdisco Project
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Kentrox::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Kentrox::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS,
|
||||
#from DATASMART-MIB
|
||||
# MIB isn't yet in netdisco-mibs (not clear permission)
|
||||
# ... when it is, this can change to dsScWyv
|
||||
'ds_sysinfo' => '.1.3.6.1.4.1.181.2.2.12.15.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
|
||||
|
||||
sub os {
|
||||
return 'Kentrox';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $dsver = shift;
|
||||
my $descr = $dsver->description();
|
||||
if ( $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $dsserial = shift;
|
||||
my $serial = $dsserial->ds_sysinfo();
|
||||
if ( $serial =~ /SERIAL\s(\S+)/){
|
||||
my $str = substr($1,8,10);
|
||||
return $str;
|
||||
}
|
||||
|
||||
}
|
||||
sub vendor {
|
||||
return 'Kentrox';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $dsmodel = shift;
|
||||
my $descr = $dsmodel->description();
|
||||
if ( $descr =~ /^(\S+\s\S+)/){
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Kentrox - SNMP Interface to L2 Kentrox DataSMART DSU/CSU
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
phishphreek@gmail.com
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $router = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $router->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Kentrox DataSMART DSU/CSU
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $router->vendor()
|
||||
|
||||
=item $router->os()
|
||||
|
||||
=item $router->os_ver()
|
||||
|
||||
=item $router->model()
|
||||
|
||||
=item $router->serial()
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
248
Info/Layer2/N2270.pm
Normal file
248
Info/Layer2/N2270.pm
Normal file
@@ -0,0 +1,248 @@
|
||||
# SNMP::Info::Layer2::N2270
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::N2270;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::SONMP;
|
||||
use SNMP::Info::Airespace;
|
||||
|
||||
@SNMP::Info::Layer2::N2270::ISA
|
||||
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::SONMP SNMP::Info::Airespace Exporter/;
|
||||
@SNMP::Info::Layer2::N2270::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS, %SNMP::Info::Airespace::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS, %SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::SONMP::GLOBALS, %SNMP::Info::Airespace::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS, %SNMP::Info::Airespace::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::MUNGE, %SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE, %SNMP::Info::Airespace::MUNGE,
|
||||
);
|
||||
|
||||
sub os {
|
||||
return 'nortel';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $n2270 = shift;
|
||||
my $id = $n2270->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
$model =~ s/^sreg-WLANSecuritySwitch//i;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub index_factor {
|
||||
return 256;
|
||||
}
|
||||
|
||||
sub slot_offset {
|
||||
return 0;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::N2270 - SNMP Interface to Nortel 2270 Series Wireless
|
||||
Switch
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $n2270 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $n2270->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Nortel 2270 Series Wireless Switch through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $n2270 = new SNMP::Info::Layer2::N2270(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
=item SNMP::Info::Airespace
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $n2270->vendor()
|
||||
|
||||
Returns 'nortel'
|
||||
|
||||
=item $n2270->os()
|
||||
|
||||
Returns 'nortel'
|
||||
|
||||
=item $n2270->model()
|
||||
|
||||
Cross references $bayhub->id() to the F<SYNOPTICS-ROOT-MIB> and returns
|
||||
the results.
|
||||
|
||||
Removes C<sreg-WLANSecuritySwitch> from the model name
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $bayhub->index_factor()
|
||||
|
||||
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||
reserved per slot within the device MIB. Returns 256.
|
||||
|
||||
=item $bayhub->slot_offset()
|
||||
|
||||
Required by SNMP::Info::SONMP. Offset if slot numbering does not
|
||||
start at 0. Returns 0.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Airespace
|
||||
|
||||
See documentation in L<SNMP::Info::Airespace/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item None
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Airespace
|
||||
|
||||
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,178 +1,156 @@
|
||||
# SNMP::Info::Layer2::NAP222x
|
||||
# Eric Miller <eric@jeneric.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::NAP222x;
|
||||
$VERSION = 0.9;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::SONMP;
|
||||
use SNMP::Info::IEEE802dot11;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::NAP222x::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::SONMP Exporter/;
|
||||
@SNMP::Info::Layer2::NAP222x::ISA
|
||||
= qw/SNMP::Info::SONMP SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::NAP222x::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
'NORTEL-WLAN-AP-MIB' => 'ntWlanSwHardwareVer',
|
||||
);
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS, 'NORTEL-WLAN-AP-MIB' => 'ntWlanSwHardwareVer',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::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',
|
||||
);
|
||||
%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::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
'i_name2' => 'ifName',
|
||||
'bp_index_2' => 'dot1dTpFdbPort',
|
||||
# From ntWlanPortTable
|
||||
'nt_prt_name' => 'ntWlanPortName',
|
||||
'nt_dpx_admin' => 'ntWlanPortCapabilities',
|
||||
'nt_auto' => 'ntWlanPortAutonegotiation',
|
||||
'nt_dpx' => 'ntWlanPortSpeedDpxStatus',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
);
|
||||
# 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_ver {
|
||||
my $nap222x = shift;
|
||||
my $ver = $nap222x->nt_sw_ver();
|
||||
return undef unless defined $ver;
|
||||
|
||||
if ($ver =~ m/(\d+\.\d+\.\d+\.\d+)/){
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $nap222x = shift;
|
||||
my $bin = $nap222x->nt_fw_ver();
|
||||
return undef unless defined $bin;
|
||||
my $bin = $nap222x->nt_fw_ver();
|
||||
return unless defined $bin;
|
||||
|
||||
if ($bin =~ m/(\d+\.\d+\.\d+)/){
|
||||
if ( $bin =~ m/(\d+\.\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $nap222x = shift;
|
||||
my $descr = $nap222x->description();
|
||||
return undef unless defined $descr;
|
||||
my $descr = $nap222x->description();
|
||||
return unless defined $descr;
|
||||
|
||||
return 'AP-2220' if ($descr =~ /2220/);
|
||||
return 'AP-2221' if ($descr =~ /2221/);
|
||||
return 'AP-2225' if ($descr =~ /2225/);
|
||||
return undef;
|
||||
return 'AP-2220' if ( $descr =~ /2220/ );
|
||||
return 'AP-2221' if ( $descr =~ /2221/ );
|
||||
return;
|
||||
}
|
||||
|
||||
sub mac {
|
||||
my $nap222x = shift;
|
||||
my $i_mac = $nap222x->i_mac();
|
||||
my $i_mac = $nap222x->i_mac();
|
||||
|
||||
# Return Interface MAC
|
||||
foreach my $entry (keys %$i_mac){
|
||||
# Return Interface MAC
|
||||
foreach my $entry ( keys %$i_mac ) {
|
||||
my $sn = $i_mac->{$entry};
|
||||
next unless $sn;
|
||||
return $sn;
|
||||
}
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $nap222x = shift;
|
||||
my $i_mac = $nap222x->i_mac();
|
||||
my $i_mac = $nap222x->i_mac();
|
||||
|
||||
# Return Interface MAC
|
||||
foreach my $entry (keys %$i_mac){
|
||||
# Return Interface MAC
|
||||
foreach my $entry ( keys %$i_mac ) {
|
||||
my $sn = $i_mac->{$entry};
|
||||
next unless $sn;
|
||||
return $sn;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $nap222x = shift;
|
||||
my $descr = $nap222x->i_description();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$descr){
|
||||
my $type = $descr->{$if};
|
||||
# Skip virtual interfaces
|
||||
$i_ignore{$if}++ if $type =~ /(loopback|lo|other)/i;
|
||||
}
|
||||
return \%i_ignore;
|
||||
return;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $nap222x = shift;
|
||||
my $interfaces = $nap222x->i_index();
|
||||
my $description = $nap222x->i_description();
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $nap222x->i_index($partial) || {};
|
||||
my $description = $nap222x->i_description($partial) || {};
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid (keys %$interfaces){
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $desc = $description->{$iid};
|
||||
next unless defined $desc;
|
||||
next if $desc =~ /lo/i;
|
||||
@@ -184,25 +162,26 @@ sub interfaces {
|
||||
|
||||
sub i_duplex {
|
||||
my $nap222x = shift;
|
||||
|
||||
my $mode = $nap222x->nt_dpx();
|
||||
my $port_name = $nap222x->nt_prt_name();
|
||||
my $interfaces = $nap222x->interfaces();
|
||||
|
||||
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){
|
||||
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';
|
||||
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;
|
||||
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
}
|
||||
return \%i_duplex;
|
||||
@@ -210,28 +189,31 @@ sub i_duplex {
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $nap222x = shift;
|
||||
|
||||
my $dpx_admin = $nap222x->nt_dpx_admin();
|
||||
my $nt_auto = $nap222x->nt_auto();
|
||||
my $interfaces = $nap222x->interfaces();
|
||||
my $port_name = $nap222x->nt_prt_name();
|
||||
|
||||
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){
|
||||
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';
|
||||
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};
|
||||
|
||||
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 = '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;
|
||||
|
||||
$i_duplex_admin{$if} = $duplex;
|
||||
}
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
@@ -239,18 +221,20 @@ sub i_duplex_admin {
|
||||
|
||||
sub i_name {
|
||||
my $nap222x = shift;
|
||||
my $interfaces = $nap222x->interfaces();
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $nap222x->interfaces($partial) || {};
|
||||
|
||||
my %i_name;
|
||||
foreach my $if (keys %$interfaces){
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $desc = $interfaces->{$if};
|
||||
next unless defined $desc;
|
||||
|
||||
next unless defined $desc;
|
||||
|
||||
my $name = 'unknown';
|
||||
$name = 'Ethernet Interface' if $desc =~ /dp/i;
|
||||
$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;
|
||||
@@ -259,32 +243,135 @@ sub i_name {
|
||||
# dot1dBasePortTable does not exist and dot1dTpFdbPort does not map to ifIndex
|
||||
sub bp_index {
|
||||
my $nap222x = shift;
|
||||
my $interfaces = $nap222x->interfaces();
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $nap222x->interfaces($partial) || {};
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid (keys %$interfaces){
|
||||
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;
|
||||
$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
|
||||
SNMP::Info::Layer2::NAP222x - SNMP Interface to Nortel 2220 Series Access
|
||||
Points
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller (C<eric@jeneric.org>)
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -292,14 +379,13 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
my $nap222x = 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 = $nap222x->class();
|
||||
my $class = $nap222x->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -307,47 +393,39 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
Provides abstraction to the configuration information obtainable from a Nortel
|
||||
2220 series wireless Access Points through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $nap222x = new SNMP::Info::Layer2::nap222x(...);
|
||||
my $nap222x = new SNMP::Info::Layer2::NAP222x(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
=item SNMP::Info::IEEE802dot11
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item NORTEL-WLAN-AP-MIB
|
||||
|
||||
=item Inherited classes
|
||||
|
||||
See SNMP::Info for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::Bridge for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::SONMP for its own MIB requirements.
|
||||
=item F<NORTEL-WLAN-AP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found on the CD that came with your product.
|
||||
=head2 Inherited MIBs
|
||||
|
||||
Or, they can be downloaded directly from Nortel Networks regardless of support
|
||||
contract status.
|
||||
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.
|
||||
|
||||
Go to http://www.nortelnetworks.com Techninal Support, Browse Technical Support,
|
||||
Select by Product Families, Wireless LAN, WLAN - Access Point 2220, Software.
|
||||
Filter on mibs and download the latest version's archive.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -355,25 +433,17 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $nap222x->vendor()
|
||||
|
||||
Returns 'Nortel'
|
||||
|
||||
=item $nap222x->model()
|
||||
|
||||
Returns the model extracted from B<sysDescr>.
|
||||
Returns the model extracted from C<sysDescr>.
|
||||
|
||||
=item $nap222x->os()
|
||||
|
||||
Returns 'Nortel'
|
||||
|
||||
=item $nap222x->os_ver()
|
||||
|
||||
Returns the software version extracted from B<ntWlanSwOpCodeVer>.
|
||||
Returns 'nortel'
|
||||
|
||||
=item $nap222x->os_bin()
|
||||
|
||||
Returns the firmware version extracted from B<ntWlanSwBootRomVer>.
|
||||
Returns the firmware version extracted from C<ntWlanSwBootRomVer>.
|
||||
|
||||
=item $nap222x->mac()
|
||||
|
||||
@@ -387,65 +457,65 @@ Returns the MAC address of the first Ethernet Interface.
|
||||
|
||||
Returns the hardware version.
|
||||
|
||||
B<ntWlanSwHardwareVer>
|
||||
(C<ntWlanSwHardwareVer>)
|
||||
|
||||
=item $nap222x->nt_cc()
|
||||
|
||||
Returns the country code of the AP.
|
||||
|
||||
B<ntWlanSwHardwareVer>
|
||||
(C<ntWlanSwHardwareVer>)
|
||||
|
||||
=item $nap222x->tftp_action()
|
||||
|
||||
B<ntWlanTransferStart>
|
||||
(C<ntWlanTransferStart>)
|
||||
|
||||
=item $nap222x->tftp_host()
|
||||
|
||||
B<ntWlanFileServer>
|
||||
(C<ntWlanFileServer>)
|
||||
|
||||
=item $nap222x->tftp_file()
|
||||
|
||||
B<ntWlanDestFile>
|
||||
(C<ntWlanDestFile>)
|
||||
|
||||
=item $nap222x->tftp_type()
|
||||
|
||||
B<ntWlanFileType>
|
||||
(C<ntWlanFileType>)
|
||||
|
||||
=item $nap222x->tftp_result()
|
||||
|
||||
B<ntWlanFileTransferStatus>
|
||||
(C<ntWlanFileTransferStatus>)
|
||||
|
||||
=item $nap222x->tftp_xtype()
|
||||
|
||||
B<ntWlanTransferType>
|
||||
(C<ntWlanTransferType>)
|
||||
|
||||
=item $nap222x->tftp_src_file()
|
||||
|
||||
B<ntWlanSrcFile>
|
||||
(C<ntWlanSrcFile>)
|
||||
|
||||
=item $nap222x->ftp_user()
|
||||
|
||||
B<ntWlanUserName>
|
||||
(C<ntWlanUserName>)
|
||||
|
||||
=item $nap222x->ftp_pass()
|
||||
|
||||
B<ntWlanPassword>
|
||||
(C<ntWlanPassword>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
=head2 Globals imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::SONMP for details.
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -458,21 +528,17 @@ to a hash.
|
||||
|
||||
Returns reference to map of IIDs to physical ports.
|
||||
|
||||
=item $nap222x->i_ignore()
|
||||
|
||||
Returns reference to hash of IIDs to ignore.
|
||||
|
||||
=item $nap222x->i_duplex()
|
||||
|
||||
Returns reference to hash. Maps port operational duplexes to IIDs.
|
||||
|
||||
B<ntWlanPortSpeedDpxStatus>
|
||||
(C<ntWlanPortSpeedDpxStatus>)
|
||||
|
||||
=item $nap222x->i_duplex_admin()
|
||||
|
||||
Returns reference to hash. Maps port admin duplexes to IIDs.
|
||||
|
||||
B<ntWlanPortCapabilities>
|
||||
(C<ntWlanPortCapabilities>)
|
||||
|
||||
=item $nap222x->i_name()
|
||||
|
||||
@@ -480,21 +546,41 @@ Returns a human name based upon port description.
|
||||
|
||||
=item $nap222x->bp_index()
|
||||
|
||||
Returns a mapping between ifIndex and the Bridge Table. This does not exist in
|
||||
the MIB and bridge port index is not the same as ifIndex so it is created.
|
||||
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
|
||||
|
||||
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::SONMP
|
||||
|
||||
See documentation in SNMP::Info::SONMP for details.
|
||||
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
1299
Info/Layer2/NWSS2300.pm
Normal file
1299
Info/Layer2/NWSS2300.pm
Normal file
File diff suppressed because it is too large
Load Diff
240
Info/Layer2/Netgear.pm
Normal file
240
Info/Layer2/Netgear.pm
Normal file
@@ -0,0 +1,240 @@
|
||||
# SNMP::Info::Layer2::Netgear
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Netgear;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::LLDP::MIBS, );
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
|
||||
ng_serial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
|
||||
ng_gsmosver => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
|
||||
ng_gsosver => '.1.3.6.1.2.1.32.2.1.1.1.0',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::LLDP::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'netgear';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'netgear';
|
||||
}
|
||||
|
||||
# Wish the OID-based method worked, but netgear scatters
|
||||
# the sysObjectID values across all the device MIBs, and
|
||||
# makes the device MIBs state secrets.
|
||||
# They seem to set sysDescr to the model number, though,
|
||||
# so we'll use that.
|
||||
sub model {
|
||||
my $netgear = shift;
|
||||
return $netgear->description();
|
||||
}
|
||||
|
||||
#
|
||||
# This is model-dependent. Some netgear brand devices don't implement
|
||||
# the bridge MIB forwarding table, so we use the Q-BRIDGE-MIB forwarding
|
||||
# table. Fall back to the orig functions if the qb versions don't
|
||||
# return anything.
|
||||
sub fw_mac {
|
||||
my $netgear = shift;
|
||||
my $ret = $netgear->qb_fw_mac();
|
||||
$ret = $netgear->orig_fw_mac() if ( !defined($ret) );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $netgear = shift;
|
||||
my $ret = $netgear->qb_fw_port();
|
||||
$ret = $netgear->orig_fw_port() if ( !defined($ret) );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
# these seem to work for GSM models but not GS
|
||||
# https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529
|
||||
sub os_ver {
|
||||
my $self = shift;
|
||||
return $self->ng_gsosver if defined $self->model and $self->model =~ m/GS\d/i;
|
||||
return $self->ng_gsmosver();
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $self = shift;
|
||||
return if defined $self->model and $self->model =~ m/GS\d/i;
|
||||
return $self->ng_serial();
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner and Zoltan Erszenyi,
|
||||
Hacked in LLDP support from Baystack.pm by
|
||||
Nic Bernstein <nic@onlight.com>
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $netgear = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $netgear->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Netgear device through SNMP. See inherited classes' documentation for
|
||||
inherited methods.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer2
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
|
||||
classes.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $netgear->vendor()
|
||||
|
||||
Returns 'netgear'
|
||||
|
||||
=item $netgear->os()
|
||||
|
||||
Returns 'netgear'
|
||||
|
||||
=item $netgear->model()
|
||||
|
||||
Returns description()
|
||||
|
||||
=item $netgear->os_ver()
|
||||
|
||||
Returns OS Version.
|
||||
|
||||
=item $netgear->serial()
|
||||
|
||||
Returns Serial Number.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of
|
||||
a reference to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $netgear->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses.
|
||||
|
||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
|
||||
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
|
||||
C<Q-BRIDGE-MIB> doesn't return anything.
|
||||
|
||||
=item $netgear->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
|
||||
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
|
||||
C<Q-BRIDGE-MIB> doesn't return anything.
|
||||
|
||||
=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::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,64 +1,70 @@
|
||||
# SNMP::Info::Layer2::Orinoco
|
||||
# Eric Miller <eric@jeneric.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::Orinoco;
|
||||
$VERSION = 0.9;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::IEEE802dot11;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::Orinoco::ISA = qw/SNMP::Info SNMP::Info::Bridge Exporter/;
|
||||
@SNMP::Info::Layer2::Orinoco::ISA
|
||||
= qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::Orinoco::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
);
|
||||
$VERSION = '3.03';
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
%SNMP::Info::IEEE802dot11::MIBS,
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
);
|
||||
#'ORiNOCO-MIB' => 'orinoco',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
);
|
||||
%GLOBALS
|
||||
= ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
|
||||
# ORiNOCO-MIB:oriWirelessIfPropertiesTable
|
||||
#'ori_ssid' => 'oriWirelessIfNetworkName',
|
||||
#'ori_channel' => 'oriWirelessIfChannel',
|
||||
#'ori_closed_sys' => 'oriWirelessIfClosedSystem',
|
||||
# ORiNOCO-MIB:oriSystemInvMgmtComponentTable
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, );
|
||||
|
||||
sub os {
|
||||
return 'orinoco';
|
||||
@@ -66,66 +72,74 @@ sub os {
|
||||
|
||||
sub os_ver {
|
||||
my $orinoco = shift;
|
||||
|
||||
my $descr = $orinoco->description();
|
||||
return undef unless defined $descr;
|
||||
return unless defined $descr;
|
||||
|
||||
if ($descr =~ m/V(\d+\.\d+)/){
|
||||
if ( $descr =~ m/V(\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
if ($descr =~ m/v(\d+\.\d+\.\d+)/){
|
||||
if ( $descr =~ m/v(\d+\.\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_bin {
|
||||
my $orinoco = shift;
|
||||
|
||||
my $descr = $orinoco->description();
|
||||
return undef unless defined $descr;
|
||||
return unless defined $descr;
|
||||
|
||||
if ($descr =~ m/V(\d+\.\d+)$/){
|
||||
if ( $descr =~ m/V(\d+\.\d+)$/ ) {
|
||||
return $1;
|
||||
}
|
||||
if ($descr =~ m/v(\d+\.\d+\.\d+)$/){
|
||||
if ( $descr =~ m/v(\d+\.\d+\.\d+)$/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'Proxim';
|
||||
return 'proxim';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $orinoco = shift;
|
||||
my $descr = $orinoco->description();
|
||||
return undef unless defined $descr;
|
||||
|
||||
return 'AP-1000' if ($descr =~ /AP-1000/);
|
||||
return 'AP-2000' if ($descr =~ /AP-2000/);
|
||||
return 'WavePOINT-II' if ($descr =~ /WavePOINT-II/);
|
||||
return undef;
|
||||
my $descr = $orinoco->description();
|
||||
return unless defined $descr;
|
||||
|
||||
return $1 if ( $descr =~ /(AP-\d+)/ );
|
||||
return 'WavePOINT-II' if ( $descr =~ /WavePOINT-II/ );
|
||||
return 'Outdoor Router' if ( $descr =~ /Wireless Router/ );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $orinoco = shift;
|
||||
my $descr = $orinoco->description();
|
||||
return undef unless defined $descr;
|
||||
|
||||
$descr = $1 if $descr =~ /SN-(\S+)/;
|
||||
my $descr = $orinoco->description();
|
||||
return unless defined $descr;
|
||||
|
||||
$descr = $1 if $descr =~ /SN-(\S+)/;
|
||||
return $descr;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $orinoco = shift;
|
||||
my $descr = $orinoco->i_description();
|
||||
my $partial = shift;
|
||||
|
||||
my $descr = $orinoco->i_description($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$descr){
|
||||
foreach my $if ( keys %$descr ) {
|
||||
my $type = $descr->{$if};
|
||||
# Skip virtual interfaces
|
||||
|
||||
# Skip virtual interfaces
|
||||
$i_ignore{$if}++ if $type =~ /(lo|empty|PCMCIA)/i;
|
||||
}
|
||||
return \%i_ignore;
|
||||
@@ -133,22 +147,40 @@ sub i_ignore {
|
||||
|
||||
sub interfaces {
|
||||
my $orinoco = shift;
|
||||
my $interfaces = $orinoco->i_index();
|
||||
my $descriptions = $orinoco->i_description();
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $orinoco->i_index($partial) || {};
|
||||
my $descriptions = $orinoco->i_description($partial) || {};
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid (keys %$interfaces){
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
next if $desc =~ /(lo|empty|PCMCIA)/i;
|
||||
|
||||
$desc = 'AMD' if $desc =~ /AMD/;
|
||||
$desc = 'AMD' if $desc =~ /AMD/;
|
||||
|
||||
$interfaces{$iid} = $desc;
|
||||
}
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
#sub i_ssidbcast {
|
||||
# my $orinoco = shift;
|
||||
# my $partial = shift;
|
||||
#
|
||||
# my $bcast = $orinoco->ori_closed_sys($partial) || {};
|
||||
#
|
||||
# my %i_ssidbcast;
|
||||
# foreach my $iid (keys %$bcast){
|
||||
# my $bc = $bcast->{$iid};
|
||||
# next unless defined $bc;
|
||||
#
|
||||
# $i_ssidbcast{$iid} = $bc;
|
||||
# }
|
||||
# return \%i_ssidbcast;
|
||||
#}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
@@ -158,7 +190,7 @@ SNMP::Info::Layer2::Orinoco - SNMP Interface to Orinoco Series Access Points
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller (C<eric@jeneric.org>)
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -166,23 +198,23 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
my $orinoco = 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 = $orinoco->class();
|
||||
my $class = $orinoco->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a Orinoco
|
||||
Access Point through SNMP.
|
||||
Provides abstraction to the configuration information obtainable from
|
||||
Orinoco Access Point through SNMP. Orinoco devices have been manufactured
|
||||
by Proxim, Agere, and Lucent.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after
|
||||
determining a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $orinoco = new SNMP::Info::Layer2::Orinoco(...);
|
||||
|
||||
@@ -190,9 +222,9 @@ determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
=item SNMP::Info::Layer2
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
=item SNMP::Info::IEEE802dot11
|
||||
|
||||
=back
|
||||
|
||||
@@ -200,14 +232,16 @@ determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited classes
|
||||
|
||||
See SNMP::Info for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::Bridge for its own MIB requirements.
|
||||
None.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -216,11 +250,11 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $orinoco->vendor()
|
||||
|
||||
Returns 'Proxim' :)
|
||||
Returns 'proxim'
|
||||
|
||||
=item $orinoco->model()
|
||||
|
||||
Returns the model extracted from B<sysDescr>.
|
||||
Returns the model extracted from C<sysDescr>.
|
||||
|
||||
=item $orinoco->os()
|
||||
|
||||
@@ -228,27 +262,27 @@ Returns 'Orinoco'
|
||||
|
||||
=item $orinoco->os_ver()
|
||||
|
||||
Returns the software version extracted from B<sysDescr>.
|
||||
Returns the software version extracted from C<sysDescr>.
|
||||
|
||||
=item $orinoco->os_bin()
|
||||
|
||||
Returns the firmware version extracted from B<sysDescr>.
|
||||
Returns the firmware version extracted from C<sysDescr>.
|
||||
|
||||
=item $orinoco->serial()
|
||||
|
||||
Returns the serial number extracted from B<sysDescr>.
|
||||
Returns the serial number extracted from C<sysDescr>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -267,12 +301,12 @@ Returns reference to hash of IIDs to ignore.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
1303
Info/Layer2/Trapeze.pm
Normal file
1303
Info/Layer2/Trapeze.pm
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,67 +1,63 @@
|
||||
# SNMP::Info::Layer2::ZyXEL_DSLAM
|
||||
# Dmitry Sergienko <dmitry@trifle.net>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker <max@warped.org>
|
||||
# Copyright (c) 2008 Max Baker
|
||||
# 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 Netdisco nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer2::ZyXEL_DSLAM;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
use strict;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer2;
|
||||
|
||||
@SNMP::Info::Layer2::ZyXEL_DSLAM::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::ZyXEL_DSLAM::ISA = qw/SNMP::Info::Layer2 Exporter/;
|
||||
@SNMP::Info::Layer2::ZyXEL_DSLAM::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
# Set for No CDP
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS
|
||||
);
|
||||
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||
|
||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
||||
'ip_adresses' => 'ipAdEntAddr',
|
||||
'i_name' => 'ifDescr',
|
||||
'i_description' => 'adslLineConfProfile',
|
||||
);
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer2::FUNCS,
|
||||
'ip_adresses' => 'ipAdEntAddr',
|
||||
'i_name' => 'ifDescr',
|
||||
'i_description' => 'adslLineConfProfile',
|
||||
);
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS,
|
||||
'ADSL-LINE-MIB' => 'adslLineConfProfile'
|
||||
);
|
||||
|
||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE
|
||||
);
|
||||
%MIBS
|
||||
= ( %SNMP::Info::Layer2::MIBS, 'ADSL-LINE-MIB' => 'adslLineConfProfile' );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE );
|
||||
|
||||
sub layers {
|
||||
my $zyxel = shift;
|
||||
my $zyxel = shift;
|
||||
my $layers = $zyxel->layers();
|
||||
return $layers if defined $layers;
|
||||
|
||||
@@ -80,11 +76,11 @@ sub os {
|
||||
sub os_ver {
|
||||
my $zyxel = shift;
|
||||
my $descr = $zyxel->description();
|
||||
|
||||
if ($descr =~ m/version (\S+) /){
|
||||
|
||||
if ( $descr =~ m/version (\S+) / ) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
@@ -92,23 +88,26 @@ sub model {
|
||||
|
||||
my $desc = $zyxel->description();
|
||||
|
||||
if ($desc =~ /8-port ADSL Module\(Annex A\)/){
|
||||
if ( $desc =~ /8-port ADSL Module\(Annex A\)/ ) {
|
||||
return "AAM1008-61";
|
||||
} elsif ($desc =~ /8-port ADSL Module\(Annex B\)/){
|
||||
}
|
||||
elsif ( $desc =~ /8-port ADSL Module\(Annex B\)/ ) {
|
||||
return "AAM1008-63";
|
||||
}
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub ip{
|
||||
my $zyxel = shift;
|
||||
sub ip {
|
||||
my $zyxel = shift;
|
||||
my $ip_hash = $zyxel->ip_addresses();
|
||||
my $ip;
|
||||
|
||||
foreach $ip (keys %{$ip_hash}) {
|
||||
my $found_ip = $ip if (defined $ip and $ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/);
|
||||
my $found_ip;
|
||||
|
||||
foreach my $ip ( keys %{$ip_hash} ) {
|
||||
$found_ip = $ip
|
||||
if ( defined $ip
|
||||
and $ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ );
|
||||
}
|
||||
return $ip;
|
||||
return $found_ip;
|
||||
}
|
||||
1;
|
||||
__END__
|
||||
@@ -127,7 +126,6 @@ Dmitry Sergienko (C<dmitry@trifle.net>)
|
||||
my $zyxel = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myhub',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
@@ -155,13 +153,12 @@ inherited methods.
|
||||
|
||||
=over
|
||||
|
||||
=item ADSL-LINE-MIB
|
||||
|
||||
This MIB assumedly obtainable through ZyXEL or possibly included with your device.
|
||||
=item F<ADSL-LINE-MIB>
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs listed in SNMP::Info::Layer2 and their inherited classes.
|
||||
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and their inherited
|
||||
classes.
|
||||
|
||||
=back
|
||||
|
||||
@@ -189,19 +186,23 @@ Culls Version from description()
|
||||
|
||||
Returns IP Address of DSLAM.
|
||||
|
||||
(B<ipAdEntAddr>)
|
||||
(C<ipAdEntAddr>)
|
||||
|
||||
=item $zyxel->model()
|
||||
|
||||
Trys to cull out model out of the description field.
|
||||
Tries to cull out model out of the description field.
|
||||
|
||||
=item $zyxel->layers()
|
||||
|
||||
Returns 00000011.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
@@ -209,7 +210,7 @@ See documentation in SNMP::Info::Layer2 for details.
|
||||
|
||||
=item $zyxel->i_name()
|
||||
|
||||
Returns reference to map of IIDs to port name (B<ifDescr>).
|
||||
Returns reference to map of IIDs to port name (C<ifDescr>).
|
||||
|
||||
=item $zyxel->i_description()
|
||||
|
||||
@@ -219,6 +220,6 @@ Returns reference to map of IIDs to human-set port description (profile name).
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||
|
||||
See documentation in SNMP::Info::Layer2 for details.
|
||||
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
698
Info/Layer3.pm
698
Info/Layer3.pm
@@ -1,139 +1,201 @@
|
||||
# SNMP::Info::Layer3 - SNMP Interface to Layer3 devices
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker -- All changes from Version 0.7 on
|
||||
# Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::EtherLike;
|
||||
use SNMP::Info::Entity;
|
||||
use SNMP::Info::PowerEthernet;
|
||||
use SNMP::Info::IPv6;
|
||||
use SNMP::Info::AdslLine;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
@SNMP::Info::Layer3::ISA = qw/SNMP::Info SNMP::Info::CDP SNMP::Info::Bridge
|
||||
SNMP::Info::EtherLike SNMP::Info::CiscoStats Exporter/;
|
||||
@SNMP::Info::Layer3::ISA = qw/
|
||||
SNMP::Info::PowerEthernet SNMP::Info::IPv6
|
||||
SNMP::Info::Entity SNMP::Info::EtherLike
|
||||
SNMP::Info::Bridge SNMP::Info::AdslLine
|
||||
SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer3::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
'ENTITY-MIB' => 'entPhysicalName',
|
||||
'CISCO-PRODUCTS-MIB' => 'sysName',
|
||||
'OSPF-MIB' => 'ospfRouterId',
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
%SNMP::Info::AdslLine::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::EtherLike::MIBS,
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
%SNMP::Info::PowerEthernet::MIBS,
|
||||
%SNMP::Info::IPv6::MIBS,
|
||||
'IP-MIB' => 'ipNetToMediaIfIndex',
|
||||
'OSPF-MIB' => 'ospfRouterId',
|
||||
'BGP4-MIB' => 'bgpIdentifier',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
# Inherit the super class ones
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'serial1' => '.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||
'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',
|
||||
'ent_serial' => 'entPhysicalSerialNum',
|
||||
'ent_chassis'=> 'entPhysicalDescr',
|
||||
);
|
||||
# Inherit the super class ones
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::AdslLine::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::EtherLike::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
%SNMP::Info::PowerEthernet::GLOBALS,
|
||||
%SNMP::Info::IPv6::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'serial1' =>
|
||||
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||
'router_ip' => 'ospfRouterId.0',
|
||||
'bgp_id' => 'bgpIdentifier.0',
|
||||
'bgp_local_as' => 'bgpLocalAs.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::AdslLine::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::EtherLike::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
%SNMP::Info::PowerEthernet::FUNCS,
|
||||
%SNMP::Info::IPv6::FUNCS,
|
||||
|
||||
# Obsolete Address Translation Table (ARP Cache)
|
||||
'old_at_index' => 'atIfIndex',
|
||||
'old_at_paddr' => 'atPhysAddress',
|
||||
'old_at_netaddr' => 'atNetAddress',
|
||||
|
||||
# IP-MIB IP Net to Media Table (ARP Cache)
|
||||
'at_index' => 'ipNetToMediaIfIndex',
|
||||
'at_paddr' => 'ipNetToMediaPhysAddress',
|
||||
'at_netaddr' => 'ipNetToMediaNetAddress',
|
||||
|
||||
# OSPF-MIB::ospfIfTable
|
||||
'ospf_if_ip' => 'ospfIfIpAddress',
|
||||
'ospf_if_area' => 'ospfIfAreaId',
|
||||
'ospf_if_type' => 'ospfIfType',
|
||||
'ospf_if_hello' => 'ospfIfHelloInterval',
|
||||
'ospf_if_dead' => 'ospfIfRtrDeadInterval',
|
||||
'ospf_if_admin' => 'ospfIfAdminStat',
|
||||
'ospf_if_state' => 'ospfIfState',
|
||||
|
||||
# OSPF-MIB::ospfNbrTable
|
||||
'ospf_ip' => 'ospfHostIpAddress',
|
||||
'ospf_peers' => 'ospfNbrIpAddr',
|
||||
'ospf_peer_id' => 'ospfNbrRtrId',
|
||||
'ospf_peer_state' => 'ospfNbrState',
|
||||
|
||||
# BGP4-MIB::bgpPeerTable
|
||||
'bgp_peers' => 'bgpPeerLocalAddr',
|
||||
'bgp_peer_id' => 'bgpPeerIdentifier',
|
||||
'bgp_peer_state' => 'bgpPeerState',
|
||||
'bgp_peer_as' => 'bgpPeerRemoteAs',
|
||||
'bgp_peer_addr' => 'bgpPeerRemoteAddr',
|
||||
'bgp_peer_fsm_est_trans' => 'bgpPeerFsmEstablishedTransitions',
|
||||
'bgp_peer_in_tot_msgs' => 'bgpPeerInTotalMessages',
|
||||
'bgp_peer_in_upd_el_time' => 'bgpPeerInUpdateElapsedTime',
|
||||
'bgp_peer_in_upd' => 'bgpPeerInUpdates',
|
||||
'bgp_peer_out_tot_msgs' => 'bgpPeerOutTotalMessages',
|
||||
'bgp_peer_out_upd' => 'bgpPeerOutUpdates',
|
||||
|
||||
# IP-MIB Net to Physical Table (ARP Cache)
|
||||
'n2p_paddr' => 'ipNetToPhysicalPhysAddress',
|
||||
'n2p_lastupdate' => 'ipNetToPhysicalLastUpdated',
|
||||
'n2p_ptype' => 'ipNetToPhysicalType',
|
||||
'n2p_pstate' => 'ipNetToPhysicalState',
|
||||
'n2p_pstatus' => 'ipNetToPhysicalRowStatus',
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::AdslLine::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::EtherLike::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
%SNMP::Info::PowerEthernet::MUNGE,
|
||||
%SNMP::Info::IPv6::MUNGE,
|
||||
'old_at_paddr' => \&SNMP::Info::munge_mac,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
'n2p_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
sub root_ip {
|
||||
my $l3 = shift;
|
||||
|
||||
my $router_ip = $l3->router_ip();
|
||||
my $ospf_ip = $l3->ospf_ip();
|
||||
my $router_ip = $l3->router_ip();
|
||||
my $ospf_ip = $l3->ospf_ip();
|
||||
|
||||
# return the first one found here (should be only)
|
||||
if (defined $ospf_ip and scalar(keys %$ospf_ip)){
|
||||
foreach my $key (keys %$ospf_ip){
|
||||
# if the router ip exists and is a route advertised by the device we prefer
|
||||
# it over the others
|
||||
return $router_ip
|
||||
if (( defined $router_ip )
|
||||
and ( $router_ip ne '0.0.0.0' )
|
||||
and ( grep { $ospf_ip->{$_} eq $router_ip } (keys %$ospf_ip))
|
||||
and ( $l3->snmp_connect_ip($router_ip) ) );
|
||||
|
||||
# return the first one found here (should be only one)
|
||||
if ( defined $ospf_ip and scalar( keys %$ospf_ip ) ) {
|
||||
foreach my $key ( keys %$ospf_ip ) {
|
||||
my $ip = $ospf_ip->{$key};
|
||||
next if $ip eq '0.0.0.0';
|
||||
print " SNMP::Layer3::root_ip() using $ip\n" if $DEBUG;
|
||||
next unless $l3->snmp_connect_ip($ip);
|
||||
print " SNMP::Layer3::root_ip() using $ip\n" if $l3->debug();
|
||||
return $ip;
|
||||
}
|
||||
}
|
||||
|
||||
return $router_ip if (defined $router_ip and $router_ip ne '0.0.0.0');
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces();
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$interfaces) {
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo -> cisco aironet 350 loopback
|
||||
if ($interfaces->{$if} =~ /(tunnel|loopback|lo|null)/i){
|
||||
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
@@ -142,34 +204,37 @@ sub i_ignore {
|
||||
|
||||
sub serial {
|
||||
my $l3 = shift;
|
||||
|
||||
my $serial1 = $l3->serial1();
|
||||
my $ent_chassis = $l3->ent_chassis() || {};
|
||||
my $ent_serial = $l3->ent_serial() || {};
|
||||
|
||||
my $serial2 = $ent_serial->{1} || undef;
|
||||
my $chassis = $ent_chassis->{1} || undef;
|
||||
|
||||
|
||||
my $serial1 = $l3->serial1();
|
||||
my $e_descr = $l3->e_descr() || {};
|
||||
my $e_serial = $l3->e_serial() || {};
|
||||
|
||||
my $serial2 = $e_serial->{1} || undef;
|
||||
my $chassis = $e_descr->{1} || undef;
|
||||
|
||||
# precedence
|
||||
# serial2,chassis parse,serial1
|
||||
return $serial2 if (defined $serial2 and $serial2 !~ /^\s*$/);
|
||||
return $1 if (defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i);
|
||||
return $serial1 if (defined $serial1 and $serial1 !~ /^\s*$/);
|
||||
return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
|
||||
return $1
|
||||
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
|
||||
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
|
||||
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
# $l3->model() - the sysObjectID returns an IID to an entry in
|
||||
# $l3->model() - the sysObjectID returns an IID to an entry in
|
||||
# the CISCO-PRODUCT-MIB. Look it up and return it.
|
||||
sub model {
|
||||
my $l3 = shift;
|
||||
my $id = $l3->id();
|
||||
|
||||
unless (defined $id){
|
||||
print " SNMP::Info::Layer3::model() - Device does not support sysObjectID\n" if $DEBUG;
|
||||
return undef;
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
|
||||
if $l3->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
@@ -181,31 +246,35 @@ sub model {
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $l3 = shift;
|
||||
my $i_index = $l3->i_index();
|
||||
my $i_alias = $l3->i_alias();
|
||||
my $i_name2 = $l3->i_name2();
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $l3->i_index($partial);
|
||||
my $i_alias = $l3->i_alias($partial);
|
||||
my $i_name2 = $l3->orig_i_name($partial);
|
||||
|
||||
my %i_name;
|
||||
foreach my $iid (keys %$i_name2){
|
||||
my $name = $i_name2->{$iid};
|
||||
foreach my $iid ( keys %$i_name2 ) {
|
||||
my $name = $i_name2->{$iid};
|
||||
my $alias = $i_alias->{$iid};
|
||||
$i_name{$iid} = (defined $alias and $alias !~ /^\s*$/) ?
|
||||
$alias :
|
||||
$name;
|
||||
$i_name{$iid}
|
||||
= ( defined $alias and $alias !~ /^\s*$/ )
|
||||
? $alias
|
||||
: $name;
|
||||
}
|
||||
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $l3 = shift;
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_index = $l3->el_index($partial);
|
||||
my $el_duplex = $l3->el_duplex($partial);
|
||||
|
||||
my $el_index = $l3->el_index();
|
||||
my $el_duplex = $l3->el_duplex();
|
||||
|
||||
my %i_index;
|
||||
foreach my $el_port (keys %$el_duplex){
|
||||
foreach my $el_port ( keys %$el_duplex ) {
|
||||
my $iid = $el_index->{$el_port};
|
||||
next unless defined $iid;
|
||||
my $duplex = $el_duplex->{$el_port};
|
||||
@@ -221,18 +290,20 @@ sub i_duplex {
|
||||
|
||||
# $l3->interfaces() - Map the Interfaces to their physical names
|
||||
sub interfaces {
|
||||
my $l3 = shift;
|
||||
my $interfaces = $l3->i_index();
|
||||
my $descriptions = $l3->i_description();
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->i_index($partial);
|
||||
my $descriptions = $l3->i_description($partial);
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid (keys %$interfaces){
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
$interfaces{$iid} = $desc;
|
||||
}
|
||||
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
@@ -240,21 +311,52 @@ sub vendor {
|
||||
my $l3 = shift;
|
||||
|
||||
my $descr = $l3->description();
|
||||
my $id = $l3->id();
|
||||
|
||||
return 'cisco' if ($descr =~ /(cisco|ios)/i);
|
||||
return 'foundry' if ($descr =~ /foundry/i);
|
||||
# .1.3.6.1.4.1.9.1 is the CISCO-PRODUCTS-MIB
|
||||
# .1.3.6.1.4.1.9.9.368.4 is an old tree that Cisco CSSs were numbered from
|
||||
return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/;
|
||||
return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/;
|
||||
return 'cisco' if ( $descr =~ /(cisco|\bios\b)/i );
|
||||
return 'brocade' if ( $descr =~ /foundry/i );
|
||||
|
||||
return 'unknown';
|
||||
|
||||
}
|
||||
|
||||
sub at_index {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->orig_at_index($partial) || $l3->old_at_index($partial);
|
||||
}
|
||||
|
||||
sub at_paddr {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->orig_at_paddr($partial) || $l3->old_at_paddr($partial);
|
||||
}
|
||||
|
||||
sub at_netaddr {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->orig_at_netaddr($partial) || $l3->old_at_netaddr($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3 - Perl5 Interface to network devices serving Layer3 or Layers 2 & 3
|
||||
SNMP::Info::Layer3 - SNMP Interface to network devices serving Layer3 or
|
||||
Layers 2 & 3
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -262,14 +364,13 @@ Max Baker (C<max@warped.org>)
|
||||
my $l3 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l3->class();
|
||||
my $class = $l3->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
@@ -285,14 +386,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes listed under
|
||||
SNMP::Info::Layer3::* Please read all docs under SNMP::Info first.
|
||||
This class is usually used as a superclass for more specific device classes
|
||||
listed under SNMP::Info::Layer3::* Please read all docs under SNMP::Info
|
||||
first.
|
||||
|
||||
Provides generic methods for accessing SNMP data for Layer 3 network devices.
|
||||
Includes support for Layer2+3 devices.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $l3 = new SNMP::Info::Layer3(...);
|
||||
|
||||
@@ -302,33 +404,43 @@ a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
=item SNMP::Info::Bridge (For L2/L3 devices)
|
||||
|
||||
=item SNMP::Info::EtherLike
|
||||
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=item SNMP::Info::PowerEthernet
|
||||
|
||||
=item SNMP::Info::IPv6
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item CISCO-PRODUCTS-MIB
|
||||
=item F<IP-MIB>
|
||||
|
||||
=item ENTITY-MIB
|
||||
=item F<OSPF-MIB>
|
||||
|
||||
=item OSPF-MIB
|
||||
|
||||
=item Inherited Classes
|
||||
|
||||
MIBs required by the inherited classes listed above.
|
||||
=item F<BGP4-MIB>
|
||||
|
||||
=back
|
||||
|
||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Bridge/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::EtherLike/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::PowerEthernet/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::IPv6/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -336,21 +448,27 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->chassis()
|
||||
|
||||
Returns Chassis type (model).
|
||||
|
||||
(B<entPhysicalDescr.1>)
|
||||
|
||||
=item $l3->mac()
|
||||
|
||||
Returns root port mac address
|
||||
|
||||
(B<ifPhysAddress.1>)
|
||||
(C<ifPhysAddress.1>)
|
||||
|
||||
=item $l3->router_ip()
|
||||
|
||||
(B<ospfRouterId.0>)
|
||||
(C<ospfRouterId.0>)
|
||||
|
||||
=item $l3->bgp_id()
|
||||
|
||||
(C<bgpIdentifier.0>)
|
||||
|
||||
Returns the BGP identifier of the local system
|
||||
|
||||
=item $l3->bgp_local_as()
|
||||
|
||||
Returns the local autonomous system number
|
||||
|
||||
(C<bgpLocalAs.0>)
|
||||
|
||||
=back
|
||||
|
||||
@@ -360,41 +478,44 @@ Returns root port mac address
|
||||
|
||||
=item $l3->model()
|
||||
|
||||
Trys to reference $l3->id() to one of the product MIBs listed above
|
||||
Tries to reference $l3->id() to one of the product MIBs listed above
|
||||
|
||||
Removes 'cisco' from cisco devices for readability.
|
||||
|
||||
=item $l3->serial()
|
||||
|
||||
Trys to cull a serial number from $l3->chassis()
|
||||
Tries to cull a serial number from F<ENTITY-MIB>, description, and
|
||||
F<OLD-CISCO->... MIB.
|
||||
|
||||
=item $l3->vendor()
|
||||
|
||||
Trys to cull a Vendor name from B<sysDescr>
|
||||
Tries to cull a Vendor name from C<sysDescr>
|
||||
|
||||
=item $l3->root_ip()
|
||||
|
||||
Returns the primary IP used to communicate with the device. Returns the first
|
||||
found: OSPF Router ID (C<ospfRouterId>) or any OSPF Host IP Address
|
||||
(C<ospfHostIpAddress>).
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
=head2 Global Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
=head2 Global Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
See L<SNMP::Info::EtherLike/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
=head2 Global Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
See L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -405,7 +526,8 @@ to a hash.
|
||||
|
||||
=item $l3->interfaces()
|
||||
|
||||
Returns the map between SNMP Interface Identifier (iid) and physical port name.
|
||||
Returns the map between SNMP Interface Identifier (iid) and physical port
|
||||
name.
|
||||
|
||||
Only returns those iids that have a description listed in $l3->i_description()
|
||||
|
||||
@@ -419,7 +541,7 @@ Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
|
||||
|
||||
Returns reference to hash of iid to human set name.
|
||||
|
||||
Defaults to B<ifName>, but checks for an B<ifAlias>
|
||||
Defaults to C<ifName>, but checks for an C<ifAlias>
|
||||
|
||||
=item $l3->i_duplex()
|
||||
|
||||
@@ -428,52 +550,244 @@ Returns reference to hash of iid to current link duplex setting.
|
||||
Maps $l3->el_index() to $l3->el_duplex, then culls out
|
||||
full,half, or auto and sets the map to that value.
|
||||
|
||||
see SNMP::Info::Etherlike for the el_index() and el_duplex() methods.
|
||||
See L<SNMP::Info::Etherlike> for the el_index() and el_duplex() methods.
|
||||
|
||||
=back
|
||||
|
||||
=head2 ARP Cache Entries
|
||||
=head2 F<IP-MIB> Arp Cache Table (C<ipNetToMediaTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->at_index()
|
||||
|
||||
Returns reference to map of IID to Arp Cache Entry
|
||||
Returns reference to hash. Maps ARP table entries to Interface IIDs
|
||||
|
||||
(B<atIfIndex>)
|
||||
(C<ipNetToMediaIfIndex>)
|
||||
|
||||
If the device doesn't support C<ipNetToMediaIfIndex>, this will try
|
||||
the deprecated C<atIfIndex>.
|
||||
|
||||
=item $l3->at_paddr()
|
||||
|
||||
Returns reference to hash of Arp Cache Entries to MAC address
|
||||
Returns reference to hash. Maps ARP table entries to MAC addresses.
|
||||
|
||||
(B<atPhysAddress>)
|
||||
(C<ipNetToMediaPhysAddress>)
|
||||
|
||||
If the device doesn't support C<ipNetToMediaPhysAddress>, this will try
|
||||
the deprecated C<atPhysAddress>.
|
||||
|
||||
=item $l3->at_netaddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to IP addresses.
|
||||
|
||||
(C<ipNetToMediaNetAddress>)
|
||||
|
||||
If the device doesn't support C<ipNetToMediaNetAddress>, this will try
|
||||
the deprecated C<atNetAddress>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 ARP Cache Entries
|
||||
|
||||
The C<atTable> has been deprecated since 1991. You should never need
|
||||
to use these methods. See C<ipNetToMediaTable> above.
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->old_at_index()
|
||||
|
||||
Returns reference to map of IID to Arp Cache Entry
|
||||
|
||||
(C<atIfIndex>)
|
||||
|
||||
=item $l3->old_at_paddr()
|
||||
|
||||
Returns reference to hash of Arp Cache Entries to MAC address
|
||||
|
||||
(C<atPhysAddress>)
|
||||
|
||||
=item $l3->old_at_netaddr()
|
||||
|
||||
Returns reference to hash of Arp Cache Entries to IP Address
|
||||
|
||||
(B<atNetAddress>)
|
||||
(C<atNetAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 BGP Peer Table (C<bgpPeerTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->bgp_peers()
|
||||
|
||||
Returns reference to hash of BGP peer to local IP address
|
||||
|
||||
(C<bgpPeerLocalAddr>)
|
||||
|
||||
=item $l3->bgp_peer_id()
|
||||
|
||||
Returns reference to hash of BGP peer to BGP peer identifier
|
||||
|
||||
(C<bgpPeerIdentifier>)
|
||||
|
||||
=item $l3->bgp_peer_state()
|
||||
|
||||
Returns reference to hash of BGP peer to BGP peer state
|
||||
|
||||
(C<bgpPeerState>)
|
||||
|
||||
=item $l3->bgp_peer_as()
|
||||
|
||||
Returns reference to hash of BGP peer to BGP peer autonomous system number
|
||||
|
||||
(C<bgpPeerRemoteAs>)
|
||||
|
||||
=item $l3->bgp_peer_addr()
|
||||
|
||||
Returns reference to hash of BGP peer to BGP peer IP address
|
||||
|
||||
(C<bgpPeerRemoteAddr>)
|
||||
|
||||
=item $l3->bgp_peer_fsm_est_trans()
|
||||
|
||||
Returns reference to hash of BGP peer to the total number of times the BGP FSM
|
||||
transitioned into the established state
|
||||
|
||||
(C<bgpPeerFsmEstablishedTransitions>)
|
||||
|
||||
=item $l3->bgp_peer_in_tot_msgs()
|
||||
|
||||
Returns reference to hash of BGP peer to the total number of messages received
|
||||
from the remote peer on this connection
|
||||
|
||||
(C<bgpPeerInTotalMessages>)
|
||||
|
||||
=item $l3->bgp_peer_in_upd_el_time()
|
||||
|
||||
Returns reference to hash of BGP peer to the elapsed time in seconds since
|
||||
the last BGP UPDATE message was received from the peer.
|
||||
|
||||
(C<bgpPeerInUpdateElapsedTime>)
|
||||
|
||||
=item $l3->bgp_peer_in_upd()
|
||||
|
||||
Returns reference to hash of BGP peer to the number of BGP UPDATE messages
|
||||
received on this connection
|
||||
|
||||
(C<bgpPeerInUpdates>)
|
||||
|
||||
=item $l3->bgp_peer_out_tot_msgs()
|
||||
|
||||
Returns reference to hash of BGP peer to the total number of messages
|
||||
transmitted to the remote peer on this connection
|
||||
|
||||
(C<bgpPeerOutTotalMessages>)
|
||||
|
||||
=item $l3->bgp_peer_out_upd()
|
||||
|
||||
Returns reference to hash of BGP peer to the number of BGP UPDATE messages
|
||||
transmitted on this connection
|
||||
|
||||
(C<bgpPeerOutUpdates>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 OSPF Interface Table (C<ospfIfTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->ospf_if_ip()
|
||||
|
||||
Returns reference to hash of OSPF interface IP addresses
|
||||
|
||||
(C<ospfIfIpAddress>)
|
||||
|
||||
=item $l3->ospf_if_area()
|
||||
|
||||
Returns reference to hash of the OSPF area to which the interfaces connect
|
||||
|
||||
(C<ospfIfAreaId>)
|
||||
|
||||
=item $l3->ospf_if_type()
|
||||
|
||||
Returns reference to hash of the OSPF interfaces' type
|
||||
|
||||
(C<ospfIfType>)
|
||||
|
||||
=item $l3->ospf_if_hello()
|
||||
|
||||
Returns reference to hash of the OSPF interfaces' hello interval
|
||||
|
||||
(C<ospfIfHelloInterval>)
|
||||
|
||||
=item $l3->ospf_if_dead()
|
||||
|
||||
Returns reference to hash of the OSPF interfaces' dead interval
|
||||
|
||||
(C<ospfIfRtrDeadInterval>)
|
||||
|
||||
=item $l3->ospf_if_admin()
|
||||
|
||||
Returns reference to hash of the OSPF interfaces' administrative status
|
||||
|
||||
(C<ospfIfAdminStat>)
|
||||
|
||||
=item $l3->ospf_if_state()
|
||||
|
||||
Returns reference to hash of the OSPF interfaces' state
|
||||
|
||||
(C<ospfIfState>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 OSPF Neighbor Table (C<ospfNbrTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $l3->ospf_peers()
|
||||
|
||||
Returns reference to hash of IP addresses the neighbor is using in its
|
||||
IP Source Addresses
|
||||
|
||||
(C<ospfNbrIpAddr>)
|
||||
|
||||
=item $l3->ospf_peer_id()
|
||||
|
||||
Returns reference to hash of neighbor Router IDs
|
||||
|
||||
(C<ospfNbrRtrId>)
|
||||
|
||||
=item $l3->ospf_peer_state()
|
||||
|
||||
Returns reference to hash of state of the relationship with the neighbor
|
||||
routers
|
||||
|
||||
(C<ospfNbrState>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in SNMP::Info::CDP for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in SNMP::Info::CiscoStats for details.
|
||||
See L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::EtherLike
|
||||
|
||||
See documentation in SNMP::Info::EtherLike for details.
|
||||
See L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::PowerEthernet
|
||||
|
||||
See L<SNMP::Info::PowerEthernet/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::IPv6
|
||||
|
||||
See L<SNMP::Info::IPv6/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,88 +1,89 @@
|
||||
# SNMP::Info::Layer3::Aironet
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Aironet;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::Layer3::Aironet::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Aironet::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Aironet::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'AWCVX-MIB' => 'awcIfTable',
|
||||
'IEEE802dot11-MIB' => 'dot11StationID',
|
||||
);
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'AWCVX-MIB' => 'awcIfTable',
|
||||
'IEEE802dot11-MIB' => 'dot11StationID',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'mac' => 'dot11StationID.2',
|
||||
# AWC Ethernet Table
|
||||
'awc_duplex' => 'awcEtherDuplex.0',
|
||||
);
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'mac' => 'dot11StationID.2',
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
'i_mac2' => 'ifPhysAddress',
|
||||
'i_mtu2' => 'ifMtu',
|
||||
'i_ssid' => 'dot11DesiredSSID',
|
||||
# Bridge-mib overrides
|
||||
'fw_mac2' => 'dot1dTpFdbAddress',
|
||||
'fw_port2' => 'dot1dTpFdbPort',
|
||||
'bp_index2' => 'dot1dBasePortIfIndex',
|
||||
# AWC Interface Table (awcIfTable)
|
||||
'awc_default_mac' => 'awcIfDefaultPhyAddress',
|
||||
'awc_mac' => 'awcIfPhyAddress',
|
||||
'awc_ip' => 'awcIfIpAddress',
|
||||
'awc_netmask' => 'awcIfIpNetMask',
|
||||
'awc_msdu' => 'awcIfMSDUMaxLength',
|
||||
);
|
||||
# AWC Ethernet Table
|
||||
'awc_duplex' => 'awcEtherDuplex.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
'i_mac2' => 'ifPhysAddress',
|
||||
'i_mtu2' => 'ifMtu',
|
||||
'i_ssid' => 'dot11DesiredSSID',
|
||||
|
||||
# Bridge-mib overrides
|
||||
'fw_mac2' => 'dot1dTpFdbAddress',
|
||||
'fw_port2' => 'dot1dTpFdbPort',
|
||||
'bp_index2' => 'dot1dBasePortIfIndex',
|
||||
|
||||
# AWC Interface Table (awcIfTable)
|
||||
'awc_default_mac' => 'awcIfDefaultPhyAddress',
|
||||
'awc_mac' => 'awcIfPhyAddress',
|
||||
'awc_ip' => 'awcIfIpAddress',
|
||||
'awc_netmask' => 'awcIfIpNetMask',
|
||||
'awc_msdu' => 'awcIfMSDUMaxLength',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
'i_mac2' => \&SNMP::Info::munge_mac,
|
||||
'awc_mac' => \&SNMP::Info::munge_mac,
|
||||
'fw_mac2' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
'i_mac2' => \&SNMP::Info::munge_mac,
|
||||
'awc_mac' => \&SNMP::Info::munge_mac,
|
||||
'fw_mac2' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
sub os {
|
||||
return 'aironet';
|
||||
@@ -90,35 +91,35 @@ sub os {
|
||||
|
||||
sub os_ver {
|
||||
my $aironet = shift;
|
||||
my $descr = $aironet->description();
|
||||
my $descr = $aironet->description() || '';
|
||||
|
||||
# CAP340 11.21, AP4800-E 11.21
|
||||
if ($descr =~ /AP\d{3,4}(-\D+)?\s+(\d{2}\.\d{2})/){
|
||||
if ( $descr =~ /AP\d{3,4}(-\D+)?\s+(\d{2}\.\d{2})/ ) {
|
||||
return $2;
|
||||
}
|
||||
|
||||
if ($descr =~ /Series\s*AP\s+(\d{2}\.\d{2})/){
|
||||
|
||||
if ( $descr =~ /Series\s*AP\s+(\d{2}\.\d{2})/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
# Override wireless port with static info
|
||||
sub bp_index {
|
||||
my $aironet = shift;
|
||||
my $aironet = shift;
|
||||
my $interfaces = $aironet->interfaces();
|
||||
my $bp_index = $aironet->bp_index2();
|
||||
|
||||
foreach my $iid (keys %$interfaces){
|
||||
my $bp_index = $aironet->bp_index2();
|
||||
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $port = $interfaces->{$iid};
|
||||
|
||||
# Hardwire the wireless port to the transparent bridge port
|
||||
if ($port =~ /awc/){
|
||||
$bp_index->{0}=$iid;
|
||||
if ( $port =~ /awc/ ) {
|
||||
$bp_index->{0} = $iid;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $bp_index;
|
||||
}
|
||||
|
||||
@@ -127,16 +128,16 @@ sub fw_mac {
|
||||
my $aironet = shift;
|
||||
my $fw_mac = $aironet->fw_mac2();
|
||||
my $fw_port = $aironet->fw_port2();
|
||||
my $bs_mac = $aironet->bs_mac();
|
||||
|
||||
my $bs_mac = $aironet->bs_mac();
|
||||
|
||||
# remove port 0 forwarding table entries, only port 0 static entries
|
||||
foreach my $fw (keys %$fw_mac){
|
||||
foreach my $fw ( keys %$fw_mac ) {
|
||||
my $port = $fw_port->{$fw};
|
||||
next unless defined $port;
|
||||
delete $fw_mac->{$fw} if $port == 0;
|
||||
}
|
||||
|
||||
foreach my $bs (keys %$bs_mac){
|
||||
foreach my $bs ( keys %$bs_mac ) {
|
||||
my $entry = $bs;
|
||||
$entry =~ s/\.0$//;
|
||||
$fw_mac->{$entry} = $bs_mac->{$bs};
|
||||
@@ -149,10 +150,9 @@ sub fw_mac {
|
||||
sub fw_port {
|
||||
my $aironet = shift;
|
||||
my $fw_port = $aironet->fw_port2();
|
||||
my $bs_port = $aironet->bs_port();
|
||||
my $bs_port = $aironet->bs_port();
|
||||
|
||||
|
||||
foreach my $bs (keys %$bs_port){
|
||||
foreach my $bs ( keys %$bs_port ) {
|
||||
my $entry = $bs;
|
||||
$entry =~ s/\.0$//;
|
||||
$fw_port->{$entry} = $bs_port->{$bs};
|
||||
@@ -161,18 +161,17 @@ sub fw_port {
|
||||
return $fw_port;
|
||||
}
|
||||
|
||||
|
||||
sub i_duplex {
|
||||
my $aironet = shift;
|
||||
my $aironet = shift;
|
||||
my $interfaces = $aironet->interfaces();
|
||||
my $awc_duplex = $aironet->awc_duplex();
|
||||
|
||||
|
||||
my %i_duplex;
|
||||
|
||||
foreach my $iid (keys %$interfaces){
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $name = $interfaces->{$iid};
|
||||
|
||||
if ($name =~ /fec/){
|
||||
if ( $name =~ /fec/ ) {
|
||||
$i_duplex{$iid} = $awc_duplex;
|
||||
}
|
||||
}
|
||||
@@ -186,7 +185,7 @@ sub i_mac {
|
||||
my $i_mac = $aironet->i_mac2();
|
||||
my $awc_mac = $aironet->awc_mac();
|
||||
|
||||
foreach my $iid (keys %$awc_mac){
|
||||
foreach my $iid ( keys %$awc_mac ) {
|
||||
next unless defined $i_mac->{$iid};
|
||||
$i_mac->{$iid} = $awc_mac->{$iid};
|
||||
}
|
||||
@@ -195,14 +194,14 @@ sub i_mac {
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $aironet = shift;
|
||||
my $aironet = shift;
|
||||
my $interfaces = $aironet->interfaces();
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$interfaces){
|
||||
$i_ignore{$if}++ if ($interfaces->{$if} =~ /(rptr|lo)/);
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
$i_ignore{$if}++ if ( $interfaces->{$if} =~ /(rptr|lo)/ );
|
||||
}
|
||||
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
@@ -216,11 +215,12 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Aironet - Perl5 Interface to Cisco Aironet Wireless Devices running Aironet software, not IOS
|
||||
SNMP::Info::Layer3::Aironet - Perl5 Interface to Cisco Aironet Wireless
|
||||
Devices running Aironet software, not IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -228,7 +228,6 @@ Max Baker (C<max@warped.org>)
|
||||
my $aironet = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -240,8 +239,8 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info subclass to provide access to SNMP data for an Aironet device running Aironet software,
|
||||
not cisco IOS.
|
||||
SNMP::Info subclass to provide access to SNMP data for an Aironet device
|
||||
running Aironet software, not cisco IOS.
|
||||
|
||||
Note there are two classes for Aironet devices :
|
||||
|
||||
@@ -257,8 +256,8 @@ This class is for devices running Cisco IOS software (newer)
|
||||
|
||||
=back
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $aironet = new SNMP::Info::Layer3::Aironet(...);
|
||||
|
||||
@@ -274,14 +273,14 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item AWCVX-MIB
|
||||
=item F<AWCVX-MIB>
|
||||
|
||||
=item IEEE802dot11-MIB
|
||||
=item F<IEEE802dot11-MIB>
|
||||
|
||||
=back
|
||||
|
||||
These MIBs are now included in the v2.tar.gz archive available from ftp.cisco.com. Make sure you
|
||||
have a current version.
|
||||
These MIBs are now included in the v2.tar.gz archive available from
|
||||
ftp.cisco.com. Make sure you have a current version.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
@@ -293,13 +292,13 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
Gives the admin duplex setting for the Ethernet Port.
|
||||
|
||||
B<awcEtherDuplex.0>
|
||||
C<awcEtherDuplex.0>
|
||||
|
||||
=item $aironet->mac()
|
||||
|
||||
Gives the MAC Address of the wireless side
|
||||
|
||||
B<dot11StationID.2>
|
||||
C<dot11StationID.2>
|
||||
|
||||
=item $aironet->os()
|
||||
|
||||
@@ -317,9 +316,9 @@ Returns 'cisco'.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -330,18 +329,18 @@ to a hash.
|
||||
|
||||
=item $aironet->bp_index()
|
||||
|
||||
Takes the bp_index() value from SNMP::Info::Bridge and overrides the wireless port
|
||||
to be assigned to the transparent bridge port (port 0)
|
||||
Takes the bp_index() value from SNMP::Info::Bridge and overrides the wireless
|
||||
port to be assigned to the transparent bridge port (port 0)
|
||||
|
||||
=item $aironet->fw_mac()
|
||||
|
||||
Adds static table entries from bs_mac() to port 0 so that wireless MAC addresses will
|
||||
be reported. Forwarding table entries for port 0 are removed.
|
||||
Adds static table entries from bs_mac() to port 0 so that wireless MAC
|
||||
addresses will be reported. Forwarding table entries for port 0 are removed.
|
||||
|
||||
=item $aironet->fw_port()
|
||||
|
||||
Adds the static table port mappings to the forwarding table port mappings by adding
|
||||
bs_port() to fw_port()
|
||||
Adds the static table port mappings to the forwarding table port mappings by
|
||||
adding bs_port() to fw_port()
|
||||
|
||||
=item $aironet->i_duplex()
|
||||
|
||||
@@ -365,34 +364,34 @@ Ignores ports that are of type ``rptr'' and ``lo''.
|
||||
|
||||
Gives the default MAC address of each interface.
|
||||
|
||||
B<awcIfDefaultPhyAddress>
|
||||
C<awcIfDefaultPhyAddress>
|
||||
|
||||
=item $aironet->awc_mac()
|
||||
|
||||
Gives the actual MAC address of each interface.
|
||||
|
||||
B<awcIfPhyAddress>
|
||||
C<awcIfPhyAddress>
|
||||
|
||||
=item $aironet->awc_ip()
|
||||
|
||||
Gives the IP Address assigned to each interface.
|
||||
|
||||
B<awcIfIpAddress>
|
||||
C<awcIfIpAddress>
|
||||
|
||||
=item $aironet->awc_netmask()
|
||||
|
||||
Gives the NetMask for each interface.
|
||||
|
||||
B<awcIfIpNetMask>
|
||||
C<awcIfIpNetMask>
|
||||
|
||||
=item $aironet->awc_msdu()
|
||||
|
||||
B<awcIfMSDUMaxLength>
|
||||
C<awcIfMSDUMaxLength>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
489
Info/Layer3/AlcatelLucent.pm
Normal file
489
Info/Layer3/AlcatelLucent.pm
Normal file
@@ -0,0 +1,489 @@
|
||||
# SNMP::Info::Layer3::AlcatelLucent
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::AlcatelLucent;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::AMAP;
|
||||
# Use LLDP
|
||||
# (or at least try. The versions I've seen have two problems:
|
||||
# 1. they report ifIndex values as 'local'; we don't support ifIndex
|
||||
# but *could*
|
||||
# 2. They report 0.0.0.0 as the management address
|
||||
# )
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::AMAP SNMP::Info::LLDP
|
||||
SNMP::Info::MAU SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::AlcatelLucent::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::AMAP::MIBS,
|
||||
'ALCATEL-IND1-DEVICES' => 'familyOmniSwitch7000',
|
||||
'ALCATEL-IND1-CHASSIS-MIB' => 'chasEntPhysOperStatus',
|
||||
'ALU-POWER-ETHERNET-MIB' => 'pethPsePortDetectionStatus',
|
||||
);
|
||||
|
||||
# Alcatel provides their own version of the POWER-ETHERNET-MIB,
|
||||
# off in vendor-space, without renaming any of the objects.
|
||||
# This means we have to *not* load the POWER-ETHERNET-MIB
|
||||
# but can then still use the standard PowerEthernet module,
|
||||
# but cannot try both so we hope Alcatel doesn't stop supporting
|
||||
# their private version even if they get around to supporting the
|
||||
# standard.
|
||||
delete $MIBS{'POWER-ETHERNET-MIB'};
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS, %SNMP::Info::AMAP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::AMAP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::AMAP::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::AlcatelLucent::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::AlcatelLucent::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub model {
|
||||
my $alu = shift;
|
||||
my $id = $alu->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^device//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'AOS';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'alcatel-lucent';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $alu = shift;
|
||||
|
||||
my $descr = $alu->description();
|
||||
if ( $descr =~ m/^(\S+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# No clue what this will try but hey
|
||||
return $alu->SUPER::os_ver();
|
||||
}
|
||||
|
||||
# ps1_type, ps1_status, ps2_type, ps2_status:
|
||||
# Find the list of power supplies in the ENTITY-MIB
|
||||
# e_class = powerSupply
|
||||
# e_descr = ps_type
|
||||
# chasEntPhysOperStatus = ps_status
|
||||
sub _power_supplies {
|
||||
my $alu = shift;
|
||||
|
||||
my $e_class = $alu->e_class();
|
||||
my @supplies = ();
|
||||
|
||||
foreach my $key ( sort { int($a) cmp int($b) } keys %$e_class ) {
|
||||
if ( $e_class->{$key} eq 'powerSupply' ) {
|
||||
push( @supplies, int($key) );
|
||||
}
|
||||
}
|
||||
return @supplies;
|
||||
}
|
||||
|
||||
sub _ps_type {
|
||||
my $alu = shift;
|
||||
my $psnum = shift;
|
||||
my @ps = $alu->_power_supplies();
|
||||
|
||||
if ( $psnum > $#ps ) {
|
||||
return "none";
|
||||
}
|
||||
my $supply = $ps[$psnum];
|
||||
my $descr = $alu->e_descr($supply);
|
||||
return $descr->{$supply};
|
||||
}
|
||||
|
||||
sub _ps_status {
|
||||
my $alu = shift;
|
||||
my $psnum = shift;
|
||||
my @ps = $alu->_power_supplies();
|
||||
|
||||
if ( $psnum > $#ps ) {
|
||||
return "not present";
|
||||
}
|
||||
my $supply = $ps[$psnum];
|
||||
my $status = $alu->chasEntPhysOperStatus($supply);
|
||||
return $status->{$supply};
|
||||
}
|
||||
|
||||
sub ps1_type {
|
||||
my $alu = shift;
|
||||
return $alu->_ps_type(0);
|
||||
}
|
||||
|
||||
sub ps2_type {
|
||||
my $alu = shift;
|
||||
return $alu->_ps_type(1);
|
||||
}
|
||||
|
||||
sub ps1_status {
|
||||
my $alu = shift;
|
||||
return $alu->_ps_status(0);
|
||||
}
|
||||
|
||||
sub ps2_status {
|
||||
my $alu = shift;
|
||||
return $alu->_ps_status(1);
|
||||
}
|
||||
|
||||
# The interface description contains the software version, so
|
||||
# to avoid losing historical information through a software upgrade
|
||||
# we use interface name instead.
|
||||
sub interfaces {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->orig_i_name($partial);
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB
|
||||
sub fw_mac {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
# Work around buggy bp_index in 6.3.1.871.R01 and 6.3.1.975.R01
|
||||
sub bp_index {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $bp_index = $alu->SUPER::bp_index($partial);
|
||||
|
||||
#
|
||||
# This device sometimes reports an ifIndex and sometimes reports
|
||||
# dot1dBasePort for the dot1d port values - e.g.,
|
||||
# in 6.3.1.871.R01 both dot1dTpFdbPort and dot1qTpFdbPort report
|
||||
# the ifIndex; in 6.3.1.975.R01 dot1dTpFdbPort has been updated
|
||||
# to report the dot1dBasePort but dot1qTpFdbPort still returns an
|
||||
# ifIndex. For this reason, we augment the dot1dBasePort
|
||||
# mapping with ifIndex->ifIndex mappings -- we can do this because
|
||||
# the ifIndex and dot1dBasePort spaces don't overlap, at least for
|
||||
# the ports we care about.
|
||||
my @keys = keys %$bp_index;
|
||||
foreach my $idx (@keys) {
|
||||
my $ifIndex = $bp_index->{$idx};
|
||||
$bp_index->{$ifIndex} = $ifIndex;
|
||||
}
|
||||
|
||||
#
|
||||
# In addition, aggregates aren't reported at all in bp_index.
|
||||
# We grab them from i_index.
|
||||
my $i_index = $alu->i_index();
|
||||
foreach my $idx ( keys %$i_index ) {
|
||||
my $ifIndex = $i_index->{$idx};
|
||||
if ( int($ifIndex) > 40000001 ) {
|
||||
$bp_index->{$ifIndex} = $ifIndex;
|
||||
|
||||
# dot1dTpFdbPort seems to use 4098, 4099, 4100 for
|
||||
# 40000001, 40000002, 40000003. I guess this is
|
||||
# 4096 + 1 + aggregate number.
|
||||
my $tmp = sprintf( "%d", int($ifIndex) - 39995903 );
|
||||
$bp_index->{$tmp} = $ifIndex;
|
||||
}
|
||||
}
|
||||
return $bp_index;
|
||||
}
|
||||
|
||||
# Workaround for unimplemented Q-BRIDGE-MIB::dot1qPvid
|
||||
# If there is only one VLAN on which a given port is output
|
||||
# untagged, then call that one the PVID. This is a guess that
|
||||
# works in obvious configurations but may be wrong in
|
||||
# subtle cases (like there's one output VLAN but a different
|
||||
# input one - the only way to know that is via the dot1qPvid
|
||||
# object)
|
||||
#
|
||||
# Newer versions have implemented dot1qPvid (but wrong, but
|
||||
# that's just life)
|
||||
#sub i_vlan {
|
||||
# my $alu = shift;
|
||||
#
|
||||
# my $qb_v_untagged = $alu->qb_v_untagged();
|
||||
# my $bp_index = $alu->bp_index();
|
||||
# my $vlan_list = {};
|
||||
# foreach my $vlan (keys %$qb_v_untagged) {
|
||||
# my $portlist = $qb_v_untagged->{$vlan};
|
||||
# my $port;
|
||||
# for ($port = 0; $port <= $#$portlist; $port++) {
|
||||
# if ($portlist->[$port]) {
|
||||
# my $ifindex = $bp_index->{$port + 1};
|
||||
# if ($ifindex) {
|
||||
# push(@{$vlan_list->{$ifindex}}, int($vlan));
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
#
|
||||
# my $i_vlan = {};
|
||||
# foreach my $ifindex (keys %$vlan_list) {
|
||||
# if ($#{$vlan_list->{$ifindex}} == 0) {
|
||||
# $i_vlan->{$ifindex} = ${$vlan_list->{$ifindex}}[0];
|
||||
# }
|
||||
# }
|
||||
# return $i_vlan;
|
||||
#}
|
||||
|
||||
# Power-Ethernet ifIndex mapping. I've only seen this from a
|
||||
# fixed-config single-module system, so this is only a plausible
|
||||
# guess as to the mapping on a stack or modular system.
|
||||
sub peth_port_ifindex {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $peth_port_status = $alu->peth_port_status($partial);
|
||||
my $peth_port_ifindex = {};
|
||||
|
||||
foreach my $key ( keys %$peth_port_status ) {
|
||||
my @oid = split( m/\./, $key );
|
||||
$peth_port_ifindex->{$key} = int( $oid[0] ) * 1000 + int( $oid[1] );
|
||||
}
|
||||
return $peth_port_ifindex;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::AlcatelLucent - SNMP Interface to Alcatel-Lucent OmniSwitch
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $alu = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $alu->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Alcatel-Lucent OmniSwitch devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ALCATEL-IND1-DEVICES>
|
||||
|
||||
=item F<ALCATEL-IND1-CHASSIS-MIB>
|
||||
|
||||
=item F<ALU-POWER-ETHERNET-MIB>
|
||||
|
||||
Note that Alcatel-Lucent distributes their own proprietary version of the
|
||||
F<POWER-ETHERNET-MIB>, but the MIB module name that they distribute is
|
||||
simply F<POWER-ETHERNET-MIB>. This module must be hand-edited to change the
|
||||
module name to F<ALU-POWER-ETHERNET-MIB> so that it can be used simultaneously
|
||||
with the standard F<POWER-ETHERNET-MIB>.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $alu->vendor()
|
||||
|
||||
Returns 'alcatel-lucent'
|
||||
|
||||
=item $alu->model()
|
||||
|
||||
Tries to reference $alu->id() to one of the product MIBs listed above
|
||||
|
||||
Removes 'device' from the name for readability.
|
||||
|
||||
=item $alu->os()
|
||||
|
||||
Returns 'AOS'
|
||||
|
||||
=item $alu->os_ver()
|
||||
|
||||
Grabs the os version from C<sysDescr>
|
||||
|
||||
=item $alu->ps1_type()
|
||||
|
||||
Return the type of the first power supply from the F<ENTITY-MIB>
|
||||
|
||||
=item $alu->ps2_type()
|
||||
|
||||
Return the type of the second power supply from the F<ENTITY-MIB>
|
||||
|
||||
=item $alu->ps1_status()
|
||||
|
||||
Return the status of the first power supply from the F<ALCATEL-IND1-CHASSIS-MIB>
|
||||
|
||||
=item $alu->ps2_status()
|
||||
|
||||
Return the status of the second power supply from the F<ALCATEL-IND1-CHASSIS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $alu->interfaces()
|
||||
|
||||
Returns interface name from C<ifName>, since the default return value
|
||||
of C<ifDescr> includes the OS version.
|
||||
|
||||
=item $alu->fw_mac()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $alu->fw_port()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $alu->bp_index()
|
||||
|
||||
Work around various bugs in the F<BRIDGE-MIB> and
|
||||
F<Q-BRIDGE-MIB> implementations, by returning both
|
||||
C<ifIndex> and C<dot1dBasePort> mappings to C<ifIndex> values.
|
||||
|
||||
=item $alu->i_duplex_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=item $alu->i_speed_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=item $alu->peth_port_ifindex()
|
||||
|
||||
Returns the C<ifIndex> value for power-ethernet ports
|
||||
using the OmniSwitch algorithm.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,148 +1,215 @@
|
||||
# SNMP::Info::Layer3::AlteonAD
|
||||
# Eric Miller <eric@jeneric.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::AlteonAD;
|
||||
$VERSION = 0.9;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE /;
|
||||
|
||||
@SNMP::Info::Layer3::AlteonAD::ISA = qw/SNMP::Info SNMP::Info::Bridge Exporter/;
|
||||
@SNMP::Info::Layer3::AlteonAD::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::AlteonAD::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
'ALTEON-TIGON-SWITCH-MIB' => 'agSoftwareVersion',
|
||||
'ALTEON-TS-PHYSICAL-MIB' => 'agPortTableMaxEnt',
|
||||
'ALTEON-TS-NETWORK-MIB' => 'agPortTableMaxEnt',
|
||||
);
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'ALTEON-ROOT-MIB' => 'aceswitch184',
|
||||
'ALTEON-TIGON-SWITCH-MIB' => 'hwPowerSupplyStatus',
|
||||
'ALTEON-CHEETAH-SWITCH-MIB' => 'hwFanStatus',
|
||||
'ALTEON-TS-PHYSICAL-MIB' => 'agPortTableMaxEnt',
|
||||
'ALTEON-CS-PHYSICAL-MIB' => 'vlanCurCfgLearn',
|
||||
'ALTEON-TS-NETWORK-MIB' => 'ripCurCfgSupply',
|
||||
'ALTEON-CHEETAH-NETWORK-MIB' => 'ripCurCfgIntfSupply',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
'sw_ver' => 'agSoftwareVersion',
|
||||
'tftp_action' => 'agTftpAction',
|
||||
'tftp_host' => 'agTftpServer',
|
||||
'tftp_file' => 'agTftpCfgFileName',
|
||||
'tftp_result' => 'agTftpLastActionStatus',
|
||||
);
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'old_sw_ver' => 'ALTEON_TIGON_SWITCH_MIB__agSoftwareVersion',
|
||||
'new_sw_ver' => 'ALTEON_CHEETAH_SWITCH_MIB__agSoftwareVersion',
|
||||
'old_tftp_action' => 'ALTEON_TIGON_SWITCH_MIB__agTftpAction',
|
||||
'new_tftp_action' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpAction',
|
||||
'old_tftp_host' => 'ALTEON_TIGON_SWITCH_MIB__agTftpServer',
|
||||
'new_tftp_host' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpServer',
|
||||
'old_tftp_file' => 'ALTEON_TIGON_SWITCH_MIB__agTftpCfgFileName',
|
||||
'new_tftp_file' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpCfgFileName',
|
||||
'old_tftp_result' => 'ALTEON_TIGON_SWITCH_MIB__agTftpLastActionStatus',
|
||||
'new_tftp_result' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpLastActionStatus',
|
||||
'old_ip_max' => 'ALTEON_TS_NETWORK_MIB__ipInterfaceTableMax',
|
||||
'new_ip_max' => 'ALTEON_CHEETAH_NETWORK_MIB__ipInterfaceTableMax',
|
||||
'fan' => 'ALTEON_CHEETAH_SWITCH_MIB__hwFanStatus',
|
||||
'old_ps1_stat' => 'ALTEON_TIGON_SWITCH_MIB__hwPowerSupplyStatus',
|
||||
'old_ps2_stat' => 'ALTEON_TIGON_SWITCH_MIB__hwRedundantPSStatus',
|
||||
'new_ps_stat' => 'ALTEON_CHEETAH_SWITCH_MIB__hwPowerSupplyStatus',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
'bp_index_2' => 'dot1dBasePortIfIndex',
|
||||
'i_name2' => 'ifName',
|
||||
# From RFC1213-MIB
|
||||
'at_index' => 'ipNetToMediaIfIndex',
|
||||
'at_paddr' => 'ipNetToMediaPhysAddress',
|
||||
'at_netaddr' => 'ipNetToMediaNetAddress',
|
||||
# From agPortCurCfgTable
|
||||
'ag_p_cfg_idx' => 'agPortCurCfgIndx',
|
||||
'ag_p_cfg_pref' => 'agPortCurCfgPrefLink',
|
||||
'ag_p_cfg_pvid' => 'agPortCurCfgPVID',
|
||||
'ag_p_cfg_fe_auto' => 'agPortCurCfgFastEthAutoNeg',
|
||||
'ag_p_cfg_fe_mode' => 'agPortCurCfgFastEthMode',
|
||||
'ag_p_cfg_ge_auto' => 'agPortCurCfgGigEthAutoNeg',
|
||||
'ag_p_cfg_name' => 'agPortCurCfgPortName',
|
||||
# From portInfoTable
|
||||
'p_info_idx' => 'portInfoIndx',
|
||||
'p_info_mode' => 'portInfoMode',
|
||||
# From portInfoTable
|
||||
'ip_cfg_vlan' => 'ipCurCfgIntfVlan',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
|
||||
# From agPortCurCfgTable
|
||||
'old_ag_p_cfg_idx' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgIndx',
|
||||
'new_ag_p_cfg_idx' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgIndx',
|
||||
'old_ag_p_cfg_pref' => 'agPortCurCfgPrefLink',
|
||||
'new_ag_p_cfg_pref' => 'agPortCurCfgPreferred',
|
||||
'old_ag_p_cfg_pvid' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgPVID',
|
||||
'new_ag_p_cfg_pvid' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgPVID',
|
||||
'old_ag_p_cfg_fe_auto' =>
|
||||
'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgFastEthAutoNeg',
|
||||
'new_ag_p_cfg_fe_auto' =>
|
||||
'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgFastEthAutoNeg',
|
||||
'old_ag_p_cfg_fe_mode' =>
|
||||
'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgFastEthMode',
|
||||
'new_ag_p_cfg_fe_mode' =>
|
||||
'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgFastEthMode',
|
||||
'old_ag_p_cfg_ge_auto' =>
|
||||
'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgGigEthAutoNeg',
|
||||
'new_ag_p_cfg_ge_auto' =>
|
||||
'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgGigEthAutoNeg',
|
||||
'old_ag_p_cfg_name' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgPortName',
|
||||
'new_ag_p_cfg_name' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgPortName',
|
||||
|
||||
# From portInfoTable
|
||||
'old_p_info_idx' => 'ALTEON_TS_PHYSICAL_MIB__portInfoIndx',
|
||||
'new_p_info_idx' => 'ALTEON_CHEETAH_SWITCH_MIB__portInfoIndx',
|
||||
'old_p_info_mode' => 'ALTEON_TS_PHYSICAL_MIB__portInfoMode',
|
||||
'new_p_info_mode' => 'ALTEON_CHEETAH_SWITCH_MIB__portInfoMode',
|
||||
|
||||
# From ipCurCfgIntfTable
|
||||
'old_ip_cfg_vlan' => 'ALTEON_TS_NETWORK_MIB__ipCurCfgIntfVlan',
|
||||
'new_ip_cfg_vlan' => 'ALTEON_CHEETAH_NETWORK_MIB__ipCurCfgIntfVlan',
|
||||
|
||||
# From vlanCurCfgTable
|
||||
'old_vlan_id' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgVlanId',
|
||||
'new_vlan_id' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgVlanId',
|
||||
'old_vlan_state' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgState',
|
||||
'new_vlan_state' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgState',
|
||||
'old_vlan_name' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgVlanName',
|
||||
'new_vlan_name' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgVlanName',
|
||||
'old_vlan_ports' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgPorts',
|
||||
'new_vlan_ports' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgPorts',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub model {
|
||||
my $alteon = shift;
|
||||
my $desc = $alteon->description();
|
||||
return undef unless defined $desc;
|
||||
|
||||
return 'AD2' if ($desc =~ /AD2/);
|
||||
return 'AD3' if ($desc =~ /AD3/);
|
||||
return 'AD4' if ($desc =~ /AD4/);
|
||||
return '180' if ($desc =~ /180/);
|
||||
return '183' if ($desc =~ /183/);
|
||||
return '184' if ($desc =~ /184/);
|
||||
|
||||
return $desc;
|
||||
my $id = $alteon->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::AlteonAD::model() - Device does not support sysObjectID\n"
|
||||
if $alteon->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^(aceswitch|aws|ods)//;
|
||||
$model =~ s/^acedirector/AD/;
|
||||
$model =~ s/^(copper|fiber)Module/BladeCenter GbESM/;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
return 'radware';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'webos';
|
||||
return 'alteon';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $alteon = shift;
|
||||
my $version = $alteon->sw_ver();
|
||||
return undef unless defined $version;
|
||||
my $version = $alteon->new_sw_ver() || $alteon->old_sw_ver();
|
||||
return unless defined $version;
|
||||
|
||||
return $version;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
sub ps1_status {
|
||||
my $alteon = shift;
|
||||
my $interfaces = $alteon->i_index();
|
||||
my $old_ps = $alteon->old_ps1_stat();
|
||||
my $new_ps = $alteon->new_ps_stat();
|
||||
|
||||
return $old_ps if $old_ps;
|
||||
|
||||
if ($new_ps) {
|
||||
return 'ok' if ($new_ps eq 'singlePowerSupplyOk');
|
||||
return 'failed' if ($new_ps eq 'firstPowerSupplyFailed');
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub ps2_status {
|
||||
my $alteon = shift;
|
||||
my $old_ps = $alteon->old_ps2_stat();
|
||||
my $new_ps = $alteon->new_ps_stat();
|
||||
|
||||
return $old_ps if $old_ps;
|
||||
|
||||
if ($new_ps) {
|
||||
return 'ok' if ($new_ps eq 'doublePowerSupplyOk');
|
||||
return 'failed' if ($new_ps eq 'secondPowerSupplyFailed');
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $alteon = shift;
|
||||
my $interfaces = $alteon->i_index();
|
||||
my $descriptions = $alteon->i_description();
|
||||
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid (keys %$interfaces){
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
if ($desc =~ /(^net\d+)/) {
|
||||
$desc = $1;
|
||||
}
|
||||
elsif (($iid > 256) and ($iid < 266)) {
|
||||
$desc = ($iid % 256);
|
||||
}
|
||||
if ( $desc =~ /(^net\d+)/ ) {
|
||||
$desc = $1;
|
||||
}
|
||||
|
||||
# IP interfaces are first followed by physical, number possible
|
||||
# varies by switch model
|
||||
elsif ( defined $ip_max and $iid > $ip_max ) {
|
||||
$desc = ( $iid % $ip_max );
|
||||
$desc = 'mgmt' if $desc == 231;
|
||||
}
|
||||
$interfaces{$iid} = $desc;
|
||||
}
|
||||
return \%interfaces;
|
||||
@@ -150,20 +217,24 @@ sub interfaces {
|
||||
|
||||
sub i_duplex {
|
||||
my $alteon = shift;
|
||||
|
||||
my $p_mode = $alteon->p_info_mode();
|
||||
|
||||
|
||||
my $p_mode = $alteon->new_p_info_mode()
|
||||
|| $alteon->old_p_info_mode()
|
||||
|| {};
|
||||
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if (keys %$p_mode){
|
||||
foreach my $if ( keys %$p_mode ) {
|
||||
my $duplex = $p_mode->{$if};
|
||||
next unless defined $duplex;
|
||||
|
||||
next unless defined $duplex;
|
||||
|
||||
$duplex = 'half' if $duplex =~ /half/i;
|
||||
$duplex = 'full' if $duplex =~ /full/i;
|
||||
|
||||
my $idx = $if + 256;
|
||||
|
||||
$i_duplex{$idx}=$duplex;
|
||||
|
||||
my $idx;
|
||||
$idx = $if + $ip_max if ( defined $ip_max );
|
||||
|
||||
$i_duplex{$idx} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
@@ -171,116 +242,179 @@ sub i_duplex {
|
||||
sub i_duplex_admin {
|
||||
my $alteon = shift;
|
||||
|
||||
my $ag_pref = $alteon->ag_p_cfg_pref();
|
||||
my $ag_fe_auto = $alteon->ag_p_cfg_fe_auto();
|
||||
my $ag_fe_mode = $alteon->ag_p_cfg_fe_mode();
|
||||
my $ag_ge_auto = $alteon->ag_p_cfg_ge_auto();
|
||||
|
||||
my $ag_pref
|
||||
= $alteon->new_ag_p_cfg_pref()
|
||||
|| $alteon->old_ag_p_cfg_pref()
|
||||
|| {};
|
||||
my $ag_fe_auto
|
||||
= $alteon->new_ag_p_cfg_fe_auto()
|
||||
|| $alteon->old_ag_p_cfg_fe_auto()
|
||||
|| {};
|
||||
my $ag_fe_mode
|
||||
= $alteon->new_ag_p_cfg_fe_mode()
|
||||
|| $alteon->old_ag_p_cfg_fe_mode()
|
||||
|| {};
|
||||
my $ag_ge_auto
|
||||
= $alteon->new_ag_p_cfg_ge_auto()
|
||||
|| $alteon->old_ag_p_cfg_ge_auto()
|
||||
|| {};
|
||||
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||
my $i_speed = $alteon->i_speed() || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if (keys %$ag_pref){
|
||||
my $pref = $ag_pref->{$if};
|
||||
next unless defined $pref;
|
||||
|
||||
my $string = 'other';
|
||||
if ($pref =~ /gigabit/i) {
|
||||
my $ge_auto = $ag_ge_auto->{$if};
|
||||
$string = 'full' if ($ge_auto =~ /off/i);
|
||||
$string = 'auto' if ($ge_auto =~ /on/i);
|
||||
}
|
||||
elsif ($pref =~ /fast/i) {
|
||||
my $fe_auto = $ag_fe_auto->{$if};
|
||||
my $fe_mode = $ag_fe_mode->{$if};
|
||||
$string = 'half' if ($fe_mode =~ /half/i and $fe_auto =~ /off/i);
|
||||
$string = 'full' if ($fe_mode =~ /full/i and $fe_auto =~ /off/i);
|
||||
$string = 'auto' if $fe_auto =~ /on/i;
|
||||
}
|
||||
my $idx = $if + 256;
|
||||
|
||||
$i_duplex_admin{$idx}=$string;
|
||||
foreach my $if ( keys %$ag_ge_auto ) {
|
||||
my $pref = $ag_pref->{$if} || '';
|
||||
my $speed = $i_speed->{$if} || '';
|
||||
my $ge_auto = $ag_ge_auto->{$if} || '';
|
||||
my $fe_auto = $ag_fe_auto->{$if} || '';
|
||||
my $fe_mode = $ag_fe_mode->{$if} || '';
|
||||
|
||||
# Default to auto
|
||||
my $string = 'auto';
|
||||
|
||||
if ( $ge_auto =~ /off/i
|
||||
&& ( $pref =~ /gigabit/i || $speed eq '1.0 Gbps' ) )
|
||||
{
|
||||
$string = 'full';
|
||||
}
|
||||
if ( $fe_auto =~ /off/i
|
||||
&& ( $pref =~ /fast/i || $speed =~ /100?\sMbps/ ) )
|
||||
{
|
||||
$string = 'half'
|
||||
if ( $fe_mode =~ /half/i );
|
||||
$string = 'full'
|
||||
if ( $fe_mode =~ /full/i );
|
||||
}
|
||||
|
||||
my $idx;
|
||||
$idx = $if + $ip_max if ( defined $ip_max );
|
||||
|
||||
$i_duplex_admin{$idx} = $string;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $alteon = shift;
|
||||
|
||||
my $ag_vlans = $alteon->ag_p_cfg_pvid();
|
||||
my $ip_vlans = $alteon->ip_cfg_vlan();
|
||||
|
||||
|
||||
my %i_vlan;
|
||||
foreach my $if (keys %$ip_vlans){
|
||||
my $ip_vlanid = $ip_vlans->{$if};
|
||||
next unless defined $ip_vlanid;
|
||||
|
||||
$i_vlan{$if}=$ip_vlanid;
|
||||
}
|
||||
foreach my $if (keys %$ag_vlans){
|
||||
my $ag_vlanid = $ag_vlans->{$if};
|
||||
next unless defined $ag_vlanid;
|
||||
|
||||
my $idx = $if + 256;
|
||||
$i_vlan{$idx}=$ag_vlanid;
|
||||
}
|
||||
return \%i_vlan;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $alteon = shift;
|
||||
my $p_name = $alteon->ag_p_cfg_name();
|
||||
|
||||
my $p_name = $alteon->new_ag_p_cfg_name()
|
||||
|| $alteon->old_ag_p_cfg_name()
|
||||
|| {};
|
||||
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||
|
||||
my %i_name;
|
||||
foreach my $iid (keys %$p_name){
|
||||
foreach my $iid ( keys %$p_name ) {
|
||||
my $name = $p_name->{$iid};
|
||||
next unless defined $name;
|
||||
my $idx = $iid + 256;
|
||||
next unless defined $name;
|
||||
my $idx;
|
||||
$idx = $iid + $ip_max if ( defined $ip_max );
|
||||
$i_name{$idx} = $name;
|
||||
}
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
# Bridge MIB does not map Bridge Port to ifIndex correctly
|
||||
sub v_index {
|
||||
my $alteon = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alteon->new_vlan_id($partial) || $alteon->old_vlan_id($partial);
|
||||
}
|
||||
|
||||
sub v_name {
|
||||
my $alteon = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alteon->new_vlan_name($partial)
|
||||
|| $alteon->old_vlan_name($partial);
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $alteon = shift;
|
||||
|
||||
my $ag_vlans = $alteon->new_ag_p_cfg_pvid()
|
||||
|| $alteon->old_ag_p_cfg_pvid()
|
||||
|| {};
|
||||
my $ip_vlans = $alteon->new_ip_cfg_vlan()
|
||||
|| $alteon->old_ip_cfg_vlan()
|
||||
|| {};
|
||||
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||
|
||||
my %i_vlan;
|
||||
foreach my $if ( keys %$ip_vlans ) {
|
||||
my $ip_vlanid = $ip_vlans->{$if};
|
||||
next unless defined $ip_vlanid;
|
||||
|
||||
$i_vlan{$if} = $ip_vlanid;
|
||||
}
|
||||
foreach my $if ( keys %$ag_vlans ) {
|
||||
my $ag_vlanid = $ag_vlans->{$if};
|
||||
next unless defined $ag_vlanid;
|
||||
|
||||
my $idx;
|
||||
$idx = $if + $ip_max if ( defined $ip_max );
|
||||
$i_vlan{$idx} = $ag_vlanid;
|
||||
}
|
||||
return \%i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $alteon = shift;
|
||||
|
||||
my $v_ports = $alteon->old_vlan_ports()
|
||||
|| $alteon->new_vlan_ports()
|
||||
|| {};
|
||||
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $vlan ( keys %$v_ports ) {
|
||||
my $portlist = [ split( //, unpack( "B*", $v_ports->{$vlan} ) ) ];
|
||||
my $ret = [];
|
||||
|
||||
# Convert portlist bit array to ifIndex array
|
||||
for ( my $i = 0; $i <= scalar(@$portlist); $i++ ) {
|
||||
my $idx;
|
||||
$idx = $i + $ip_max if ( defined $ip_max );
|
||||
push( @{$ret}, $idx ) if ( @$portlist[$i] );
|
||||
}
|
||||
|
||||
#Create HoA ifIndex -> VLAN array
|
||||
foreach my $port ( @{$ret} ) {
|
||||
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||
}
|
||||
}
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
# Bridge MIB does not map Bridge Port to ifIndex correctly on some code
|
||||
# versions
|
||||
sub bp_index {
|
||||
my $alteon = shift;
|
||||
my $b_index = $alteon->bp_index_2();
|
||||
|
||||
my $b_index = $alteon->orig_bp_index();
|
||||
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||
|
||||
my %bp_index;
|
||||
foreach my $iid (keys %$b_index){
|
||||
foreach my $iid ( keys %$b_index ) {
|
||||
my $port = $b_index->{$iid};
|
||||
next unless defined $port;
|
||||
$port = $port + 256;
|
||||
$port = $port + $ip_max if ( defined $ip_max and $iid == $ip_max );
|
||||
|
||||
$bp_index{$iid} = $port;
|
||||
$bp_index{$iid} = $port;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub root_ip {
|
||||
my $alteon = shift;
|
||||
my $ip_table = $alteon->ip_table();
|
||||
|
||||
# Return First IP Address
|
||||
foreach my $entry (keys %$ip_table){
|
||||
my $router_ip = $ip_table->{$entry};
|
||||
print " SNMP::Layer3::AlteonAD::root_ip() using $router_ip\n" if $DEBUG;
|
||||
next unless $router_ip;
|
||||
return $router_ip if ($router_ip ne '0.0.0.0');
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::AlteonAD - Perl5 Interface to Nortel Networks' Alteon Ace
|
||||
Director Series Layer 2-7 Switches.
|
||||
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Radware Alteon ADC
|
||||
Switches.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller (C<eric@jeneric.org>)
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -288,7 +422,6 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
my $alteon = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
@@ -300,11 +433,11 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Layer 2-7 load balancing switches running Nortel Networks'
|
||||
Alteon Web OS Traffic Control Software.
|
||||
Abstraction subclass for Radware Alteon Series ADC switches and
|
||||
Nortel BladeCenter Layer2-3 GbE Switch Modules.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after
|
||||
determining a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $alteon = new SNMP::Info::Layer3::AlteonAD(...);
|
||||
|
||||
@@ -312,9 +445,7 @@ determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
@@ -322,25 +453,23 @@ determining a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item ALTEON-TIGON-SWITCH-MIB
|
||||
=item F<ALTEON-ROOT-MIB>
|
||||
|
||||
=item ALTEON-TS-PHYSICAL-MIB
|
||||
=item F<ALTEON-TIGON-SWITCH-MIB>
|
||||
|
||||
=item ALTEON-TS-NETWORK-MIB
|
||||
=item F<ALTEON-TS-PHYSICAL-MIB>
|
||||
|
||||
MIBs can be found on the CD that came with your product.
|
||||
=item F<ALTEON-TS-NETWORK-MIB>
|
||||
|
||||
Or, they can be downloaded directly from Nortel Networks regardless of support
|
||||
contract status. Go to http://www.nortelnetworks.com Techninal Support,
|
||||
Browse Technical Support, Select by Product Families, Alteon,
|
||||
Alteon Web OS Traffic Control Software, Software. Filter on mibs and download
|
||||
the latest version's archive.
|
||||
=item F<ALTEON-CS-PHYSICAL-MIB>
|
||||
|
||||
=item F<ALTEON-CHEETAH-SWITCH-MIB>
|
||||
|
||||
=item F<ALTEON-CHEETAH-NETWORK-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::Bridge for its own MIB requirements.
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -352,55 +481,60 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $alteon->model()
|
||||
|
||||
Returns the model extracted from B<sysDescr>
|
||||
Returns model type. Checks $alteon->id() against the F<ALTEON-ROOT-MIB> and
|
||||
then parses out C<aceswitch>, C<aws>, and C<ods> replaces C<acedirector>
|
||||
with AD, and replaces copperModule/fiberModule with BladeCenter GbESM.
|
||||
|
||||
=item $alteon->vendor()
|
||||
|
||||
Returns 'Nortel'
|
||||
Returns 'radware'
|
||||
|
||||
=item $alteon->os()
|
||||
|
||||
Returns 'WebOS'
|
||||
Returns 'alteon'
|
||||
|
||||
=item $alteon->os_ver()
|
||||
|
||||
Returns the software version reported by B<agSoftwareVersion>
|
||||
|
||||
=item $alteon->root_ip()
|
||||
|
||||
Returns the primary IP used to communicate with the device. Currently returns
|
||||
the first interfaces IP.
|
||||
Returns the software version reported by C<agSoftwareVersion>
|
||||
|
||||
=item $alteon->tftp_action()
|
||||
|
||||
(B<agTftpAction>)
|
||||
(C<agTftpAction>)
|
||||
|
||||
=item $alteon->tftp_host()
|
||||
|
||||
(B<agTftpServer>)
|
||||
(C<agTftpServer>)
|
||||
|
||||
=item $alteon->tftp_file()
|
||||
|
||||
(B<agTftpCfgFileName>)
|
||||
(C<agTftpCfgFileName>)
|
||||
|
||||
=item $alteon->tftp_result()
|
||||
|
||||
(B<agTftpLastActionStatus>)
|
||||
(C<agTftpLastActionStatus>)
|
||||
|
||||
=item $alteon->fan()
|
||||
|
||||
(C<hwFanStatus>)
|
||||
|
||||
=item $alteon->ps1_status()
|
||||
|
||||
Returns status of primary power supply
|
||||
|
||||
=item $alteon->ps2_status()
|
||||
|
||||
Returns status of redundant power supply
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
=head1 TABLE METHODS
|
||||
|
||||
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.
|
||||
These are methods that return tables of information in the form of a
|
||||
reference to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
@@ -411,7 +545,7 @@ to a hash.
|
||||
Returns reference to the map between IID and physical port.
|
||||
|
||||
Utilizes description for network interfaces. Ports are determined by
|
||||
formula (ifIndex mod 256).
|
||||
formula (C<ifIndex mod 256>).
|
||||
|
||||
=item $alteon->i_duplex()
|
||||
|
||||
@@ -423,48 +557,44 @@ Returns reference to hash. Maps port admin duplexes to IIDs.
|
||||
|
||||
=item $alteon->i_vlan()
|
||||
|
||||
Returns reference to hash. Maps port VLAN ID to IIDs.
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=item $alteon->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the egress list for the port.
|
||||
|
||||
Example:
|
||||
my $interfaces = $alteon->interfaces();
|
||||
my $vlans = $alteon->i_vlan_membership();
|
||||
|
||||
foreach my $iid (sort keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $alteon->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
=item $alteon->v_name()
|
||||
|
||||
Human-entered name for vlans.
|
||||
|
||||
=item $alteon->i_name()
|
||||
|
||||
Maps (B<agPortCurCfgPortName>) to port and returns the human set port name if exists.
|
||||
Maps (C<agPortCurCfgPortName>) to port and returns the human set port name if
|
||||
exists.
|
||||
|
||||
=item $alteon->bp_index()
|
||||
|
||||
Returns a mapping between ifIndex and the Bridge Table.
|
||||
Returns a mapping between C<ifIndex> and the Bridge Table.
|
||||
|
||||
=back
|
||||
|
||||
=head2 RFC1213 Arp Cache Table (B<ipNetToMediaTable>)
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
=over
|
||||
|
||||
=item $alteon->at_index()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to Interface IIDs
|
||||
|
||||
(B<ipNetToMediaIfIndex>)
|
||||
|
||||
=item $alteon->at_paddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to MAC addresses.
|
||||
|
||||
(B<ipNetToMediaPhysAddress>)
|
||||
|
||||
=item $alteon->at_netaddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to IPs
|
||||
|
||||
(B<ipNetToMediaNetAddress>)
|
||||
|
||||
=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.
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
392
Info/Layer3/Altiga.pm
Normal file
392
Info/Layer3/Altiga.pm
Normal file
@@ -0,0 +1,392 @@
|
||||
# SNMP::Info::Layer3::Altiga
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Jeroen van Ingen Schenau
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Altiga;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Altiga::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Altiga::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE
|
||||
$int_include_vpn $fake_idx $type_class/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'ALTIGA-VERSION-STATS-MIB' => 'alVersionString',
|
||||
'ALTIGA-SESSION-STATS-MIB' => 'alActiveSessionCount',
|
||||
'ALTIGA-HARDWARE-STATS-MIB' => 'alHardwarePs1Type',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
# From ALTIGA-VERSION-STATS-MIB
|
||||
'os_ver' => 'alVersionString',
|
||||
# From ALTIGA-SESSION-STATS-MIB
|
||||
'vpn_act_sess' => 'alActiveSessionCount',
|
||||
'vpn_total_sess' => 'alTotalSessionCount',
|
||||
'vpn_max_sess' => 'alMaxSessionCount',
|
||||
'vpn_l2l_sess' => 'alActiveLanToLanSessionCount',
|
||||
'vpn_mgmt_sess' => 'alActiveManagementSessionCount',
|
||||
'vpn_ras_sess' => 'alActiveRemoteAccessSessionCount',
|
||||
# From ALTIGA-HARDWARE-STATS-MIB
|
||||
'ps1_type' => 'alHardwarePs1Type',
|
||||
'ps1_3v_alarm' => 'alHardwarePs1Voltage3vAlarm',
|
||||
'ps1_5v_alarm' => 'alHardwarePs1Voltage5vAlarm',
|
||||
'ps2_type' => 'alHardwarePs2Type',
|
||||
'ps2_3v_alarm' => 'alHardwarePs2Voltage3vAlarm',
|
||||
'ps2_5v_alarm' => 'alHardwarePs2Voltage5vAlarm',
|
||||
'fan1_alarm' => 'alHardwareFan1RpmAlarm',
|
||||
'fan2_alarm' => 'alHardwareFan2RpmAlarm',
|
||||
'fan3_alarm' => 'alHardwareFan3RpmAlarm',
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
'i_type2' => 'ifType',
|
||||
'i_lastchange2' => 'ifLastChange',
|
||||
'vpn_sess_status' => 'alActiveSessionRowStatus',
|
||||
'vpn_sess_user' => 'alActiveSessionUserName',
|
||||
'vpn_sess_peer_ip' => 'alActiveSessionIpAddress',
|
||||
'vpn_sess_protocol' => 'alActiveSessionProtocol',
|
||||
'vpn_sess_encr' => 'alActiveSessionEncrType',
|
||||
'vpn_sess_start' => 'alActiveSessionStartTime',
|
||||
'vpn_sess_conntime' => 'alActiveSessionConnectTime',
|
||||
'vpn_sess_out_oct' => 'alActiveSessionOctetsSent',
|
||||
'vpn_sess_in_oct' => 'alActiveSessionOctetsRcvd',
|
||||
'vpn_sess_group' => 'alActiveSessionGroupName',
|
||||
'vpn_sess_gid' => 'alActiveSessionGroupId',
|
||||
'vpn_sess_rem_ip' => 'alActiveSessionPublicIpAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
'ps1_3v_alarm' => \&munge_alarm,
|
||||
'ps1_5v_alarm' => \&munge_alarm,
|
||||
'ps2_3v_alarm' => \&munge_alarm,
|
||||
'ps2_5v_alarm' => \&munge_alarm,
|
||||
'fan1_alarm' => \&munge_alarm,
|
||||
'fan2_alarm' => \&munge_alarm,
|
||||
'fan3_alarm' => \&munge_alarm,
|
||||
|
||||
);
|
||||
|
||||
# Variable to modify behaviour of "interfaces" subroutine.
|
||||
# * When set to 0, "interfaces" returns only fixed interfaces from the IF-MIB,
|
||||
# * When set to 1, "interfaces" returns fixed interfaces from IF-MIB and LAN-to-LAN tunnels from ALTIGA-SESSION-MIB
|
||||
# TODO: This should be an instance method, not a class global
|
||||
$int_include_vpn = 1;
|
||||
|
||||
# Variable to prepended to each tunnel index when tunnel is added to %interfaces, to avoid overwriting "real" ifIndex entries
|
||||
$fake_idx = 3076;
|
||||
|
||||
# Variable to classify session types into categories: 0 - unclassified, 1 - LAN-to-LAN or fixed, 2 - RAS or dynamic, 3 - administrative
|
||||
$type_class = {
|
||||
'pptp' => 2,
|
||||
'l2tp' => 2,
|
||||
'ipsec' => 2,
|
||||
'http' => 3,
|
||||
'ftp' => 3,
|
||||
'telnet' => 3,
|
||||
'snmp' => 3,
|
||||
'tftp' => 3,
|
||||
'console' => 3,
|
||||
'debugTelnet' => 3,
|
||||
'debugConsole' => 3,
|
||||
'other' => 3,
|
||||
'ike' => 0,
|
||||
'l2tpOverIpSec' => 2,
|
||||
'ipsecLanToLan' => 1,
|
||||
'ipsecOverUdp' => 2,
|
||||
'ssh' => 3,
|
||||
'vcaLanToLan' => 1,
|
||||
'ipsecOverTcp' => 2,
|
||||
'pppoe' => 2,
|
||||
'ipsecOverNatT' => 2,
|
||||
'ipsecLan2LanOverNatT' => 1,
|
||||
'l2tpOverIpsecOverNatT' => 2,
|
||||
'userHttps' => 2,
|
||||
'pop3s' => 2,
|
||||
'imap4s' => 2,
|
||||
'smtps' => 2,
|
||||
'httpsTunnel' => 2,
|
||||
};
|
||||
|
||||
sub vendor {
|
||||
return 'altiga';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'altiga';
|
||||
}
|
||||
|
||||
# $altiga->interfaces() - Map the Interfaces to their physical names
|
||||
# Add interface number to interface name to prevent duplicate ifDescr
|
||||
# Included statically configured VPN tunnels if ($int_include_vpn)
|
||||
sub interfaces {
|
||||
my $altiga = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $altiga->i_index($partial);
|
||||
my $descriptions = $altiga->i_description($partial);
|
||||
|
||||
my %int_rev = ();
|
||||
my %interfaces = ();
|
||||
foreach my $iid (sort {$a cmp $b} keys %$interfaces) {
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
if (!exists $int_rev{$desc}) {
|
||||
$interfaces{$iid} = $desc;
|
||||
$int_rev{$desc} = $iid;
|
||||
} else {
|
||||
my $done = 0;
|
||||
my $unique_desc;
|
||||
my $cnt = 1;
|
||||
until ($done) {
|
||||
$cnt++;
|
||||
$unique_desc = sprintf("%s (%d)", $desc, $cnt);
|
||||
if (!exists $int_rev{$unique_desc}) {
|
||||
$done++;
|
||||
}
|
||||
}
|
||||
$int_rev{$unique_desc} = $iid;
|
||||
$interfaces{$iid} = $unique_desc;
|
||||
$interfaces{ $int_rev{$desc} } = sprintf("%s (%d)", $desc, 1);
|
||||
}
|
||||
}
|
||||
if ($int_include_vpn) {
|
||||
my $tun_type = $altiga->vpn_sess_protocol();
|
||||
my $peer = $altiga->vpn_sess_peer_ip();
|
||||
my $remote = $altiga->vpn_sess_rem_ip();
|
||||
my $group = $altiga->vpn_sess_gid();
|
||||
foreach my $tunnel (keys %$tun_type) {
|
||||
if ($type_class->{$tun_type->{$tunnel}} eq 1) {
|
||||
$interfaces{"$fake_idx.$tunnel"} = sprintf("%s VPN to %s", uc($tun_type->{$tunnel}), $remote->{$tunnel});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $altiga = shift;
|
||||
my $partial = shift;
|
||||
my $types = $altiga->i_type2();
|
||||
if ($int_include_vpn) {
|
||||
my $tun_type = $altiga->vpn_sess_protocol();
|
||||
foreach my $tunnel (keys %$tun_type) {
|
||||
$types->{"$fake_idx.$tunnel"} = $tun_type->{$tunnel};
|
||||
}
|
||||
}
|
||||
return $types;
|
||||
}
|
||||
|
||||
sub i_lastchange {
|
||||
my $altiga = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# TODO: This is what munges are for.
|
||||
my $lastchange = $altiga->i_lastchange2();
|
||||
if ($int_include_vpn) {
|
||||
my $tun_start = $altiga->vpn_sess_start();
|
||||
foreach my $tunnel (keys %$tun_start) {
|
||||
$lastchange->{"$fake_idx.$tunnel"} = $tun_start->{$tunnel};
|
||||
}
|
||||
}
|
||||
return $lastchange;
|
||||
}
|
||||
|
||||
sub ps1_status {
|
||||
my $altiga = shift;
|
||||
my $alarm_3v = $altiga->ps1_3v_alarm() || "";
|
||||
my $alarm_5v = $altiga->ps1_5v_alarm() || "";
|
||||
return sprintf("3V: %s, 5V: %s", $alarm_3v, $alarm_5v);
|
||||
}
|
||||
|
||||
sub ps2_status {
|
||||
my $altiga = shift;
|
||||
my $alarm_3v = $altiga->ps2_3v_alarm() || "";
|
||||
my $alarm_5v = $altiga->ps2_5v_alarm() || "";
|
||||
return sprintf("3V: %s, 5V: %s", $alarm_3v, $alarm_5v);
|
||||
}
|
||||
|
||||
sub fan {
|
||||
my $altiga = shift;
|
||||
my $alarm_fan1 = $altiga->fan1_alarm() || "";
|
||||
my $alarm_fan2 = $altiga->fan2_alarm() || "";
|
||||
my $alarm_fan3 = $altiga->fan3_alarm() || "";
|
||||
return sprintf("Fan 1: %s, Fan 2: %s, Fan 3: %s", $alarm_fan1, $alarm_fan2, $alarm_fan3);
|
||||
}
|
||||
|
||||
sub munge_alarm {
|
||||
my $alarm = shift;
|
||||
if ($alarm eq 'false') {
|
||||
return 'OK';
|
||||
} elsif ($alarm eq 'true') {
|
||||
return 'FAIL';
|
||||
} else {
|
||||
return "(n/a)";
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Altiga - SNMP Interface to Cisco (formerly Altiga) VPN concentrators
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen Schenau
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $altiga = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'my_vpn_host',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $altiga->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Cisco (formerly Altiga) VPN concentrators
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Class Variables (options)
|
||||
|
||||
=over
|
||||
|
||||
=item $SNMP::Info::Layer3::Altiga::int_include_vpn
|
||||
|
||||
Variable to modify behavior of "interfaces" subroutine.
|
||||
|
||||
* When set to 0, "interfaces" returns only fixed interfaces from the IF-MIB,
|
||||
* When set to 1, "interfaces" returns fixed interfaces from IF-MIB and
|
||||
LAN-to-LAN tunnels from ALTIGA-SESSION-MIB (default)
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $altiga->vendor()
|
||||
|
||||
Returns 'altiga'
|
||||
|
||||
=item $altiga->os()
|
||||
|
||||
Returns 'altiga'
|
||||
|
||||
=item $altiga->os_ver()
|
||||
|
||||
Tries to determine OS version from the C<sysDescr.0> field. Returns version or C<sysDescr.0>
|
||||
|
||||
=item $altiga->fan()
|
||||
|
||||
Combines results from C<fan1_alarm>, C<fan2_alarm>, and C<fam3_alarm> methods.
|
||||
|
||||
=item $altiga->ps1_status()
|
||||
|
||||
Combines C<ps1_3v_alarm> and C<ps1_5v_alarm> methods.
|
||||
|
||||
=item $altiga->ps2_status()
|
||||
|
||||
Combines C<ps2_3v_alarm> and C<ps2_5v_alarm> methods.
|
||||
|
||||
=back
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $altiga->interfaces()
|
||||
|
||||
This method overrides the interfaces() method inherited from SNMP::Info.
|
||||
It provides a mapping between the Interface Table Index (iid) and the physical
|
||||
port name, adding a port number to the port name to prevent duplicate names.
|
||||
|
||||
=item $altiga->i_lastchange()
|
||||
|
||||
Filters out the results depending on the value of $SNMP::Info::Layer3::Altiga::int_include_vpn
|
||||
|
||||
=item $altiga->i_type()
|
||||
|
||||
Filters out the results depending on the value of $SNMP::Info::Layer3::Altiga::int_include_vpn
|
||||
|
||||
=back
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=item munge_alarm()
|
||||
|
||||
Changes C<true> and C<false> to C<FAIL>, C<OK>, and C<(n/a)>.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
257
Info/Layer3/Arista.pm
Normal file
257
Info/Layer3/Arista.pm
Normal file
@@ -0,0 +1,257 @@
|
||||
# SNMP::Info::Layer3::Arista
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Arista Networks, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of Arista Networks, Inc. nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Arista;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::Arista::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Arista::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'ARISTA-PRODUCTS-MIB' => 'aristaProducts',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::Arista::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::Arista::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub vendor {
|
||||
return 'arista';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'EOS';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $arista = shift;
|
||||
my $descr = $arista->description();
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = $1 if ( $descr =~ /\s+EOS\s+version\s+(\S+)\s+/ );
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $arista = shift;
|
||||
my $id = $arista->id();
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^arista//;
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB
|
||||
|
||||
sub fw_mac {
|
||||
my $arista = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $arista->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $arista = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $arista->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Arista - SNMP Interface to Arista Networks EOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $arista = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $arista->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Arista Networks EOS-based devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ARISTA-PRODUCTS-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $arista->vendor()
|
||||
|
||||
Returns 'Arista Networks, Inc.'
|
||||
|
||||
=item $arista->model()
|
||||
|
||||
Tries to reference $arista->id() to one of the product MIBs listed above
|
||||
|
||||
Removes 'arista' from the name for readability.
|
||||
|
||||
=item $arista->os()
|
||||
|
||||
Returns 'EOS'
|
||||
|
||||
=item $arista->os_ver()
|
||||
|
||||
Grabs the os version from C<sysDescr>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $arista->fw_mac()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $arista->fw_port()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $arista->i_duplex_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=item $arista->i_speed_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
658
Info/Layer3/Aruba.pm
Normal file
658
Info/Layer3/Aruba.pm
Normal file
@@ -0,0 +1,658 @@
|
||||
# SNMP::Info::Layer3::Aruba
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Aruba;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Aruba::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Aruba::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'WLSX-SWITCH-MIB' => 'wlsxHostname',
|
||||
'WLSX-WLAN-MIB' => 'wlanAPFQLN',
|
||||
'WLSR-AP-MIB' => 'wlsrHideSSID',
|
||||
#'ALCATEL-IND1-TP-DEVICES' => 'familyOmniAccessWireless',
|
||||
);
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
|
||||
# WLSX-SWITCH-MIB::wlsxSwitchAccessPointTable
|
||||
# Table index leafs do not return information
|
||||
# therefore unable to use apBSSID. We extract
|
||||
# the information from the IID instead.
|
||||
'aruba_ap_name' => 'apLocation',
|
||||
'aruba_ap_ip' => 'apIpAddress',
|
||||
'aruba_ap_essid' => 'apESSID',
|
||||
'aruba_ap_ssidbcast' => 'wlsrHideSSID',
|
||||
|
||||
# WLSX-WLAN-MIB::wlsxWlanAPTable
|
||||
'aruba_perap_fqln' => 'wlanAPFQLN',
|
||||
|
||||
# WLSR-AP-MIB::wlsrConfigTable
|
||||
'aruba_ap_channel' => 'apCurrentChannel',
|
||||
|
||||
# WLSX-SWITCH-MIB::wlsxSwitchStationMgmtTable
|
||||
# Table index leafs do not return information
|
||||
# therefore unable to use staAccessPointBSSID
|
||||
# or staPhyAddress. We extract the information from
|
||||
# the IID instead.
|
||||
#'fw_port' => 'staAccessPointBSSID',
|
||||
#'fw_mac' => 'staPhyAddress',
|
||||
'fw_user' => 'staUserName',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub layers {
|
||||
return '00000111';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $aruba = shift;
|
||||
my %osmap = (
|
||||
'alcatel-lucent' => 'aos-w',
|
||||
);
|
||||
return $osmap{$aruba->vendor()} || 'airos';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $aruba = shift;
|
||||
my $id = $aruba->id() || 'undef';
|
||||
my %oidmap = (
|
||||
6486 => 'alcatel-lucent',
|
||||
);
|
||||
$id = $1 if (defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/);
|
||||
|
||||
if (defined($id) and exists($oidmap{$id})) {
|
||||
return $oidmap{$id};
|
||||
}
|
||||
else {
|
||||
return 'aruba';
|
||||
}
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $aruba = shift;
|
||||
my $descr = $aruba->description();
|
||||
return unless defined $descr;
|
||||
|
||||
if ( $descr =~ m/Version\s+(\d+\.\d+\.\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $aruba = shift;
|
||||
my $id = $aruba->id();
|
||||
return unless defined $id;
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Thin APs do not support ifMIB requirement
|
||||
#
|
||||
# We return all BSSIDs as pseudo-ports on the controller.
|
||||
|
||||
sub i_index {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->orig_i_index($partial) || {};
|
||||
my $ap_index = $aruba->aruba_ap_name($partial) || {};
|
||||
|
||||
my %if_index;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
$if_index{$iid} = $index;
|
||||
}
|
||||
|
||||
# Get Attached APs as Interfaces
|
||||
foreach my $ap_id ( keys %$ap_index ) {
|
||||
|
||||
# Convert the 0.254.123.456 index entry to a MAC address.
|
||||
my $mac = join( ':',
|
||||
map { sprintf( "%02x", $_ ) } split( /\./, $ap_id ) );
|
||||
|
||||
$if_index{$ap_id} = $mac;
|
||||
}
|
||||
return \%if_index;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
my $i_descr = $aruba->i_description($partial) || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /^\d+$/ ) {
|
||||
|
||||
# Replace the Index with the ifDescr field.
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
$if{$iid} = $port;
|
||||
}
|
||||
|
||||
elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
$if{$index} = $index;
|
||||
}
|
||||
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%if;
|
||||
}
|
||||
|
||||
# Most items are indexed by BSSID.
|
||||
# aruba_perap_fqln is indexed by AP, so we use the
|
||||
# [haven't decided yet] index to figure out all of the
|
||||
# BSSIDs served by a given radio.
|
||||
sub aruba_ap_fqln {
|
||||
my $aruba = shift;
|
||||
# I don't think $partial is meaningful in this context
|
||||
|
||||
my $perap_fqln = $aruba->aruba_perap_fqln();
|
||||
my $channel = $aruba->wlanAPBssidChannel();
|
||||
my $aruba_ap_fqln = {};
|
||||
|
||||
# Channel index is: AP, radio, BSSID
|
||||
foreach my $idx (keys %$channel) {
|
||||
my @oid = split(/\./, $idx );
|
||||
my $ap = join(".", @oid[0..5]);
|
||||
my $bssid = join(".", @oid[7..12]);
|
||||
$aruba_ap_fqln->{$bssid} = $perap_fqln->{$ap};
|
||||
}
|
||||
|
||||
return $aruba_ap_fqln;
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
my $i_name2 = $aruba->orig_i_name($partial) || {};
|
||||
my $ap_name = $aruba->aruba_ap_name($partial) || {};
|
||||
my $ap_fqln = $aruba->aruba_ap_fqln($partial) || {};
|
||||
|
||||
my %i_name;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /^\d+$/ ) {
|
||||
my $name = $i_name2->{$iid};
|
||||
next unless defined $name;
|
||||
$i_name{$index} = $name;
|
||||
}
|
||||
|
||||
elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
my $name = $ap_fqln->{$iid} || $ap_name->{$iid};
|
||||
next unless defined $name;
|
||||
$i_name{$index} = $name;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
sub i_ssidlist {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
my $ap_ssid = $aruba->aruba_ap_essid($partial) || {};
|
||||
|
||||
my %i_ssid;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
my $ssid = $ap_ssid->{$iid};
|
||||
next unless defined $ssid;
|
||||
$i_ssid{$index} = $ssid;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%i_ssid;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
my $ap_ch = $aruba->aruba_ap_channel($partial) || {};
|
||||
|
||||
my %i_ch;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
my $ch = $ap_ch->{$iid};
|
||||
next unless defined $ch;
|
||||
$i_ch{$index} = $ch;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%i_ch;
|
||||
}
|
||||
|
||||
sub i_ssidbcast {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
my $ap_bc = $aruba->aruba_ap_ssidbcast($partial) || {};
|
||||
|
||||
my %i_bc;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
|
||||
my $bc = $ap_bc->{$iid};
|
||||
next unless defined $bc;
|
||||
$bc = ( $bc ? 0 : 1 );
|
||||
$i_bc{$index} = $bc;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%i_bc;
|
||||
}
|
||||
|
||||
# Wireless switches do not support the standard Bridge MIB
|
||||
# Wired switches currently (AOS 7.2.0.0) do, but it seems only for
|
||||
# dot1q ports or access ports that are 'untrusted' ?
|
||||
sub bp_index {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $aruba->orig_i_index($partial) || {};
|
||||
my $ap_index = $aruba->aruba_ap_name($partial) || {};
|
||||
|
||||
# Collect standard bp_index first
|
||||
my $wired_bp_index = $aruba->SUPER::bp_index($partial) || {};
|
||||
my %bp_index = %$wired_bp_index;
|
||||
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
next if exists $bp_index{$iid}; # Only augment bp_index, don't overwrite any existing mappings
|
||||
|
||||
$bp_index{$iid} = $index;
|
||||
}
|
||||
|
||||
# Get Attached APs as Interfaces
|
||||
foreach my $ap_id ( keys %$ap_index ) {
|
||||
|
||||
# Convert the 0.254.123.456 index entry to a MAC address.
|
||||
my $mac = join( ':',
|
||||
map { sprintf( "%02x", $_ ) } split( /\./, $ap_id ) );
|
||||
|
||||
$bp_index{$mac} = $mac;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $fw_idx = $aruba->fw_user($partial) || {};
|
||||
|
||||
my $wired_fw_port = $aruba->SUPER::qb_fw_port($partial) || {};
|
||||
my %fw_port = %$wired_fw_port;
|
||||
|
||||
foreach my $iid ( keys %$fw_idx ) {
|
||||
if ( $iid
|
||||
=~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/
|
||||
)
|
||||
{
|
||||
my $port = join( ':',
|
||||
map { sprintf( "%02x", $_ ) } split( /\./, $2 ) );
|
||||
$fw_port{$iid} = $port;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%fw_port;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $fw_idx = $aruba->fw_user($partial) || {};
|
||||
|
||||
my $wired_fw_mac = $aruba->SUPER::qb_fw_mac($partial) || {};
|
||||
my %fw_mac = %$wired_fw_mac;
|
||||
|
||||
foreach my $iid ( keys %$fw_idx ) {
|
||||
if ( $iid
|
||||
=~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/
|
||||
)
|
||||
{
|
||||
my $mac = join( ':',
|
||||
map { sprintf( "%02x", $_ ) } split( /\./, $1 ) );
|
||||
$fw_mac{$iid} = $mac;
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%fw_mac;
|
||||
}
|
||||
|
||||
# Return the BSSID in i_mac.
|
||||
sub i_mac {
|
||||
my $aruba = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# Start with the i_mac entries for the physical ports.
|
||||
my $i_mac = $aruba->orig_i_mac($partial) || {};
|
||||
|
||||
# Add in all the BSSID entries.
|
||||
my $i_index = $aruba->i_index($partial) || {};
|
||||
foreach my $iid (keys %$i_index) {
|
||||
my $index = $i_index->{$iid};
|
||||
if ($index =~ /:/) {
|
||||
$i_mac->{$index} = $index;
|
||||
}
|
||||
}
|
||||
|
||||
return $i_mac;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Aruba - SNMP Interface to Aruba wireless switches
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
my $aruba = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $aruba->class();
|
||||
print " Using device sub class : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::Layer3::Aruba is a subclass of SNMP::Info that provides an
|
||||
interface to Aruba wireless switches. The Aruba platform utilizes
|
||||
intelligent wireless switches which control thin access points. The thin
|
||||
access points themselves are unable to be polled for end station information.
|
||||
|
||||
This class emulates bridge functionality for the wireless switch. This enables
|
||||
end station MAC addresses collection and correlation to the thin access point
|
||||
the end station is using for communication.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $aruba = new SNMP::Info::Layer3::Aruba(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<WLSX-SWITCH-MIB>
|
||||
|
||||
=item F<WLSR-AP-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->model()
|
||||
|
||||
Returns model type. Cross references $aruba->id() with product IDs in the
|
||||
Aruba MIB.
|
||||
|
||||
=item $aruba->vendor()
|
||||
|
||||
Returns 'aruba'
|
||||
|
||||
=item $aruba->os()
|
||||
|
||||
Returns 'airos'
|
||||
|
||||
=item $aruba->os_ver()
|
||||
|
||||
Returns the software version extracted from C<sysDescr>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->layers()
|
||||
|
||||
Returns 00000011. Class emulates Layer 2 functionality for Thin APs through
|
||||
proprietary MIBs.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->i_index()
|
||||
|
||||
Returns reference to map of IIDs to Interface index.
|
||||
|
||||
Extends C<ifIndex> to support thin APs as device interfaces.
|
||||
|
||||
=item $aruba->interfaces()
|
||||
|
||||
Returns reference to map of IIDs to ports. Thin APs are implemented as device
|
||||
interfaces. The thin AP BSSID is used as the port identifier.
|
||||
|
||||
=item $aruba->i_name()
|
||||
|
||||
Interface name. Returns (C<ifName>) for Ethernet interfaces and
|
||||
(C<wlanAPFQLN> or C<apLocation>) for thin AP interfaces.
|
||||
|
||||
=item $aruba->i_mac()
|
||||
|
||||
Interface MAC address. Returns interface MAC address for Ethernet
|
||||
interfaces and BSSID for thin AP interfaces.
|
||||
|
||||
=item $aruba->bp_index()
|
||||
|
||||
Simulates bridge MIB by returning reference to a hash containing the index for
|
||||
both the keys and values.
|
||||
|
||||
=item $aruba->fw_port()
|
||||
|
||||
(C<staAccessPointBSSID>) as extracted from the IID.
|
||||
|
||||
=item $aruba->fw_mac()
|
||||
|
||||
(C<staPhyAddress>) as extracted from the IID.
|
||||
|
||||
=item $aruba->i_ssidlist()
|
||||
|
||||
Returns reference to hash. SSID's recognized by the radio interface.
|
||||
|
||||
(C<apESSID>)
|
||||
|
||||
=item $aruba->i_ssidbcast()
|
||||
|
||||
Returns reference to hash. Indicates whether the SSID is broadcast, true or
|
||||
false.
|
||||
|
||||
(C<wlsrHideSSID>)
|
||||
|
||||
=item $aruba->i_80211channel()
|
||||
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface.
|
||||
|
||||
(C<apCurrentChannel>)
|
||||
|
||||
=item $aruba->aruba_ap_fqln()
|
||||
|
||||
Returns F<aruba_perap_fqln> indexed by BSSID instead of by AP.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Aruba Switch AP Table (C<wlsxSwitchAccessPointTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->aruba_ap_name()
|
||||
|
||||
(C<apLocation>)
|
||||
|
||||
=item $aruba->aruba_ap_ip()
|
||||
|
||||
(C<apIpAddress>)
|
||||
|
||||
=item $aruba->aruba_ap_essid()
|
||||
|
||||
(C<apESSID>)
|
||||
|
||||
=item $aruba->aruba_ap_ssidbcast()
|
||||
|
||||
(C<wlsrHideSSID>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Aruba AP Table (C<wlsxWlanAPTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->aruba_perap_fqln()
|
||||
|
||||
(C<wlanAPFQLN>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Aruba Switch Station Management Table (C<wlsxSwitchStationMgmtTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->fw_user()
|
||||
|
||||
(C<staUserName>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Aruba Wireless AP Configuration Table (C<wlsrConfigTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $aruba->aruba_ap_channel()
|
||||
|
||||
(C<apCurrentChannel>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
1638
Info/Layer3/BayRS.pm
1638
Info/Layer3/BayRS.pm
File diff suppressed because it is too large
Load Diff
168
Info/Layer3/BlueCoatSG.pm
Normal file
168
Info/Layer3/BlueCoatSG.pm
Normal file
@@ -0,0 +1,168 @@
|
||||
package SNMP::Info::Layer3::BlueCoatSG;
|
||||
|
||||
# Copyright (c) 2011 Netdisco Project
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::BlueCoatSG::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::BlueCoatSG::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
|
||||
'BLUECOAT-SG-PROXY-MIB' => 'sgProxyAdmin',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
|
||||
#From BLUECOAT-SG-PROXY-MIB
|
||||
'serial1'=> 'sgProxySerialNumber',
|
||||
'sw_ver' => 'sgProxyVersion',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'Blue Coat';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'sgos';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $sg = shift;
|
||||
my $os_string = $sg->sw_ver();
|
||||
if ($os_string =~ /^Version:\s(\w+)\s([\d\.]+)/) {
|
||||
return $2;
|
||||
} else {
|
||||
return ''; # perhaps we can try sysDescr or some other object...
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::BlueCoatSG - SNMP Interface to Blue Coat SG Series proxy devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $router = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $router->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Blue Coat SG Series proxy devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
BLUECOAT-SG-PROXY-MIB
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $router->vendor()
|
||||
|
||||
Returns C<'Blue Coat'>
|
||||
|
||||
=item $router->os()
|
||||
|
||||
Returns C<'sgos'>
|
||||
|
||||
=item $router->os_ver()
|
||||
|
||||
Tries to resolve version string from C<"sgProxyVersion">.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -1,88 +1,118 @@
|
||||
# SNMP::Info::Layer3::C3550
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2003, Regents of the University of California
|
||||
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2004 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::C3550;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoPower;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# NOTE : Top-most items gets precedence for @ISA
|
||||
@SNMP::Info::Layer3::C3550::ISA = qw/
|
||||
SNMP::Info::CiscoVTP
|
||||
SNMP::Info::CiscoStpExtensions
|
||||
SNMP::Info::CiscoStack
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig
|
||||
SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
|
||||
@SNMP::Info::Layer3::C3550::ISA = qw/ SNMP::Info::Layer3 SNMP::Info::CiscoStack SNMP::Info::CiscoVTP Exporter/;
|
||||
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
# NOTE: Order creates precedence
|
||||
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
|
||||
# Bridge is called from Layer3 and CiscoStpExtensions
|
||||
# So we want CiscoVTP to come last to get the right one.
|
||||
# The @ISA order should match these orders.
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS,
|
||||
);
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoPower::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS, %SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
'ports2' => 'ifNumber',
|
||||
);
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS,
|
||||
);
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CiscoPower::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS, %SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
|
||||
# Pick and choose
|
||||
|
||||
*SNMP::Info::Layer3::C3550::serial = \&SNMP::Info::CiscoStack::serial;
|
||||
*SNMP::Info::Layer3::C3550::interfaces = \&SNMP::Info::Layer3::interfaces;
|
||||
*SNMP::Info::Layer3::C3550::i_duplex = \&SNMP::Info::CiscoStack::i_duplex;
|
||||
*SNMP::Info::Layer3::C3550::i_duplex_admin = \&SNMP::Info::CiscoStack::i_duplex_admin;
|
||||
*SNMP::Info::Layer3::C3550::i_name = \&SNMP::Info::Layer3::i_name;
|
||||
*SNMP::Info::Layer3::C3550::i_type = \&SNMP::Info::CiscoStack::i_type;
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoPower::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE, %SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
@@ -90,12 +120,12 @@ sub vendor {
|
||||
|
||||
sub model {
|
||||
my $c3550 = shift;
|
||||
my $id = $c3550->id();
|
||||
my $id = $c3550->id();
|
||||
my $model = &SNMP::translateObj($id) || $id;
|
||||
$model =~ s/^catalyst//;
|
||||
|
||||
# turn 355048 into 3550-48
|
||||
if ($model =~ /^(35\d\d)(\d\d[T]?)$/) {
|
||||
if ( $model =~ /^(35\d\d)(\d\d(T|G)?)$/ ) {
|
||||
$model = "$1-$2";
|
||||
}
|
||||
return $model;
|
||||
@@ -105,42 +135,129 @@ sub model {
|
||||
sub ports {
|
||||
my $c3550 = shift;
|
||||
|
||||
my $ports2 = $c3550->ports2();
|
||||
|
||||
my $id = $c3550->id();
|
||||
my $id = $c3550->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
if ($model =~ /(12|24|48)[T]?$/) {
|
||||
if ( $model =~ /(12|24|48)(C|T|TS|G|TS-E|TS-S|T-E)?$/ ) {
|
||||
return $1;
|
||||
}
|
||||
return $ports2;
|
||||
|
||||
my $ports = $c3550->orig_ports();
|
||||
return $ports;
|
||||
}
|
||||
|
||||
# Verions prior to 12.1(22)EA1a use the older CiscoStack method
|
||||
# Newer versions use the ETHERLIKE-MIB to report operational duplex.
|
||||
# See http://www.ciscosystems.com/en/US/products/hw/switches/ps646/prod_release_note09186a00802a08ee.html
|
||||
|
||||
sub i_duplex {
|
||||
my $c3550 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $c3550->el_duplex($partial);
|
||||
|
||||
# Newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my %i_duplex;
|
||||
foreach my $el_port ( keys %$el_duplex ) {
|
||||
my $duplex = $el_duplex->{$el_port};
|
||||
next unless defined $duplex;
|
||||
|
||||
$i_duplex{$el_port} = 'half' if $duplex =~ /half/i;
|
||||
$i_duplex{$el_port} = 'full' if $duplex =~ /full/i;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
# Fall back to CiscoStack method
|
||||
else {
|
||||
return $c3550->SUPER::i_duplex($partial);
|
||||
}
|
||||
}
|
||||
|
||||
# Software >= 12.1(22)EA1a uses portDuplex as admin setting
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c3550 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $c3550->el_duplex($partial);
|
||||
|
||||
# Newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my $p_port = $c3550->p_port() || {};
|
||||
my $p_duplex = $c3550->p_duplex() || {};
|
||||
|
||||
my $i_duplex_admin = {};
|
||||
foreach my $port ( keys %$p_duplex ) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
|
||||
$i_duplex_admin->{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
return $i_duplex_admin;
|
||||
}
|
||||
|
||||
# Fall back to CiscoStack method
|
||||
else {
|
||||
return $c3550->SUPER::i_duplex_admin($partial);
|
||||
}
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/half 1 full 2 auto 4/;
|
||||
|
||||
my $c3550 = shift;
|
||||
my ( $duplex, $iid ) = @_;
|
||||
|
||||
my $el_duplex = $c3550->el_duplex($iid);
|
||||
|
||||
# Auto duplex only supported on newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my $p_port = $c3550->p_port() || {};
|
||||
my %reverse_p_port = reverse %$p_port;
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return 0 unless defined $duplexes{$duplex};
|
||||
|
||||
$iid = $reverse_p_port{$iid};
|
||||
|
||||
return $c3550->set_p_duplex( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
else {
|
||||
return $c3550->SUPER::set_i_duplex_admin;
|
||||
}
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::C3550 - Perl5 Interface to Cisco Catalyst 3550 Layer 2/3 Switches running IOS
|
||||
SNMP::Info::Layer3::C3550 - SNMP Interface to Cisco Catalyst 3550 Layer 2/3
|
||||
Switches running IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c3550 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
@@ -151,12 +268,12 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
Abstraction subclass for Cisco Catalyst 3550 Layer 2/3 Switches.
|
||||
|
||||
These devices run IOS but have some of the same charactersitics as the Catalyst WS-C family (5xxx,6xxx).
|
||||
For example, forwarding tables are held in VLANs, and extened interface information
|
||||
is gleened from CISCO-SWITCH-MIB.
|
||||
These devices run IOS but have some of the same characteristics as the
|
||||
Catalyst WS-C family (5xxx,6xxx). For example, forwarding tables are held in
|
||||
VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $c3550 = new SNMP::Info::Layer3::C3550(...);
|
||||
|
||||
@@ -166,10 +283,24 @@ a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoSTPExtensions
|
||||
|
||||
=item SNMP::Info::CiscoPower
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -178,11 +309,26 @@ a more specific class using the method above.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info::Layer3 for its own MIB requirements.
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::CiscoVTP for its own MIB requirements.
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::CiscoStack for its own MIB requirements.
|
||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -194,37 +340,149 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $c3550->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
Returns 'cisco'
|
||||
|
||||
=item $c3550->model()
|
||||
|
||||
Will take the translated model number and try to format it better.
|
||||
|
||||
355048 -> 3550-48
|
||||
355012G -> 3550-12G
|
||||
|
||||
=item $c3550->ports()
|
||||
|
||||
Tries to cull the number of ports from the model number.
|
||||
|
||||
=item $c3550->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in SNMP::Info::CiscoVTP for details.
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in SNMP::Info::CiscoStack for details.
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c3550->i_duplex()
|
||||
|
||||
Returns reference to hash of iid to current link duplex setting.
|
||||
|
||||
Software version 12.1(22)EA1a or greater returns duplex based upon the
|
||||
result of $c3550->el_duplex(). Otherwise it uses the result of
|
||||
the call to CiscoStack::i_duplex().
|
||||
|
||||
See L<SNMP::Info::Etherlike> for el_duplex() method and
|
||||
L<SNMP::Info::CiscoStack> for its i_duplex() method.
|
||||
|
||||
=item $c3550->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative duplex setting.
|
||||
|
||||
Software version 12.1(22)EA1a or greater returns duplex based upon the
|
||||
result of $c3550->p_duplex(). Otherwise it uses the result of
|
||||
the call to CiscoStack::i_duplex().
|
||||
|
||||
See L<SNMP::Info::CiscoStack> for its i_duplex() and p_duplex() methods.
|
||||
|
||||
=item $c3550->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
|
||||
|
||||
Speed choices are 'auto', 'half', 'full'.
|
||||
|
||||
Crosses $c3550->p_port() with $c3550->p_duplex() to utilize port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c3550->interfaces()};
|
||||
$c3550->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port duplex. ",$c3550->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in SNMP::Info::CiscoVTP for details.
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in SNMP::Info::CiscoStack for details.
|
||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
319
Info/Layer3/C4000.pm
Normal file
319
Info/Layer3/C4000.pm
Normal file
@@ -0,0 +1,319 @@
|
||||
# SNMP::Info::Layer3::C4000
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::C4000;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::C4000::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::C4000::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
'CISCO-ENVMON-MIB' => 'ciscoEnvMonMIB',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
'ps1_type' => 'ciscoEnvMonSupplyStatusDescr.1',
|
||||
'ps1_status' => 'ciscoEnvMonSupplyState.1',
|
||||
'ps2_type' => 'ciscoEnvMonSupplyStatusDescr.2',
|
||||
'ps2_status' => 'ciscoEnvMonSupplyState.2',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
'fan_state' => 'ciscoEnvMonFanState',
|
||||
'fan_descr' => 'ciscoEnvMonFanStatusDescr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
# Override Inheritance for these specific methods
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::C4000::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::C4000::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub fan {
|
||||
my $c4000 = shift;
|
||||
my $fan_state = $c4000->fan_state();
|
||||
my $fan_descr = $c4000->fan_descr();
|
||||
my $ret = "";
|
||||
my $s = "";
|
||||
foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
|
||||
$ret .= $s . $fan_descr->{$i} . ": " . $fan_state->{$i};
|
||||
$s = ", ";
|
||||
}
|
||||
return if ( $s eq "" );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::C4000 - SNMP Interface to Cisco Catalyst 4000 Layer 2/3
|
||||
Switches running IOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c4000 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $c4000->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Cisco Catalyst 4000 Layer 2/3 Switches.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $c4000 = new SNMP::Info::Layer3::C4000(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c4000->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=item $c4000->fan()
|
||||
|
||||
Returns fan status
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $c4000->i_duplex()
|
||||
|
||||
Parses mau_index and mau_link to return the duplex information for
|
||||
interfaces.
|
||||
|
||||
=item $c4000->i_duplex_admin()
|
||||
|
||||
Parses C<mac_index>,C<mau_autostat>,C<mau_type_admin> in
|
||||
order to find the admin duplex setting for all the interfaces.
|
||||
|
||||
Returns either (auto,full,half).
|
||||
|
||||
=item $c4000->i_speed_admin()
|
||||
|
||||
Returns administrative speed for interfaces.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,124 +1,234 @@
|
||||
# SNMP::Info::Layer3::C6500
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2003,2004 Max Baker
|
||||
# Copyright (c) 2008-2009 Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the Author, nor
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::C6500;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CiscoStack;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoPower;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# NOTE : Top-most items gets precedence for @ISA
|
||||
@SNMP::Info::Layer3::C6500::ISA = qw/
|
||||
SNMP::Info::CiscoVTP
|
||||
SNMP::Info::CiscoStpExtensions
|
||||
SNMP::Info::CiscoStack
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::CDP
|
||||
SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoStats
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig
|
||||
SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
|
||||
@SNMP::Info::Layer3::C6500::ISA = qw/ SNMP::Info::Layer3 SNMP::Info::CiscoStack SNMP::Info::CiscoVTP Exporter/;
|
||||
@SNMP::Info::Layer3::C6500::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
# NOTE: Order creates precedence
|
||||
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
|
||||
# Bridge is called from Layer3 and CiscoStpExtensions
|
||||
# So we want CiscoVTP to come last to get the right one.
|
||||
# The @ISA order should match these orders.
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS,
|
||||
);
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoPower::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS, %SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::CiscoStack::MIBS, %SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
);
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStack::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS,
|
||||
);
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CiscoPower::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS, %SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::CiscoStack::FUNCS, %SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE,
|
||||
);
|
||||
|
||||
# Pick and choose
|
||||
|
||||
*SNMP::Info::Layer3::C6500::serial = \&SNMP::Info::CiscoStack::serial;
|
||||
*SNMP::Info::Layer3::C6500::interfaces = \&SNMP::Info::Layer3::interfaces;
|
||||
*SNMP::Info::Layer3::C6500::i_duplex = \&SNMP::Info::CiscoStack::i_duplex;
|
||||
#*SNMP::Info::Layer3::C6500::i_duplex_admin = \&SNMP::Info::Layer3::i_duplex_admin;
|
||||
*SNMP::Info::Layer3::C6500::i_name = \&SNMP::Info::Layer3::i_name;
|
||||
*SNMP::Info::Layer3::C6500::i_type = \&SNMP::Info::CiscoStack::i_type;
|
||||
|
||||
sub model {
|
||||
my $c6500 = shift;
|
||||
my $model1 = $c6500->model1();
|
||||
return $model1 if defined $model1;
|
||||
return $c6500->SUPER::model();
|
||||
}
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoPower::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE, %SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::CiscoStack::MUNGE, %SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub cisco_comm_indexing {
|
||||
1;
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
# Newer versions use the ETHERLIKE-MIB to report operational duplex.
|
||||
|
||||
sub i_duplex {
|
||||
my $c6500 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $c6500->el_duplex($partial);
|
||||
|
||||
# Newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my %i_duplex;
|
||||
foreach my $el_port ( keys %$el_duplex ) {
|
||||
my $duplex = $el_duplex->{$el_port};
|
||||
next unless defined $duplex;
|
||||
|
||||
$i_duplex{$el_port} = 'half' if $duplex =~ /half/i;
|
||||
$i_duplex{$el_port} = 'full' if $duplex =~ /full/i;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
# Fall back to CiscoStack method
|
||||
else {
|
||||
return $c6500->SUPER::i_duplex($partial);
|
||||
}
|
||||
}
|
||||
|
||||
# Newer software uses portDuplex as admin setting
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $c6500 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $el_duplex = $c6500->el_duplex($partial);
|
||||
|
||||
# Newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my $p_port = $c6500->p_port() || {};
|
||||
my $p_duplex = $c6500->p_duplex() || {};
|
||||
|
||||
my $i_duplex_admin = {};
|
||||
foreach my $port ( keys %$p_duplex ) {
|
||||
my $iid = $p_port->{$port};
|
||||
next unless defined $iid;
|
||||
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||
|
||||
$i_duplex_admin->{$iid} = $p_duplex->{$port};
|
||||
}
|
||||
return $i_duplex_admin;
|
||||
}
|
||||
|
||||
# Fall back to CiscoStack method
|
||||
else {
|
||||
return $c6500->SUPER::i_duplex_admin($partial);
|
||||
}
|
||||
}
|
||||
|
||||
sub set_i_duplex_admin {
|
||||
|
||||
# map a textual duplex to an integer one the switch understands
|
||||
my %duplexes = qw/half 1 full 2 auto 4/;
|
||||
|
||||
my $c6500 = shift;
|
||||
my ( $duplex, $iid ) = @_;
|
||||
|
||||
my $el_duplex = $c6500->el_duplex($iid);
|
||||
|
||||
# Auto duplex only supported on newer software
|
||||
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
|
||||
my $p_port = $c6500->p_port() || {};
|
||||
my %reverse_p_port = reverse %$p_port;
|
||||
|
||||
$duplex = lc($duplex);
|
||||
|
||||
return 0 unless defined $duplexes{$duplex};
|
||||
|
||||
$iid = $reverse_p_port{$iid};
|
||||
|
||||
return $c6500->set_p_duplex( $duplexes{$duplex}, $iid );
|
||||
}
|
||||
else {
|
||||
return $c6500->SUPER::set_i_duplex_admin;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::C6500 - Perl5 Interface to Cisco Catalyst 6500 Layer 2/3 Switches running IOS and/or CatOS
|
||||
SNMP::Info::Layer3::C6500 - SNMP Interface to Cisco Catalyst 6500 Layer 2/3
|
||||
Switches running IOS and/or CatOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $c6500 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
@@ -129,12 +239,12 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
Abstraction subclass for Cisco Catalyst 6500 Layer 2/3 Switches.
|
||||
|
||||
These devices run IOS but have some of the same charactersitics as the Catalyst WS-C family (5xxx).
|
||||
For example, forwarding tables are held in VLANs, and extened interface information
|
||||
is gleened from CISCO-SWITCH-MIB.
|
||||
These devices run IOS but have some of the same characteristics as the
|
||||
Catalyst WS-C family (5xxx). For example, forwarding tables are held in
|
||||
VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $c6500 = new SNMP::Info::Layer3::C6500(...);
|
||||
|
||||
@@ -142,12 +252,26 @@ a more specific class using the method above.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CiscoStack
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoPower
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
@@ -156,11 +280,26 @@ a more specific class using the method above.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info::Layer3 for its own MIB requirements.
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::CiscoVTP for its own MIB requirements.
|
||||
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::CiscoStack for its own MIB requirements.
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -174,36 +313,137 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $c6500->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in SNMP::Info::CiscoVTP for details.
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in SNMP::Info::CiscoStack for details.
|
||||
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
=head2 Overrides
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
=over
|
||||
|
||||
=item $c6500->i_duplex()
|
||||
|
||||
Returns reference to hash of iid to current link duplex setting.
|
||||
|
||||
Newer software versions return duplex based upon the result of
|
||||
$c6500->el_duplex(). Otherwise it uses the result of the call to
|
||||
CiscoStack::i_duplex().
|
||||
|
||||
See L<SNMP::Info::Etherlike> for el_duplex() method and
|
||||
L<SNMP::Info::CiscoStack> for its i_duplex() method.
|
||||
|
||||
=item $c6500->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative duplex setting.
|
||||
|
||||
Newer software versions return duplex based upon the result of
|
||||
$c6500->p_duplex(). Otherwise it uses the result of the call to
|
||||
CiscoStack::i_duplex().
|
||||
|
||||
See L<SNMP::Info::CiscoStack> for its i_duplex() and p_duplex() methods.
|
||||
|
||||
=item $c6500->set_i_duplex_admin(duplex, ifIndex)
|
||||
|
||||
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
|
||||
|
||||
Speed choices are 'auto', 'half', 'full'.
|
||||
|
||||
Crosses $c6500->p_port() with $c6500->p_duplex() to utilize port C<ifIndex>.
|
||||
|
||||
Example:
|
||||
my %if_map = reverse %{$c6500->interfaces()};
|
||||
$c6500->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||
or die "Couldn't change port duplex. ",$c6500->error(1);
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in SNMP::Info::CiscoVTP for details.
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStack
|
||||
|
||||
See documentation in SNMP::Info::CiscoStack for details.
|
||||
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
@@ -1,94 +1,148 @@
|
||||
# SNMP::Info::Layer3::Cisco
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# 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
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Cisco;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoRTT;
|
||||
use SNMP::Info::CiscoQOS;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoPower;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
|
||||
@SNMP::Info::Layer3::Cisco::ISA = qw/SNMP::Info::Layer3 SNMP::Info::CiscoVTP Exporter/;
|
||||
@SNMP::Info::Layer3::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
|
||||
SNMP::Info::CiscoConfig SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::Cisco::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
);
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::CiscoPower::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoQOS::MIBS,
|
||||
%SNMP::Info::CiscoRTT::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS,
|
||||
%SNMP::Info::CiscoStats::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
'CISCO-EIGRP-MIB' => 'cEigrpAsRouterId',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
);
|
||||
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS, %SNMP::Info::CiscoQOS::GLOBALS,
|
||||
%SNMP::Info::CiscoRTT::GLOBALS, %SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS, 'eigrp_id' => 'cEigrpAsRouterId',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoPower::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoQOS::FUNCS,
|
||||
%SNMP::Info::CiscoRTT::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS,
|
||||
%SNMP::Info::CiscoStats::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
|
||||
# EIGRP
|
||||
'eigrp_peers' => 'cEigrpPeerAddr',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoPower::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoQOS::MUNGE,
|
||||
%SNMP::Info::CiscoRTT::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE,
|
||||
%SNMP::Info::CiscoStats::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
'eigrp_peers' => \&SNMP::Info::munge_ip,
|
||||
);
|
||||
|
||||
sub i_vlan {
|
||||
my ($cisco) = shift;
|
||||
my ($partial) = shift;
|
||||
|
||||
my ($i_type) = $cisco->i_type($partial);
|
||||
my ($i_descr) = $cisco->i_description($partial);
|
||||
my %i_vlan;
|
||||
|
||||
foreach my $idx ( keys %$i_descr ) {
|
||||
if ( $i_type->{$idx} eq 'l2vlan' || $i_type->{$idx} eq 135 ) {
|
||||
if ( $i_descr->{$idx} =~ /\.(\d+)$/ ) {
|
||||
$i_vlan{$idx} = $1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return \%i_vlan;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Cisco - Perl5 Interface to Generic L3 Cisco Device
|
||||
SNMP::Info::Layer3::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
|
||||
that are not covered in other classes.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
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 on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
@@ -103,21 +157,51 @@ Subclass for Generic Cisco Routers running IOS
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoStats
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoRTT
|
||||
|
||||
=item SNMP::Info::CiscoQOS
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::Power
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-EIGRP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info::Layer3 for its own MIB requirements.
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::CiscoVTP for its own MIB requirements.
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoQOS/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -131,28 +215,101 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $cisco->eigrp_id()
|
||||
|
||||
(C<cEigrpAsRouterId>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in SNMP::Info::CiscoVTP for details.
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoRTT
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoQOS
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
=over
|
||||
|
||||
See documentation in SNMP::Info::Layer3 for details.
|
||||
=item $cisco->eigrp_peers()
|
||||
|
||||
Returns EIGRP peer IP addresses
|
||||
|
||||
(C<cEigrpPeerAddr>)
|
||||
|
||||
=item $cisco->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in SNMP::Info::CiscoVTP for details.
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoRTT
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoQOS
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
252
Info/Layer3/CiscoASA.pm
Normal file
252
Info/Layer3/CiscoASA.pm
Normal file
@@ -0,0 +1,252 @@
|
||||
# SNMP::Info::Layer3::CiscoASA
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2013 Moe Kraus
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::CiscoASA;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoStats;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoRTT;
|
||||
use SNMP::Info::CiscoQOS;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoPower;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::Layer3::Cisco;
|
||||
|
||||
@SNMP::Info::Layer3::CiscoASA::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
|
||||
SNMP::Info::CiscoConfig SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3::Cisco
|
||||
SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::CiscoASA::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::Cisco::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::Cisco::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::Cisco::FUNCS,
|
||||
'mac_table' => 'ifPhysAddress',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::Cisco::MUNGE,
|
||||
'mac_table' => \&SNMP::Info::munge_mac, );
|
||||
|
||||
sub b_mac {
|
||||
my ($asa) = shift;
|
||||
my $macs = $asa->mac_table();
|
||||
my @macs;
|
||||
# gather physical addresses
|
||||
foreach my $i ( keys %$macs ) {
|
||||
my $mac = $macs->{$i};
|
||||
# don't catch the bad macs with zeroed OUI
|
||||
if ( $mac !~ m/(0{1,2}:){3}/ ) {
|
||||
push( @macs, $mac);
|
||||
}
|
||||
@macs = sort( @macs );
|
||||
}
|
||||
# return the least mac
|
||||
return $macs[0];
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
my $self = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $self->orig_i_description($partial) || {};
|
||||
|
||||
foreach my $ifindex ( keys %$i_descr ) {
|
||||
$i_descr->{$ifindex} =~ /'(.*)'/;
|
||||
$i_descr->{$ifindex} = $1
|
||||
if defined $1;
|
||||
}
|
||||
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::CiscoASA - Cisco Adaptive Security Appliance
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Moe Kraus
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $cisco = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $asa->class();
|
||||
print "SNMP::Info determined this device to fall under subclass: $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Cisco ASAs
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3::Cisco
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-EIGRP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $asa->b_mac()
|
||||
|
||||
Returns base mac.
|
||||
Overrides base mac function in L<SNMP::Info::Layer3>.
|
||||
|
||||
=item $asa->i_description()
|
||||
|
||||
Overrides base interface description function in L<SNMP::Info> to return the
|
||||
configured interface name instead of "Adaptive Security Appliance
|
||||
'$configured interface name' interface".
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoRTT
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoQOS
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a
|
||||
reference to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoRTT
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoQOS
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
223
Info/Layer3/CiscoFWSM.pm
Normal file
223
Info/Layer3/CiscoFWSM.pm
Normal file
@@ -0,0 +1,223 @@
|
||||
# SNMP::Info::Layer3::CiscoFWSM
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2010 Brian De Wolf
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::CiscoFWSM;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3::Cisco;
|
||||
|
||||
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::Layer3::Cisco
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::CiscoFWSM::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::Cisco::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::Cisco::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::Cisco::FUNCS,
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::Cisco::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
# For FWSMs, the ipNetToPhysicalPhysAddress table appears to be of the form:
|
||||
# $ifindex.$inetaddresstype.$proto.$ip_address -> $mac_address
|
||||
#
|
||||
# Using the output of ipNetToPhysicalPhysAddress, we can emulate the other
|
||||
# functions.
|
||||
#
|
||||
# This doesn't really line up to what at_* return, so we munge it
|
||||
|
||||
sub at_paddr {
|
||||
my ($fwsm) = shift;
|
||||
my ($partial) = shift;
|
||||
|
||||
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||
my $n_paddrs = {};
|
||||
|
||||
foreach my $key (keys %$paddrs) {
|
||||
my $paddr = $paddrs->{$key};
|
||||
my @parts = split /\./, $key;
|
||||
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
|
||||
my $ip = join ".", @parts;
|
||||
|
||||
next if($proto != 4); # at_paddr doesn't support non-IPv4
|
||||
|
||||
$n_paddrs->{"$ifindex.$ip"} = $paddr;
|
||||
}
|
||||
return $n_paddrs;
|
||||
}
|
||||
|
||||
sub at_netaddr {
|
||||
my ($fwsm) = shift;
|
||||
my ($partial) = shift;
|
||||
|
||||
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||
|
||||
my $netaddrs = {};
|
||||
|
||||
foreach my $key (keys %$paddrs) {
|
||||
my $paddr = $paddrs->{$key};
|
||||
my @parts = split /\./, $key;
|
||||
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
|
||||
my $ip = join ".", @parts;
|
||||
|
||||
next if($proto != 4); # at_netaddr doesn't support non-IPv4
|
||||
|
||||
$netaddrs->{"$ifindex.$ip"} = $ip;
|
||||
}
|
||||
return $netaddrs;
|
||||
}
|
||||
|
||||
sub at_ifaddr {
|
||||
my ($fwsm) = shift;
|
||||
my ($partial) = shift;
|
||||
|
||||
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||
|
||||
my $ifaddrs = {};
|
||||
|
||||
foreach my $key (keys %$paddrs) {
|
||||
my $paddr = $paddrs->{$key};
|
||||
my @parts = split /\./, $key;
|
||||
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
|
||||
my $ip = join ".", @parts;
|
||||
|
||||
next if($proto != 4); # at_ifaddr doesn't support non-IPv4
|
||||
|
||||
$ifaddrs->{"$ifindex.$ip"} = $ip;
|
||||
}
|
||||
return $ifaddrs;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::CiscoFWSM - SNMP Interface to Firewall Services Modules for
|
||||
features not covered elsewhere.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Brian De Wolf
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $fwsm = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $fwsm->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Cisco Firewall Services Modules
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3::Cisco
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $fwsm->at_paddr()
|
||||
|
||||
This function derives the at_paddr information from the n2p_paddr() table as
|
||||
the MIB to provide that information isn't supported on FWSM.
|
||||
|
||||
=item $fwsm->at_netaddr()
|
||||
|
||||
This function derives the at_netaddr information from the n2p_paddr() table as
|
||||
the MIB to provide that information isn't supported on FWSM.
|
||||
|
||||
=item $fwsm->at_ifaddr()
|
||||
|
||||
This function derives the at_ifaddr information from the n2p_paddr() table as
|
||||
the MIB to provide that information isn't supported on FWSM.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3::Cisco
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,85 +1,74 @@
|
||||
# SNMP::Info::Layer3::Contivity
|
||||
# Eric Miller <eric@jeneric.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker
|
||||
# Copyright (c) 2010 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Contivity;
|
||||
$VERSION = 0.9;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::Entity;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
@SNMP::Info::Layer3::Contivity::ISA = qw/SNMP::Info SNMP::Info::Entity Exporter/;
|
||||
@SNMP::Info::Layer3::Contivity::ISA
|
||||
= qw/SNMP::Info SNMP::Info::Layer3 SNMP::Info::Entity Exporter/;
|
||||
@SNMP::Info::Layer3::Contivity::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
# See SNMP::Info for the details of these data structures and
|
||||
# the interworkings.
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
%SNMP::Info::Entity::MIBS,
|
||||
);
|
||||
%SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
);
|
||||
%SNMP::Info::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::Entity::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
'i_name2' => 'ifName',
|
||||
# From RFC1213-MIB
|
||||
'at_index' => 'ipNetToMediaIfIndex',
|
||||
'at_paddr' => 'ipNetToMediaPhysAddress',
|
||||
'at_netaddr' => 'ipNetToMediaNetAddress',
|
||||
);
|
||||
|
||||
%SNMP::Info::FUNCS, %SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::Entity::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
%SNMP::Info::MUNGE, %SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::Entity::MUNGE,
|
||||
);
|
||||
|
||||
sub layers {
|
||||
return '00000100';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'nortel';
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub model {
|
||||
@@ -87,9 +76,9 @@ sub model {
|
||||
my $e_model = $contivity->e_model() || {};
|
||||
|
||||
my $model = $e_model->{1} || undef;
|
||||
|
||||
return $1 if (defined $model and $model =~ /(CES\d+)/i);
|
||||
return undef;
|
||||
|
||||
return $1 if ( defined $model and $model =~ /(CES\d+|NVR\d+)/i );
|
||||
return;
|
||||
}
|
||||
|
||||
sub os {
|
||||
@@ -98,26 +87,26 @@ sub os {
|
||||
|
||||
sub os_ver {
|
||||
my $contivity = shift;
|
||||
my $descr = $contivity->description();
|
||||
return undef unless defined $descr;
|
||||
my $descr = $contivity->description();
|
||||
return unless defined $descr;
|
||||
|
||||
if ($descr =~ m/V(\d+_\d+\.\d+)/i){
|
||||
if ( $descr =~ m/V(\d+_\d+\.\d+)/i ) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub mac {
|
||||
my $contivity = shift;
|
||||
my $i_mac = $contivity->i_mac();
|
||||
my $i_mac = $contivity->i_mac();
|
||||
|
||||
# Return Interface MAC
|
||||
foreach my $entry (keys %$i_mac){
|
||||
# Return Interface MAC
|
||||
foreach my $entry ( keys %$i_mac ) {
|
||||
my $sn = $i_mac->{$entry};
|
||||
next unless $sn;
|
||||
return $sn;
|
||||
}
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
@@ -125,21 +114,23 @@ sub serial {
|
||||
my $e_serial = $contivity->e_serial() || {};
|
||||
|
||||
my $serial = $e_serial->{1} || undef;
|
||||
|
||||
return $1 if (defined $serial and $serial =~ /(\d+)/);
|
||||
return undef;
|
||||
}
|
||||
|
||||
return $1 if ( defined $serial and $serial =~ /(\d+)/ );
|
||||
return;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $contivity = shift;
|
||||
my $description = $contivity->i_description();
|
||||
|
||||
my $partial = shift;
|
||||
|
||||
my $description = $contivity->i_description($partial) || {};
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid (keys %$description){
|
||||
foreach my $iid ( keys %$description ) {
|
||||
my $desc = $description->{$iid};
|
||||
|
||||
# Skip everything except Ethernet interfaces
|
||||
next unless (defined $desc and $desc =~ /fe/i);
|
||||
next unless ( defined $desc and $desc =~ /fe/i );
|
||||
|
||||
$interfaces{$iid} = $desc;
|
||||
}
|
||||
@@ -148,33 +139,22 @@ sub interfaces {
|
||||
|
||||
sub i_name {
|
||||
my $contivity = shift;
|
||||
my $i_name2 = $contivity->i_name2();
|
||||
|
||||
my $partial = shift;
|
||||
|
||||
my $i_name2 = $contivity->orig_i_name($partial) || {};
|
||||
|
||||
my %i_name;
|
||||
foreach my $iid (keys %$i_name2){
|
||||
my $name = $i_name2->{$iid};
|
||||
#Skip everything except Ethernet interfaces
|
||||
next unless (defined $name and $name =~ /fe/i);
|
||||
|
||||
$name = $1 if $name =~ /(fei\.\d+\.\d+)/;
|
||||
|
||||
$i_name{$iid} = $name;
|
||||
}
|
||||
return \%i_name;
|
||||
}
|
||||
foreach my $iid ( keys %$i_name2 ) {
|
||||
my $name = $i_name2->{$iid};
|
||||
|
||||
sub root_ip {
|
||||
my $contivity = shift;
|
||||
my $ip_table = $contivity->ip_table();
|
||||
#Skip everything except Ethernet interfaces
|
||||
next unless ( defined $name and $name =~ /fe/i );
|
||||
|
||||
# Return First IP Address
|
||||
foreach my $entry (keys %$ip_table){
|
||||
my $router_ip = $ip_table->{$entry};
|
||||
print " SNMP::Layer3::Contivity::root_ip() using $router_ip\n" if $DEBUG;
|
||||
next unless $router_ip;
|
||||
return $router_ip if ($router_ip ne '0.0.0.0');
|
||||
$name = $1 if $name =~ /(fei\.\d+\.\d+)/;
|
||||
|
||||
$i_name{$iid} = $name;
|
||||
}
|
||||
return undef;
|
||||
return \%i_name;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -182,12 +162,12 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Contivity - Perl5 Interface to Nortel Networks' Contivity
|
||||
Extranet Switches (CES).
|
||||
SNMP::Info::Layer3::Contivity - SNMP Interface to Avaya/Nortel VPN Routers
|
||||
(formerly Contivity Extranet Switches).
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller (C<eric@jeneric.org>)
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -195,22 +175,22 @@ Eric Miller (C<eric@jeneric.org>)
|
||||
my $contivity = 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 = $contivity->class();
|
||||
my $class = $contivity->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Nortel Networks' Contivity Extranet Switch (CES).
|
||||
Abstraction subclass for Avaya/Nortel VPN Routers (formerly Contivity
|
||||
Extranet Switch).
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $contivity = new SNMP::Info::Layer3::Contivity(...);
|
||||
|
||||
@@ -220,6 +200,8 @@ a more specific class using the method above.
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::Entity
|
||||
|
||||
=back
|
||||
@@ -230,9 +212,11 @@ a more specific class using the method above.
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See SNMP::Info for its own MIB requirements.
|
||||
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See SNMP::Info::Entity for its own MIB requirements.
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Entity/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
@@ -244,37 +228,32 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $contivity->vendor()
|
||||
|
||||
Returns 'Nortel'
|
||||
Returns 'avaya'
|
||||
|
||||
=item $contivity->model()
|
||||
|
||||
Returns the chassis name.
|
||||
|
||||
(B<entPhysicalModelName.1>)
|
||||
(C<entPhysicalModelName.1>)
|
||||
|
||||
=item $contivity->os()
|
||||
|
||||
Returns 'CES'
|
||||
Returns C<'CES'>
|
||||
|
||||
=item $contivity->os_ver()
|
||||
|
||||
Returns the software version extracted from (B<sysDescr>).
|
||||
Returns the software version extracted from (C<sysDescr>).
|
||||
|
||||
=item $contivity->serial()
|
||||
|
||||
Returns the chassis serial number.
|
||||
|
||||
(B<entPhysicalSerialNum.1>)
|
||||
(C<entPhysicalSerialNum.1>)
|
||||
|
||||
=item $contivity->mac()
|
||||
|
||||
Returns the MAC address of the first Ethernet Interface.
|
||||
|
||||
=item $contivity->root_ip()
|
||||
|
||||
Returns the primary IP used to communicate with the router. Returns the first
|
||||
IP interface.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
@@ -290,13 +269,17 @@ layers.
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::Entity for details.
|
||||
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -307,41 +290,25 @@ to a hash.
|
||||
|
||||
=item $contivity->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port. Skips loopback and
|
||||
tunnel interfaces.
|
||||
Returns reference to the map between IID and physical Port. Skips loopback
|
||||
and tunnel interfaces.
|
||||
|
||||
=back
|
||||
=item $contivity->i_name()
|
||||
|
||||
=head2 RFC1213 Arp Cache Table (B<ipNetToMediaTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $contivity->at_index()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to Interface IIDs
|
||||
|
||||
(B<ipNetToMediaIfIndex>)
|
||||
|
||||
=item $contivity->at_paddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to MAC addresses.
|
||||
|
||||
(B<ipNetToMediaPhysAddress>)
|
||||
|
||||
=item $contivity->at_netaddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to IPs
|
||||
|
||||
(B<ipNetToMediaNetAddress>)
|
||||
Interface Name field. Skips loopback and tunnel interfaces.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Entity
|
||||
|
||||
See documentation in SNMP::Info::Entity for details.
|
||||
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
436
Info/Layer3/Dell.pm
Normal file
436
Info/Layer3/Dell.pm
Normal file
@@ -0,0 +1,436 @@
|
||||
# SNMP::Info::Layer3::Dell - SNMP Interface to Dell devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Dell;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::Dell::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Dell::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'RADLAN-Physicaldescription-MIB' => 'rlPhdStackReorder',
|
||||
'RADLAN-rlInterfaces' => 'rlIfNumOfLoopbackPorts',
|
||||
'RADLAN-HWENVIROMENT' => 'rlEnvPhysicalDescription',
|
||||
'Dell-Vendor-MIB' => 'productIdentificationVersion',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'os_ver' => 'productIdentificationVersion',
|
||||
'dell_id_name' => 'productIdentificationDisplayName',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
|
||||
# RADLAN-rlInterfaces:swIfTable
|
||||
'dell_duplex_admin' => 'swIfDuplexAdminMode',
|
||||
'dell_duplex' => 'swIfDuplexOperMode',
|
||||
'dell_tag_mode' => 'swIfTaggedMode',
|
||||
'dell_i_type' => 'swIfType',
|
||||
'dell_fc_admin' => 'swIfFlowControlMode',
|
||||
'dell_speed_admin' => 'swIfSpeedAdminMode',
|
||||
'dell_auto' => 'swIfSpeedDuplexAutoNegotiation',
|
||||
'dell_fc' => 'swIfOperFlowControlMode',
|
||||
|
||||
# RADLAN-Physicaldescription-MIB:rlPhdUnitGenParamTable
|
||||
'dell_unit' => 'rlPhdUnitGenParamStackUnit',
|
||||
'dell_sw_ver' => 'rlPhdUnitGenParamSoftwareVersion',
|
||||
'dell_fw_ver' => 'rlPhdUnitGenParamFirmwareVersion',
|
||||
'dell_hw_ver' => 'rlPhdUnitGenParamHardwareVersion',
|
||||
'dell_serial_no' => 'rlPhdUnitGenParamSerialNum',
|
||||
'dell_asset_no' => 'rlPhdUnitGenParamAssetTag',
|
||||
|
||||
# RADLAN-COPY-MIB:rlCopyTable
|
||||
'dell_cp_idx' => 'rlCopyIndex',
|
||||
'dell_cp_sloc' => 'rlCopySourceLocation',
|
||||
'dell_cp_sip' => 'rlCopySourceIpAddress',
|
||||
'dell_cp_sunit' => 'rlCopySourceUnitNumber',
|
||||
'dell_cp_sfile' => 'rlCopySourceFileName',
|
||||
'dell_cp_stype' => 'rlCopySourceFileType',
|
||||
'dell_cp_dloc' => 'rlCopyDestinationLocation',
|
||||
'dell_cp_dip' => 'rlCopyDestinationIpAddress',
|
||||
'dell_cp_dunit' => 'rlCopyDestinationUnitNumber',
|
||||
'dell_cp_dfile' => 'rlCopyDestinationFileName',
|
||||
'dell_cp_dtype' => 'rlCopyDestinationFileType',
|
||||
'dell_cp_state' => 'rlCopyOperationState',
|
||||
'dell_cp_bkgnd' => 'rlCopyInBackground',
|
||||
'dell_cp_rstatus' => 'rlCopyRowStatus',
|
||||
|
||||
# RADLAN-HWENVIROMENT:rlEnvMonSupplyStatusTable
|
||||
'dell_pwr_src' => 'rlEnvMonSupplySource',
|
||||
'dell_pwr_state' => 'rlEnvMonSupplyState',
|
||||
'dell_pwr_desc' => 'rlEnvMonSupplyStatusDescr',
|
||||
|
||||
# RADLAN-HWENVIROMENT:rlEnvMonFanStatusTable
|
||||
'dell_fan_state' => 'rlEnvMonFanState',
|
||||
'dell_fan_desc' => 'rlEnvMonFanStatusDescr',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||
|
||||
# Method OverRides
|
||||
|
||||
sub model {
|
||||
my $dell = shift;
|
||||
|
||||
my $name = $dell->dell_id_name();
|
||||
my $descr = $dell->description();
|
||||
|
||||
if ( defined $name and $name =~ m/(\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Don't have a vendor MIB for D-Link
|
||||
else {
|
||||
return $descr;
|
||||
}
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $dell = shift;
|
||||
|
||||
return $dell->_vendor();
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $dell = shift;
|
||||
|
||||
return $dell->_vendor();
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $dell = shift;
|
||||
|
||||
my $numbers = $dell->dell_serial_no();
|
||||
|
||||
foreach my $key ( keys %$numbers ) {
|
||||
my $serial = $numbers->{$key};
|
||||
return $serial if ( defined $serial and $serial !~ /^\s*$/ );
|
||||
next;
|
||||
}
|
||||
|
||||
# Last resort
|
||||
return $dell->SUPER::serial();
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $dell = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $dell->i_description($partial) || {};
|
||||
my $i_name = $dell->orig_i_name($partial) || {};
|
||||
|
||||
# Descriptions are all the same on some Dells, so use name instead if
|
||||
# available
|
||||
foreach my $iid ( keys %$i_name ) {
|
||||
my $name = $i_name->{$iid};
|
||||
next unless defined $name;
|
||||
$i_descr->{$iid} = $name;
|
||||
}
|
||||
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $dell = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $dell->interfaces($partial) || {};
|
||||
my $dell_duplex = $dell->dell_duplex_admin($partial) || {};
|
||||
my $dell_auto = $dell->dell_auto($partial) || {};
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
my $duplex = $dell_duplex->{$if};
|
||||
next unless defined $duplex;
|
||||
my $auto = $dell_auto->{$if} || 'false';
|
||||
|
||||
$duplex = 'half' if ( $duplex =~ /half/i and $auto =~ /false/i );
|
||||
$duplex = 'full' if ( $duplex =~ /half/i and $auto =~ /false/i );
|
||||
$duplex = 'auto' if $auto =~ /true/i;
|
||||
$i_duplex_admin{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
# Use same methods as netgear. Some device didn't implement the bridge MIB
|
||||
# forwarding table and some don't return MACs for VLANs other than default yet
|
||||
# don't support community indexing, so we use the Q-BRIDGE-MIB forwarding
|
||||
# table. Fall back to the orig functions if the qb versions don't
|
||||
# return anything.
|
||||
sub fw_mac {
|
||||
my $dell = shift;
|
||||
my $ret = $dell->qb_fw_mac();
|
||||
$ret = $dell->orig_fw_mac() if ( !defined($ret) );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $dell = shift;
|
||||
my $ret = $dell->qb_fw_port();
|
||||
$ret = $dell->orig_fw_port() if ( !defined($ret) );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub _vendor {
|
||||
my $dell = shift;
|
||||
|
||||
my $id = $dell->id() || 'undef';
|
||||
my %oidmap = (
|
||||
2 => 'ibm',
|
||||
171 => 'dlink',
|
||||
674 => 'dell',
|
||||
3955 => 'linksys',
|
||||
);
|
||||
$id = $1 if ( defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/ );
|
||||
|
||||
if ( defined($id) and exists( $oidmap{$id} ) ) {
|
||||
return $oidmap{$id};
|
||||
}
|
||||
else {
|
||||
return 'dlink';
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Dell - SNMP Interface to Dell Power Connect Network
|
||||
Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $dell = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $dell->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from an
|
||||
Dell Power Connect device through SNMP. D-Link and the IBM BladeCenter
|
||||
Gigabit Ethernet Switch Module also use this module based upon MIB support.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $dell = new SNMP::Info::Layer3::Dell(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<Dell-Vendor-MIB>
|
||||
|
||||
=item F<RADLAN-Physicaldescription-MIB>
|
||||
|
||||
=item F<RADLAN-rlInterfaces>
|
||||
|
||||
=item F<RADLAN-HWENVIROMENT>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See classes listed above for their required MIBs.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $dell->os_ver()
|
||||
|
||||
(C<productIdentificationVersion>)
|
||||
|
||||
=item $dell->dell_id_name()
|
||||
|
||||
(C<productIdentificationDisplayName>)
|
||||
|
||||
=item $dell->model()
|
||||
|
||||
Returns model type. Returns numeric from
|
||||
(C<productIdentificationDisplayName>) if available, otherwise if returns
|
||||
description().
|
||||
|
||||
=item $dell->vendor()
|
||||
|
||||
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
|
||||
id(). Defaults to 'dlink'.
|
||||
|
||||
=item $dell->os()
|
||||
|
||||
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
|
||||
id(). Defaults to 'dlink'.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $dell->serial()
|
||||
|
||||
Returns serial number. Returns (C<rlPhdUnitGenParamSerialNum>) if available,
|
||||
otherwise uses the Layer3 serial method.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 RADLAN Interface Table (C<swIfTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $dell->dell_duplex_admin()
|
||||
|
||||
(C<swIfDuplexAdminMode>)
|
||||
|
||||
=item $dell->dell_duplex()
|
||||
|
||||
(C<swIfDuplexOperMode>)
|
||||
|
||||
=item $dell->dell_tag_mode()
|
||||
|
||||
(C<swIfTaggedMode>)
|
||||
|
||||
=item $dell->dell_i_type()
|
||||
|
||||
(C<swIfType>)
|
||||
|
||||
=item $dell->dell_fc_admin()
|
||||
|
||||
(C<swIfFlowControlMode>)
|
||||
|
||||
=item $dell->dell_speed_admin()
|
||||
|
||||
(C<swIfSpeedAdminMode>)
|
||||
|
||||
=item $dell->dell_auto()
|
||||
|
||||
(C<swIfSpeedDuplexAutoNegotiation>)
|
||||
|
||||
=item $dell->dell_fc()
|
||||
|
||||
(C<swIfOperFlowControlMode>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $dell->interfaces()
|
||||
|
||||
Returns the map between SNMP Interface Identifier (iid) and physical port
|
||||
name. Uses name if available instead of description since descriptions are
|
||||
sometimes not unique.
|
||||
|
||||
=item $dell->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of iid to current link administrative duplex
|
||||
setting.
|
||||
|
||||
=item $dell->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses.
|
||||
|
||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
|
||||
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
|
||||
C<Q-BRIDGE-MIB> doesn't return anything.
|
||||
|
||||
=item $dell->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
|
||||
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
|
||||
C<Q-BRIDGE-MIB> doesn't return anything.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
427
Info/Layer3/Enterasys.pm
Normal file
427
Info/Layer3/Enterasys.pm
Normal file
@@ -0,0 +1,427 @@
|
||||
# SNMP::Info::Layer3::Enterasys - SNMP Interface to Enterasys devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Enterasys;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Enterasys::ISA = qw/SNMP::Info::MAU SNMP::Info::LLDP
|
||||
SNMP::Info::CDP SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::Enterasys::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS, %SNMP::Info::MAU::MIBS,
|
||||
'ENTERASYS-OIDS-MIB' => 'etsysOidDevice',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS, %SNMP::Info::MAU::GLOBALS,
|
||||
'mac' => 'dot1dBaseBridgeAddress',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::MAU::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::MAU::MUNGE,
|
||||
);
|
||||
|
||||
sub model {
|
||||
my $enterasys = shift;
|
||||
my $id = $enterasys->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::Enterasys::model() - Device does not support sysObjectID\n"
|
||||
if $enterasys->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
$model =~ s/^etsysOidDev//i;
|
||||
$model =~ s/^etsysOidPhy//i;
|
||||
return $id unless defined $model;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'enterasys';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'enterasys';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $enterasys = shift;
|
||||
my $descr = $enterasys->description();
|
||||
return unless defined $descr;
|
||||
|
||||
if ( $descr =~ m/\bRev ([\d.]*)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
# Use ifName as it is used for CDP and LLDP.
|
||||
sub interfaces {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
# We need the original ifName, SUPER:: would give us a method definition
|
||||
# in a higher class, we could use orig_ but just call the MIB leaf since
|
||||
# that's what we really want anyway.
|
||||
return $enterasys->ifName($partial)
|
||||
|| $enterasys->i_description($partial);
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $enterasys->i_type($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
if ( $interfaces->{$if} =~ /(rs232|tunnel|loopback|\blo\b|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $enterasys->mau_i_duplex($partial);
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $enterasys->mau_i_duplex_admin($partial);
|
||||
}
|
||||
|
||||
# Normal BRIDGE-MIB has issues on some devices, duplicates and
|
||||
# non-increasing oids, Use Q-BRIDGE-MIB for macsuck
|
||||
sub fw_mac {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $enterasys->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $enterasys->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
# LLDP table timefilter implementation continuously increments when walked
|
||||
# and we may never reach the end of the table. This behavior can be
|
||||
# modified with the "set snmp timefilter break disable" command,
|
||||
# unfortunately it is not the default. Query with a partial value of zero
|
||||
# which means no time filter.
|
||||
|
||||
sub lldp_ip {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
return $enterasys->SUPER::lldp_ip($partial);
|
||||
}
|
||||
|
||||
# [3564920] LLDP-MIB::lldpLocPortDesc isn't always unique,
|
||||
# use LLDP-MIB::lldpLocPortId this cross references to ifName
|
||||
sub lldp_if {
|
||||
my $lldp = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
my $addr = $lldp->lldp_rem_pid($partial) || {};
|
||||
my $i_descr = $lldp->ifName() || {};
|
||||
my %r_i_descr = reverse %$i_descr;
|
||||
|
||||
my %lldp_if;
|
||||
foreach my $key ( keys %$addr ) {
|
||||
my @aOID = split( '\.', $key );
|
||||
my $port = $aOID[1];
|
||||
next unless $port;
|
||||
# Local LLDP port may not equate to ifIndex
|
||||
# Cross reference lldpLocPortId with ifName to get ifIndex
|
||||
my $lldp_desc = $lldp->lldpLocPortId($port);
|
||||
my $desc = $lldp_desc->{$port};
|
||||
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
|
||||
if ( exists $r_i_descr{$desc} ) {
|
||||
$port = $r_i_descr{$desc};
|
||||
}
|
||||
|
||||
$lldp_if{$key} = $port;
|
||||
}
|
||||
return \%lldp_if;
|
||||
}
|
||||
|
||||
sub lldp_port {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
return $enterasys->SUPER::lldp_port($partial);
|
||||
}
|
||||
|
||||
sub lldp_id {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
return $enterasys->SUPER::lldp_id($partial);
|
||||
}
|
||||
|
||||
sub lldp_platform {
|
||||
my $enterasys = shift;
|
||||
my $partial = shift || 0;
|
||||
|
||||
return $enterasys->SUPER::lldp_rem_sysdesc($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Enterasys - SNMP Interface to Enterasys Network Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $enterasys = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $enterasys->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from an
|
||||
Enterasys device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $enterasys = new SNMP::Info::Layer3::Enterasys(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<ENTERASYS-OIDS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited MIBs
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $enterasys->model()
|
||||
|
||||
Returns model type. Checks $enterasys->id() against the
|
||||
F<ENTERASYS-OIDS-MIB>.
|
||||
|
||||
=item $enterasys->vendor()
|
||||
|
||||
Returns enterasys
|
||||
|
||||
=item $enterasys->os()
|
||||
|
||||
Returns enterasys
|
||||
|
||||
=item $enterasys->os_ver()
|
||||
|
||||
Returns os version extracted from C<sysDescr>
|
||||
|
||||
=item $enterasys->mac()
|
||||
|
||||
Returns base mac
|
||||
|
||||
(C<dot1dBaseBridgeAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $enterasys->interfaces()
|
||||
|
||||
Mapping between the Interface Table Index (iid) and the physical port name.
|
||||
|
||||
=item $enterasys->i_ignore()
|
||||
|
||||
Returns reference to hash. Creates a key for each IID that should be ignored.
|
||||
|
||||
Currently looks for rs232, tunnel,loopback,lo,null from
|
||||
$enterasys->interfaces()
|
||||
|
||||
=item $enterasys->i_duplex()
|
||||
|
||||
See documentation for mau_i_duplex() in L<SNMP::Info::MAU/"TABLE METHODS">.
|
||||
|
||||
=item $enterasys->i_duplex_admin()
|
||||
|
||||
See documentation for mau_i_duplex_admin() in
|
||||
L<SNMP::Info::MAU/"TABLE METHODS">.
|
||||
|
||||
=item $enterasys->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses.
|
||||
|
||||
=item $enterasys->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid).
|
||||
|
||||
(C<dot1qTpFdbPort>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Link Layer Discovery Protocol (LLDP) Overrides
|
||||
|
||||
The LLDP table time filter implementation continuously increments when
|
||||
walked and we may never reach the end of the table. This behavior can be
|
||||
modified with the C<"set snmp timefilter break disable"> command,
|
||||
unfortunately it is not the default. These methods are overridden to
|
||||
supply a partial value of zero which means no time filter.
|
||||
|
||||
=over
|
||||
|
||||
=item $enterasys->lldp_if()
|
||||
|
||||
=item $enterasys->lldp_ip()
|
||||
|
||||
=item $enterasys->lldp_port()
|
||||
|
||||
=item $enterasys->lldp_id()
|
||||
|
||||
=item $enterasys->lldp_platform()
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
1053
Info/Layer3/Extreme.pm
Normal file
1053
Info/Layer3/Extreme.pm
Normal file
File diff suppressed because it is too large
Load Diff
416
Info/Layer3/F5.pm
Normal file
416
Info/Layer3/F5.pm
Normal file
@@ -0,0 +1,416 @@
|
||||
# SNMP::Info::Layer3::F5
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::F5;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::F5::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::F5::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'F5-BIGIP-SYSTEM-MIB' => 'sysAttrArpMaxEntries',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'os_ver' => 'sysProductVersion',
|
||||
'mkt_name' => 'sysPlatformInfoMarketingName',
|
||||
'ps1_status' => 'sysChassisPowerSupplyStatus.1',
|
||||
'ps2_status' => 'sysChassisPowerSupplyStatus.2',
|
||||
|
||||
# Named serial1 to override serial1 in L3 serial method
|
||||
'serial1' => 'sysGeneralChassisSerialNum',
|
||||
'qb_vlans' => 'sysVlanNumber',
|
||||
'ports' => 'sysInterfaceNumber',
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
|
||||
# sysInterfaceTable
|
||||
'i_index' => 'sysInterfaceName',
|
||||
'i_description' => 'sysInterfaceName',
|
||||
'i_mtu' => 'sysInterfaceMtu',
|
||||
'i_speed' => 'sysInterfaceMediaActiveSpeed',
|
||||
'i_mac' => 'sysInterfaceMacAddr',
|
||||
'i_up_admin' => 'sysInterfaceEnabled',
|
||||
'i_up' => 'sysInterfaceStatus',
|
||||
|
||||
# sysIfxStatTable
|
||||
'i_octet_in' => 'sysIfxStatHcInOctets',
|
||||
'i_octet_out' => 'sysIfxStatHcOutOctets',
|
||||
'i_pkts_ucast_in' => 'sysIfxStatHcInUcastPkts',
|
||||
'i_pkts_ucast_out' => 'sysIfxStatHcOutUcastPkts',
|
||||
|
||||
# sysInterfaceStatTable
|
||||
'i_discards_in' => 'sysInterfaceStatDropsIn',
|
||||
'i_discards_out' => 'sysInterfaceStatDropsOut',
|
||||
'i_errors_in' => 'sysInterfaceStatErrorsIn',
|
||||
'i_errors_out' => 'sysInterfaceStatErrorsOut',
|
||||
|
||||
# sysInterfaceTable
|
||||
'sys_i_duplex' => 'sysInterfaceMediaActiveDuplex',
|
||||
|
||||
# sysChassisFanTable
|
||||
'fan_state' => 'sysChassisFanStatus',
|
||||
|
||||
# sysVlanTable
|
||||
'sys_v_id' => 'sysVlanId',
|
||||
'v_name' => 'sysVlanVname',
|
||||
|
||||
# sysVlanMemberTable
|
||||
'sys_vm_tagged' => 'sysVlanMemberTagged',
|
||||
'sys_vm_name' => 'sysVlanMemberVmname',
|
||||
'sys_vmp_name' => 'sysVlanMemberParentVname',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'f5';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'f5';
|
||||
}
|
||||
|
||||
sub fan {
|
||||
my $f5 = shift;
|
||||
my $fan_state = $f5->fan_state();
|
||||
my $ret = "";
|
||||
my $s = "";
|
||||
foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
|
||||
$ret .= $s . $i . ": " . $fan_state->{$i};
|
||||
$s = ", ";
|
||||
}
|
||||
return if ( $s eq "" );
|
||||
return $ret;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $f5 = shift;
|
||||
|
||||
my $name = $f5->mkt_name();
|
||||
|
||||
if ( defined $name ) { return $name; }
|
||||
|
||||
my $id = $f5->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
if ( !defined $model ) { return $id; }
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Override L3 interfaces
|
||||
sub interfaces {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $f5->i_index($partial);
|
||||
}
|
||||
|
||||
# Override L3 i_name
|
||||
sub i_name {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $f5->i_index($partial);
|
||||
}
|
||||
|
||||
# We don't have this, so fake it
|
||||
sub i_type {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $idx = $f5->i_index($partial);
|
||||
|
||||
my %i_type;
|
||||
foreach my $if ( keys %$idx ) {
|
||||
|
||||
$i_type{$if} = 'ethernetCsmacd';
|
||||
}
|
||||
return \%i_type;
|
||||
}
|
||||
|
||||
# Override L3 i_duplex
|
||||
sub i_duplex {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $duplexes = $f5->sys_i_duplex() || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $if ( keys %$duplexes ) {
|
||||
my $duplex = $duplexes->{$if};
|
||||
next unless defined $duplex;
|
||||
next if ( $duplex eq 'none' );
|
||||
|
||||
$i_duplex{$if} = $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
# Override Bridge v_index
|
||||
sub v_index {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $f5->sys_v_id($partial);
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $f5->i_index($partial) || {};
|
||||
my $tagged = $f5->sys_vm_tagged() || {};
|
||||
my $vlans = $f5->v_index() || {};
|
||||
|
||||
my $i_vlan = {};
|
||||
foreach my $iid ( keys %$tagged ) {
|
||||
my $tag = $tagged->{$iid};
|
||||
next if ( $tag eq 'true' );
|
||||
|
||||
# IID is length.vlan name index.length.interface index
|
||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
||||
my @iid_array = split /\./, $iid;
|
||||
my $len = $iid_array[0];
|
||||
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
|
||||
my $idx = join '.', @iid_array;
|
||||
|
||||
# Check to make sure we can map to a port
|
||||
my $p_idx = $index->{$idx};
|
||||
next unless $p_idx;
|
||||
|
||||
my $vlan = $vlans->{$v_idx};
|
||||
next unless $vlan;
|
||||
|
||||
$i_vlan->{$idx} = $vlan;
|
||||
}
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $f5 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $f5->i_index($partial) || {};
|
||||
my $tagged = $f5->sys_vm_tagged() || {};
|
||||
my $vlans = $f5->v_index() || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
foreach my $iid ( keys %$tagged ) {
|
||||
|
||||
# IID is length.vlan name index.length.interface index
|
||||
# Split out and use as the IID to get the VLAN ID and ifIndex
|
||||
my @iid_array = split /\./, $iid;
|
||||
my $len = $iid_array[0];
|
||||
my $v_idx = join '.', ( splice @iid_array, 0, $len + 1 );
|
||||
my $idx = join '.', @iid_array;
|
||||
|
||||
# Check to make sure we can map to a port
|
||||
my $p_idx = $index->{$idx};
|
||||
next unless $p_idx;
|
||||
|
||||
my $vlan = $vlans->{$v_idx};
|
||||
next unless $vlan;
|
||||
|
||||
push( @{ $i_vlan_membership->{$idx} }, $vlan );
|
||||
}
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::F5 - SNMP Interface to F5 network devices.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $f5 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $f5->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for F5 network devices.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $f5 = new SNMP::Info::Layer3::F5(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<F5-BIGIP-COMMON-MIB>
|
||||
|
||||
=item F<F5-BIGIP-SYSTEM-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $f5->model()
|
||||
|
||||
Return (C<sysPlatformInfoMarketingName>), otherwise tries to reference
|
||||
$f5->id() to F<F5-BIGIP-COMMON-MIB>.
|
||||
|
||||
=item $f5->vendor()
|
||||
|
||||
Returns 'f5'
|
||||
|
||||
=item $f5->os()
|
||||
|
||||
Returns 'f5'
|
||||
|
||||
=item $f5->os_ver()
|
||||
|
||||
Returns the software version reported by C<sysProductVersion>
|
||||
|
||||
=item $f5->fan()
|
||||
|
||||
Combines (C<sysChassisFanStatus>) into a single string.
|
||||
|
||||
=item $f5->ps1_status()
|
||||
|
||||
Returns status of primary power supply
|
||||
|
||||
=item $f5->ps2_status()
|
||||
|
||||
Returns status of redundant power supply
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a
|
||||
reference to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $f5->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical port.
|
||||
|
||||
(C<sysInterfaceName>).
|
||||
|
||||
=item $f5->i_duplex()
|
||||
|
||||
Returns reference to hash. Maps port operational duplexes to IIDs.
|
||||
|
||||
=item $f5->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the default VLAN.
|
||||
|
||||
=item $f5->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs.
|
||||
|
||||
Example:
|
||||
my $interfaces = $f5->interfaces();
|
||||
my $vlans = $f5->i_vlan_membership();
|
||||
|
||||
foreach my $iid (sort keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||
print "Port: $port VLAN: $vlan\n";
|
||||
}
|
||||
|
||||
=item $f5->v_index()
|
||||
|
||||
Returns VLAN IDs
|
||||
|
||||
=item $f5->v_name()
|
||||
|
||||
Human-entered name for vlans.
|
||||
|
||||
=item $f5->i_name()
|
||||
|
||||
Returns the human set port name if exists.
|
||||
|
||||
=item $f5->i_type()
|
||||
|
||||
Returns C<'ethernetCsmacd'> for each C<ifIndex>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
333
Info/Layer3/Force10.pm
Normal file
333
Info/Layer3/Force10.pm
Normal file
@@ -0,0 +1,333 @@
|
||||
# SNMP::Info::Layer3::Force10
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2012 William Bulley
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Force10;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::Force10::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Force10::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'F10-PRODUCTS-MIB' => 'f10Products',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::Force10::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::Force10::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub vendor {
|
||||
return 'force10';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'ftos';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $force10 = shift;
|
||||
my $descr = $force10->description();
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = $1 if ( $descr =~ /Force10\s+Application\s+Software\s+Version:\s+(\S+)/s );
|
||||
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $force10 = shift;
|
||||
my $id = $force10->id();
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB
|
||||
|
||||
sub fw_mac {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $force10->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $force10->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
sub v_name {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $force10->qb_v_name($partial);
|
||||
}
|
||||
|
||||
# ------------------- stub for now-----------------
|
||||
sub i_vlan {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_vlan = {};
|
||||
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $force10 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $force10->bp_index();
|
||||
my $v_index = $force10->v_index();
|
||||
|
||||
my $v_ports = $force10->qb_v_egress();
|
||||
|
||||
# If given a partial it will be an ifIndex, we need to use dot1dBasePort
|
||||
if ($partial) {
|
||||
my %r_index = reverse %$index;
|
||||
$partial = $r_index{$partial};
|
||||
}
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
|
||||
foreach my $idx ( sort keys %{$v_ports} ) {
|
||||
next unless ( defined $v_ports->{$idx} );
|
||||
my $portlist = $v_ports->{$idx}; # is an array reference
|
||||
my $ret = [];
|
||||
my $vlan_ndx = $idx;
|
||||
|
||||
# Convert portlist bit array to bp_index array
|
||||
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
|
||||
push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
|
||||
}
|
||||
|
||||
#Create HoA ifIndex -> VLAN array
|
||||
foreach my $port ( @{$ret} ) {
|
||||
my $ifindex = $index->{$port};
|
||||
next unless ( defined($ifindex) ); # shouldn't happen
|
||||
next if ( defined $partial and $ifindex !~ /^$partial$/ );
|
||||
my $vlan_tag = $v_index->{$vlan_ndx};
|
||||
|
||||
# FIXME: would be preferable to use
|
||||
# the mapping from Q-BRIDGE-MIB::dot1qVlanFdbId
|
||||
my $mod = $vlan_tag % 4096;
|
||||
|
||||
push ( @{ $i_vlan_membership->{$ifindex} }, ($mod) );
|
||||
}
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Force10 - SNMP Interface to Force10 Networks FTOS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
William Bulley
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $force10 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $force10->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Force10 Networks FTOS-based devices.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<F10-PRODUCTS-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP:
|
||||
|
||||
=over
|
||||
|
||||
=item $force10->vendor()
|
||||
|
||||
Returns C<'force10'>
|
||||
|
||||
=item $force10->model()
|
||||
|
||||
Tries to reference $force10->id() to the Force10 product MIB listed above.
|
||||
|
||||
=item $force10->os()
|
||||
|
||||
Returns C<'ftos'>.
|
||||
|
||||
=item $force10->os_ver()
|
||||
|
||||
Grabs the operating system version from C<sysDescr>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $force10->v_name()
|
||||
|
||||
Returns the VLAN names.
|
||||
|
||||
=item $force10->i_vlan()
|
||||
|
||||
Currently not implemented.
|
||||
|
||||
=item $force10->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays:
|
||||
key = C<ifIndex>, value = array of VLAN IDs.
|
||||
These are the VLANs which are members of the egress list for the port.
|
||||
|
||||
=item $force10->fw_mac()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $force10->fw_port()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $force10->i_duplex_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=item $force10->i_speed_admin()
|
||||
|
||||
Returns info from F<MAU-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
@@ -1,140 +1,102 @@
|
||||
# SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry devices
|
||||
# Max Baker <max@warped.org>
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Foundry;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
use SNMP::Info::Bridge;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::FDP;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
|
||||
|
||||
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::FDP Exporter/;
|
||||
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Foundry::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( %SNMP::Info::MIBS,
|
||||
%SNMP::Info::Bridge::MIBS,
|
||||
%SNMP::Info::FDP::MIBS,
|
||||
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
|
||||
# IP-FORWARD-MIB
|
||||
# ETHERLIKE-MIB
|
||||
# RFC1398-MIB
|
||||
# RMON-MIB
|
||||
# IF-MIB
|
||||
);
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::FDP::MIBS,
|
||||
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
|
||||
'FOUNDRY-SN-AGENT-MIB' => 'snChasPwrSupplyDescription',
|
||||
'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
# Inherit the super class ones
|
||||
%SNMP::Info::GLOBALS,
|
||||
%SNMP::Info::Bridge::GLOBALS,
|
||||
%SNMP::Info::FDP::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'chassis' => 'entPhysicalDescr.1',
|
||||
'serial' => 'snChasSerNum',
|
||||
'temp' => 'snChasActualTemperature',
|
||||
'ps1_type' => 'snChasPwrSupplyDescription.1',
|
||||
'ps1_status' => 'snChasPwrSupplyOperStatus.1',
|
||||
'fan' => 'snChasFanOperStatus.1',
|
||||
#'serial' => 'enterprises.1991.1.1.1.1.2.0',
|
||||
#'temp' => 'enterprises.1991.1.1.1.1.18.0',
|
||||
#'ps1_type' => 'enterprises.1991.1.1.1.2.1.1.2.1',
|
||||
#'ps1_status' => 'enterprises.1991.1.1.1.2.1.1.3.1',
|
||||
#'fan' => 'enterprises.1991.1.1.1.3.1.1.3.1'
|
||||
);
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::FDP::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'chassis' => 'entPhysicalDescr.1',
|
||||
'temp' => 'snChasActualTemperature',
|
||||
'ps1_type' => 'snChasPwrSupplyDescription.1',
|
||||
'ps1_status' => 'snChasPwrSupplyOperStatus.1',
|
||||
'fan' => 'snChasFanOperStatus.1',
|
||||
'img_ver' => 'snAgImgVer',
|
||||
'ch_serial' => 'snChasSerNum',
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
%SNMP::Info::Bridge::FUNCS,
|
||||
%SNMP::Info::FDP::FUNCS,
|
||||
'i_name2' => 'ifName',
|
||||
# From RFC1213-MIB
|
||||
'at_index' => 'ipNetToMediaIfIndex',
|
||||
'at_paddr' => 'ipNetToMediaPhysAddress',
|
||||
'at_netaddr' => 'ipNetToMediaNetAddress',
|
||||
# FOUNDRY-MIB
|
||||
# snSwPortInfoTable - Switch Port Information Group
|
||||
'sw_index' => 'snSwPortIfIndex',
|
||||
'sw_duplex' => 'snSwPortInfoChnMode',
|
||||
'sw_type' => 'snSwPortInfoMediaType',
|
||||
'sw_speed' => 'snSwPortInfoSpeed',
|
||||
);
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::FDP::FUNCS,
|
||||
|
||||
# FOUNDRY-SN-SWITCH-GROUP-MIB
|
||||
# snSwPortInfoTable - Switch Port Information Group
|
||||
'sw_index' => 'snSwPortIfIndex',
|
||||
'sw_duplex' => 'snSwPortInfoChnMode',
|
||||
'sw_type' => 'snSwPortInfoMediaType',
|
||||
'sw_speed' => 'snSwPortInfoSpeed',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
%SNMP::Info::Bridge::MUNGE,
|
||||
%SNMP::Info::FDP::MUNGE,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
|
||||
# Method OverRides
|
||||
|
||||
# Add our i_aliases if they are set (manually)
|
||||
sub i_name {
|
||||
my $foundry = shift;
|
||||
my $i_name = $foundry->i_name2();
|
||||
|
||||
my $i_alias = $foundry->i_alias();
|
||||
|
||||
foreach my $iid (keys %$i_name){
|
||||
my $alias = $i_alias->{$iid};
|
||||
next unless defined $alias;
|
||||
next unless length($alias);
|
||||
$i_name->{$iid} = $i_alias->{$iid};
|
||||
}
|
||||
|
||||
return $i_name;
|
||||
}
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::FDP::MUNGE,
|
||||
);
|
||||
|
||||
sub i_ignore {
|
||||
my $foundry = shift;
|
||||
|
||||
my $interfaces = $foundry->interfaces();
|
||||
my $i_descr = $foundry->i_descr();
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $foundry->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if (keys %$interfaces) {
|
||||
# lo -> cisco aironet 350 loopback
|
||||
if ($interfaces->{$if} =~ /(tunnel|loopback|lo|lb|null)/i){
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|lb|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
@@ -143,12 +105,18 @@ sub i_ignore {
|
||||
|
||||
sub i_duplex {
|
||||
my $foundry = shift;
|
||||
my $sw_index = $foundry->sw_index();
|
||||
my $sw_duplex= $foundry->sw_duplex();
|
||||
|
||||
my $partial = shift;
|
||||
|
||||
my $sw_index = $foundry->sw_index($partial);
|
||||
my $sw_duplex = $foundry->sw_duplex($partial);
|
||||
|
||||
unless ( defined $sw_index and defined $sw_duplex ) {
|
||||
return $foundry->SUPER::i_duplex();
|
||||
}
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $sw_port (keys %$sw_duplex){
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
foreach my $sw_port ( keys %$sw_duplex ) {
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $duplex = $sw_duplex->{$sw_port};
|
||||
next if $duplex =~ /none/i;
|
||||
$i_duplex{$iid} = 'half' if $duplex =~ /half/i;
|
||||
@@ -157,105 +125,162 @@ sub i_duplex {
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $foundry = shift;
|
||||
my $sw_index = $foundry->sw_index();
|
||||
my $sw_type= $foundry->sw_type();
|
||||
|
||||
my %i_type;
|
||||
foreach my $sw_port (keys %$sw_type){
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $type = $sw_type->{$sw_port};
|
||||
next unless defined $type;
|
||||
$i_type{$iid} = $type;
|
||||
}
|
||||
return \%i_type;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $foundry = shift;
|
||||
my $sw_index = $foundry->sw_index();
|
||||
my $sw_speed= $foundry->sw_speed();
|
||||
|
||||
my %i_speed;
|
||||
foreach my $sw_port (keys %$sw_speed){
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $speed = $sw_speed->{$sw_port};
|
||||
next unless defined $speed;
|
||||
$speed = 'auto' if $speed =~ /auto/i;
|
||||
$speed = '10 Mbps' if $speed =~ /s10m/i;
|
||||
$speed = '100 Mbps' if $speed =~ /s100m/i;
|
||||
$speed = '1.0 Gbps' if $speed =~ /s1g/i;
|
||||
$speed = '45 Mbps' if $speed =~ /s45M/i;
|
||||
$speed = '155 Mbps' if $speed =~ /s155M/i;
|
||||
$i_speed{$iid} = $speed;
|
||||
}
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
# $foundry->model() - looks for xxnnnn in the description
|
||||
sub model {
|
||||
my $foundry = shift;
|
||||
my $id = $foundry->id();
|
||||
my $desc = $foundry->description();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
my $id = $foundry->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
$model = $1 if $desc =~ /\s+([a-z]{2}\d{4})\D/i;
|
||||
|
||||
# EdgeIron
|
||||
if ( $id =~ /\.1991\.1\.[45]\./ ) {
|
||||
|
||||
my $e_name = $foundry->e_name();
|
||||
|
||||
# Find entity table entry for "unit.1"
|
||||
my $unit_iid = undef;
|
||||
foreach my $e ( keys %$e_name ) {
|
||||
my $name = $e_name->{$e} || '';
|
||||
$unit_iid = $e if $name eq 'unit.1';
|
||||
}
|
||||
|
||||
# Find Model Name
|
||||
my $e_model = $foundry->e_model();
|
||||
if ( defined $e_model->{$unit_iid} ) {
|
||||
return $e_model->{$unit_iid};
|
||||
}
|
||||
}
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^sn//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $foundry = shift;
|
||||
my $descr = $foundry->description();
|
||||
if ($descr =~ m/IronWare/i) {
|
||||
return 'IronWare';
|
||||
}
|
||||
|
||||
return 'foundry';
|
||||
}
|
||||
sub os_ver {
|
||||
my $foundry = shift;
|
||||
my $os_version = $foundry->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 = $foundry->description();
|
||||
if ($descr =~ m/Version (\d\S*)/) {
|
||||
return $1;
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
# $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;
|
||||
return 'brocade';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'foundry';
|
||||
return 'brocade';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $foundry = shift;
|
||||
|
||||
return $foundry->img_ver() if ( defined $foundry->img_ver() );
|
||||
|
||||
# Some older ones don't have this value,so we cull it from the description
|
||||
my $descr = $foundry->description();
|
||||
if ( $descr =~ m/Version (\d\S*)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# EdgeIron
|
||||
my $e_name = $foundry->e_name();
|
||||
|
||||
# find entity table entry for "stackmanaget.1"
|
||||
my $unit_iid = undef;
|
||||
foreach my $e ( keys %$e_name ) {
|
||||
my $name = $e_name->{$e} || '';
|
||||
$unit_iid = $e if $name eq 'stackmanaget.1';
|
||||
}
|
||||
|
||||
if ( defined $unit_iid ) {
|
||||
|
||||
# Find Model Name
|
||||
my $e_fwver = $foundry->e_fwver();
|
||||
if ( defined $e_fwver->{$unit_iid} ) {
|
||||
return $e_fwver->{$unit_iid};
|
||||
}
|
||||
}
|
||||
|
||||
# See if we report from Flash if wouldn't report from running above
|
||||
return $foundry->snAgFlashImgVer() if ( defined $foundry->snAgFlashImgVer() );
|
||||
|
||||
# Last resort
|
||||
return $foundry->SUPER::os_ver();
|
||||
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $foundry = shift;
|
||||
|
||||
# Return chassis serial number if available
|
||||
return $foundry->ch_serial() if ( $foundry->ch_serial() );
|
||||
|
||||
# If no chassis serial use first module serial
|
||||
my $mod_serials = $foundry->snAgentConfigModuleSerialNumber() || {};
|
||||
|
||||
foreach my $mod ( sort keys %$mod_serials ) {
|
||||
my $serial = $mod_serials->{$mod} || '';
|
||||
next unless defined $serial;
|
||||
return $serial;
|
||||
}
|
||||
|
||||
# EdgeIron
|
||||
my $e_name = $foundry->e_name();
|
||||
|
||||
# find entity table entry for "unit.1"
|
||||
my $unit_iid = undef;
|
||||
foreach my $e ( keys %$e_name ) {
|
||||
my $name = $e_name->{$e} || '';
|
||||
$unit_iid = $e if $name eq 'unit.1';
|
||||
}
|
||||
|
||||
if ( defined $unit_iid ) {
|
||||
|
||||
# Look up serial of found entry.
|
||||
my $e_serial = $foundry->e_serial();
|
||||
return $e_serial->{$unit_iid} if defined $e_serial->{$unit_iid};
|
||||
}
|
||||
|
||||
# Last resort
|
||||
return $foundry->SUPER::serial();
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $foundry->i_description($partial) || {};
|
||||
my $i_name = $foundry->i_name($partial) || {};
|
||||
|
||||
# Use ifName for EdgeIrons else use ifDescr
|
||||
foreach my $iid ( keys %$i_name ) {
|
||||
my $name = $i_name->{$iid};
|
||||
next unless defined $name;
|
||||
$i_descr->{$iid} = $name
|
||||
if $name =~ /^port\d+/i;
|
||||
}
|
||||
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
# Reported hangs on a EdgeIron 24G
|
||||
sub stp_p_state {
|
||||
my $foundry = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $descr = $foundry->description();
|
||||
if ( $descr =~ m/\bEdgeIron 24G\b/ ) {
|
||||
return;
|
||||
}
|
||||
|
||||
return $foundry->SUPER::stp_p_state($partial) || {};
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Foundry - Perl5 Interface to Foundry FastIron Network Devices
|
||||
SNMP::Info::Layer3::Foundry - SNMP Interface to Brocade (Foundry) Network
|
||||
Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -263,26 +288,22 @@ Max Baker (C<max@warped.org>)
|
||||
my $foundry = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly on to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $foundry->class();
|
||||
my $class = $foundry->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This subclass no longer supported.
|
||||
Abstraction subclass for Brocade (Foundry) Networks devices.
|
||||
|
||||
This module provides limited functionality from older Foundry devices.
|
||||
|
||||
Specifically designed for a FI4802.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
||||
a more specific class using the method above. Turn off the AutoSpecify flag.
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $foundry = new SNMP::Info::Layer3::Foundry(...);
|
||||
|
||||
@@ -290,9 +311,11 @@ a more specific class using the method above. Turn off the AutoSpecify flag.
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
=item SNMP::Info::Layer3;
|
||||
|
||||
=item SNMP::Info::Bridge
|
||||
=item SNMP::Info::FDP;
|
||||
|
||||
=item SNMP::Info::LLDP;
|
||||
|
||||
=back
|
||||
|
||||
@@ -300,16 +323,22 @@ a more specific class using the method above. Turn off the AutoSpecify flag.
|
||||
|
||||
=over
|
||||
|
||||
=item FOUNDRY-SN-ROOT-MIB
|
||||
=item F<FOUNDRY-SN-ROOT-MIB>
|
||||
|
||||
=item F<FOUNDRY-SN-AGENT-MIB>
|
||||
|
||||
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See classes listed above for their required MIBs.
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::FDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
The Foundry MIBS can be downloaded from www.mibdepot.com and ??
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
@@ -318,66 +347,88 @@ These are methods that return scalar value from SNMP
|
||||
|
||||
=item $foundry->model()
|
||||
|
||||
Returns model type. Checks $foundry->id() against the
|
||||
FOUNDRY-SN-ROOT-MIB and then parses out xxNNNN
|
||||
Returns model type. Checks $foundry->id() against the F<FOUNDRY-SN-ROOT-MIB>
|
||||
and removes 'C<sn>'. EdgeIron models determined through F<ENTITY-MIB>.
|
||||
|
||||
=item $foundry->vendor()
|
||||
|
||||
Returns 'foundry' :)
|
||||
Returns 'brocade'
|
||||
|
||||
=item $foundry->os()
|
||||
|
||||
Returns 'brocade'
|
||||
|
||||
=item $foundry->os_ver()
|
||||
|
||||
Returns the software version
|
||||
|
||||
=item $foundry->mac()
|
||||
|
||||
Returns MAC Address of root port.
|
||||
|
||||
(B<ifPhysAddress.1>)
|
||||
(C<ifPhysAddress.1>)
|
||||
|
||||
=item $foundry->chassis()
|
||||
|
||||
Returns Chassis type.
|
||||
|
||||
(B<entPhysicalDescr.1>)
|
||||
(C<entPhysicalDescr.1>)
|
||||
|
||||
=item $foundry->serial()
|
||||
|
||||
Returns serial number of device.
|
||||
|
||||
(B<snChasSerNum>)
|
||||
|
||||
=item $foundry->temp()
|
||||
|
||||
Returns the chassis temperature
|
||||
|
||||
(B<snChasActualTemperature>)
|
||||
(C<snChasActualTemperature>)
|
||||
|
||||
=item $foundry->ps1_type()
|
||||
|
||||
Returns the Description for the power supply
|
||||
|
||||
(B<snChasPwrSupplyDescription.1>)
|
||||
(C<snChasPwrSupplyDescription.1>)
|
||||
|
||||
=item $foundry->ps1_status()
|
||||
|
||||
Returns the status of the power supply.
|
||||
|
||||
(B<snChasPwrSupplyOperStatus.1>)
|
||||
(C<snChasPwrSupplyOperStatus.1>)
|
||||
|
||||
=item $foundry->fan()
|
||||
|
||||
Returns the status of the chassis fan.
|
||||
|
||||
(B<snChasFanOperStatus.1>)
|
||||
(C<snChasFanOperStatus.1>)
|
||||
|
||||
=item $foundry->img_ver()
|
||||
|
||||
Returns device image version.
|
||||
|
||||
(C<snAgImgVer.0>)
|
||||
|
||||
=item $foundry->ch_serial()
|
||||
|
||||
Returns chassis serial number.
|
||||
|
||||
(C<snChasSerNum.0>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Bridge
|
||||
=head2 Global Methods imported from SNMP::Info::FDP
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
=head2 Global Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
@@ -390,13 +441,6 @@ to a hash.
|
||||
|
||||
Returns reference to hash of interface names to iids.
|
||||
|
||||
Uses B<ifDescr>.
|
||||
|
||||
=item $foundry->i_name()
|
||||
|
||||
Returns reference to hash of interface names.
|
||||
Trys for B<ifAlias> and Defaults to B<ifName>
|
||||
|
||||
=item $foundry->i_ignore()
|
||||
|
||||
Returns reference to hash of interfaces to be ignored.
|
||||
@@ -409,46 +453,18 @@ Returns reference to hash of interface link duplex status.
|
||||
|
||||
Crosses $foundry->sw_duplex() with $foundry->sw_index()
|
||||
|
||||
=item $foundry->i_type()
|
||||
=item $foundry->stp_p_state()
|
||||
|
||||
Returns reference to hash of interface types.
|
||||
"The port's current state as defined by application of the Spanning Tree
|
||||
Protocol.
|
||||
|
||||
Crosses $foundry->sw_type() with $foundry->sw_index()
|
||||
Skipped if device is an EdgeIron 24G due to reports of hangs.
|
||||
|
||||
=item $foundry->i_speed()
|
||||
|
||||
Returns reference to hash of interface speeds .
|
||||
|
||||
Crosses $foundry->sw_speeD() with $foundry->sw_index() and
|
||||
does a little munging.
|
||||
(C<dot1dStpPortState>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 RFC1213 Arp Cache Table (B<ipNetToMediaTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $foundry->at_index()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to Interface IIDs
|
||||
|
||||
(B<ipNetToMediaIfIndex>)
|
||||
|
||||
=item $foundry->at_paddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to MAC addresses.
|
||||
|
||||
(B<ipNetToMediaPhysAddress>)
|
||||
|
||||
=item $foundry->at_netaddr()
|
||||
|
||||
Returns reference to hash. Maps ARP table entries to IPs
|
||||
|
||||
(B<ipNetToMediaNetAddress>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Foundry Switch Port Information Table (B<snSwPortIfTable>)
|
||||
=head2 Foundry Switch Port Information Table (C<snSwPortIfTable>)
|
||||
|
||||
=over
|
||||
|
||||
@@ -456,34 +472,38 @@ Returns reference to hash. Maps ARP table entries to IPs
|
||||
|
||||
Returns reference to hash. Maps Table to Interface IID.
|
||||
|
||||
(B<snSwPortIfIndex>)
|
||||
(C<snSwPortIfIndex>)
|
||||
|
||||
=item $foundry->sw_duplex()
|
||||
|
||||
Returns reference to hash. Current duplex status for switch ports.
|
||||
|
||||
(B<snSwPortInfoChnMode>)
|
||||
(C<snSwPortInfoChnMode>)
|
||||
|
||||
=item $foundry->sw_type()
|
||||
|
||||
Returns reference to hash. Current Port Type .
|
||||
|
||||
(B<snSwPortInfoMediaType>)
|
||||
(C<snSwPortInfoMediaType>)
|
||||
|
||||
=item $foundry->sw_speed()
|
||||
|
||||
Returns reference to hash. Current Port Speed.
|
||||
|
||||
(B<snSwPortInfoSpeed>)
|
||||
(C<snSwPortInfoSpeed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in SNMP::Info for details.
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||
=head2 Table Methods imported from SNMP::Info::FDP
|
||||
|
||||
See documentation in SNMP::Info::Bridge for details.
|
||||
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
256
Info/Layer3/H3C.pm
Normal file
256
Info/Layer3/H3C.pm
Normal file
@@ -0,0 +1,256 @@
|
||||
# SNMP::Info::Layer3::H3C
|
||||
#
|
||||
# Copyright (c) 2012 Jeroen van Ingen
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::H3C;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::H3C::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::H3C::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'HH3C-LswDEVM-MIB' => 'hh3cDevMFanStatus',
|
||||
'HH3C-LswINF-MIB' => 'hh3cSlotPortMax',
|
||||
'HH3C-LSW-DEV-ADM-MIB' => 'hh3cLswSysVersion',
|
||||
'HH3C-PRODUCT-ID-MIB' => 'hh3c-s5500-28C-EI',
|
||||
'HH3C-ENTITY-VENDORTYPE-OID-MIB' => 'hh3cevtOther',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'fan' => 'hh3cDevMFanStatus.1',
|
||||
'ps1_status' => 'hh3cDevMPowerStatus.1',
|
||||
'ps2_status' => 'hh3cDevMPowerStatus.2',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
i_duplex_admin => 'hh3cifEthernetDuplex',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
my $h3c = shift;
|
||||
my $mfg = $h3c->entPhysicalMfgName(1) || {};
|
||||
return $mfg->{1};
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $h3c = shift;
|
||||
my $descr = $h3c->description();
|
||||
|
||||
return $1 if ( $descr =~ /(\S+)\s+Platform Software/ );
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $h3c = shift;
|
||||
my $descr = $h3c->description();
|
||||
# my $version = $h3c->hh3cLswSysVersion(); # Don't use, indicates base version only, no release details
|
||||
my $ver_release = $h3c->entPhysicalSoftwareRev(2) || {};
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = "$1 $2" if ( $descr =~ /Software Version ([^,]+),.*(Release\s\S+)/i );
|
||||
|
||||
return $ver_release->{2} || $os_ver;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo0 etc
|
||||
if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB
|
||||
|
||||
sub fw_mac {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $l3->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::H3C - SNMP Interface to L3 Devices, H3C & HP A-series
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $h3c = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $h3c->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for H3C & HP A-series devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HH3C-LswDEVM-MIB>
|
||||
|
||||
=item F<HH3C-LswINF-MIB>
|
||||
|
||||
=item F<HH3C-LSW-DEV-ADM-MIB>
|
||||
|
||||
=item F<HH3C-PRODUCT-ID-MIB>
|
||||
|
||||
=item F<HH3C-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $h3c->vendor()
|
||||
|
||||
Returns value for C<entPhysicalMfgName.1>.
|
||||
|
||||
=item $h3c->os()
|
||||
|
||||
Returns the OS extracted from C<sysDescr>.
|
||||
|
||||
=item $h3c->os_ver()
|
||||
|
||||
Returns the software version. Either C<entPhysicalSoftwareRev.2> or extracted from
|
||||
C<sysDescr>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $h3c->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback
|
||||
|
||||
=item $h3c->fw_mac()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=item $h3c->fw_port()
|
||||
|
||||
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=cut
|
||||
414
Info/Layer3/HP9300.pm
Normal file
414
Info/Layer3/HP9300.pm
Normal file
@@ -0,0 +1,414 @@
|
||||
# SNMP::Info::Layer3::HP9300 - SNMP Interface to HP Foundry OEM devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::HP9300;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::FDP;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::HP9300::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::HP9300::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::FDP::MIBS,
|
||||
'HP-SN-ROOT-MIB' => 'hp',
|
||||
'HP-SN-AGENT-MIB' => 'snChasPwrSupplyDescription',
|
||||
'HP-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::FDP::GLOBALS,
|
||||
'mac' => 'ifPhysAddress.1',
|
||||
'chassis' => 'entPhysicalDescr.1',
|
||||
'temp' => 'snChasActualTemperature',
|
||||
'ps1_type' => 'snChasPwrSupplyDescription.1',
|
||||
'ps1_status' => 'snChasPwrSupplyOperStatus.1',
|
||||
'fan' => 'snChasFanOperStatus.1',
|
||||
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::FDP::FUNCS,
|
||||
|
||||
# HP-SN-SWITCH-GROUP-MIB
|
||||
# snSwPortInfoTable - Switch Port Information Group
|
||||
# Fully qualify these since FDP class will load
|
||||
# FOUNDRY-SN-SWITCH-GROUP-MIB which contains the same leaf names
|
||||
'sw_index' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortIfIndex',
|
||||
'sw_duplex' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoChnMode',
|
||||
'sw_type' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoMediaType',
|
||||
'sw_speed' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoSpeed',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::FDP::MUNGE,
|
||||
);
|
||||
|
||||
sub i_ignore {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $hp9300->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|lb|null)/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $sw_index = $hp9300->sw_index($partial);
|
||||
my $sw_duplex = $hp9300->sw_duplex($partial);
|
||||
|
||||
unless ( defined $sw_index and defined $sw_duplex ) {
|
||||
return $hp9300->SUPER::i_duplex();
|
||||
}
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $sw_port ( keys %$sw_duplex ) {
|
||||
my $iid = $sw_index->{$sw_port};
|
||||
my $duplex = $sw_duplex->{$sw_port};
|
||||
next if $duplex =~ /none/i;
|
||||
$i_duplex{$iid} = 'half' if $duplex =~ /half/i;
|
||||
$i_duplex{$iid} = 'full' if $duplex =~ /full/i;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $hp9300 = shift;
|
||||
my $id = $hp9300->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^hpSwitch//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'hp';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $hp9300 = shift;
|
||||
|
||||
return $hp9300->snAgImgVer() if ( defined $hp9300->snAgImgVer() );
|
||||
|
||||
# Some older ones don't have this value,so we cull it from the description
|
||||
my $descr = $hp9300->description();
|
||||
if ( $descr =~ m/Version (\d\S*)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# Last resort
|
||||
return $hp9300->SUPER::os_ver();
|
||||
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $hp9300 = shift;
|
||||
|
||||
# Return chassis serial number if available
|
||||
return $hp9300->snChasSerNum() if ( $hp9300->snChasSerNum() );
|
||||
|
||||
# If no chassis serial use first module serial
|
||||
my $mod_serials = $hp9300->snAgentConfigModuleSerialNumber();
|
||||
|
||||
foreach my $mod ( sort keys %$mod_serials ) {
|
||||
my $serial = $mod_serials->{$mod} || '';
|
||||
next unless defined $serial;
|
||||
return $serial;
|
||||
}
|
||||
|
||||
# Last resort
|
||||
return $hp9300->SUPER::serial();
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $hp9300 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_descr = $hp9300->i_description($partial) || {};
|
||||
my $i_name = $hp9300->i_name($partial) || {};
|
||||
|
||||
# Use ifName for EdgeIrons else use ifDescr
|
||||
foreach my $iid ( keys %$i_name ) {
|
||||
my $name = $i_name->{$iid};
|
||||
next unless defined $name;
|
||||
$i_descr->{$iid} = $name
|
||||
if $name =~ /^port\d+/i;
|
||||
}
|
||||
|
||||
return $i_descr;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::HP9300 - SNMP Interface to HP Foundry OEM Network Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $hp9300 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $hp9300->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for HP network devices which Foundry Networks was the
|
||||
Original Equipment Manufacturer (OEM) such as the HP ProCurve 9300 series.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $hp9300 = new SNMP::Info::Layer3::HP9300(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3;
|
||||
|
||||
=item SNMP::Info::FDP;
|
||||
|
||||
=item SNMP::Info::LLDP;
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HP-SN-ROOT-MIB>
|
||||
|
||||
=item F<HP-SN-AGENT-MIB>
|
||||
|
||||
=item F<HP-SN-SWITCH-GROUP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::FDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $hp9300->model()
|
||||
|
||||
Returns model type. Checks $hp9300->id() against the F<HP-SN-ROOT-MIB>
|
||||
and removes C<hpSwitch>.
|
||||
|
||||
=item $hp9300->vendor()
|
||||
|
||||
Returns 'hp'
|
||||
|
||||
=item $hp9300->os()
|
||||
|
||||
Returns 'hp'
|
||||
|
||||
=item $hp9300->os_ver()
|
||||
|
||||
Returns the software version
|
||||
|
||||
=item $hp9300->mac()
|
||||
|
||||
Returns MAC Address of root port.
|
||||
|
||||
(C<ifPhysAddress.1>)
|
||||
|
||||
=item $hp9300->chassis()
|
||||
|
||||
Returns Chassis type.
|
||||
|
||||
(C<entPhysicalDescr.1>)
|
||||
|
||||
=item $hp9300->serial()
|
||||
|
||||
Returns serial number of device.
|
||||
|
||||
=item $hp9300->temp()
|
||||
|
||||
Returns the chassis temperature
|
||||
|
||||
(C<snChasActualTemperature>)
|
||||
|
||||
=item $hp9300->ps1_type()
|
||||
|
||||
Returns the Description for the power supply
|
||||
|
||||
(C<snChasPwrSupplyDescription.1>)
|
||||
|
||||
=item $hp9300->ps1_status()
|
||||
|
||||
Returns the status of the power supply.
|
||||
|
||||
(C<snChasPwrSupplyOperStatus.1>)
|
||||
|
||||
=item $hp9300->fan()
|
||||
|
||||
Returns the status of the chassis fan.
|
||||
|
||||
(C<snChasFanOperStatus.1>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::FDP
|
||||
|
||||
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $hp9300->interfaces()
|
||||
|
||||
Returns reference to hash of interface names to iids.
|
||||
|
||||
=item $hp9300->i_ignore()
|
||||
|
||||
Returns reference to hash of interfaces to be ignored.
|
||||
|
||||
Ignores interfaces with descriptions of tunnel,loopback,null
|
||||
|
||||
=item $hp9300->i_duplex()
|
||||
|
||||
Returns reference to hash of interface link duplex status.
|
||||
|
||||
Crosses $hp9300->sw_duplex() with $hp9300->sw_index()
|
||||
|
||||
=back
|
||||
|
||||
=head2 Switch Port Information Table (C<snSwPortIfTable>)
|
||||
|
||||
=over
|
||||
|
||||
=item $hp9300->sw_index()
|
||||
|
||||
Returns reference to hash. Maps Table to Interface IID.
|
||||
|
||||
(C<snSwPortIfIndex>)
|
||||
|
||||
=item $hp9300->sw_duplex()
|
||||
|
||||
Returns reference to hash. Current duplex status for switch ports.
|
||||
|
||||
(C<snSwPortInfoChnMode>)
|
||||
|
||||
=item $hp9300->sw_type()
|
||||
|
||||
Returns reference to hash. Current Port Type .
|
||||
|
||||
(C<snSwPortInfoMediaType>)
|
||||
|
||||
=item $hp9300->sw_speed()
|
||||
|
||||
Returns reference to hash. Current Port Speed.
|
||||
|
||||
(C<snSwPortInfoSpeed>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::FDP
|
||||
|
||||
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
765
Info/Layer3/Juniper.pm
Normal file
765
Info/Layer3/Juniper.pm
Normal file
@@ -0,0 +1,765 @@
|
||||
# SNMP::Info::Layer3::Juniper
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Juniper;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::Juniper::ISA = qw/SNMP::Info::Layer3 SNMP::Info::LLDP Exporter/;
|
||||
@SNMP::Info::Layer3::Juniper::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'JUNIPER-CHASSIS-DEFINES-MIB' => 'jnxChassisDefines',
|
||||
'JUNIPER-MIB' => 'jnxBoxAnatomy',
|
||||
'JUNIPER-VIRTUALCHASSIS-MIB' => 'jnxVirtualChassisMemberTable',
|
||||
'JUNIPER-VLAN-MIB' => 'jnxVlanMIBObjects',
|
||||
);
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'serial' => 'jnxBoxSerialNo.0',
|
||||
'mac' => 'dot1dBaseBridgeAddress',
|
||||
'box_descr' => 'jnxBoxDescr'
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
|
||||
# JUNIPER-VLAN-MIB::jnxExVlanTable
|
||||
'v_index' => 'jnxExVlanTag',
|
||||
'v_type' => 'jnxExVlanType',
|
||||
'v_name' => 'jnxExVlanName',
|
||||
|
||||
# JUNIPER-VLAN-MIB::jnxExVlanPortGroupTable
|
||||
'i_trunk' => 'jnxExVlanPortAccessMode',
|
||||
|
||||
# JUNPIER-MIB
|
||||
'e_contents_type' => 'jnxContentsType',
|
||||
'e_containers_type' => 'jnxContainersType',
|
||||
'e_hwver' => 'jnxContentsRevision',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
'e_containers_type' => \&SNMP::Info::munge_e_type,
|
||||
'e_contents_type' => \&SNMP::Info::munge_e_type,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'juniper';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'junos';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $juniper = shift;
|
||||
|
||||
my $descr = $juniper->description() || '';
|
||||
my $lldp_descr = $juniper->lldp_sysdesc() || '';
|
||||
|
||||
if ( $descr =~ m/kernel JUNOS (\S+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
elsif ( $lldp_descr =~ m/version\s(\S+)\s/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $l3 = shift;
|
||||
my $id = $l3->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::Juniper::model() - Device does not support sysObjectID\n"
|
||||
if $l3->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^jnxProductName//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
# Override the fancy Layer3.pm serial function
|
||||
sub serial {
|
||||
my $juniper = shift;
|
||||
return $juniper->orig_serial();
|
||||
}
|
||||
|
||||
# 'i_trunk' => 'jnxExVlanPortAccessMode',
|
||||
sub i_trunk {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $access = $juniper->jnxExVlanPortAccessMode($partial);
|
||||
|
||||
my %i_trunk;
|
||||
|
||||
foreach (keys %$access)
|
||||
{
|
||||
my $old_key = $_;
|
||||
m/^\d+\.(\d+)$/o;
|
||||
my $new_key = $1;
|
||||
$i_trunk{$new_key} = $access->{$old_key};
|
||||
}
|
||||
|
||||
return \%i_trunk;
|
||||
}
|
||||
|
||||
# 'v_type' => 'jnxExVlanType',
|
||||
sub v_type {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $v_type = $juniper->jnxExVlanType($partial);
|
||||
|
||||
return $v_type;
|
||||
}
|
||||
|
||||
# 'v_index' => 'jnxExVlanTag',
|
||||
sub v_index {
|
||||
my ($juniper) = shift;
|
||||
my ($partial) = shift;
|
||||
|
||||
my ($v_index) = $juniper->jnxExVlanTag($partial);
|
||||
|
||||
return $v_index;
|
||||
}
|
||||
|
||||
sub i_vlan {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $juniper->bp_index();
|
||||
|
||||
# If given a partial it will be an ifIndex, we need to use dot1dBasePort
|
||||
if ($partial) {
|
||||
my %r_index = reverse %$index;
|
||||
$partial = $r_index{$partial};
|
||||
}
|
||||
|
||||
my $v_index = $juniper->jnxExVlanTag();
|
||||
my $i_pvid = $juniper->qb_i_vlan($partial) || {};
|
||||
my $i_vlan = {};
|
||||
|
||||
foreach my $bport ( keys %$i_pvid ) {
|
||||
my $q_vlan = $i_pvid->{$bport};
|
||||
my $vlan = $v_index->{$q_vlan};
|
||||
my $ifindex = $index->{$bport};
|
||||
unless ( defined $ifindex ) {
|
||||
print " Port $bport has no bp_index mapping. Skipping.\n"
|
||||
if $DEBUG;
|
||||
next;
|
||||
}
|
||||
$i_vlan->{$ifindex} = $vlan;
|
||||
}
|
||||
|
||||
return $i_vlan;
|
||||
}
|
||||
|
||||
sub i_vlan_membership {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $index = $juniper->bp_index();
|
||||
my ($v_index) = $juniper->jnxExVlanTag($partial);
|
||||
|
||||
my $v_ports = $juniper->qb_v_egress() || {};
|
||||
|
||||
my $i_vlan_membership = {};
|
||||
|
||||
foreach my $idx ( sort keys %$v_ports ) {
|
||||
next unless ( defined $v_ports->{$idx} );
|
||||
my $portlist = $v_ports->{$idx}; # is an array reference
|
||||
my $ret = [];
|
||||
my $vlan_ndx = $idx;
|
||||
|
||||
# Convert portlist bit array to bp_index array
|
||||
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
|
||||
push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
|
||||
}
|
||||
|
||||
#Create HoA ifIndex -> VLAN array
|
||||
foreach my $port ( @{$ret} ) {
|
||||
my $ifindex = $index->{$port};
|
||||
next unless ( defined($ifindex) ); # shouldn't happen
|
||||
next if ( defined $partial and $ifindex !~ /^$partial$/ );
|
||||
push ( @{ $i_vlan_membership->{$ifindex} }, $v_index->{$vlan_ndx} );
|
||||
}
|
||||
}
|
||||
|
||||
return $i_vlan_membership;
|
||||
}
|
||||
|
||||
# Use Q-BRIDGE-MIB for bridge forwarding tables
|
||||
sub fw_mac {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $juniper->qb_fw_mac($partial);
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $juniper = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $juniper->qb_fw_port($partial);
|
||||
}
|
||||
|
||||
# Pseudo ENTITY-MIB methods
|
||||
|
||||
# This class supports both virtual chassis (stackable) and physical chassis
|
||||
# based devices, identify if we have a virtual chassis so that we return
|
||||
# appropriate entPhysicalClass and correct ordering
|
||||
|
||||
sub _e_is_virtual {
|
||||
my $juniper = shift;
|
||||
|
||||
my $v_test = $juniper->jnxVirtualChassisMemberRole() || {};
|
||||
|
||||
#If we are functioning as a stack someone should be master
|
||||
foreach my $iid ( keys %$v_test ) {
|
||||
my $role = $v_test->{$iid};
|
||||
return 1 if ($role =~ /master/i);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub _e_virtual_index {
|
||||
my $juniper = shift;
|
||||
|
||||
my $containers = $juniper->jnxContainersWithin() || {};
|
||||
my $members = $juniper->jnxVirtualChassisMemberRole() || {};
|
||||
|
||||
my %v_index;
|
||||
foreach my $key (keys %$containers) {
|
||||
foreach my $member ( keys %$members ) {
|
||||
# Virtual chassis members start at zero
|
||||
$member++;
|
||||
# We will be duplicating and eliminating some keys,
|
||||
# but this is for the benefit of e_parent()
|
||||
my $index = sprintf ("%02d", $key) . sprintf ("%02d", $member) . "0000";
|
||||
my $iid = "$key\.$member\.0\.0";
|
||||
$v_index{$iid} = $index;
|
||||
}
|
||||
unless ($containers->{$key}) {
|
||||
my $index = sprintf ("%02d", $key) . "000000";
|
||||
$v_index{$key} = $index;
|
||||
}
|
||||
}
|
||||
return \%v_index;
|
||||
}
|
||||
|
||||
sub e_index {
|
||||
my $juniper = shift;
|
||||
|
||||
my $contents = $juniper->jnxContentsDescr() || {};
|
||||
my $containers = $juniper->jnxContainersDescr() || {};
|
||||
my $virtuals = $juniper->_e_virtual_index() || {};
|
||||
my $is_virtual = $juniper->_e_is_virtual();
|
||||
|
||||
# Format into consistent integer format so that numeric sorting works
|
||||
my %e_index;
|
||||
if ($is_virtual) {
|
||||
foreach my $key ( keys %$virtuals ) {
|
||||
$e_index{$key} = $virtuals->{$key};
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach my $key ( keys %$containers ) {
|
||||
$e_index{$key} = sprintf ("%02d", $key) . "000000";
|
||||
}
|
||||
}
|
||||
foreach my $key ( keys %$contents ) {
|
||||
$e_index{$key} = join( '', map { sprintf "%02d", $_ } split /\./, $key );
|
||||
}
|
||||
|
||||
return \%e_index;
|
||||
}
|
||||
|
||||
sub e_class {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_index = $juniper->e_index() || {};
|
||||
my $fru_type = $juniper->jnxFruType() || {};
|
||||
my $c_type = $juniper->jnxContainersDescr() || {};
|
||||
my $is_virtual = $juniper->_e_is_virtual();
|
||||
|
||||
my %e_class;
|
||||
foreach my $iid ( keys %$e_index ) {
|
||||
|
||||
my $type = $fru_type->{$iid} || 0;
|
||||
my $container = $c_type->{$iid} || 0;
|
||||
|
||||
if ( $type =~ /power/i ) {
|
||||
$e_class{$iid} = 'powerSupply';
|
||||
}
|
||||
elsif ( $type =~ /fan/i ) {
|
||||
$e_class{$iid} = 'fan';
|
||||
}
|
||||
elsif ( $type ) {
|
||||
$e_class{$iid} = 'module';
|
||||
}
|
||||
# Shouldn't get here if we have type which means
|
||||
# we only have container, chassis, and stack left
|
||||
elsif (($container =~ /chassis/i) and (!$is_virtual) ) {
|
||||
$e_class{$iid} = 'chassis';
|
||||
}
|
||||
elsif (($container =~ /chassis/i) and ($is_virtual)) {
|
||||
$e_class{$iid} = 'stack';
|
||||
}
|
||||
# Were calling the second level chassis a container in the case
|
||||
# of a virtual chassis but not sure that it really matters
|
||||
else {
|
||||
$e_class{$iid} = 'container';
|
||||
}
|
||||
}
|
||||
return \%e_class;
|
||||
}
|
||||
|
||||
sub e_descr {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_index = $juniper->e_index() || {};
|
||||
my $box_descr = $juniper->box_descr;
|
||||
my $contents = $juniper->jnxContentsDescr() || {};
|
||||
my $containers = $juniper->jnxContainersDescr() || {};
|
||||
|
||||
my %e_descr;
|
||||
foreach my $iid ( keys %$e_index ) {
|
||||
|
||||
my $content_descr = $contents->{$iid} || 0;
|
||||
my $container_descr = $containers->{$iid} || 0;
|
||||
|
||||
if ($content_descr) {
|
||||
$e_descr{$iid} = $content_descr;
|
||||
}
|
||||
elsif ($container_descr and $container_descr !~ /chassis/) {
|
||||
$e_descr{$iid} = $container_descr;
|
||||
}
|
||||
elsif ($container_descr and $container_descr =~ /chassis/) {
|
||||
$e_descr{$iid} = $box_descr;
|
||||
}
|
||||
# We should only be left with virtual entries created in
|
||||
# _e_virtual_index()
|
||||
elsif ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) {
|
||||
my $descr = $containers->{$1};
|
||||
$e_descr{$iid} = $descr;
|
||||
}
|
||||
# Anything past here undef
|
||||
}
|
||||
return \%e_descr;
|
||||
}
|
||||
|
||||
sub e_serial {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_index = $juniper->e_index() || {};
|
||||
my $serials = $juniper->jnxContentsSerialNo() || {};
|
||||
my $e_class = $juniper->e_class() || {};
|
||||
my $is_virtual = $juniper->_e_is_virtual();
|
||||
my $box_serial = $juniper->serial();
|
||||
|
||||
my %e_serial;
|
||||
foreach my $iid ( keys %$e_index ) {
|
||||
my $serial = $serials->{$iid} || '';
|
||||
my $class = $e_class->{$iid} || '';
|
||||
# Chassis serial number is seperate on true chassis
|
||||
# Virtual chassis (stack) report master switch serial
|
||||
if (!$is_virtual and ($class =~ /chassis/i)){
|
||||
$e_serial{$iid} = $box_serial;
|
||||
}
|
||||
elsif (($serial !~ /^\w/) or ($serial =~ /builtin/i)) {
|
||||
next;
|
||||
}
|
||||
else {
|
||||
$e_serial{$iid} = $serial;
|
||||
}
|
||||
}
|
||||
return \%e_serial;
|
||||
}
|
||||
|
||||
sub e_fru {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_index = $juniper->e_index() || {};
|
||||
my $frus = $juniper->jnxContentsPartNo() || {};
|
||||
|
||||
my %e_fru;
|
||||
foreach my $iid ( keys %$e_index ) {
|
||||
my $fru = $frus->{$iid} || '';
|
||||
if ( ($fru !~ /^\w/) or ($fru =~ /builtin/i)) {
|
||||
$e_fru{$iid} = "false";
|
||||
}
|
||||
else {
|
||||
$e_fru{$iid} = "true";
|
||||
}
|
||||
}
|
||||
return \%e_fru;
|
||||
}
|
||||
|
||||
sub e_type {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_index = $juniper->e_index() || {};
|
||||
my $contents = $juniper->e_contents_type() || {};
|
||||
my $containers = $juniper->e_containers_type() || {};
|
||||
|
||||
my %e_type;
|
||||
foreach my $iid ( keys %$e_index ) {
|
||||
|
||||
my $content_type = $contents->{$iid} || 0;
|
||||
my $container_type = $containers->{$iid} || 0;
|
||||
|
||||
if ($content_type) {
|
||||
$content_type =~ s/\.0//;
|
||||
$e_type{$iid} = $content_type;
|
||||
}
|
||||
elsif ($container_type) {
|
||||
$container_type =~ s/\.0//;
|
||||
$e_type{$iid} = $container_type;
|
||||
}
|
||||
# We should only be left with virtual entries created in
|
||||
# _e_virtual_index()
|
||||
elsif ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) {
|
||||
my $descr = $containers->{$1};
|
||||
$descr =~ s/\.0//;
|
||||
$e_type{$iid} = $descr;
|
||||
}
|
||||
# Anything past here undef
|
||||
}
|
||||
return \%e_type;
|
||||
}
|
||||
|
||||
sub e_vendor {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_idx = $juniper->e_index() || {};
|
||||
|
||||
my %e_vendor;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
$e_vendor{$iid} = 'juniper';
|
||||
}
|
||||
return \%e_vendor;
|
||||
}
|
||||
|
||||
sub e_pos {
|
||||
my $juniper = shift;
|
||||
|
||||
# We could look at index levels, but his will work as well
|
||||
return $juniper->e_index();
|
||||
}
|
||||
|
||||
sub e_parent {
|
||||
my $juniper = shift;
|
||||
|
||||
my $e_idx = $juniper->e_index() || {};
|
||||
my $c_within = $juniper->jnxContainersWithin() || {};
|
||||
my $e_descr = $juniper->e_descr() || {};
|
||||
my $is_virtual = $juniper->_e_is_virtual();
|
||||
|
||||
my %e_parent;
|
||||
foreach my $iid ( keys %$e_idx ) {
|
||||
next unless $iid;
|
||||
|
||||
my ($idx, $l1,$l2, $l3) = split /\./, $iid;
|
||||
my $within = $c_within->{$idx};
|
||||
my $descr = $e_descr->{$iid};
|
||||
|
||||
if ( !$is_virtual and ($iid =~ /^(\d+)\.\d+/) ) {
|
||||
$e_parent{$iid} = sprintf ("%02d", $1) . "000000";
|
||||
}
|
||||
elsif ( $is_virtual and ($descr =~ /chassis/i) and ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) ) {
|
||||
$e_parent{$iid} = sprintf ("%02d", $1) . "000000";
|
||||
}
|
||||
elsif ( $is_virtual and ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) ) {
|
||||
$e_parent{$iid} = sprintf ("%02d", $within) . sprintf ("%02d", $2) . "0000";
|
||||
}
|
||||
elsif ( $is_virtual and ($iid =~ /^(\d+)\.(\d+)\.[1-9]+/) ) {
|
||||
$e_parent{$iid} = sprintf ("%02d", $1) . sprintf ("%02d", $2) . "0000";
|
||||
}
|
||||
elsif ( defined $within and $iid =~ /\d+/ ) {
|
||||
$e_parent{$iid} = sprintf ("%02d", $within) . "000000";
|
||||
}
|
||||
else {
|
||||
next;
|
||||
}
|
||||
}
|
||||
return \%e_parent;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Juniper - SNMP Interface to L3 Juniper Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $juniper = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $juniper->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Juniper Devices running JUNOS
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<JUNIPER-VLAN-MIB> dated "200901090000Z" or later.
|
||||
|
||||
=item F<JUNIPER-CHASSIS-DEFINES-MIB>
|
||||
|
||||
=item F<JUNIPER-MIB>
|
||||
|
||||
=item F<JUNIPER-VIRTUALCHASSIS-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->vendor()
|
||||
|
||||
Returns 'juniper'
|
||||
|
||||
=item $juniper->os()
|
||||
|
||||
Returns 'junos'
|
||||
|
||||
=item $juniper->os_ver()
|
||||
|
||||
Returns the software version extracted first from C<sysDescr> or
|
||||
C<lldpLocSysDesc> if not available in C<sysDescr>.
|
||||
|
||||
=item $juniper->model()
|
||||
|
||||
Returns the model from C<sysObjectID>, with C<jnxProductName> removed from the
|
||||
beginning.
|
||||
|
||||
=item $juniper->serial()
|
||||
|
||||
Returns serial number
|
||||
|
||||
(C<jnxBoxSerialNo.0>)
|
||||
|
||||
=item $juniper->mac()
|
||||
|
||||
Returns the MAC address used by this bridge when it must be referred
|
||||
to in a unique fashion.
|
||||
|
||||
(C<dot1dBaseBridgeAddress>)
|
||||
|
||||
=item $juniper->box_descr()
|
||||
|
||||
The name, model, or detailed description of the device.
|
||||
|
||||
(C<jnxBoxDescr.0>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->v_index()
|
||||
|
||||
(C<jnxExVlanTag>)
|
||||
|
||||
=item $juniper->v_name()
|
||||
|
||||
(C<jnxExVlanName>)
|
||||
|
||||
=item $juniper->v_type()
|
||||
|
||||
(C<jnxExVlanType>)
|
||||
|
||||
=item $juniper->i_trunk()
|
||||
|
||||
(C<jnxExVlanPortAccessMode>)
|
||||
|
||||
=item $juniper->i_vlan()
|
||||
|
||||
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||
|
||||
=item $juniper->i_vlan_membership()
|
||||
|
||||
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||
IDs. These are the VLANs which are members of the egress list for the port.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Forwarding Table (C<dot1dTpFdbEntry>)
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses
|
||||
|
||||
(C<dot1dTpFdbAddress>)
|
||||
|
||||
=item $juniper->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (iid)
|
||||
|
||||
(C<dot1dTpFdbPort>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Pseudo F<ENTITY-MIB> information
|
||||
|
||||
These methods emulate F<ENTITY-MIB> Physical Table methods using
|
||||
F<JUNIPER-MIB> and F<JUNIPER-VIRTUALCHASSIS-MIB>.
|
||||
|
||||
=over
|
||||
|
||||
=item $juniper->e_index()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Integer, Indices are combined
|
||||
into a eight digit integer, each index is two digits padded with leading zero
|
||||
if required.
|
||||
|
||||
=item $juniper->e_class()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: General hardware type.
|
||||
|
||||
=item $juniper->e_descr()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Human friendly name
|
||||
|
||||
=item $juniper->e_hwver()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Hardware version
|
||||
|
||||
=item $juniper->e_vendor()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: juniper
|
||||
|
||||
=item $juniper->e_serial()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Serial number
|
||||
|
||||
=item $juniper->e_pos()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: The relative position among all
|
||||
entities sharing the same parent.
|
||||
|
||||
=item $juniper->e_type()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: Type of component/sub-component
|
||||
as defined in F<JUNIPER-CHASSIS-DEFINES-MIB>.
|
||||
|
||||
=item $juniper->e_parent()
|
||||
|
||||
Returns reference to hash. Key: IID, Value: The value of e_index() for the
|
||||
entity which 'contains' this entity. A value of zero indicates this entity
|
||||
is not contained in any other entity.
|
||||
|
||||
=item $entity->e_fru()
|
||||
|
||||
BOOLEAN. Is a Field Replaceable unit?
|
||||
|
||||
(C<entPhysicalFRU>)
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
271
Info/Layer3/Lantronix.pm
Normal file
271
Info/Layer3/Lantronix.pm
Normal file
@@ -0,0 +1,271 @@
|
||||
# SNMP::Info::Layer3::Lantronix
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2012 J R Binks
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Lantronix;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Lantronix::ISA = qw/
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
@SNMP::Info::Layer3::Lantronix::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'LANTRONIX-MIB' => 'products',
|
||||
'LANTRONIX-SLC-MIB' => 'slcNetwork',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'slc_os_ver' => 'slcSystemFWRev',
|
||||
'slc_serial' => 'slcSystemSerialNo',
|
||||
'slc_model' => 'slcSystemModel',
|
||||
'slc_psu_a_status' => 'slcDevPowerSupplyA',
|
||||
'slc_psu_b_status' => 'slcDevPowerSupplyB',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
# General notes:
|
||||
#
|
||||
# Products like the EDS have very minimal MIB support for the basics.
|
||||
# Much information has to be derived from sysDescr string.
|
||||
#
|
||||
sub vendor {
|
||||
return 'lantronix';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $device = shift;
|
||||
my $descr = $device->description() || '';
|
||||
my $os;
|
||||
|
||||
# On EDS, it is called the "Evolution OS"
|
||||
# Not sure what, if any, name it has a name on other products
|
||||
$os = 'EvolutionOS' if ( $descr =~ m/Lantronix EDS\w+ V([\d\.R]+)/ );
|
||||
|
||||
return 'LantronixOS';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $device = shift;
|
||||
my $descr = $device->description() || '';
|
||||
my $slc_os_ver = $device->slc_os_ver;
|
||||
my $os_ver;
|
||||
|
||||
return $slc_os_ver if defined $slc_os_ver;
|
||||
|
||||
return unless defined $descr;
|
||||
|
||||
# EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
|
||||
$os_ver = $1 if ( $descr =~ m/Lantronix EDS\w+ V([\d\.R]+)/ );
|
||||
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $device = shift;
|
||||
my $descr = $device->description() || '';
|
||||
my $slc_serial = $device->slc_serial;
|
||||
my $serial;
|
||||
|
||||
return $slc_serial if defined $slc_serial;
|
||||
|
||||
return unless defined $descr;
|
||||
|
||||
# EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
|
||||
$serial = $1 if ( $descr =~ m/Lantronix EDS\w+ V[\d\.R]+ \((\w+)\)/ );
|
||||
|
||||
return $serial;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $device = shift;
|
||||
my $descr = $device->description() || '';
|
||||
my $slc_model = $device->slc_model;
|
||||
my $model;
|
||||
|
||||
return $slc_model if defined $slc_model;
|
||||
|
||||
return unless defined $descr;
|
||||
|
||||
# EDS: "Lantronix EDS16PR V4.0.0.0R15 (1307.....X)"
|
||||
$model = $1 if ( $descr =~ m/Lantronix (EDS\w+)/ );
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub ps1_status {
|
||||
my $device = shift;
|
||||
my $slc_psu_a_status = $device->slc_psu_a_status;
|
||||
|
||||
return $slc_psu_a_status if defined $slc_psu_a_status;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub ps2_status {
|
||||
my $device = shift;
|
||||
my $slc_psu_b_status = $device->slc_psu_b_status;
|
||||
|
||||
return $slc_psu_b_status if defined $slc_psu_b_status;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Lantronix - SNMP Interface to Lantronix devices such as terminal servers
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
J R Binks
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $device = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'mydevice',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $device->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Lantronix devices such as terminal servers.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<LANTRONIX-MIB>
|
||||
|
||||
=item F<LANTRONIX-SLC-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP.
|
||||
|
||||
=over
|
||||
|
||||
=item $device->vendor()
|
||||
|
||||
Returns 'lantronix'.
|
||||
|
||||
=item $device->os()
|
||||
|
||||
Returns 'EvolutionOS' for EDS devices.
|
||||
|
||||
=item $device->os_ver()
|
||||
|
||||
Returns the software version.
|
||||
|
||||
=item $device->model()
|
||||
|
||||
Returns the model.
|
||||
|
||||
=item $device->serial()
|
||||
|
||||
Returns the serial number.
|
||||
|
||||
=item $device->ps1_status()
|
||||
|
||||
Power supply 1 status
|
||||
|
||||
=item $device->ps2_status()
|
||||
|
||||
Power supply 2 status
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $device->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Lantronix specific items
|
||||
|
||||
None at present.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
196
Info/Layer3/Microsoft.pm
Normal file
196
Info/Layer3/Microsoft.pm
Normal file
@@ -0,0 +1,196 @@
|
||||
# SNMP::Info::Layer3::Microsoft
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Microsoft;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Microsoft::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Microsoft::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'microsoft';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'windows';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
return '';
|
||||
}
|
||||
|
||||
sub model {
|
||||
return 'Windows Router';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
return '';
|
||||
}
|
||||
|
||||
# $l3->interfaces() - Map the Interfaces to their physical names
|
||||
# Add interface number to interface name because if MS Win
|
||||
# have identical interface cards ("HP NC7782 Gigabit Server Adapter"
|
||||
# for example), than MS Win return identical ifDescr
|
||||
sub interfaces {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->i_index($partial);
|
||||
my $descriptions = $l3->i_description($partial);
|
||||
|
||||
my %interfaces = ();
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $desc = $descriptions->{$iid};
|
||||
next unless defined $desc;
|
||||
|
||||
$interfaces{$iid} = sprintf( "(%U) %s", $iid, $desc );
|
||||
}
|
||||
|
||||
return \%interfaces;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Microsoft - SNMP Interface to L3 Microsoft Windows router
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
begemot
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $router = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $router->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Microsoft Routers running Microsoft Windows OS
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $router->vendor()
|
||||
|
||||
Returns C<'microsoft'>
|
||||
|
||||
=item $router->os()
|
||||
|
||||
Returns C<'windows'>
|
||||
|
||||
=item $router->os_ver()
|
||||
|
||||
Returns ''
|
||||
|
||||
=item $router->model()
|
||||
|
||||
Returns C<'Windows Router'>
|
||||
|
||||
=item $router->serial()
|
||||
|
||||
Returns ''
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $router->interfaces()
|
||||
|
||||
Map the Interfaces to their physical names. Adds interface number to
|
||||
interface name because identical interface cards return identical C<ifDescr>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
175
Info/Layer3/Mikrotik.pm
Normal file
175
Info/Layer3/Mikrotik.pm
Normal file
@@ -0,0 +1,175 @@
|
||||
# SNMP::Info::Layer3::Mikrotik
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Mikrotik;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Mikrotik::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Mikrotik::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'HOST-RESOURCES-MIB' => 'hrSystem',
|
||||
'MIKROTIK-MIB' => 'mtxrLicVersion',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'hrSystemUptime' => 'hrSystemUptime',
|
||||
'os_ver' => 'mtxrLicVersion',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'mikrotik';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $mikrotik = shift;
|
||||
my $descr = $mikrotik->description() || '';
|
||||
my $model = undef;
|
||||
$model = $1 if ( $descr =~ /^RouterOS\s+(\S+)$/i );
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'routeros';
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Mikrotik - SNMP Interface to Mikrotik devices
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Jeroen van Ingen
|
||||
initial version based on SNMP::Info::Layer3::NetSNMP by Bradley Baetz and Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $mikrotik = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $mikrotik->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Mikrotik devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<HOST-RESOURCES-MIB>
|
||||
|
||||
=item F<MIKROTIK-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $mikrotik->vendor()
|
||||
|
||||
Returns C<'mikrotik'>.
|
||||
|
||||
=item $mikrotik->os()
|
||||
|
||||
Returns C<'routeros'>.
|
||||
|
||||
=item $mikrotik->model()
|
||||
|
||||
Tries to extract the device model from C<sysDescr>.
|
||||
|
||||
=item $mikrotik->os_ver()
|
||||
|
||||
Returns the value of C<mtxrLicVersion>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
None.
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
|
||||
=cut
|
||||
319
Info/Layer3/N1600.pm
Normal file
319
Info/Layer3/N1600.pm
Normal file
@@ -0,0 +1,319 @@
|
||||
# SNMP::Info::Layer3::N1600 - SNMP Interface to Nortel N16XX devices
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::N1600;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::SONMP;
|
||||
|
||||
@SNMP::Info::Layer3::N1600::ISA
|
||||
= qw/SNMP::Info::Layer3 SNMP::Info::SONMP Exporter/;
|
||||
@SNMP::Info::Layer3::N1600::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::SONMP::MIBS,
|
||||
'SWL2MGMT-MIB' => 'swL2MgmtMIB',
|
||||
'RAPID-CITY' => 'rapidCity',
|
||||
);
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::SONMP::GLOBALS, );
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::SONMP::FUNCS,
|
||||
|
||||
# SWL2MGMT-MIB
|
||||
# swL2PortInfoTable
|
||||
'n1600_nway_status' => 'swL2PortInfoNwayStatus',
|
||||
|
||||
# swL2PortCtrlTable
|
||||
'n1600_nway_state' => 'swL2PortCtrlNwayState',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::SONMP::MUNGE,
|
||||
);
|
||||
|
||||
# Method OverRides
|
||||
|
||||
sub model {
|
||||
my $n1600 = shift;
|
||||
my $id = $n1600->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::N1600::model() - Device does not support sysObjectID\n"
|
||||
if $n1600->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^rcA//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'passport';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $n1600 = shift;
|
||||
my $descr = $n1600->description();
|
||||
return unless defined $descr;
|
||||
|
||||
if ( $descr =~ m/(\d+\.\d+\.\d+\.\d+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $n1600 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_index = $n1600->i_index($partial) || {};
|
||||
|
||||
my %if;
|
||||
foreach my $iid ( keys %$i_index ) {
|
||||
my $index = $i_index->{$iid};
|
||||
next unless defined $index;
|
||||
|
||||
my $slotport = "1.$index";
|
||||
$if{$iid} = $slotport;
|
||||
}
|
||||
return \%if;
|
||||
}
|
||||
|
||||
sub i_duplex {
|
||||
my $n1600 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $nway_status = $n1600->n1600_nway_status($partial) || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $iid ( keys %$nway_status ) {
|
||||
my $duplex = $nway_status->{$iid};
|
||||
next unless defined $duplex;
|
||||
next if $duplex =~ /other/i;
|
||||
$i_duplex{$iid} = 'half' if $duplex =~ /half/i;
|
||||
$i_duplex{$iid} = 'full' if $duplex =~ /full/i;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub i_duplex_admin {
|
||||
my $n1600 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $nway_state = $n1600->n1600_nway_state($partial) || {};
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $iid ( keys %$nway_state ) {
|
||||
my $duplex = $nway_state->{$iid};
|
||||
next unless defined $duplex;
|
||||
next if $duplex =~ /other/i;
|
||||
$i_duplex{$iid} = 'half' if $duplex =~ /half/i;
|
||||
$i_duplex{$iid} = 'full' if $duplex =~ /full/i;
|
||||
$i_duplex{$iid} = 'auto' if $duplex =~ /nway-enabled/i;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
# Required for SNMP::Info::SONMP
|
||||
sub index_factor {
|
||||
return 64;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::N1600 - SNMP Interface to Avaya/Nortel 16XX Network
|
||||
Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $n1600 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $n1600->class();
|
||||
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from an
|
||||
Avaya/Nortel N16XX device through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $n1600 = new SNMP::Info::Layer3::N1600(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::SONMP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<SWL2MGMT-MIB>
|
||||
|
||||
=item F<RAPID-CITY>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See classes listed above for their required MIBs.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $n1600->bulkwalk_no
|
||||
|
||||
Return C<1>. Bulkwalk is currently turned off for this class.
|
||||
|
||||
=item $n1600->model()
|
||||
|
||||
Returns model type. Checks $n1600->id() against the
|
||||
F<RAPID-CITY-MIB> and then parses out C<rcA>.
|
||||
|
||||
=item $n1600->vendor()
|
||||
|
||||
Returns 'avaya'
|
||||
|
||||
=item $n1600->os()
|
||||
|
||||
Returns 'passport'
|
||||
|
||||
=item $n1600->os_ver()
|
||||
|
||||
Returns os version extracted from C<sysDescr>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $n1600->index_factor()
|
||||
|
||||
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||
reserved per slot within the device MIB.
|
||||
|
||||
Returns 64 since largest switch has 48 ports. Since these switches can
|
||||
not stack, the only requirement to reserve more than the max number of ports.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in SNMP::SONMP::Layer3 for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $n1600->interfaces()
|
||||
|
||||
Returns reference to hash of interface names to iids.
|
||||
|
||||
Places a 1 in front of index number. This is required for compatibility with
|
||||
SNMP::Info::SONMP.
|
||||
|
||||
=item $n1600->i_duplex()
|
||||
|
||||
Returns reference to hash of interface operational link duplex status.
|
||||
|
||||
=item $n1600->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of interface administrative link duplex status.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||
|
||||
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
272
Info/Layer3/NetSNMP.pm
Normal file
272
Info/Layer3/NetSNMP.pm
Normal file
@@ -0,0 +1,272 @@
|
||||
# SNMP::Info::Layer3::NetSNMP
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::NetSNMP;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::NetSNMP::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::NetSNMP::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
'UCD-SNMP-MIB' => 'versionTag',
|
||||
'NET-SNMP-TC' => 'netSnmpAgentOIDs',
|
||||
'HOST-RESOURCES-MIB' => 'hrSystem',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
'netsnmp_vers' => 'versionTag',
|
||||
'hrSystemUptime' => 'hrSystemUptime',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'Net-SNMP';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $netsnmp = shift;
|
||||
my $descr = $netsnmp->description();
|
||||
|
||||
return $1 if ( $descr =~ /^(\S+)\s+/ );
|
||||
return;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $netsnmp = shift;
|
||||
my $descr = $netsnmp->description();
|
||||
my $vers = $netsnmp->netsnmp_vers();
|
||||
my $os_ver = undef;
|
||||
|
||||
$os_ver = $1 if ( $descr =~ /^\S+\s+\S+\s+(\S+)\s+/ );
|
||||
if ($vers) {
|
||||
$os_ver = "???" unless defined($os_ver);
|
||||
$os_ver .= " / Net-SNMP " . $vers;
|
||||
}
|
||||
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
return '';
|
||||
}
|
||||
|
||||
# sysUptime gives us the time since the SNMP daemon has restarted,
|
||||
# so return the system uptime since that's probably what the user
|
||||
# wants. (Caution: this could cause trouble if using
|
||||
# sysUptime-based discontinuity timers or other TimeStamp
|
||||
# objects.
|
||||
sub uptime {
|
||||
my $netsnmp = shift;
|
||||
my $uptime;
|
||||
|
||||
$uptime = $netsnmp->hrSystemUptime();
|
||||
return $uptime if defined $uptime;
|
||||
|
||||
return $netsnmp->SUPER::uptime();
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo0 etc
|
||||
if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::NetSNMP - SNMP Interface to L3 Net-SNMP Devices
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Bradley Baetz and Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $netsnmp = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $netsnmp->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Net-SNMP devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<UCD-SNMP-MIB>
|
||||
|
||||
=item F<NET-SNMP-TC>
|
||||
|
||||
=item F<HOST-RESOURCES-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $netsnmp->vendor()
|
||||
|
||||
Returns 'Net-SNMP'.
|
||||
|
||||
=item $netsnmp->os()
|
||||
|
||||
Returns the OS extracted from C<sysDescr>.
|
||||
|
||||
=item $netsnmp->os_ver()
|
||||
|
||||
Returns the software version extracted from C<sysDescr>, along
|
||||
with the Net-SNMP version.
|
||||
|
||||
=item $netsnmp->uptime()
|
||||
|
||||
Returns the system uptime instead of the agent uptime.
|
||||
NOTE: discontinuity timers and other Time Stamp based objects
|
||||
are based on agent uptime, so use orig_uptime().
|
||||
|
||||
=item $netsnmp->serial()
|
||||
|
||||
Returns ''.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $netsnmp->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP> for details.
|
||||
|
||||
=head1 NOTES
|
||||
|
||||
In order to cause SNMP::Info to classify your device into this class, it
|
||||
may be necessary to put a configuration line into your F<snmpd.conf>
|
||||
similar to
|
||||
|
||||
sysobjectid .1.3.6.1.4.1.8072.3.2.N
|
||||
|
||||
where N is the object ID for your OS from the C<NET-SNMP-TC> MIB (or
|
||||
255 if not listed). Some Net-SNMP installations default to an
|
||||
incorrect return value for C<system.sysObjectId>.
|
||||
|
||||
In order to recognize a Net-SNMP device as Layer3, it may be necessary
|
||||
to put a configuration line similar to
|
||||
|
||||
sysservices 76
|
||||
|
||||
in your F<snmpd.conf>.
|
||||
|
||||
=cut
|
||||
740
Info/Layer3/Netscreen.pm
Normal file
740
Info/Layer3/Netscreen.pm
Normal file
@@ -0,0 +1,740 @@
|
||||
# SNMP::Info::Layer3::Netscreen
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Netscreen;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::IEEE802dot11;
|
||||
|
||||
@SNMP::Info::Layer3::Netscreen::ISA
|
||||
= qw/SNMP::Info::Layer3 SNMP::Info::IEEE802dot11 Exporter/;
|
||||
@SNMP::Info::Layer3::Netscreen::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::IEEE802dot11::MIBS,
|
||||
'NETSCREEN-SMI' => 'netscreenSetting',
|
||||
'NETSCREEN-PRODUCTS-MIB' => 'netscreenGeneric',
|
||||
'NETSCREEN-INTERFACE-MIB' => 'nsIfIndex',
|
||||
'NETSCREEN-SET-GEN-MIB' => 'nsSetGenSwVer',
|
||||
'NETSCREEN-IP-ARP-MIB' => 'nsIpArpAOD',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||
'os_version' => 'nsSetGenSwVer',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||
|
||||
ns_i_index => 'nsIfIndex',
|
||||
ns_i_name => 'nsIfName',
|
||||
ns_i_description => 'nsIfDescr',
|
||||
ns_i_mac => 'nsIfMAC',
|
||||
ns_i_up => 'nsIfStatus',
|
||||
ns_ip_table => 'nsIfIp',
|
||||
ns_ip_netmask => 'nsIfNetmask',
|
||||
at_index => 'nsIpArpIfIdx',
|
||||
at_paddr => 'nsIpArpMac',
|
||||
at_netaddr => 'nsIpArpIp',
|
||||
bp_index => 'nsIfInfo',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::IEEE802dot11::MUNGE,
|
||||
'ns_i_mac' => \&SNMP::Info::munge_mac,
|
||||
'at_paddr' => \&SNMP::Info::munge_mac,
|
||||
);
|
||||
|
||||
sub layers {
|
||||
return '01001110';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'juniper';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'screenos';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $descr = $netscreen->description();
|
||||
if ( $descr =~ m/version (\d\S*) \(SN: / ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $e_serial = $netscreen->e_serial() || {};
|
||||
|
||||
my $serial = $e_serial->{1} || undef;
|
||||
|
||||
return $1 if ( defined $serial and $serial =~ /(\d+)/ );
|
||||
my $descr = $netscreen->description();
|
||||
if ( $descr =~ m/version .*\(SN: (\d\S*),/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $id = $netscreen->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
|
||||
if $netscreen->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^netscreen//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
# provides mapping from IF-MIB to nsIf interfaces - many to 1 (!)
|
||||
# - on WLAN devices wireless0/0(|-[ag]) -> wireless0/0 !!
|
||||
sub _if_nsif_map {
|
||||
my $netscreen = shift;
|
||||
my $i_descr = $netscreen->SUPER::i_description;
|
||||
my $ns_descr = $netscreen->i_description;
|
||||
my %if_nsif_map = ();
|
||||
my @ikeys = sort { $a <=> $b } keys %$i_descr;
|
||||
my @nskeys = sort { $a <=> $b } keys %$ns_descr;
|
||||
my $i = 0;
|
||||
my $n = 0;
|
||||
|
||||
# assumes descriptions are in the same order from both walks
|
||||
while ( $i < @ikeys && $n < @nskeys ) {
|
||||
|
||||
# find matching sub interfaces
|
||||
while (
|
||||
$i < @ikeys
|
||||
&& substr(
|
||||
$i_descr->{ $ikeys[$i] },
|
||||
0,
|
||||
length $ns_descr->{ $nskeys[$n] }
|
||||
) eq $ns_descr->{ $nskeys[$n] }
|
||||
)
|
||||
{
|
||||
|
||||
$if_nsif_map{ $ikeys[$i] } = $nskeys[$n];
|
||||
$i++;
|
||||
}
|
||||
|
||||
$n++;
|
||||
|
||||
# skip non-matching interfaces (e.g. tunnel.N)
|
||||
while (
|
||||
$i < @ikeys
|
||||
&& substr(
|
||||
$i_descr->{ $ikeys[$i] },
|
||||
0,
|
||||
length $ns_descr->{ $nskeys[$n] }
|
||||
) ne $ns_descr->{ $nskeys[$n] }
|
||||
&& $n < @nskeys
|
||||
)
|
||||
{
|
||||
|
||||
$if_nsif_map{ $ikeys[$i] } = 0; # no matching interface
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
return \%if_nsif_map;
|
||||
}
|
||||
|
||||
# Provides mapping from nsIf interfaces to IF-MIB interfaces - many to 1
|
||||
# Example, tunnel.# interfaces are not present in IF-MIB. There exist no
|
||||
# mapping of index IID's between the tables so create mapping based on names
|
||||
sub _nsif_if_map {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_descr = $netscreen->SUPER::i_description;
|
||||
my $ns_descr = $netscreen->i_description;
|
||||
my %rev_i_descr = reverse %$i_descr;
|
||||
my %rev_ns_descr = reverse %$ns_descr;
|
||||
|
||||
my %nsif_if_map = ();
|
||||
foreach my $value ( values %$ns_descr ) {
|
||||
if ( exists $rev_i_descr{$value} ) {
|
||||
$nsif_if_map{ $rev_ns_descr{$value} } = $rev_i_descr{$value};
|
||||
}
|
||||
else {
|
||||
$nsif_if_map{ $rev_ns_descr{$value} } = 0;
|
||||
}
|
||||
}
|
||||
return \%nsif_if_map;
|
||||
}
|
||||
|
||||
sub interfaces {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->i_description();
|
||||
}
|
||||
|
||||
sub i_index {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->ns_i_index();
|
||||
}
|
||||
|
||||
sub i_name {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->ns_i_name();
|
||||
}
|
||||
|
||||
sub i_description {
|
||||
my $netscreen = shift;
|
||||
|
||||
# Versions prior to 5.4 do not support nsIfDescr but do have nsIfName
|
||||
return $netscreen->ns_i_description() || $netscreen->ns_i_name();
|
||||
}
|
||||
|
||||
sub i_mac {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ns_mac = $netscreen->ns_i_mac() || {};
|
||||
my $if_i_mac = $netscreen->SUPER::i_mac() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
|
||||
my %i_mac = ();
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_mac{$iid} = $ns_mac->{$iid} || $if_i_mac->{ $ns_i_map->{$iid} };
|
||||
}
|
||||
|
||||
return \%i_mac;
|
||||
}
|
||||
|
||||
sub i_lastchange {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $if_i_lastchange = $netscreen->SUPER::i_lastchange() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_lastchange;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_lastchange{$iid} = $if_i_lastchange->{ $ns_i_map->{$iid} };
|
||||
}
|
||||
return \%i_lastchange;
|
||||
}
|
||||
|
||||
sub i_up {
|
||||
my $netscreen = shift;
|
||||
return $netscreen->ns_i_up();
|
||||
}
|
||||
|
||||
sub i_up_admin {
|
||||
my $netscreen = shift;
|
||||
my $i_up = $netscreen->i_up();
|
||||
my $i_up_admin = $netscreen->SUPER::i_up_admin();
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_up_admin;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_up_admin{$iid}
|
||||
= $i_up->{$iid} eq "up" && "up"
|
||||
|| $i_up_admin->{ $ns_i_map->{$iid} }
|
||||
|| 0;
|
||||
}
|
||||
return \%i_up_admin;
|
||||
}
|
||||
|
||||
sub i_type {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $if_i_type = $netscreen->SUPER::i_type() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_type;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_type{$iid} = $if_i_type->{ $ns_i_map->{$iid} } || "tunnel";
|
||||
}
|
||||
return \%i_type;
|
||||
}
|
||||
|
||||
sub i_mtu {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_type = $netscreen->SUPER::i_mtu() || {};
|
||||
my $ns_i_map = $netscreen->_nsif_if_map();
|
||||
my %i_mtu;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_mtu{$iid} = $i_type->{ $ns_i_map->{$iid} };
|
||||
}
|
||||
return \%i_mtu;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
return;
|
||||
}
|
||||
|
||||
sub i_speed {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_speed = $netscreen->SUPER::i_speed();
|
||||
my $i_name = $netscreen->i_name();
|
||||
my $ns_i_map = $netscreen->_nsif_if_map;
|
||||
my %i_speed;
|
||||
|
||||
foreach my $iid ( keys %$ns_i_map ) {
|
||||
$i_speed{$iid}
|
||||
= $i_speed->{ $ns_i_map->{$iid} }
|
||||
|| $i_name->{$iid} =~ /tunnel/ && "vpn"
|
||||
|| 0;
|
||||
}
|
||||
return \%i_speed;
|
||||
}
|
||||
|
||||
sub _mac_map {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $arp_mac = $netscreen->nsIpArpMac() || {};
|
||||
|
||||
my %mac_map = ();
|
||||
foreach my $iid ( keys %$arp_mac ) {
|
||||
my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
|
||||
$mac_map{$oid} = $iid;
|
||||
}
|
||||
return \%mac_map;
|
||||
}
|
||||
|
||||
sub ip_index {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ns_ip = $netscreen->ns_ip_table() || {};
|
||||
|
||||
my %ip_index = ();
|
||||
foreach my $iid ( keys %$ns_ip ) {
|
||||
$ip_index{ $ns_ip->{$iid} } = $iid if $ns_ip->{$iid} ne "0.0.0.0";
|
||||
}
|
||||
return \%ip_index;
|
||||
}
|
||||
|
||||
sub ip_table {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ip_index = $netscreen->ip_index() || {};
|
||||
|
||||
my %ip_table = ();
|
||||
foreach my $iid ( keys %$ip_index ) {
|
||||
$ip_table{$iid} = $iid;
|
||||
}
|
||||
return \%ip_table;
|
||||
}
|
||||
|
||||
sub ip_netmask {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $ip_index = $netscreen->ip_index() || {};
|
||||
my $ns_netmask = $netscreen->ns_ip_netmask();
|
||||
|
||||
my %ip_netmask = ();
|
||||
foreach my $iid ( keys %$ip_index ) {
|
||||
$ip_netmask{$iid} = $ns_netmask->{ $ip_index->{$iid} };
|
||||
}
|
||||
return \%ip_netmask;
|
||||
}
|
||||
|
||||
sub fw_index {
|
||||
my $netscreen = shift;
|
||||
my %fw_index = ();
|
||||
my $arp_mac = $netscreen->nsIpArpMac() || {};
|
||||
|
||||
foreach my $iid ( keys %$arp_mac ) {
|
||||
my $oid = join( ".", ( unpack( "C6", $arp_mac->{$iid} ) ) );
|
||||
$fw_index{$iid} = $oid;
|
||||
}
|
||||
return \%fw_index;
|
||||
}
|
||||
|
||||
sub fw_mac {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $mac_map = $netscreen->_mac_map() || {};
|
||||
|
||||
my %fw_mac = ();
|
||||
foreach my $oid ( keys %$mac_map ) {
|
||||
my $mac
|
||||
= join( ":", ( map { sprintf "%lx", $_ } split( /\./, $oid ) ) );
|
||||
$fw_mac{$oid} = $mac;
|
||||
}
|
||||
return \%fw_mac;
|
||||
}
|
||||
|
||||
sub bp_index {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $if_info = $netscreen->nsIfInfo() || {};
|
||||
|
||||
my %bp_index = ();
|
||||
foreach my $iid ( keys %$if_info ) {
|
||||
$bp_index{ $if_info->{$iid} } = $iid;
|
||||
}
|
||||
return \%bp_index;
|
||||
}
|
||||
|
||||
sub fw_port {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $fw_index = $netscreen->fw_index();
|
||||
my $arp_if = $netscreen->nsIpArpIfIdx() || {};
|
||||
|
||||
my %fw_port;
|
||||
foreach my $iid ( keys %$arp_if ) {
|
||||
$fw_port{ $fw_index->{$iid} } = $arp_if->{$iid}
|
||||
if defined $fw_index->{$iid};
|
||||
}
|
||||
return \%fw_port;
|
||||
}
|
||||
|
||||
# need to remap from IF-MIB index to nsIf index
|
||||
sub i_ssidlist {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_ssidlist = $netscreen->SUPER::i_ssidlist() || {};
|
||||
my $ns_i_map = $netscreen->_if_nsif_map();
|
||||
|
||||
my %i_ssidlist;
|
||||
foreach my $iid ( keys %$i_ssidlist ) {
|
||||
$i_ssidlist{ $ns_i_map->{$iid} } = $i_ssidlist->{$iid};
|
||||
}
|
||||
return \%i_ssidlist;
|
||||
}
|
||||
|
||||
sub i_80211channel {
|
||||
my $netscreen = shift;
|
||||
|
||||
my $i_80211channel = $netscreen->SUPER::i_80211channel() || {};
|
||||
my $ns_i_map = $netscreen->_if_nsif_map();
|
||||
|
||||
my %i_80211channel;
|
||||
foreach my $iid ( keys %$i_80211channel ) {
|
||||
$i_80211channel{ $ns_i_map->{$iid} } = $i_80211channel->{$iid};
|
||||
}
|
||||
return \%i_80211channel;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Netscreen - SNMP Interface to Juniper Netscreen Devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Kent Hamilton
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#Let SNMP::Info determine the correct subclass for you.
|
||||
|
||||
my $netscreen = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $netscreen->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Juniper Netscreen devices through SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::IEEE802dot11
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<NETSCREEN-SMI>
|
||||
|
||||
=item F<NETSCREEN-PRODUCTS-MIB>
|
||||
|
||||
=item F<NETSCREEN-INTERFACE-MIB>
|
||||
|
||||
=item F<NETSCREEN-SET-GEN-MIB>
|
||||
|
||||
=item F<NETSCREEN-IP-ARP-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->model()
|
||||
|
||||
Tries to reference $netscreen->id() to F<NETSCREEN-PRODUCTS-MIB>
|
||||
|
||||
=item $netscreen->vendor()
|
||||
|
||||
Returns C<'juniper'>
|
||||
|
||||
=item $netscreen->os()
|
||||
|
||||
Returns C<'screenos'>
|
||||
|
||||
=item $netscreen->os_ver()
|
||||
|
||||
Extracts the OS version from the description string.
|
||||
|
||||
=item $netscreen->serial()
|
||||
|
||||
Returns serial number.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->layers()
|
||||
|
||||
Returns 01001110. Device doesn't report layers properly, modified to reflect
|
||||
Layer 2 and 3 functionality.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=head3 Interface Information
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->interfaces()
|
||||
|
||||
Creates a map between the interface identifier (iid) and the physical port
|
||||
name.
|
||||
|
||||
Defaults to C<insIfDescr> if available, uses C<nsIfName> if not.
|
||||
|
||||
=item $netscreen->i_description()
|
||||
|
||||
Description of the interface. Uses C<insIfDescr> if available, C<nsIfName>
|
||||
if not.
|
||||
|
||||
=item $netscreen->i_ignore()
|
||||
|
||||
Returns without defining any interfaces to ignore.
|
||||
|
||||
=item $netscreen->i_index()
|
||||
|
||||
Default SNMP IID to Interface index.
|
||||
|
||||
(C<nsIfIndex>)
|
||||
|
||||
=item $netscreen->i_lastchange()
|
||||
|
||||
The value of C<sysUpTime> when this port last changed states (up,down),
|
||||
maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<ifLastChange>)
|
||||
|
||||
=item $netscreen->i_mac()
|
||||
|
||||
MAC address of the interface. Note this is just the MAC of the port, not
|
||||
anything connected to it. Uses C<nsIfMAC> if available, C<ifPhysAddress>
|
||||
if not.
|
||||
|
||||
=item $netscreen->i_mtu()
|
||||
|
||||
INTEGER. Interface MTU value, maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<ifMtu>)
|
||||
|
||||
=item $netscreen->i_name()
|
||||
|
||||
Interface Name field.
|
||||
|
||||
(C<nsIfName>)
|
||||
|
||||
=item $netscreen->i_speed()
|
||||
|
||||
Speed of the link, maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
=item $netscreen->i_type()
|
||||
|
||||
Interface type. Maps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<ifType>)
|
||||
|
||||
=item $netscreen->i_up()
|
||||
|
||||
Link Status of the interface. Typical values are 'up' and 'down'.
|
||||
|
||||
(C<nsIfStatus>)
|
||||
|
||||
=item $netscreen->i_up_admin()
|
||||
|
||||
Administrative status of the port. Checks both C<ifAdminStatus> and
|
||||
C<nsIfStatus>.
|
||||
|
||||
=back
|
||||
|
||||
=head3 IP Address Table
|
||||
|
||||
Each entry in this table is an IP address in use on this device.
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->ip_index()
|
||||
|
||||
Maps the IP Table to the IID
|
||||
|
||||
=item $netscreen->ip_table()
|
||||
|
||||
Maps the Table to the IP address
|
||||
|
||||
(C<nsIfIp>)
|
||||
|
||||
=item $netscreen->ip_netmask()
|
||||
|
||||
Gives netmask setting for IP table entry.
|
||||
|
||||
(C<nsIfNetmask>)
|
||||
|
||||
=back
|
||||
|
||||
=head3 Forwarding Table
|
||||
|
||||
Uses C<nsIpArpTable> to emulate the forwarding table.
|
||||
|
||||
=over
|
||||
|
||||
=item $netscreen->fw_index()
|
||||
|
||||
Maps the Forwarding Table to the IID
|
||||
|
||||
=item $netscreen->fw_mac()
|
||||
|
||||
Returns reference to hash of forwarding table MAC Addresses.
|
||||
|
||||
=item $netscreen->fw_port()
|
||||
|
||||
Returns reference to hash of forwarding table entries port interface
|
||||
identifier (IID).
|
||||
|
||||
=item $netscreen->bp_index()
|
||||
|
||||
Returns reference to hash of bridge port table entries map back to interface
|
||||
identifier (IID).
|
||||
|
||||
=back
|
||||
|
||||
=head3 Wireless Information
|
||||
|
||||
=over
|
||||
|
||||
=item $dot11->i_ssidlist()
|
||||
|
||||
Returns reference to hash. SSID's recognized by the radio interface.
|
||||
Remaps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
(C<dot11DesiredSSID>)
|
||||
|
||||
=item $dot11->i_80211channel()
|
||||
|
||||
Returns reference to hash. Current operating frequency channel of the radio
|
||||
interface. Remaps from C<ifIndex> to C<nsIfIndex>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
|
||||
|
||||
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
391
Info/Layer3/Nexus.pm
Normal file
391
Info/Layer3/Nexus.pm
Normal file
@@ -0,0 +1,391 @@
|
||||
# SNMP::Info::Layer3::Nexus
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Nexus;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::LLDP;
|
||||
use SNMP::Info::CDP;
|
||||
use SNMP::Info::CiscoImage;
|
||||
use SNMP::Info::CiscoPortSecurity;
|
||||
use SNMP::Info::CiscoConfig;
|
||||
use SNMP::Info::CiscoPower;
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::CiscoStpExtensions;
|
||||
use SNMP::Info::CiscoVTP;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
# NOTE : Top-most items gets precedence for @ISA
|
||||
@SNMP::Info::Layer3::Nexus::ISA = qw/
|
||||
SNMP::Info::CiscoVTP
|
||||
SNMP::Info::CiscoStpExtensions
|
||||
SNMP::Info::LLDP
|
||||
SNMP::Info::CDP
|
||||
SNMP::Info::CiscoImage
|
||||
SNMP::Info::CiscoPortSecurity
|
||||
SNMP::Info::CiscoConfig
|
||||
SNMP::Info::CiscoPower
|
||||
SNMP::Info::Layer3
|
||||
Exporter
|
||||
/;
|
||||
|
||||
@SNMP::Info::Layer3::Nexus::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
# NOTE: Order creates precedence
|
||||
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
|
||||
# Bridge is called from Layer3 and CiscoStpExtensions
|
||||
# So we want CiscoVTP to come last to get the right one.
|
||||
# The @ISA order should be reverse of these orders.
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::CiscoPower::MIBS,
|
||||
%SNMP::Info::CiscoConfig::MIBS,
|
||||
%SNMP::Info::CiscoPortSecurity::MIBS,
|
||||
%SNMP::Info::CiscoImage::MIBS,
|
||||
%SNMP::Info::CDP::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
%SNMP::Info::CiscoStpExtensions::MIBS,
|
||||
%SNMP::Info::CiscoVTP::MIBS,
|
||||
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevMIBObjects',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::CiscoPower::GLOBALS,
|
||||
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||
%SNMP::Info::CiscoImage::GLOBALS,
|
||||
%SNMP::Info::CDP::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
%SNMP::Info::CiscoStpExtensions::GLOBALS,
|
||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||
'mac' => 'dot1dBaseBridgeAddress',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::CiscoPower::FUNCS,
|
||||
%SNMP::Info::CiscoConfig::FUNCS,
|
||||
%SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||
%SNMP::Info::CiscoImage::FUNCS,
|
||||
%SNMP::Info::CDP::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
%SNMP::Info::CiscoStpExtensions::FUNCS,
|
||||
%SNMP::Info::CiscoVTP::FUNCS,
|
||||
);
|
||||
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::CiscoPower::MUNGE,
|
||||
%SNMP::Info::CiscoConfig::MUNGE,
|
||||
%SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||
%SNMP::Info::CiscoImage::MUNGE,
|
||||
%SNMP::Info::CDP::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
%SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||
%SNMP::Info::CiscoVTP::MUNGE,
|
||||
);
|
||||
|
||||
sub cisco_comm_indexing { return 1; }
|
||||
|
||||
sub vendor {
|
||||
return 'cisco';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'nx-os';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $nexus = shift;
|
||||
my $descr = $nexus->description();
|
||||
|
||||
return $1 if ( $descr =~ /\),\s+Version\s+(.+?),/ );
|
||||
return $descr;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $nexus = shift;
|
||||
|
||||
my $e_class = $nexus->e_class();
|
||||
|
||||
foreach my $iid ( keys %$e_class ) {
|
||||
my $class = $e_class->{$iid} || '';
|
||||
if ($class =~ /chassis/) {
|
||||
my $serial = $nexus->e_serial($iid);
|
||||
return $serial->{$iid};
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
# sysObjectID returns an IID to an entry in the CISCO-ENTITY-VENDORTYPE-OID-MIB.
|
||||
# Look it up and return it.
|
||||
sub model {
|
||||
my $nexus = shift;
|
||||
my $id = $nexus->id();
|
||||
|
||||
unless ( defined $id ) {
|
||||
print
|
||||
" SNMP::Info::Layer3::Nexus::model() - Device does not support sysObjectID\n"
|
||||
if $nexus->debug();
|
||||
return;
|
||||
}
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^cevChassis//i;
|
||||
return $model;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Nexus - SNMP Interface to Cisco Nexus Switches running
|
||||
NX-OS
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $nexus = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $nexus->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Abstraction subclass for Cisco Nexus Switches running NX-OS.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $nexus = new SNMP::Info::Layer3::Nexus(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::CiscoVTP
|
||||
|
||||
=item SNMP::Info::CDP
|
||||
|
||||
=item SNMP::Info::CiscoImage
|
||||
|
||||
=item SNMP::Info::CiscoPortSecurity
|
||||
|
||||
=item SNMP::Info::CiscoConfig
|
||||
|
||||
=item SNMP::Info::CiscoPower
|
||||
|
||||
=item SNMP::Info::CiscoStpExtensions
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
=back
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||
requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return a scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $nexus->vendor()
|
||||
|
||||
Returns 'cisco'
|
||||
|
||||
=item $nexus->os()
|
||||
|
||||
Returns C<'nx-os'>
|
||||
|
||||
=item $nexus->os_ver()
|
||||
|
||||
Returns operating system version extracted from C<sysDescr>.
|
||||
|
||||
=item $nexus->serial()
|
||||
|
||||
Returns the serial number of the chassis from F<ENTITY-MIB>.
|
||||
|
||||
=item $nexus->model()
|
||||
|
||||
Tries to reference $nexus->id() to F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
|
||||
|
||||
Removes C<'cevChassis'> for readability.
|
||||
|
||||
=item $nexus->mac()
|
||||
|
||||
C<dot1dBaseBridgeAddress>
|
||||
|
||||
=item $nexus->cisco_comm_indexing()
|
||||
|
||||
Returns 1. Use vlan indexing.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
|
||||
|
||||
=head2 Globals imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CDP
|
||||
|
||||
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
|
||||
details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoPower
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
|
||||
|
||||
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
220
Info/Layer3/PacketFront.pm
Normal file
220
Info/Layer3/PacketFront.pm
Normal file
@@ -0,0 +1,220 @@
|
||||
# SNMP::Info::Layer3::PacketFront
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::PacketFront;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::PacketFront::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::PacketFront::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
'UCD-SNMP-MIB' => 'versionTag',
|
||||
'NET-SNMP-TC' => 'netSnmpAgentOIDs',
|
||||
'HOST-RESOURCES-MIB' => 'hrSystem',
|
||||
'PACKETFRONT-PRODUCTS-MIB' => 'drg100',
|
||||
'PACKETFRONT-DRG-MIB' => 'productName',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'snmpd_vers' => 'versionTag',
|
||||
'hrSystemUptime' => 'hrSystemUptime',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'packetfront';
|
||||
}
|
||||
|
||||
sub os {
|
||||
# Only DRGOS for now (not tested with other product lines than DRG series)
|
||||
my $pfront = shift;
|
||||
my $descr = $pfront->description();
|
||||
if ( $descr =~ /drgos/i ) {
|
||||
return 'drgos';
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $pfront = shift;
|
||||
my $descr = $pfront->description();
|
||||
my $os_ver = undef;
|
||||
|
||||
if ( $descr =~ /Version:\sdrgos-(\w+)-([\w\-\.]+)/ ) {
|
||||
$os_ver = $2;
|
||||
}
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $pfront = shift;
|
||||
return $pfront->productSerialNo();
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo0 etc
|
||||
if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::PacketFront - SNMP Interface to PacketFront devices
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Jeroen van Ingen
|
||||
initial version based on SNMP::Info::Layer3::NetSNMP by Bradley Baetz and Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $pfront = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $pfront->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for PacketFront devices
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<UCD-SNMP-MIB>
|
||||
|
||||
=item F<NET-SNMP-TC>
|
||||
|
||||
=item F<HOST-RESOURCES-MIB>
|
||||
|
||||
=item F<PACKETFRONT-PRODUCTS-MIB>
|
||||
|
||||
=item F<PACKETFRONT-DRG-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $pfront->vendor()
|
||||
|
||||
Returns C<'packetfront'>.
|
||||
|
||||
=item $pfront->os()
|
||||
|
||||
Returns the OS extracted from C<sysDescr>.
|
||||
|
||||
=item $pfront->os_ver()
|
||||
|
||||
Returns the software version extracted from C<sysDescr>.
|
||||
|
||||
=item $pfront->serial()
|
||||
|
||||
Returns the value of C<productSerialNo>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $pfront->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3> for details.
|
||||
|
||||
|
||||
=cut
|
||||
File diff suppressed because it is too large
Load Diff
230
Info/Layer3/Pf.pm
Normal file
230
Info/Layer3/Pf.pm
Normal file
@@ -0,0 +1,230 @@
|
||||
# SNMP::Info::Layer3::Pf
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2010 Max Baker
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of Pf Networks, Inc. nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Pf;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::LLDP;
|
||||
|
||||
@SNMP::Info::Layer3::Pf::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Pf::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::LLDP::MIBS,
|
||||
# Enterprise container where BEGEMOT-* lives
|
||||
'FOKUS-MIB' => 'fokus',
|
||||
# MIBs used included in Layer3 and above:
|
||||
# UDP-MIB
|
||||
# TCP-MIB
|
||||
# IF-MIB
|
||||
#
|
||||
# Stuff in these MIBs but not used for Netdisco yet for my test device:
|
||||
#
|
||||
#'BEGEMOT-SNMPD-MIB',
|
||||
#'BEGEMOT-PF-MIB',
|
||||
#'BEGEMOT-NETGRAPH-MIB',
|
||||
#'BEGEMOT-MIB2-MIB',
|
||||
#'BEGEMOT-HOSTRES-MIB',
|
||||
# HOST-RESOURCES-MIB
|
||||
# IP-FORWARD-MIB
|
||||
#
|
||||
# Nothing in these MIBs for my test device:
|
||||
#
|
||||
#'BEGEMOT-IP-MIB',
|
||||
#'BEGEMOT-MIB',
|
||||
#'BEGEMOT-BRIDGE-MIB',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::LLDP::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::LLDP::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::LLDP::MUNGE,
|
||||
);
|
||||
|
||||
sub vendor {
|
||||
return 'FreeBSD';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $pf = shift;
|
||||
my $descr = $pf->description() || '';
|
||||
my $model = undef;
|
||||
$model = $1 if ( $descr =~ /FreeBSD\s+(\S+)/ );
|
||||
return $model if defined $model;
|
||||
return $pf->os_ver();
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'Pf';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $pf = shift;
|
||||
my $id = $pf->id();
|
||||
|
||||
my $os_ver = &SNMP::translateObj($id);
|
||||
return $id unless defined $os_ver;
|
||||
|
||||
# From /usr/share/snmp/defs/tree.def on a Pf Machine
|
||||
# (2 begemotSnmpdDefs
|
||||
# (1 begemotSnmpdAgent
|
||||
# (1 begemotSnmpdAgentFreeBSD OID op_dummy)
|
||||
# We're leaving the 1.1 and trimming off up to the 2
|
||||
$os_ver =~ s/fokus.1.1.2.//;
|
||||
return $os_ver;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Pf - SNMP Interface to FreeBSD-Based Firewalls using Pf /Pf Sense
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $pf = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $pf->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Free-BSD PF-Based devices
|
||||
|
||||
=head1 LLDP Support
|
||||
|
||||
LLDP Support is included but untested in this Device Class. It is reported
|
||||
that the available CDP/LLDP modules for net-snmp don't work on FreeBSD (on
|
||||
which pfSense is based) as they assume certain Linux specific Ethernet
|
||||
structures. This problem is apparently solved on PF based firewall appliances
|
||||
by using the ladvd package, for which a port may be found here:
|
||||
L<http://www.freshports.org/net/ladvd/>. I'm not sure if this module ties into
|
||||
Net-SNMP or not.
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::LLDP
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<FOKUS-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $pf->vendor()
|
||||
|
||||
Returns 'FreeBSD'
|
||||
|
||||
=item $pf->model()
|
||||
|
||||
Grabs the os version from C<sysDescr>
|
||||
|
||||
=item $pf->os()
|
||||
|
||||
Returns 'Pf'
|
||||
|
||||
=item $pf->os_ver()
|
||||
|
||||
Tries to reference $pf->id() to one of the product MIBs listed above.
|
||||
Will probably return a truncation of the default OID for pf-based systems
|
||||
C<enterprises.12325.1.1.2.1.1>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||
|
||||
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
189
Info/Layer3/SonicWALL.pm
Normal file
189
Info/Layer3/SonicWALL.pm
Normal file
@@ -0,0 +1,189 @@
|
||||
package SNMP::Info::Layer3::SonicWALL;
|
||||
|
||||
# Copyright (c) 2011 Netdisco Project
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::SonicWALL::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::SonicWALL::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
|
||||
'SNWL-COMMON-MIB' => 'snwlCommonModule',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
|
||||
#From SNWL-COMMON-MIB
|
||||
'sw_model' => 'snwlSysModel',
|
||||
'sw_serial' => 'snwlSysSerialNumber',
|
||||
'sw_firmware' => 'snwlSysFirmwareVersion',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'SonicWALL';
|
||||
}
|
||||
|
||||
sub os {
|
||||
my $sonicos = shift;
|
||||
my $swos = $sonicos->sw_firmware();
|
||||
if ($swos =~ /Enhanced/) {
|
||||
return 'SonicOS Enhanced';
|
||||
}
|
||||
return 'SonicOS Standard';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $sonicosver = shift;
|
||||
my $osver = $sonicosver->sw_firmware();
|
||||
if ( $osver =~ /\S+\s\S+\s(\S+)/) {
|
||||
return $1
|
||||
}
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $sw = shift;
|
||||
my $serial = $sw->sw_serial();
|
||||
return $serial;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $swmodel = shift;
|
||||
my $model = $swmodel->sw_model();
|
||||
return $model;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::SonicWALL - SNMP Interface to L3 SonicWALL Firewall
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
phishphreek@gmail.com
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $router = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $router->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic SonicWALL Firewalls
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $router->vendor()
|
||||
|
||||
Returns C<'SonicWALL'>
|
||||
|
||||
=item $router->os()
|
||||
|
||||
Returns C<'SonicOS'>
|
||||
|
||||
=item $router->os_ver()
|
||||
|
||||
Returns '4.2.0.0-10e'
|
||||
|
||||
=item $router->model()
|
||||
|
||||
Returns C<'PRO 3060 Enhanced'>
|
||||
|
||||
=item $router->serial()
|
||||
|
||||
Returns the MAC address of the first X0/LAN interface.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
|
||||
204
Info/Layer3/Sun.pm
Normal file
204
Info/Layer3/Sun.pm
Normal file
@@ -0,0 +1,204 @@
|
||||
# SNMP::Info::Layer3::Sun
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Sun;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Sun::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Sun::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
'sun_hostid' => '.1.3.6.1.4.1.42.3.1.2.0',
|
||||
'motd' => '.1.3.6.1.4.1.42.3.1.3.0',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'sun';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'sun';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $sun = shift;
|
||||
my $descr = $sun->motd();
|
||||
return unless defined $descr;
|
||||
|
||||
if ( $descr =~ m/SunOS (\S+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
return 'Solaris Router';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $sun = shift;
|
||||
my $serial = unpack( "H*", $sun->sun_hostid() );
|
||||
return $serial;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l3 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l3->interfaces($partial) || {};
|
||||
|
||||
my %i_ignore;
|
||||
foreach my $if ( keys %$interfaces ) {
|
||||
|
||||
# lo0
|
||||
if ( $interfaces->{$if} =~ /\blo0\b/i ) {
|
||||
$i_ignore{$if}++;
|
||||
}
|
||||
}
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Sun - SNMP Interface to L3 Sun Solaris
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
begemot
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $sun = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'mysunrouter',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $sun->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Generic Sun Routers running SunOS
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $sun->vendor()
|
||||
|
||||
Returns 'sun'
|
||||
|
||||
=item $sun->os()
|
||||
|
||||
Returns 'sun'
|
||||
|
||||
=item $sun->os_ver()
|
||||
|
||||
Returns the software version extracted from message of the day.
|
||||
|
||||
=item $sun->model()
|
||||
|
||||
Returns 'Solaris Router'
|
||||
|
||||
=item $sun->serial()
|
||||
|
||||
Returns serial number
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $sun->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
298
Info/Layer3/Tasman.pm
Normal file
298
Info/Layer3/Tasman.pm
Normal file
@@ -0,0 +1,298 @@
|
||||
# SNMP::Info::Layer3::Tasman
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Tasman;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
|
||||
use SNMP::Info::Layer3;
|
||||
use SNMP::Info::MAU;
|
||||
|
||||
@SNMP::Info::Layer3::Tasman::ISA = qw/SNMP::Info::MAU
|
||||
SNMP::Info::Layer3 Exporter/;
|
||||
@SNMP::Info::Layer3::Tasman::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer3::MIBS,
|
||||
%SNMP::Info::MAU::MIBS,
|
||||
'NT-ENTERPRISE-DATA-MIB' => 'ntEnterpriseRouters',
|
||||
'SYSTEM-MIB' => 'nnsysVersion',
|
||||
'CHASSIS-MIB' => 'nnchassisModel',
|
||||
'ENVIRONMENT-MIB' => 'nnenvPwrsupStatus',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer3::GLOBALS,
|
||||
%SNMP::Info::MAU::GLOBALS,
|
||||
'ps1_type' => 'nnenvPwrsupType.1',
|
||||
'ps1_status' => 'nnenvPwrsupStatus.1',
|
||||
'ps2_type' => 'nnenvPwrsupType.2',
|
||||
'ps2_status' => 'nnenvPwrsupStatus.2',
|
||||
'nn_sys_ver' => 'nnsysVersion',
|
||||
'nn_ch_model' => 'nnchassisModel',
|
||||
'nn_ch_op_stat' => 'nnchassisOperStatus',
|
||||
'nn_ch_serial' => 'nnchassisSerialNumber',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer3::FUNCS,
|
||||
%SNMP::Info::MAU::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
%SNMP::Info::Layer3::MUNGE,
|
||||
%SNMP::Info::MAU::MUNGE,
|
||||
);
|
||||
|
||||
# use MAU-MIB for admin. duplex and admin. speed
|
||||
*SNMP::Info::Layer3::Tasman::i_duplex_admin
|
||||
= \&SNMP::Info::MAU::mau_i_duplex_admin;
|
||||
*SNMP::Info::Layer3::Tasman::i_speed_admin
|
||||
= \&SNMP::Info::MAU::mau_i_speed_admin;
|
||||
|
||||
sub vendor {
|
||||
return 'avaya';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'tasman';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $tasman = shift;
|
||||
my $version = $tasman->nn_sys_ver() || "";
|
||||
my $descr = $tasman->description() || "";
|
||||
|
||||
# Newer versions
|
||||
return $1 if ( $version =~ /^SW:\s+(.+?)\s+/ );
|
||||
# Older versions
|
||||
return $1 if ( $descr =~ /Software Version\s+=\s+[r]*(.+),/);
|
||||
# Can't find
|
||||
return;
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $tasman = shift;
|
||||
|
||||
my $id = $tasman->id();
|
||||
my $ch_model = $tasman->nn_ch_model();
|
||||
|
||||
return $ch_model if $ch_model;
|
||||
|
||||
my $model = &SNMP::translateObj($id);
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^ntSecureRouter/SR/;
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $tasman = shift;
|
||||
|
||||
# Newer versions of the software redefined the MIB in a non-backwards
|
||||
# compatible manner. Try the old OID first.
|
||||
my $serial = $tasman->nn_ch_op_stat();
|
||||
# Newer versions populate status, serial should contain some numbers
|
||||
return $serial if ($serial !~ /^\D+$/);
|
||||
|
||||
# Unfortunately newer versions don't seem to populate the newer OID.
|
||||
return $tasman->nn_ch_serial();
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Tasman - SNMP Interface to Avaya Secure Routers
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $tasman = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $tasman->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Avaya Secure Routers
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=item SNMP::Info::MAU
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<NT-ENTERPRISE-DATA-MIB>
|
||||
|
||||
=item F<SYSTEM-MIB>
|
||||
|
||||
=item F<CHASSIS-MIB>
|
||||
|
||||
=item F<ENVIRONMENT-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar values from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $tasman->vendor()
|
||||
|
||||
Returns C<'avaya'>
|
||||
|
||||
=item $tasman->model()
|
||||
|
||||
Tries to get the model from C<nnchassisModel> and if not available
|
||||
cross references $tasman->id() to F<NT-ENTERPRISE-DATA-MIB>.
|
||||
|
||||
Substitutes 'SR' for C<'ntSecureRouter'> in the name for readability.
|
||||
|
||||
=item $tasman->os()
|
||||
|
||||
Returns C<'tasman'>
|
||||
|
||||
=item $tasman->os_ver()
|
||||
|
||||
Grabs the os version from C<nnsysVersion>
|
||||
|
||||
=item $tasman->ps1_type()
|
||||
|
||||
(C<nnenvPwrsupType.1>)
|
||||
|
||||
=item $tasman->ps1_status()
|
||||
|
||||
(C<nnenvPwrsupStatus.1>)
|
||||
|
||||
=item $tasman->ps2_type()
|
||||
|
||||
(C<nnenvPwrsupType.2>)
|
||||
|
||||
=item $tasman->ps2_status()
|
||||
|
||||
(C<nnenvPwrsupStatus.2>)
|
||||
|
||||
=item $tasman->nn_sys_ver()
|
||||
|
||||
(C<nnsysVersion.0>)
|
||||
|
||||
=item $tasman->nn_ch_model()
|
||||
|
||||
(C<nnchassisModel.0>)
|
||||
|
||||
=item $tasman->nn_ch_op_stat()
|
||||
|
||||
(C<nnchassisOperStatus.0>)
|
||||
|
||||
=item $tasman->nn_ch_serial()
|
||||
|
||||
(C<nnchassisSerialNumber.0>)
|
||||
|
||||
=item $tasman->serial()
|
||||
|
||||
Tries both (C<nnchassisOperStatus>) and (C<nnchassisSerialNumber>) as oid
|
||||
was redefined between versions.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over 4
|
||||
|
||||
=item $stack->i_duplex_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative duplex setting.
|
||||
|
||||
First checks for fixed gigabit ports which are always full duplex. Next checks
|
||||
the port administrative speed (C<portAdminSpeed>) which if set to
|
||||
autonegotiate then the duplex will also autonegotiate, otherwise it uses the
|
||||
reported port duplex (C<portDuplex>).
|
||||
|
||||
=item $stack->i_speed_admin()
|
||||
|
||||
Returns reference to hash of iid to administrative speed setting.
|
||||
|
||||
C<portAdminSpeed>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::MAU
|
||||
|
||||
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
194
Info/Layer3/Timetra.pm
Normal file
194
Info/Layer3/Timetra.pm
Normal file
@@ -0,0 +1,194 @@
|
||||
# SNMP::Info::Layer3::Timetra
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2008 Bill Fenner
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer3::Timetra;
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer3;
|
||||
|
||||
@SNMP::Info::Layer3::Timetra::ISA = qw/SNMP::Info::Layer3
|
||||
Exporter/;
|
||||
@SNMP::Info::Layer3::Timetra::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ( %SNMP::Info::Layer3::MIBS, 'TIMETRA-GLOBAL-MIB' => 'timetraReg', );
|
||||
|
||||
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||
|
||||
sub model {
|
||||
my $timetra = shift;
|
||||
my $id = $timetra->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
return $id unless defined $model;
|
||||
|
||||
$model =~ s/^tmnxModel//;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'TiMOS';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'alcatel-lucent';
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $timetra = shift;
|
||||
|
||||
my $descr = $timetra->description();
|
||||
if ( $descr =~ m/^TiMOS-(\S+)/ ) {
|
||||
return $1;
|
||||
}
|
||||
|
||||
# No clue what this will try but hey
|
||||
return $timetra->SUPER::os_ver();
|
||||
}
|
||||
|
||||
# The interface description contains the SFP type, so
|
||||
# to avoid losing historical information through a configuration change
|
||||
# we use interface name instead.
|
||||
sub interfaces {
|
||||
my $alu = shift;
|
||||
my $partial = shift;
|
||||
|
||||
return $alu->orig_i_name($partial);
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer3::Timetra - SNMP Interface to Alcatel-Lucent SR
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Bill Fenner
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $alu = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
# These arguments are passed directly to SNMP::Session
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $alu->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Alcatel-Lucent Service Routers
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer3
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<TIMETRA-GLOBAL-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $alu->vendor()
|
||||
|
||||
Returns 'alcatel-lucent'
|
||||
|
||||
=item $alu->os()
|
||||
|
||||
Returns 'TiMOS'
|
||||
|
||||
=item $alu->os_ver()
|
||||
|
||||
Grabs the version string from C<sysDescr>.
|
||||
|
||||
=item $alu->model()
|
||||
|
||||
Tries to reference $alu->id() to one of the product MIBs listed above
|
||||
|
||||
Removes 'tmnxModel' from the name for readability.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $alu->interfaces()
|
||||
|
||||
Returns C<ifName>, since the default Layer3 C<ifDescr> varies based
|
||||
upon the transceiver inserted.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||
|
||||
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
244
Info/Layer7.pm
Normal file
244
Info/Layer7.pm
Normal file
@@ -0,0 +1,244 @@
|
||||
# SNMP::Info::Layer7 - SNMP Interface to Layer7 Devices
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer7;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
@SNMP::Info::Layer7::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::Layer7::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::MIBS,
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::GLOBALS,
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::FUNCS,
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
# $l7->model() - Looks at sysObjectID which gives the oid of the system
|
||||
# name, contained in a proprietary MIB.
|
||||
sub model {
|
||||
my $l7 = shift;
|
||||
my $id = $l7->id();
|
||||
my $model = &SNMP::translateObj($id);
|
||||
|
||||
# Neoteris (Juniper IVE)
|
||||
$model =~ s/^ive//i;
|
||||
|
||||
return $model;
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
my $l7 = shift;
|
||||
my $id = $l7->id();
|
||||
my $vendor = 'unknown';
|
||||
if ( defined($id) && $id =~ /^(\.1\.3\.6\.1\.4\.1\.\d+)/ ) {
|
||||
my $enterprise = &SNMP::translateObj($1);
|
||||
$vendor = $enterprise if defined $enterprise;
|
||||
}
|
||||
return $vendor;
|
||||
}
|
||||
|
||||
# By Default we'll use the description field
|
||||
sub interfaces {
|
||||
my $l7 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $interfaces = $l7->i_index($partial) || {};
|
||||
my $i_descr = $l7->i_description($partial) || {};
|
||||
|
||||
# Replace the Index with the ifDescr field.
|
||||
foreach my $iid ( keys %$i_descr ) {
|
||||
my $port = $i_descr->{$iid};
|
||||
next unless defined $port;
|
||||
$interfaces->{$iid} = $port;
|
||||
}
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
sub i_ignore {
|
||||
my $l7 = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $i_type = $l7->i_type($partial) || {};
|
||||
|
||||
my %i_ignore = ();
|
||||
|
||||
foreach my $if ( keys %$i_type ) {
|
||||
my $type = $i_type->{$if};
|
||||
$i_ignore{$if}++
|
||||
if $type =~ /(loopback|other|cpu)/i;
|
||||
}
|
||||
|
||||
return \%i_ignore;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer7 - SNMP Interface to network devices serving Layer7 only.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $l7 = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 1
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $l7->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
# Let's get some basic Port information
|
||||
my $interfaces = $l7->interfaces();
|
||||
my $i_up = $l7->i_up();
|
||||
my $i_speed = $l7->i_speed();
|
||||
|
||||
foreach my $iid (keys %$interfaces) {
|
||||
my $port = $interfaces->{$iid};
|
||||
my $up = $i_up->{$iid};
|
||||
my $speed = $i_speed->{$iid}
|
||||
print "Port $port is $up. Port runs at $speed.\n";
|
||||
}
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This class is usually used as a superclass for more specific device classes
|
||||
listed under SNMP::Info::Layer7::* Please read all docs under SNMP::Info
|
||||
first.
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
Layer7 device through SNMP. Information is stored in a number of MIBs.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $l7 = new SNMP::Info::Layer7(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item None
|
||||
|
||||
=back
|
||||
|
||||
MIBs required for L<SNMP::Info/"Required MIBs">
|
||||
|
||||
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l7->model()
|
||||
|
||||
Cross references $l7->id() with product IDs.
|
||||
|
||||
=item $l7->vendor()
|
||||
|
||||
Tries to discover the vendor by looking up the enterprise number in
|
||||
C<sysObjectID>.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Global Methods imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=item $l7->interfaces()
|
||||
|
||||
Returns reference to the map between IID and physical Port.
|
||||
|
||||
=item $l7->i_ignore()
|
||||
|
||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
||||
|
||||
Ignores loopback, other, and cpu
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info
|
||||
|
||||
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||
|
||||
=cut
|
||||
237
Info/Layer7/APC.pm
Normal file
237
Info/Layer7/APC.pm
Normal file
@@ -0,0 +1,237 @@
|
||||
# SNMP::Info::Layer7::APC - SNMP Interface to APC UPS devices
|
||||
#
|
||||
# Copyright (c) 2011 Jeroen van Ingen
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer7::APC;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer7;
|
||||
|
||||
@SNMP::Info::Layer7::APC::ISA
|
||||
= qw/SNMP::Info::Layer7 Exporter/;
|
||||
@SNMP::Info::Layer7::APC::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer7::MIBS,
|
||||
'PowerNet-MIB' => 'upsBasicIdentModel',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer7::GLOBALS,
|
||||
'ups_serial' => 'upsAdvIdentSerialNumber.0',
|
||||
'mgmt_serial' => 'experimental.2.4.1.2.1',
|
||||
'os_ver' => 'experimental.2.4.1.4.1',
|
||||
'os_bin' => 'experimental.2.4.1.4.2',
|
||||
'ups_model' => 'upsBasicIdentModel.0',
|
||||
'ps1_status' => 'upsBasicOutputStatus.0',
|
||||
'ps2_status' => 'upsBasicBatteryStatus.0',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer7::FUNCS,
|
||||
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::Layer7::MUNGE,
|
||||
);
|
||||
|
||||
|
||||
# Method Overrides
|
||||
|
||||
sub os {
|
||||
return 'aos';
|
||||
}
|
||||
|
||||
sub vendor {
|
||||
return 'apc';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $apc = shift;
|
||||
return $apc->ups_model();
|
||||
}
|
||||
|
||||
sub serial {
|
||||
my $apc = shift;
|
||||
my $ups = $apc->ups_serial() || 'unknown';
|
||||
my $mgmt = $apc->mgmt_serial() || 'unknown';
|
||||
return sprintf("UPS: %s, management card: %s", $ups, $mgmt);
|
||||
}
|
||||
|
||||
sub ps1_type {
|
||||
return 'UPS status';
|
||||
}
|
||||
|
||||
sub ps2_type {
|
||||
return 'Battery status';
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer7::APC - SNMP Interface to APC UPS devices
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Jeroen van Ingen
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $apc = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myswitch',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $apc->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Provides abstraction to the configuration information obtainable from a
|
||||
APC UPS via SNMP.
|
||||
|
||||
For speed or debugging purposes you can call the subclass directly, but not
|
||||
after determining a more specific class using the method above.
|
||||
|
||||
my $apc = new SNMP::Info::Layer7::APC(...);
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer7
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<POWERNET-MIB>
|
||||
|
||||
=back
|
||||
|
||||
All required MIBs can be found in the netdisco-mibs package.
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $apc->os()
|
||||
|
||||
Returns C<'aos'>
|
||||
|
||||
=item $apc->os_bin()
|
||||
|
||||
C<POWERNET-MIB::experimental.2.4.1.4.2>
|
||||
|
||||
=item $apc->os_ver()
|
||||
|
||||
C<POWERNET-MIB::experimental.2.4.1.4.1>
|
||||
|
||||
=item $apc->serial()
|
||||
|
||||
Combines the UPS serial C<upsAdvIdentSerialNumber.0> with the management
|
||||
card serial C<POWERNET-MIB::experimental.2.4.1.2.1> into a pretty string.
|
||||
|
||||
=item $apc->vendor()
|
||||
|
||||
Returns C<'apc'>
|
||||
|
||||
=item $apc->model()
|
||||
|
||||
C<upsBasicIdentModel.0>
|
||||
|
||||
=item $apc->ps1_type()
|
||||
|
||||
Returns 'UPS status'
|
||||
|
||||
=item $apc->ps1_status()
|
||||
|
||||
Returns the main UPS status from C<upsBasicOutputStatus.0>
|
||||
|
||||
=item $apc->ps2_type()
|
||||
|
||||
Returns 'Battery status'
|
||||
|
||||
=item $apc->ps2_status()
|
||||
|
||||
Returns the battery status from C<upsBasicBatteryStatus.0>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7/"GLOBALS"> for details.
|
||||
|
||||
=head1 TABLE METHODS
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Overrides
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7/"TABLE METHODS"> for details.
|
||||
|
||||
=head1 MUNGES
|
||||
|
||||
=over
|
||||
|
||||
=back
|
||||
|
||||
=head1 SET METHODS
|
||||
|
||||
These are methods that provide SNMP set functionality for overridden methods
|
||||
or provide a simpler interface to complex set operations. See
|
||||
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
|
||||
operations.
|
||||
|
||||
=cut
|
||||
164
Info/Layer7/Neoteris.pm
Normal file
164
Info/Layer7/Neoteris.pm
Normal file
@@ -0,0 +1,164 @@
|
||||
# SNMP::Info::Layer7::Neoteris
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer7::Neoteris;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer7;
|
||||
|
||||
@SNMP::Info::Layer7::Neoteris::ISA = qw/SNMP::Info::Layer7 Exporter/;
|
||||
@SNMP::Info::Layer7::Neoteris::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer7::MIBS,
|
||||
'UCD-SNMP-MIB' => 'versionTag',
|
||||
'JUNIPER-IVE-MIB' => 'productVersion',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer7::GLOBALS,
|
||||
'os_ver' => 'productVersion',
|
||||
'cpu' => 'iveCpuUtil',
|
||||
);
|
||||
|
||||
%FUNCS = ( %SNMP::Info::Layer7::FUNCS, );
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer7::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'juniper';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'ive';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
return '';
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer7::Neoteris - SNMP Interface to Juniper SSL VPN appliances
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $neoteris = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $neoteris->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Juniper SSL VPN appliances
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer7
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<UCD-SNMP-MIB>
|
||||
|
||||
=item F<JUNIPER-IVE-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer7> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $neoteris->vendor()
|
||||
|
||||
Returns 'juniper'.
|
||||
|
||||
=item $neoteris->os()
|
||||
|
||||
Returns C<'ive'>.
|
||||
|
||||
=item $neoteris->os_ver()
|
||||
|
||||
C<productVersion>
|
||||
|
||||
=item $neoteris->cpu()
|
||||
|
||||
C<iveCpuUtil>
|
||||
|
||||
=item $neoteris->serial()
|
||||
|
||||
Returns ''.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7> for details.
|
||||
|
||||
=cut
|
||||
215
Info/Layer7/Netscaler.pm
Normal file
215
Info/Layer7/Netscaler.pm
Normal file
@@ -0,0 +1,215 @@
|
||||
# SNMP::Info::Layer7::Netscaler
|
||||
#
|
||||
# Copyright (c) 2012 Eric Miller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::Layer7::Netscaler;
|
||||
|
||||
use strict;
|
||||
use Exporter;
|
||||
use SNMP::Info::Layer7;
|
||||
|
||||
@SNMP::Info::Layer7::Netscaler::ISA = qw/SNMP::Info::Layer7 Exporter/;
|
||||
@SNMP::Info::Layer7::Netscaler::EXPORT_OK = qw//;
|
||||
|
||||
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = (
|
||||
%SNMP::Info::Layer7::MIBS,
|
||||
'NS-ROOT-MIB' => 'sysBuildVersion',
|
||||
);
|
||||
|
||||
%GLOBALS = (
|
||||
%SNMP::Info::Layer7::GLOBALS,
|
||||
'build_ver' => 'sysBuildVersion',
|
||||
'sys_hw_desc' => 'sysHardwareVersionDesc',
|
||||
'cpu' => 'resCpuUsage',
|
||||
);
|
||||
|
||||
%FUNCS = (
|
||||
%SNMP::Info::Layer7::FUNCS,
|
||||
# IP Address Table - NS-ROOT-MIB::nsIpAddrTable
|
||||
'ip_index' => 'ipAddr',
|
||||
'ip_netmask' => 'ipNetmask',
|
||||
# TODO VLAN - NS-ROOT-MIB::vlanTable
|
||||
'ns_vid' =>'vlanId',
|
||||
'ns_vlan_mem' => 'vlanMemberInterfaces',
|
||||
'ns_vtag_int' => 'vlanTaggedInterfaces',
|
||||
);
|
||||
|
||||
%MUNGE = ( %SNMP::Info::Layer7::MUNGE, );
|
||||
|
||||
sub vendor {
|
||||
return 'citrix';
|
||||
}
|
||||
|
||||
sub os {
|
||||
return 'netscaler';
|
||||
}
|
||||
|
||||
sub serial {
|
||||
return '';
|
||||
}
|
||||
|
||||
sub model {
|
||||
my $ns = shift;
|
||||
my $desc = $ns->sys_hw_desc() || '';
|
||||
|
||||
$desc =~ s/^.+\bNS//i;
|
||||
|
||||
return $desc;
|
||||
}
|
||||
|
||||
sub os_ver {
|
||||
my $ns = shift;
|
||||
my $ver = $ns->build_ver() || '';
|
||||
|
||||
if ($ver =~ /^.+\bNS(\d+\.\d+)/) {
|
||||
$ver = $1;
|
||||
}
|
||||
return $ver;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::Layer7::Netscaler - SNMP Interface to Citrix Netscaler appliances
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Eric Miller
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
# Let SNMP::Info determine the correct subclass for you.
|
||||
my $ns = new SNMP::Info(
|
||||
AutoSpecify => 1,
|
||||
Debug => 1,
|
||||
DestHost => 'myrouter',
|
||||
Community => 'public',
|
||||
Version => 2
|
||||
)
|
||||
or die "Can't connect to DestHost.\n";
|
||||
|
||||
my $class = $ns->class();
|
||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Subclass for Citrix Netscaler appliances
|
||||
|
||||
=head2 Inherited Classes
|
||||
|
||||
=over
|
||||
|
||||
=item SNMP::Info::Layer7
|
||||
|
||||
=back
|
||||
|
||||
=head2 Required MIBs
|
||||
|
||||
=over
|
||||
|
||||
=item F<NS-ROOT-MIB>
|
||||
|
||||
=item Inherited Classes' MIBs
|
||||
|
||||
See L<SNMP::Info::Layer7> for its own MIB requirements.
|
||||
|
||||
=back
|
||||
|
||||
=head1 GLOBALS
|
||||
|
||||
These are methods that return scalar value from SNMP
|
||||
|
||||
=over
|
||||
|
||||
=item $ns->vendor()
|
||||
|
||||
Returns 'citrix'.
|
||||
|
||||
=item $ns->os()
|
||||
|
||||
Returns 'netscaler'.
|
||||
|
||||
=item $ns->os_ver()
|
||||
|
||||
Release extracted from C<sysBuildVersion>.
|
||||
|
||||
=item $ns->model()
|
||||
|
||||
Model extracted from C<sysHardwareVersionDesc>.
|
||||
|
||||
=item $ns->cpu()
|
||||
|
||||
C<resCpuUsage>
|
||||
|
||||
=item $ns->build_ver()
|
||||
|
||||
C<sysBuildVersion>
|
||||
|
||||
=item $ns->sys_hw_desc()
|
||||
|
||||
C<sysHardwareVersionDesc>
|
||||
|
||||
=item $ns->serial()
|
||||
|
||||
Returns ''.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Globals imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7> for details.
|
||||
|
||||
=head1 TABLE ENTRIES
|
||||
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=over
|
||||
|
||||
=item $ns->ip_index()
|
||||
|
||||
C<ipAddr>
|
||||
|
||||
=item $ns->ip_netmask()
|
||||
|
||||
C<ipNetmask>
|
||||
|
||||
=back
|
||||
|
||||
=head2 Table Methods imported from SNMP::Info::Layer7
|
||||
|
||||
See documentation in L<SNMP::Info::Layer7> for details.
|
||||
|
||||
=cut
|
||||
372
Info/MAU.pm
372
Info/MAU.pm
@@ -1,121 +1,286 @@
|
||||
# SNMP::Info::MAU - Media Access Unit - RFC2668
|
||||
# Max Baker <max@warped.org>
|
||||
# SNMP::Info::MAU - Media Access Unit - RFC 2668
|
||||
# $Id$
|
||||
#
|
||||
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
|
||||
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||
#
|
||||
# Copyright (c) 2002,2003 Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the University of California, Santa Cruz nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
package SNMP::Info::MAU;
|
||||
$VERSION = 0.9;
|
||||
# $Id$
|
||||
|
||||
use strict;
|
||||
|
||||
use Exporter;
|
||||
use SNMP::Info;
|
||||
|
||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
|
||||
@SNMP::Info::MAU::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::MAU::ISA = qw/SNMP::Info Exporter/;
|
||||
@SNMP::Info::MAU::EXPORT_OK = qw//;
|
||||
|
||||
$DEBUG=0;
|
||||
$SNMP::debugging=$DEBUG;
|
||||
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||
|
||||
$INIT = 0;
|
||||
$VERSION = '3.03';
|
||||
|
||||
%MIBS = ('MAU-MIB' => 'mauMod');
|
||||
%MIBS = ( 'MAU-MIB' => 'mauMod' );
|
||||
|
||||
%GLOBALS = (
|
||||
);
|
||||
%GLOBALS = ();
|
||||
|
||||
%FUNCS = (
|
||||
# Interface MAU Table
|
||||
'mau_index' => 'ifMauIfIndex',
|
||||
'mau_link' => 'ifMauType',
|
||||
'mau_status' => 'ifMauStatus',
|
||||
'mau_up' => 'ifMauMediaAvailable',
|
||||
'mau_type' => 'ifMauTypeList',
|
||||
'mau_type_admin' => 'ifMauDefaultType',
|
||||
# Interface Auto-Negotiation Table
|
||||
'mau_auto' => 'ifMauAutoNegSupported',
|
||||
'mau_autostat' => 'ifMauAutoNegAdminStatus',
|
||||
'mau_autosent' => 'ifMauAutoNegCapAdvertised',
|
||||
'mau_autorec' => 'ifMauAutoNegCapReceived',
|
||||
);
|
||||
|
||||
# Interface MAU Table
|
||||
'mau_index' => 'ifMauIfIndex',
|
||||
'mau_link' => 'ifMauType',
|
||||
'mau_status' => 'ifMauStatus',
|
||||
'mau_up' => 'ifMauMediaAvailable',
|
||||
'mau_type' => 'ifMauTypeList',
|
||||
'mau_type_admin' => 'ifMauDefaultType',
|
||||
|
||||
# Interface Auto-Negotiation Table
|
||||
'mau_auto' => 'ifMauAutoNegSupported',
|
||||
'mau_autostat' => 'ifMauAutoNegAdminStatus',
|
||||
'mau_autosent' => 'ifMauAutoNegCapAdvertised',
|
||||
'mau_autorec' => 'ifMauAutoNegCapReceived',
|
||||
);
|
||||
|
||||
%MUNGE = (
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
# Add ones for our class
|
||||
'mau_type' => \&munge_int2bin,
|
||||
'mau_autosent' => \&munge_int2bin,
|
||||
'mau_autorec' => \&munge_int2bin,
|
||||
);
|
||||
|
||||
# Inherit all the built in munging
|
||||
%SNMP::Info::MUNGE,
|
||||
|
||||
# Add ones for our class
|
||||
'mau_type' => \&munge_int2bin,
|
||||
'mau_autosent' => \&munge_int2bin,
|
||||
'mau_autorec' => \&munge_int2bin,
|
||||
);
|
||||
|
||||
sub munge_int2bin {
|
||||
my $int = shift;
|
||||
return undef unless defined $int;
|
||||
return unpack("B32", pack("N", $int));
|
||||
return unless defined $int;
|
||||
return unpack( "B32", pack( "N", $int ) );
|
||||
}
|
||||
|
||||
sub _isfullduplex{
|
||||
my $mau = shift;
|
||||
sub _isfullduplex {
|
||||
my $mau = shift;
|
||||
my $mautype = shift;
|
||||
|
||||
my @full_types = qw/11 13 16 18 20/;
|
||||
foreach my $type ( @full_types ) {
|
||||
return 1 if (substr($mautype,32-$type,1) eq '1')
|
||||
foreach my $type (@full_types) {
|
||||
return 1 if ( substr( $mautype, 32 - $type, 1 ) eq '1' );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub _ishalfduplex{
|
||||
my $mau = shift;
|
||||
sub _ishalfduplex {
|
||||
my $mau = shift;
|
||||
my $mautype = shift;
|
||||
|
||||
my @half_types = qw/10 12 15 17 19/;
|
||||
foreach my $type ( @half_types ) {
|
||||
return 1 if (substr($mautype,32-$type,1) eq '1')
|
||||
foreach my $type (@half_types) {
|
||||
return 1 if ( substr( $mautype, 32 - $type, 1 ) eq '1' );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
my %_mau_i_speed_map = (
|
||||
'10' => '10 Mbps',
|
||||
'100' => '100 Mbps',
|
||||
'1000' => '1.0 Gbps',
|
||||
'10Gig' => '10 Gbps',
|
||||
);
|
||||
|
||||
sub mau_i_speed_admin {
|
||||
my $mau = shift;
|
||||
|
||||
my $mau_index = $mau->mau_index();
|
||||
my $mau_type_admin = $mau->mau_type_admin();
|
||||
|
||||
my %i_speed_admin;
|
||||
foreach my $mau_port ( keys %$mau_type_admin ) {
|
||||
my $iid = $mau_index->{$mau_port};
|
||||
next unless defined $iid;
|
||||
|
||||
my $type_adminoid = $mau_type_admin->{$mau_port};
|
||||
my $type_admin = &SNMP::translateObj($type_adminoid);
|
||||
next unless defined $type_admin;
|
||||
|
||||
if ( $type_adminoid eq '.0.0' ) {
|
||||
$i_speed_admin{$iid} = 'auto';
|
||||
}
|
||||
elsif ($type_admin =~ /^dot3MauType(.*)Base/
|
||||
&& $_mau_i_speed_map{$1} )
|
||||
{
|
||||
$i_speed_admin{$iid} = $_mau_i_speed_map{$1};
|
||||
}
|
||||
}
|
||||
return \%i_speed_admin;
|
||||
}
|
||||
|
||||
sub mau_i_duplex {
|
||||
my $mau = shift;
|
||||
|
||||
my $mau_index = $mau->mau_index();
|
||||
my $mau_link = $mau->mau_link();
|
||||
|
||||
my %i_duplex;
|
||||
foreach my $mau_port ( keys %$mau_link ) {
|
||||
my $iid = $mau_index->{$mau_port};
|
||||
next unless defined $iid;
|
||||
|
||||
my $linkoid = $mau_link->{$mau_port};
|
||||
my $link = &SNMP::translateObj($linkoid);
|
||||
next unless defined $link;
|
||||
|
||||
my $duplex = undef;
|
||||
|
||||
if ( $link =~ /fd$/i ) {
|
||||
$duplex = 'full';
|
||||
}
|
||||
elsif ( $link =~ /hd$/i ) {
|
||||
$duplex = 'half';
|
||||
}
|
||||
|
||||
$i_duplex{$iid} = $duplex if defined $duplex;
|
||||
}
|
||||
return \%i_duplex;
|
||||
}
|
||||
|
||||
sub mau_i_duplex_admin {
|
||||
my $mau = shift;
|
||||
my $partial = shift;
|
||||
|
||||
my $mau_index = $mau->mau_index() || {};
|
||||
|
||||
if ($partial) {
|
||||
my %rev_mau_index = reverse %$mau_index;
|
||||
$partial = $rev_mau_index{$partial};
|
||||
}
|
||||
|
||||
my $mau_autostat = $mau->mau_autostat($partial) || {};
|
||||
my $mau_type_admin = $mau->mau_type_admin($partial) || {};
|
||||
|
||||
# Older HP4000's don't implement ifMauDefaultType, but we can
|
||||
# figure out from ifMauAutoNegCapAdvertised what we'd like.
|
||||
if ( !defined($mau_type_admin) ) {
|
||||
if ( defined($mau_index) ) {
|
||||
return mau_i_duplex_admin_old( $mau, $mau_index, $mau_autostat );
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $mau_port ( keys %$mau_type_admin ) {
|
||||
my $iid = $mau_index->{$mau_port};
|
||||
next unless defined $iid;
|
||||
|
||||
my $autostat = $mau_autostat->{$mau_port};
|
||||
if ( defined $autostat and $autostat =~ /enabled/i ) {
|
||||
$i_duplex_admin{$iid} = 'auto';
|
||||
next;
|
||||
}
|
||||
|
||||
my $type_adminoid = $mau_type_admin->{$mau_port};
|
||||
my $type_admin = &SNMP::translateObj($type_adminoid);
|
||||
next unless defined $type_admin;
|
||||
|
||||
my $duplex = undef;
|
||||
|
||||
if ( $type_admin =~ /fd$/i ) {
|
||||
$duplex = 'full';
|
||||
}
|
||||
elsif ( $type_admin =~ /hd$/i ) {
|
||||
$duplex = 'half';
|
||||
}
|
||||
elsif ( $type_admin eq 'zeroDotZero' ) {
|
||||
$duplex = 'auto';
|
||||
}
|
||||
|
||||
$i_duplex_admin{$iid} = $duplex if defined $duplex;
|
||||
}
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
sub mau_i_duplex_admin_old {
|
||||
my $mau = shift;
|
||||
my $mau_index = shift;
|
||||
my $mau_autostat = shift;
|
||||
|
||||
my $interfaces = $mau->interfaces();
|
||||
my $mau_autosent = $mau->mau_autosent();
|
||||
|
||||
my %mau_reverse = reverse %$mau_index;
|
||||
|
||||
my %i_duplex_admin;
|
||||
foreach my $iid ( keys %$interfaces ) {
|
||||
my $mau_index = $mau_reverse{$iid};
|
||||
next unless defined $mau_index;
|
||||
|
||||
my $autostat = $mau_autostat->{$mau_index};
|
||||
|
||||
# HP25xx has this value
|
||||
if ( defined $autostat and $autostat =~ /enabled/i ) {
|
||||
$i_duplex_admin{$iid} = 'auto';
|
||||
next;
|
||||
}
|
||||
|
||||
my $type = $mau_autosent->{$mau_index};
|
||||
|
||||
next unless defined $type;
|
||||
|
||||
if ( $type == 0 ) {
|
||||
$i_duplex_admin{$iid} = 'none';
|
||||
next;
|
||||
}
|
||||
|
||||
my $full = $mau->_isfullduplex($type);
|
||||
my $half = $mau->_ishalfduplex($type);
|
||||
|
||||
if ( $full and !$half ) {
|
||||
$i_duplex_admin{$iid} = 'full';
|
||||
}
|
||||
elsif ($half) {
|
||||
$i_duplex_admin{$iid} = 'half';
|
||||
}
|
||||
}
|
||||
|
||||
return \%i_duplex_admin;
|
||||
}
|
||||
|
||||
1;
|
||||
__END__
|
||||
|
||||
|
||||
=head1 NAME
|
||||
|
||||
SNMP::Info::MAU - Perl5 Interface to Medium Access Unit (MAU) MIB (RFC2668) via SNMP
|
||||
SNMP::Info::MAU - SNMP Interface to Medium Access Unit (MAU) MIB (RFC 2668)
|
||||
via SNMP
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Max Baker (C<max@warped.org>)
|
||||
Max Baker
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -132,14 +297,15 @@ Max Baker (C<max@warped.org>)
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
SNMP::Info::MAU is a sublcass of SNMP::Info that supplies access to the
|
||||
MAU-MIB (RFC2668). This MIB is sometimes implemented on Layer 2 network devices like HP Switches.
|
||||
MAU = Media Access Unit.
|
||||
SNMP::Info::MAU is a subclass of SNMP::Info that supplies access to the
|
||||
F<MAU-MIB> (RFC 2668). This MIB is sometimes implemented on Layer 2 network
|
||||
devices like HP Switches. MAU = Media Access Unit.
|
||||
|
||||
The MAU table contains link and duplex info for the port itself and the device
|
||||
connected to that port.
|
||||
|
||||
Normally you use or create a subclass of SNMP::Info that inherits this one. Do not use directly.
|
||||
Normally you use or create a subclass of SNMP::Info that inherits this one.
|
||||
Do not use directly.
|
||||
|
||||
For debugging purposes call the class directly as you would SNMP::Info
|
||||
|
||||
@@ -153,7 +319,7 @@ None.
|
||||
|
||||
=over
|
||||
|
||||
=item MAU-MIB
|
||||
=item F<MAU-MIB>
|
||||
|
||||
=back
|
||||
|
||||
@@ -172,21 +338,50 @@ These are methods that return scalar value from SNMP
|
||||
These are methods that return tables of information in the form of a reference
|
||||
to a hash.
|
||||
|
||||
=head2 MAU INTERFACE TABLE ENTRIES
|
||||
|
||||
=over
|
||||
|
||||
=item $mau->mau_i_duplex()
|
||||
|
||||
Parses mau_index and mau_link to return the duplex information for
|
||||
interfaces.
|
||||
|
||||
=item $mau->mau_i_duplex_admin()
|
||||
|
||||
Parses C<mac_index>,C<mau_autostat>,C<mau_type_admin> in
|
||||
order to find the admin duplex setting for all the interfaces.
|
||||
|
||||
Returns either (auto,full,half).
|
||||
|
||||
=item $mau->mau_i_duplex_admin_old()
|
||||
|
||||
Called by mau_i_duplex_admin() if C<mau_type_admin> is empty.
|
||||
Parses C<mau_index>,C<mau_autostat>,C<mau_autosent> in
|
||||
order to find the admin duplex setting for all the interfaces.
|
||||
|
||||
Returns either (auto,none,full,half).
|
||||
|
||||
=item $mau->mau_i_speed_admin()
|
||||
|
||||
Returns admin speed setting for all the interfaces.
|
||||
|
||||
=back
|
||||
|
||||
=head2 MAU INTERFACE TABLE METHODS
|
||||
|
||||
=over
|
||||
|
||||
=item $mau->mau_index() - Returns a list of interfaces
|
||||
and their index in the MAU IF Table.
|
||||
|
||||
(B<ifMauIfIndex>)
|
||||
(C<ifMauIfIndex>)
|
||||
|
||||
=item $mau->mau_link() - Returns the type of Media Access used.
|
||||
|
||||
This is essentially the type of link in use.
|
||||
eg. dot3MauType100BaseTXFD - 100BaseT at Full Duplex
|
||||
|
||||
(B<ifMauType>)
|
||||
(C<ifMauType>)
|
||||
|
||||
=item $mau->mau_status() - Returns the admin link condition as
|
||||
|
||||
@@ -199,16 +394,16 @@ and their index in the MAU IF Table.
|
||||
|
||||
Use 5 and !5 to see if the link is up or down on the admin side.
|
||||
|
||||
(B<ifMauStatus>)
|
||||
(C<ifMauStatus>)
|
||||
|
||||
=item $mau->mau_up() - Returns the current link condition
|
||||
|
||||
(B<ifMauMediaAvailable>)
|
||||
(C<ifMauMediaAvailable>)
|
||||
|
||||
=item $mau->mau_type() - Returns a 32bit string reporting the capabilities
|
||||
of the port from a MAU POV.
|
||||
|
||||
Directly from the MAU-MIB :
|
||||
Directly from F<MAU-MIB> :
|
||||
Bit Capability
|
||||
0 other or unknown
|
||||
1 AUI
|
||||
@@ -232,26 +427,33 @@ of the port from a MAU POV.
|
||||
19 100BASE-T2 half duplex mode
|
||||
20 100BASE-T2 full duplex mode
|
||||
|
||||
(B<ifMauTypeList>)
|
||||
(C<ifMauTypeList>)
|
||||
|
||||
=item $mau->mau_type_admin()
|
||||
|
||||
(C<ifMauDefaultType>)
|
||||
|
||||
=item $mau->mau_auto() - Returns status of auto-negotiation mode for ports.
|
||||
|
||||
(B<ifMauAutoNegAdminStatus>)
|
||||
(C<ifMauAutoNegAdminStatus>)
|
||||
|
||||
=item $mau->mau_autostat()
|
||||
|
||||
(C<ifMauAutoNegAdminStatus>)
|
||||
|
||||
=item $mau->mau_autosent() - Returns a 32 bit bit-string representing the
|
||||
capabilities we are broadcasting on that port
|
||||
|
||||
Uses the same decoder as $mau->mau_type().
|
||||
|
||||
(B<ifMauAutoNegCapAdvertised>)
|
||||
|
||||
(C<ifMauAutoNegCapAdvertised>)
|
||||
|
||||
=item $mau->mau_autorec() - Returns a 32 bit bit-string representing the
|
||||
capabilities of the device on the other end.
|
||||
|
||||
Uses the same decoder as $mau->mau_type().
|
||||
|
||||
(B<ifMauAutoNegCapReceived>)
|
||||
(C<ifMauAutoNegCapReceived>)
|
||||
|
||||
=back
|
||||
|
||||
@@ -263,13 +465,13 @@ capabilities of the device on the other end.
|
||||
|
||||
=item $mau->_isfullduplex(bitstring)
|
||||
|
||||
Boolean. Checks to see if any of the full_duplex types from mau_type() are
|
||||
high. Currently bits 11,13,16,18,20.
|
||||
Boolean. Checks to see if any of the full_duplex types from mau_type()
|
||||
are high. Currently bits 11,13,16,18,20.
|
||||
|
||||
=item $mau->_ishalfduplex(bitstring)
|
||||
|
||||
Boolean. Checks to see if any of the half_duplex types from mau_type() are
|
||||
high. Currently bits 10,12,15,17,19.
|
||||
Boolean. Checks to see if any of the half_duplex types from mau_type()
|
||||
are high. Currently bits 10,12,15,17,19.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
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