Compare commits
878 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a264bb36cb | ||
|
|
c24e63ec4c | ||
|
|
6519570839 | ||
|
|
2c88544158 | ||
|
|
d0722d3677 | ||
|
|
d2b404763b | ||
|
|
88fb9e4df3 | ||
|
|
440ec276d3 | ||
|
|
6e91b90c48 | ||
|
|
0bfc8c5ed6 | ||
|
|
63547c2ea1 | ||
|
|
efecf1bbb7 | ||
|
|
682b8c2a9c | ||
|
|
88295e8c1e | ||
|
|
6764f15fd0 | ||
|
|
8b8ee8693e | ||
|
|
fe89001166 | ||
|
|
416a18377c | ||
|
|
8fda38184c | ||
|
|
280e9260f7 | ||
|
|
22642c1095 | ||
|
|
d68b2047b0 | ||
|
|
7240f034e5 | ||
|
|
97ce41e363 | ||
|
|
31a8abc3b8 | ||
|
|
6b49bfd4c4 | ||
|
|
985b4aab3f | ||
|
|
a4e7c3a61a | ||
|
|
d82d8781c4 | ||
|
|
b4c3f92ba3 | ||
|
|
1c57d2eab8 | ||
|
|
409de77b2c | ||
|
|
3e22e24dc9 | ||
|
|
17b1bdacfe | ||
|
|
b570fdbc89 | ||
|
|
cceb0f4e5e | ||
|
|
04f8c7f7e2 | ||
|
|
37aca89af7 | ||
|
|
5445a496db | ||
|
|
0ab93b142c | ||
|
|
d39dc76949 | ||
|
|
c6abd7b62b | ||
|
|
0e572db832 | ||
|
|
602bb15b47 | ||
|
|
b4882285c4 | ||
|
|
834b27bdad | ||
|
|
7db148a5a1 | ||
|
|
9e332095a2 | ||
|
|
7bf950026b | ||
|
|
f246444d89 | ||
|
|
8e84aea1bf | ||
|
|
d6a7a944cc | ||
|
|
fb478d3c7b | ||
|
|
24f8a8fdba | ||
|
|
28bbe0ee19 | ||
|
|
c21ca2062e | ||
|
|
e3e289a27c | ||
|
|
9540f6b9d3 | ||
|
|
539943fb0f | ||
|
|
7a8ebffd40 | ||
|
|
3d48f4e210 | ||
|
|
667cdbea13 | ||
|
|
f5fb4dd3b0 | ||
|
|
5a2722d049 | ||
|
|
f3b6cfbd01 | ||
|
|
e239a6057c | ||
|
|
9b1c439e15 | ||
|
|
074f2e7c8f | ||
|
|
4b1533e925 | ||
|
|
6812a60668 | ||
|
|
6f0cb846f0 | ||
|
|
c79307692b | ||
|
|
08b2f50ac7 | ||
|
|
3577fa1e42 | ||
|
|
cb6630582a | ||
|
|
ca5fff31a7 | ||
|
|
69b1f1e29e | ||
|
|
4e2b642ed1 | ||
|
|
3c26ce2a55 | ||
|
|
7d2cf97c06 | ||
|
|
cfce6296fb | ||
|
|
1601703ff2 | ||
|
|
905ad3e2b7 | ||
|
|
15b7e95545 | ||
|
|
247f6f038d | ||
|
|
7c6df7cce3 | ||
|
|
1a92306d51 | ||
|
|
59e9fae1d5 | ||
|
|
998094241d | ||
|
|
d6c3313138 | ||
|
|
b7e252b91a | ||
|
|
6071beb15d | ||
|
|
cda830686d | ||
|
|
a29b888620 | ||
|
|
ae5a4d413d | ||
|
|
03c4d1e81f | ||
|
|
4efa0fd509 | ||
|
|
c3a727ce10 | ||
|
|
afa97d845b | ||
|
|
8671f65bfd | ||
|
|
37737a6494 | ||
|
|
0ce8a55b88 | ||
|
|
22dd49c1dc | ||
|
|
fd5812aefc | ||
|
|
f4e37cdabe | ||
|
|
5324760463 | ||
|
|
27120045d2 | ||
|
|
abfd93ea1b | ||
|
|
070d911c60 | ||
|
|
8b14776c9a | ||
|
|
2d62372c7f | ||
|
|
3eae0b9d5c | ||
|
|
9a722bb2f8 | ||
|
|
d3e39a4132 | ||
|
|
d82d495dcf | ||
|
|
198df7cee4 | ||
|
|
46cdb4c166 | ||
|
|
62005c52d2 | ||
|
|
ca7651628d | ||
|
|
6358b7ad70 | ||
|
|
8aca1d97c0 | ||
|
|
275a533843 | ||
|
|
21bd4c662d | ||
|
|
47d9d091d1 | ||
|
|
da2ea09e84 | ||
|
|
9c71bdbcef | ||
|
|
318f9518b1 | ||
|
|
19e9fb5f67 | ||
|
|
41833c1f29 | ||
|
|
4e2f950e41 | ||
|
|
ebe3f39ea1 | ||
|
|
c6521d0b48 | ||
|
|
74b5c9f0e3 | ||
|
|
4bfebe1563 | ||
|
|
2ac4e65827 | ||
|
|
b7a135db10 | ||
|
|
d4c460fd3d | ||
|
|
8f0ac35381 | ||
|
|
a9a3229c22 | ||
|
|
5da622ff88 | ||
|
|
32f33f5150 | ||
|
|
242013f3b0 | ||
|
|
e46deb505f | ||
|
|
5d443fd1be | ||
|
|
d53152858c | ||
|
|
aefb31fb58 | ||
|
|
0be8219b9c | ||
|
|
cbb8bc5d77 | ||
|
|
6969dcbfec | ||
|
|
9e463ddddf | ||
|
|
5ec034c475 | ||
|
|
1694e648fc | ||
|
|
16aa96ebf4 | ||
|
|
43d06e184d | ||
|
|
3ff432034a | ||
|
|
0325bb1f25 | ||
|
|
b9aebf7e9e | ||
|
|
e1e693a7c8 | ||
|
|
c8c548fe97 | ||
|
|
ddf971ed54 | ||
|
|
61e8f47986 | ||
|
|
3ce9f403e6 | ||
|
|
3741010044 | ||
|
|
badfb12243 | ||
|
|
0713a6457c | ||
|
|
9abe744dac | ||
|
|
b4974aeacd | ||
|
|
688a0de498 | ||
|
|
7cef8465fa | ||
|
|
532279d2b8 | ||
|
|
d67ffc3a6c | ||
|
|
c6776b1755 | ||
|
|
49566977ad | ||
|
|
daf512e33e | ||
|
|
74816fc043 | ||
|
|
c88e37e9b5 | ||
|
|
c1c448f3df | ||
|
|
4f168a538b | ||
|
|
d94630af35 | ||
|
|
999dd1f468 | ||
|
|
c3d5631c3c | ||
|
|
9dae6b20d7 | ||
|
|
4005640a2b | ||
|
|
ca446faacf | ||
|
|
240539bd24 | ||
|
|
08e335f39c | ||
|
|
a9cc14b265 | ||
|
|
9505f119b3 | ||
|
|
683edf1668 | ||
|
|
d9c52c1a88 | ||
|
|
0f1a76a564 | ||
|
|
15cd354bae | ||
|
|
91d67ed0ae | ||
|
|
0740a7bd5e | ||
|
|
84493a99b4 | ||
|
|
f730fa3325 | ||
|
|
4b1007cb66 | ||
|
|
436f7442b6 | ||
|
|
3af05ebba5 | ||
|
|
c7db0371aa | ||
|
|
53860aaa46 | ||
|
|
829a4bf16a | ||
|
|
a83bc1bcb2 | ||
|
|
af65bb3a2b | ||
|
|
f2d9f6be27 | ||
|
|
ecea4ef4a4 | ||
|
|
e4e099510a | ||
|
|
de28ff96c2 | ||
|
|
6692ddcf1f | ||
|
|
ba7a105eb1 | ||
|
|
b9fb232859 | ||
|
|
6f54cb429e | ||
|
|
ae3398b11a | ||
|
|
e97693d12d | ||
|
|
435bb7dbe2 | ||
|
|
70bc5e78e9 | ||
|
|
a163e5b82c | ||
|
|
5eb66fe442 | ||
|
|
b6cf462b16 | ||
|
|
ead15a1cde | ||
|
|
9c19c70029 | ||
|
|
0862047241 | ||
|
|
6cfce1916d | ||
|
|
1e37bfa8ce | ||
|
|
87197067a0 | ||
|
|
8264f68f6c | ||
|
|
3e21357e8d | ||
|
|
ee5953d743 | ||
|
|
46f941b416 | ||
|
|
225e12e979 | ||
|
|
912ba274a6 | ||
|
|
18f59db2b9 | ||
|
|
f0ca1a5fa3 | ||
|
|
446e5a13f7 | ||
|
|
e8a9d18445 | ||
|
|
6256f33079 | ||
|
|
b5c4bd99bf | ||
|
|
56dae91c8a | ||
|
|
0661b1307a | ||
|
|
cd112f4925 | ||
|
|
14bf6b84d3 | ||
|
|
5c22a29e40 | ||
|
|
f1806f227b | ||
|
|
025e7b72b5 | ||
|
|
97b398051f | ||
|
|
e21d8516fb | ||
|
|
2972c70177 | ||
|
|
50b4274f68 | ||
|
|
75dc93f2c0 | ||
|
|
73fd627815 | ||
|
|
9e84141983 | ||
|
|
bd6591db7b | ||
|
|
515e876491 | ||
|
|
6105046ae9 | ||
|
|
f0eb0a9ded | ||
|
|
a227db586b | ||
|
|
04eafd3e61 | ||
|
|
3b25711e1f | ||
|
|
63687b5f8f | ||
|
|
cac2224fa1 | ||
|
|
44da7544b7 | ||
|
|
13478343cd | ||
|
|
a7aeae0aa2 | ||
|
|
876fb9946b | ||
|
|
e5853962b5 | ||
|
|
3eaa2ae230 | ||
|
|
cd1acd023e | ||
|
|
e2a314b553 | ||
|
|
102a2a03e8 | ||
|
|
8be0f9e06f | ||
|
|
40239ea078 | ||
|
|
47032cbb4a | ||
|
|
11dbeb2741 | ||
|
|
5242d16e02 | ||
|
|
428c007543 | ||
|
|
d0fbfdea86 | ||
|
|
b3fb18eee6 | ||
|
|
7d470fd0e8 | ||
|
|
295e6fb283 | ||
|
|
9e545e8cf8 | ||
|
|
182589745f | ||
|
|
bdfc430564 | ||
|
|
2da37f06ea | ||
|
|
eb5a492eb9 | ||
|
|
e79f031cb7 | ||
|
|
86909ae236 | ||
|
|
69861e7660 | ||
|
|
5054b1b5b5 | ||
|
|
a2496a536d | ||
|
|
f4ebe6a102 | ||
|
|
b10b922aa0 | ||
|
|
a8673cc076 | ||
|
|
2dd1cdc281 | ||
|
|
ccd03ae6d2 | ||
|
|
7e0771e065 | ||
|
|
e9fd3731a9 | ||
|
|
a5f242c28f | ||
|
|
43d1718618 | ||
|
|
d64f0d4a5e | ||
|
|
4a13ee8991 | ||
|
|
8764916086 | ||
|
|
78b0b77e38 | ||
|
|
8a7376f6df | ||
|
|
c9a36f12e6 | ||
|
|
8199e2a973 | ||
|
|
e1f3fb3a44 | ||
|
|
52275e92af | ||
|
|
5d9eec0992 | ||
|
|
cd9c637ba5 | ||
|
|
0bc405792a | ||
|
|
8fb36625bc | ||
|
|
674eca23b9 | ||
|
|
cfc1ead848 | ||
|
|
c41ffdfd2d | ||
|
|
df4708383b | ||
|
|
497c81a0c6 | ||
|
|
2c2f4a9ea1 | ||
|
|
feffa6d47e | ||
|
|
3bb33fa8d4 | ||
|
|
30a73c035a | ||
|
|
5c44fc0b28 | ||
|
|
a54b446dae | ||
|
|
631010ed3f | ||
|
|
8506638e5c | ||
|
|
c0f3a8eb2b | ||
|
|
662d870ad7 | ||
|
|
08746d6b10 | ||
|
|
bc8c8a6061 | ||
|
|
d09e5de229 | ||
|
|
1df1bda641 | ||
|
|
e8612e3779 | ||
|
|
a58d060310 | ||
|
|
a77c539f38 | ||
|
|
b5107b5634 | ||
|
|
6c880bb7b3 | ||
|
|
9297c70d11 | ||
|
|
bfafdc99d9 | ||
|
|
ab111a8e93 | ||
|
|
c2ce3d81e1 | ||
|
|
fb9813af51 | ||
|
|
4fb63d8a7b | ||
|
|
77982188bd | ||
|
|
8748932460 | ||
|
|
6c88df1ac0 | ||
|
|
cacb0777b7 | ||
|
|
bdf5a80868 | ||
|
|
ad1f1933e2 | ||
|
|
d7fe49a028 | ||
|
|
e802ccdc6e | ||
|
|
af2a881142 | ||
|
|
0ccf5409ca | ||
|
|
2529305803 | ||
|
|
bb8fb9d01a | ||
|
|
665f33a482 | ||
|
|
e5f948acda | ||
|
|
c28bbd5728 | ||
|
|
262fa5a3cd | ||
|
|
a58b774443 | ||
|
|
6deceb6bd1 | ||
|
|
808d3fd5c6 | ||
|
|
b82d3b82d9 | ||
|
|
cb8d780d70 | ||
|
|
01cd78c75d | ||
|
|
e7b289c399 | ||
|
|
a9b28c2270 | ||
|
|
5b059e6286 | ||
|
|
2c84636b7f | ||
|
|
2aba8dd8f1 | ||
|
|
41d68936b0 | ||
|
|
cb750624f9 | ||
|
|
bf3a37195b | ||
|
|
1e37f80368 | ||
|
|
5f9c2d3e62 | ||
|
|
c88449151e | ||
|
|
9c4f031581 | ||
|
|
3cac59adf4 | ||
|
|
77bcf720d3 | ||
|
|
e6b4c607e0 | ||
|
|
cbeb41c728 | ||
|
|
101aaa0a68 | ||
|
|
2233511fad | ||
|
|
8efa868ca3 | ||
|
|
e738d502ef | ||
|
|
2a7d5b51d9 | ||
|
|
67c4f160aa | ||
|
|
6d87313283 | ||
|
|
98e07690be | ||
|
|
c0bc769be9 | ||
|
|
01d9b0f291 | ||
|
|
2539692016 | ||
|
|
3a3fc548ca | ||
|
|
84d6cd18fb | ||
|
|
2d7b94e5a7 | ||
|
|
98eceb7c57 | ||
|
|
be92ec0379 | ||
|
|
34d4ec66a3 | ||
|
|
35c8ed6038 | ||
|
|
dd10a88ee2 | ||
|
|
71f0947988 | ||
|
|
d7cd3ff9e7 | ||
|
|
2567d6a5c9 | ||
|
|
5831d9e4ae | ||
|
|
690bc6bfa0 | ||
|
|
5f0e73bcb4 | ||
|
|
b1a7b67ae7 | ||
|
|
f0539d51ff | ||
|
|
1af34e3e25 | ||
|
|
0510dbfafc | ||
|
|
ca35689475 | ||
|
|
2ac1cc2308 | ||
|
|
0eebef47b0 | ||
|
|
29ef1301fb | ||
|
|
cfd5c5d9d7 | ||
|
|
347e1f9f59 | ||
|
|
2575320ec5 | ||
|
|
6c8ec356ec | ||
|
|
6e0712b189 | ||
|
|
906b1cb52f | ||
|
|
1eff8f8224 | ||
|
|
6a1f6d43cf | ||
|
|
8ab37354ff | ||
|
|
64340bf92e | ||
|
|
f0d490539e | ||
|
|
808464a7d0 | ||
|
|
3b8b70f760 | ||
|
|
cb58701af2 | ||
|
|
f05fbae8fc | ||
|
|
f1589d2ffe | ||
|
|
2d1df6c0e4 | ||
|
|
158596cede | ||
|
|
6c7df418af | ||
|
|
4e666d63b3 | ||
|
|
d1674dade2 | ||
|
|
ecb26a8b68 | ||
|
|
03785c4365 | ||
|
|
58c1d01b4a | ||
|
|
dc48aa08ba | ||
|
|
53f9cc8c3d | ||
|
|
0db888ef88 | ||
|
|
2ee8817103 | ||
|
|
71b0e7c60f | ||
|
|
740707539e | ||
|
|
ba088bf717 | ||
|
|
aa58a2ba56 | ||
|
|
ca9caf6e12 | ||
|
|
5a983c9600 | ||
|
|
d02c6ab450 | ||
|
|
4284cb8ea0 | ||
|
|
0743d4bce9 | ||
|
|
66ce0da9bc | ||
|
|
3e4f700a70 | ||
|
|
7518408d89 | ||
|
|
c5caffc75e | ||
|
|
086fea0349 | ||
|
|
f436c9f69c | ||
|
|
a153913d29 | ||
|
|
5189871fde | ||
|
|
daa0162639 | ||
|
|
4e6a452c87 | ||
|
|
a70a895a29 | ||
|
|
84bc3f5269 | ||
|
|
27f2bd1b26 | ||
|
|
38c63a3086 | ||
|
|
2c5301b676 | ||
|
|
1b85820314 | ||
|
|
3855c92564 | ||
|
|
ba85dc670b | ||
|
|
6221228d1f | ||
|
|
a901d9a61c | ||
|
|
0a0fac4ddb | ||
|
|
0e16cfecf6 | ||
|
|
838eb71a15 | ||
|
|
e373b1f74e | ||
|
|
b03e292d95 | ||
|
|
2139cb0212 | ||
|
|
35392a8c5c | ||
|
|
b7fab49da2 | ||
|
|
d0061b4ec9 | ||
|
|
2ffa82aff9 | ||
|
|
1c33f38323 | ||
|
|
4bb41fc368 | ||
|
|
c666fe30d8 | ||
|
|
1813e60cec | ||
|
|
4ae8f31c8f | ||
|
|
df466ac2eb | ||
|
|
846b3201b7 | ||
|
|
a2ab73c24a | ||
|
|
98e6693525 | ||
|
|
fed85592cb | ||
|
|
2b4a296128 | ||
|
|
c1b0e81b6c | ||
|
|
9a0915f3a1 | ||
|
|
a9481c86d2 | ||
|
|
5f0148dd72 | ||
|
|
dedefde79f | ||
|
|
8c421d333a | ||
|
|
97fbd36c6a | ||
|
|
e81344c357 | ||
|
|
33450039c7 | ||
|
|
5849f4ce3d | ||
|
|
70f20d2330 | ||
|
|
48e9b0b030 | ||
|
|
11db00b66c | ||
|
|
89dc775392 | ||
|
|
6d5f27fd3a | ||
|
|
e1ab8a43ba | ||
|
|
081325c68d | ||
|
|
004de3d29b | ||
|
|
8b5ba1e959 | ||
|
|
149e97c2d6 | ||
|
|
60cb2b8c20 | ||
|
|
a714c46fba | ||
|
|
692ccd0e97 | ||
|
|
e0aa0835cd | ||
|
|
845a0c4121 | ||
|
|
57a6ec56e3 | ||
|
|
4d53aa41e2 | ||
|
|
214534b211 | ||
|
|
5ac0d946a7 | ||
|
|
bd908a6952 | ||
|
|
400e94ea27 | ||
|
|
1d286d8388 | ||
|
|
bf79dd333f | ||
|
|
c882e63dad | ||
|
|
710e7afbe6 | ||
|
|
e51c9c1da2 | ||
|
|
b17f04e762 | ||
|
|
a6d16bdfc9 | ||
|
|
b6377596f8 | ||
|
|
b5d1210f72 | ||
|
|
af038c491b | ||
|
|
4af016ea4f | ||
|
|
a2d94315c3 | ||
|
|
e87e076b6a | ||
|
|
dfbc7cfd07 | ||
|
|
696efaad82 | ||
|
|
b435382a5e | ||
|
|
ea65ed57af | ||
|
|
f3058e4e9c | ||
|
|
75b570af95 | ||
|
|
840d8a48ba | ||
|
|
b5fec8dbde | ||
|
|
123dc84f05 | ||
|
|
98ceee3212 | ||
|
|
ab08aa1de1 | ||
|
|
e8c0a78e67 | ||
|
|
0c583b7838 | ||
|
|
7515cb0ab0 | ||
|
|
fc4d9cac24 | ||
|
|
8d496beceb | ||
|
|
ce1fac9e86 | ||
|
|
659d38b0db | ||
|
|
56a4238632 | ||
|
|
4c9f9d9876 | ||
|
|
533104ce55 | ||
|
|
06fd442dce | ||
|
|
8955e25c4f | ||
|
|
f543768c7b | ||
|
|
4c33cfecff | ||
|
|
2070f9b9e0 | ||
|
|
069695f570 | ||
|
|
ad300684c3 | ||
|
|
98d120717a | ||
|
|
1ebe34ce90 | ||
|
|
9565c908c6 | ||
|
|
85f36d3831 | ||
|
|
77aca4b628 | ||
|
|
7602c30d96 | ||
|
|
c5b2894d23 | ||
|
|
508a86b563 | ||
|
|
01faf96ccb | ||
|
|
3edb813da7 | ||
|
|
8cae0c74fb | ||
|
|
feefe2dcee | ||
|
|
7a40aa02ed | ||
|
|
5d9ac88750 | ||
|
|
93c54da5ba | ||
|
|
d9c87bdfbd | ||
|
|
6bbc902c75 | ||
|
|
79a4a55265 | ||
|
|
67081eed26 | ||
|
|
be37a24fc9 | ||
|
|
269d2b7be9 | ||
|
|
749ad55af1 | ||
|
|
866d28a36d | ||
|
|
1a3b3ae009 | ||
|
|
b5edc85a56 | ||
|
|
bb9e6f5101 | ||
|
|
9d37614f66 | ||
|
|
669989434c | ||
|
|
fb44b0b4b1 | ||
|
|
09f80eeed7 | ||
|
|
e5c81896aa | ||
|
|
7ad7d1e338 | ||
|
|
1b0c212a95 | ||
|
|
0dc9174c83 | ||
|
|
70197f35ee | ||
|
|
5c0cefefba | ||
|
|
54633a7b99 | ||
|
|
cde34cfc99 | ||
|
|
41dac34246 | ||
|
|
b1e0261216 | ||
|
|
84b1160c23 | ||
|
|
0cededc7ba | ||
|
|
0b932064ed | ||
|
|
c4c0cbb597 | ||
|
|
24662f2352 | ||
|
|
d460c5a473 | ||
|
|
87063bc4d3 | ||
|
|
948921930b | ||
|
|
dc494ff038 | ||
|
|
a98e163c7c | ||
|
|
e6428abc0b | ||
|
|
9597095b50 | ||
|
|
905272a3bc | ||
|
|
5da4035b03 | ||
|
|
435af3cf82 | ||
|
|
afc53b176b | ||
|
|
8624b0d63a | ||
|
|
1ac5cdd110 | ||
|
|
1be0292e78 | ||
|
|
523deb988a | ||
|
|
4ae815c6f9 | ||
|
|
d46b124674 | ||
|
|
df9a335052 | ||
|
|
038a6c7714 | ||
|
|
301d14acf0 | ||
|
|
c5a0e40065 | ||
|
|
b8c03fa9c1 | ||
|
|
3da742fa1d | ||
|
|
a1199f6ff0 | ||
|
|
4dc43891df | ||
|
|
7aede0a35e | ||
|
|
8b0239fdde | ||
|
|
ab632849bf | ||
|
|
cec6e00384 | ||
|
|
3656c6e42a | ||
|
|
b93278fa93 | ||
|
|
ff37bab36d | ||
|
|
f3783daf05 | ||
|
|
8c01484a5d | ||
|
|
d8994dc737 | ||
|
|
88890649bf | ||
|
|
d46842bd8e | ||
|
|
c240cfc854 | ||
|
|
81f5534a6a | ||
|
|
e60a1a6931 | ||
|
|
72e8f46633 | ||
|
|
d7c0959d27 | ||
|
|
862e8b6006 | ||
|
|
c9b47de8d1 | ||
|
|
0dd90a24dd | ||
|
|
9cfc0bcd64 | ||
|
|
1820299dcf | ||
|
|
acbfa7484b | ||
|
|
67fd776431 | ||
|
|
c04dd5b3b5 | ||
|
|
b8b2d337d5 | ||
|
|
8b0ffdf079 | ||
|
|
eb8328c36d | ||
|
|
2ab9bb0053 | ||
|
|
fae8e8396f | ||
|
|
cdccde0c7d | ||
|
|
ee829539c2 | ||
|
|
832679ac4f | ||
|
|
45af60459f | ||
|
|
2586fc9309 | ||
|
|
01cafebf89 | ||
|
|
9d530e2a62 | ||
|
|
c130b9a49e | ||
|
|
c10bf98500 | ||
|
|
83fb73389a | ||
|
|
f9933dcb4f | ||
|
|
74ccc599fe | ||
|
|
362acb9217 | ||
|
|
a3038adbd0 | ||
|
|
8015e59161 | ||
|
|
7a94ddcc26 | ||
|
|
4e73ff2bae | ||
|
|
257eb48e70 | ||
|
|
cf1564d598 | ||
|
|
e83380c7c5 | ||
|
|
799a06b63a | ||
|
|
b55e15a568 | ||
|
|
6b3edc3232 | ||
|
|
f65332f9cc | ||
|
|
3416928233 | ||
|
|
4d262872c8 | ||
|
|
795ae41d68 | ||
|
|
2e17b5c64a | ||
|
|
ddca296e2a | ||
|
|
af5d1d6c03 | ||
|
|
2f07667560 | ||
|
|
1fac4cb13c | ||
|
|
aa8c86ddcd | ||
|
|
83751acf91 | ||
|
|
01dc21e338 | ||
|
|
0b8f6db97a | ||
|
|
23dd87c294 | ||
|
|
9a19d3a6f6 | ||
|
|
ba6e02ea5e | ||
|
|
1426f7656d | ||
|
|
53ebeacc09 | ||
|
|
bd6cc8d7f4 | ||
|
|
19018f364e | ||
|
|
be0391bfa8 | ||
|
|
bfc36df82b | ||
|
|
5134f4163c | ||
|
|
4939a18a6c | ||
|
|
8aee915872 | ||
|
|
eeac8fd9a2 | ||
|
|
07db467827 | ||
|
|
8bed2081b9 | ||
|
|
f0e0b9063c | ||
|
|
41907297f8 | ||
|
|
2e0392a6db | ||
|
|
3c4b8911f5 | ||
|
|
3db7164f9f | ||
|
|
cfe3c34ab6 | ||
|
|
ceac50e33e | ||
|
|
b71ba01d32 | ||
|
|
5cc00d443c | ||
|
|
4edb3115e5 | ||
|
|
33435d89e4 | ||
|
|
f5c93b3413 | ||
|
|
59fbe71c56 | ||
|
|
4f6b5f0883 | ||
|
|
23eb3b596d | ||
|
|
55b2a27f40 | ||
|
|
5e46120b52 | ||
|
|
4b70bfa7c8 | ||
|
|
c530e25e02 | ||
|
|
409065375e | ||
|
|
32ccc2857f | ||
|
|
c1025cb76f | ||
|
|
1f6a738cda | ||
|
|
8f10a4f16e | ||
|
|
50d9fdefb3 | ||
|
|
d777d98396 | ||
|
|
75e7b0c6b0 | ||
|
|
9fc965d095 | ||
|
|
10b4611e81 | ||
|
|
f416f7cc49 | ||
|
|
50d9070f36 | ||
|
|
14db80441c | ||
|
|
6193e661f5 | ||
|
|
3e69394cca | ||
|
|
88cdcebe2d | ||
|
|
20024f8c50 | ||
|
|
40caf6cc0e | ||
|
|
2d3b28b973 | ||
|
|
325b087bd1 | ||
|
|
0703a5f777 | ||
|
|
c4a4749bcf | ||
|
|
1fd0facbe0 | ||
|
|
bc9ab17f2d | ||
|
|
22fd4f73a9 | ||
|
|
4de346fa39 | ||
|
|
e14c749f66 | ||
|
|
c0f1872f04 | ||
|
|
70944f0589 | ||
|
|
d2b4c85d37 | ||
|
|
a4cc2f5514 | ||
|
|
fa8f91d508 | ||
|
|
7966400cf2 | ||
|
|
3227540322 | ||
|
|
183f8bde3a | ||
|
|
62133dfedf | ||
|
|
eb833c69e3 | ||
|
|
53d96a2e32 | ||
|
|
efc1682877 | ||
|
|
8846bb2f0f | ||
|
|
558c80aa84 | ||
|
|
f905638e5b | ||
|
|
d1636f0fe9 | ||
|
|
1d1193c459 | ||
|
|
4a2e62be2d | ||
|
|
137cc84ca6 | ||
|
|
e744df1dca | ||
|
|
378dc6bc19 | ||
|
|
3f2f722dab | ||
|
|
25f57d65a5 | ||
|
|
f5dba96839 | ||
|
|
3a1d04eb38 | ||
|
|
adac25b3dd | ||
|
|
9b2229e3eb | ||
|
|
bf040dffa9 | ||
|
|
86a12cd2a6 | ||
|
|
bfcb56f06d | ||
|
|
9a4a336c78 | ||
|
|
6696eeeb9d | ||
|
|
4da90c4f9b | ||
|
|
88f31110a7 | ||
|
|
afab6191b2 | ||
|
|
7ce87ebd3d | ||
|
|
d8e1e932ae | ||
|
|
089430de17 | ||
|
|
dce0a40ebb | ||
|
|
2347edad82 | ||
|
|
0ab5eb2bf1 | ||
|
|
d314ffe897 | ||
|
|
1162dc3a7b | ||
|
|
0967634043 | ||
|
|
133355bc9d | ||
|
|
76c734dc01 | ||
|
|
3128e3e5f6 | ||
|
|
c9ebd5ae28 | ||
|
|
b6efcd86dd | ||
|
|
a0323aacd2 | ||
|
|
258b7551ff | ||
|
|
7a023554eb | ||
|
|
b557c9d890 | ||
|
|
8dae0aad96 | ||
|
|
902383cab7 | ||
|
|
a1eb6e5831 | ||
|
|
3656d4c514 | ||
|
|
e899f76249 | ||
|
|
d38bfcbbf7 | ||
|
|
0f654f5aaa | ||
|
|
6cab3ad6b3 | ||
|
|
6685e4dd77 | ||
|
|
2b42f25d1e | ||
|
|
85359ddf59 | ||
|
|
1e198a8d8e | ||
|
|
6bd545d307 | ||
|
|
bc53167731 | ||
|
|
9a5135b9e1 | ||
|
|
8193143459 | ||
|
|
61ac00d7fb | ||
|
|
7944613d42 | ||
|
|
ff07325a05 | ||
|
|
afe5436749 | ||
|
|
ade9d7ef32 | ||
|
|
6a397d7c72 | ||
|
|
933bbaf00b | ||
|
|
1bd53dda51 | ||
|
|
5595fea427 | ||
|
|
31661b1374 | ||
|
|
780965728e | ||
|
|
a7570d9e58 | ||
|
|
b6989e8ada | ||
|
|
f9f4daea94 | ||
|
|
ab175a747c | ||
|
|
2a10991980 | ||
|
|
95d3d45e66 | ||
|
|
d808fc1e6f | ||
|
|
e8f81b17fa | ||
|
|
db871c590c | ||
|
|
de464b2e6a | ||
|
|
e0acc5ce90 | ||
|
|
a1f913d91e | ||
|
|
d19b71073d | ||
|
|
ed66350c27 | ||
|
|
51d57b39f5 | ||
|
|
68524eb337 | ||
|
|
58f8ed29c7 | ||
|
|
3b96232e13 | ||
|
|
19b5d34c10 | ||
|
|
5bb4252cf0 | ||
|
|
8191d5f957 | ||
|
|
1c458c9ca9 | ||
|
|
36f84e357e | ||
|
|
c1b7d7dfc0 | ||
|
|
bbd45f82ab | ||
|
|
02f3e91c5d | ||
|
|
d5afa9f592 | ||
|
|
dceec4f537 | ||
|
|
51b09605df | ||
|
|
dc00c7d907 | ||
|
|
c6df2928a1 | ||
|
|
86bf9fd360 | ||
|
|
505de8c6dc | ||
|
|
70744f3df2 | ||
|
|
96393d5781 | ||
|
|
598c075670 | ||
|
|
ac8eef8f73 | ||
|
|
f5eb4e8bb6 | ||
|
|
abb7fe7f3c |
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*.db
|
||||||
|
SNMP
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
All code from version 0.7 on
|
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.
|
All rights reserved.
|
||||||
|
|
||||||
Original Code
|
Original Code
|
||||||
|
|||||||
665
ChangeLog
665
ChangeLog
@@ -1,5 +1,653 @@
|
|||||||
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
|
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
|
||||||
ChangeLog $Id$
|
|
||||||
|
version 3.15 (2014-07-10)
|
||||||
|
|
||||||
|
[NEW FEATURES]
|
||||||
|
|
||||||
|
* Offline mode and Cache export/priming.
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* Return serial number for Cisco 3850 from entPhysicalSerialNum
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* Cisco SB serial number probably did not work
|
||||||
|
|
||||||
|
version 3.14 (2014-06-07)
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* Improvements to Mikrotik module (Alex Z)
|
||||||
|
* Don't unshift length from broken lldpRemManAddrTable implementations (G. Shtern)
|
||||||
|
* 802.3ad LAG support in Layer3::H3C
|
||||||
|
* Add LLDP capabilities to Layer2::HPVC class
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* Return correct VLAN info with qb_fw_table() on Layer2::HP
|
||||||
|
|
||||||
|
version 3.13 (2014-03-27)
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* Cisco PAgP support added to LAG method
|
||||||
|
* HP ProCurve LAG support by inheriting Info::Aggregate class
|
||||||
|
|
||||||
|
version 3.12 (2014-02-10)
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* Modify L3::Passport to obtain forwarding table information from
|
||||||
|
RAPID-CITY if information is not available in either Q-BRIDGE-MIB or
|
||||||
|
BRIDGE-MIB. Needed for VSP 9000 prior to version 4.x (Tobias Gerlach)
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* [#52] NETSCREEN-IP-ARP-MIB considered harmful
|
||||||
|
* Foundry/Brocade aggreate port master ifIndex resolved properly
|
||||||
|
|
||||||
|
version 3.11 (2014-01-26)
|
||||||
|
|
||||||
|
[NEW FEATURES]
|
||||||
|
|
||||||
|
* [#31] port-channel (aggregate) support. Aggregate support added in new
|
||||||
|
agg_ports() method. Inital support added for Arista (ifStack),
|
||||||
|
Avaya (MLT), Brocade (MST), and Cisco (802.3ad).
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* Use Q-BRIDGE-MIB as default with fallback to BRIDGE-MIB across all
|
||||||
|
classes for the fw_mac, fw_port, and fw_status methods
|
||||||
|
* Additional support for Avaya 8800 series in L3::Passport
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* Modify cdp_cap() to handle devices which return space delimited strings
|
||||||
|
for cdpCacheCapabilities rather than hex strings
|
||||||
|
* [#51] Netdisco shows broken topology for devices with no alias entry
|
||||||
|
for primary IP - Collect nsIfMngIp when getting IP interfaces in
|
||||||
|
L3::Netscreen
|
||||||
|
* Fix Extreme XOS i_vlan_membership - Revert [28bbe0], fix bug with
|
||||||
|
untagged being added to @ret twice (Robert Kerr)
|
||||||
|
* Skip default CPU management addresses on VSP and 8800/8600 series in
|
||||||
|
L3::Passport to prevent erroneous duplicate addresses
|
||||||
|
|
||||||
|
version 3.10 (2013-12-16)
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* Data values of zero are now sent to munge method instead of skipped
|
||||||
|
|
||||||
|
version 3.09 (2013-12-15)
|
||||||
|
|
||||||
|
[NEW FEATURES]
|
||||||
|
|
||||||
|
* [#45] IBM (Blade Network Technologies) Rackswitch support in new class
|
||||||
|
L3::IBMGbTor
|
||||||
|
* [] set_i_untagged combines both set_i_vlan and set_i_pvid in one method
|
||||||
|
* [#41] Riverbed Steelhead support added in new class L3::Steelhead
|
||||||
|
* New c_cap(), cdp_cap(), and lldp_cap() methods which return a hash of
|
||||||
|
arrays with each array containing the system capabilities reported as
|
||||||
|
supported by the remote system via CDP or LLDP.
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* Remove "Switch" from model name in L3::Foundry
|
||||||
|
* [#49] IOS-XR support, add identification of IOS XR and version in
|
||||||
|
CiscoStats
|
||||||
|
* Aruba POE Support
|
||||||
|
* Aruba utilizes Q-BRIDGE-MIB when available for VLAN information to
|
||||||
|
better support wired switches
|
||||||
|
* Add lldp_platform() method which uses lldp_rem_sysdesc() or
|
||||||
|
lldp_rem_sysname() to provide a clue to type of remote LLDP capable
|
||||||
|
device.
|
||||||
|
* [RT#78232] Extend cdpCacheCapabilities to show more CDP bits
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* Modify _xos_i_vlan_membership() in L3::Extreme to only include tagged
|
||||||
|
ports
|
||||||
|
* When determining the BSSID in Airespace there is only one hexadecimal
|
||||||
|
digit available so skip if outside the range of 1-16, 17 is reserved
|
||||||
|
for 3rd party AP's
|
||||||
|
* Don't assume entity index 1 is the chassis and has serial in Layer3
|
||||||
|
* Capture serial number on newer Aruba devices
|
||||||
|
* munge_bits() correctly unpacks BITS
|
||||||
|
* Fix for single instance table leafs in test_class_mocked.pl
|
||||||
|
* Fix power module indexing
|
||||||
|
|
||||||
|
version 3.08 (2013-10-22)
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* Rewrite of L3::Aruba, now supports pseudo ENTITY-MIB methods to gather
|
||||||
|
module information, more interface information for APs, more
|
||||||
|
wireless information to include client stats, and arpnip information
|
||||||
|
from wireless clients. WARNING: AP device interfaces are now based on
|
||||||
|
AP MAC and radio versus BSSID to align with other wireless classes.
|
||||||
|
* [#64] Add i_speed_admin() to L2::2900 (psychiatric)
|
||||||
|
* [#66] Support for VSS via CISCO-VIRTUAL-SWITCH-MIB in L3::6500
|
||||||
|
* [#67] Add the possibility to set speed for Layer3::C4000 (psychiatric)
|
||||||
|
* [#69] set speed and duplex on Cisco VSS system (psychiatric)
|
||||||
|
* munge_null() now removes all non-printable control characters
|
||||||
|
* Support Aironet standalone access points (Layer2::Aironet) running IOS15
|
||||||
|
* lldp_port() returns port ID instead of port description if the port ID
|
||||||
|
subtype is "interface name". This improves the ability to correlate
|
||||||
|
ports by name when a port description is also set.
|
||||||
|
* Add docs note about make_snmpdata.pl under EXTENDING SNMP::Info
|
||||||
|
* [#46] Brocade (Foundry) Module Support
|
||||||
|
* Brocade (Foundry) POE Support
|
||||||
|
* Support peth_port_power() power supplied by PoE ports in L2::Baystack
|
||||||
|
* Update test_class.pl utility to allow ignore of snmp.conf and test
|
||||||
|
summarize more standard class methods
|
||||||
|
* On EOS, the LLDP port ID is a dot1d port
|
||||||
|
* Use LLDP in Layer3::Aruba, for switches
|
||||||
|
* Clean up more model names in L2::Baystack
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* [#68] Fix device_port entries for switches with non-unique
|
||||||
|
ifDesc (Nic Bernstein)
|
||||||
|
* Don't try to munge undef values
|
||||||
|
* [#49] Perl 5.18 UNIVERSAL::can change could cause infinite loop
|
||||||
|
* Silence warning from uninitialized variable in L3::Passport e_descr()
|
||||||
|
|
||||||
|
version 3.07 (2013-10-01)
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* Support for Pica8 switches in L3::Pica8
|
||||||
|
* Factor out cache/munge code from global/attr methods
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* [#48] Switch duplicate J9624A for J9626A in Layer2/HP (R. Kerr)
|
||||||
|
* Correct device serial number reporting for Nexus devices
|
||||||
|
* Override ipAddrTable methods in L3::Nexus as some versions do not
|
||||||
|
index the table with the IPv4 address in accordance with the MIB
|
||||||
|
definition.
|
||||||
|
|
||||||
|
version 3.05 (2013-08-16)
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* [#47] Add model info on HP 2530 and HP 2920 series
|
||||||
|
* Add support for Cisco Small Business series
|
||||||
|
Layer2/CiscoSB class
|
||||||
|
* Add proper LLDP support to Netgear.pm
|
||||||
|
* Change $netgear->interfaces() to use ifName rather than ifDescr
|
||||||
|
as the former is unique per interface while the latter is not.
|
||||||
|
If ifName is not present, concatenate ifDescr and ifIndex
|
||||||
|
to achieve a unique value.
|
||||||
|
* Properly report hardware version, Serial No. and OS Version for
|
||||||
|
Netgear.
|
||||||
|
|
||||||
|
|
||||||
|
version 3.03 (2013-07-11)
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* Add missing =back to POD (A. Hartmaier)
|
||||||
|
|
||||||
|
version 3.02 (2013-07-08)
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* Properly pull os_ver from Netgear GS series switches.
|
||||||
|
* Support Alcatel devices with layer3 features.
|
||||||
|
* Identify Cisco Aironet 1140 APs as Layer2::Aironet
|
||||||
|
* LAN switch support added to Layer3::Aruba class
|
||||||
|
* [RT#86725] - Identify Cisco Catalyst 3850 as Layer3::C6500 (C. Causer)
|
||||||
|
|
||||||
|
version 3.01 (2013-04-13)
|
||||||
|
|
||||||
|
[API Changes]
|
||||||
|
|
||||||
|
* The methods c_ip(), c_if(), c_port(), c_id(), and c_platform() now
|
||||||
|
represent common topology methods and will try to return a combined
|
||||||
|
hash of data from all L2 topology protocols either running on the
|
||||||
|
device or specified in the method call. The topology specific methods
|
||||||
|
have been been prefixed with the protocol name in lowercase so that
|
||||||
|
they can be called directly, sonmp_ip(), cdp_ip(), etc.
|
||||||
|
* L2::Bay and L2::Foundry have been removed from the distribution. Both
|
||||||
|
classes were depreciated and all functionality is available through
|
||||||
|
L2::Baystack and L3::Foundry.
|
||||||
|
|
||||||
|
[NEW FEATURES]
|
||||||
|
|
||||||
|
* [3160037] - Support _raw suffix on methods to skip munging
|
||||||
|
* [3185391] - Support for F5 devices in new class L3::F5
|
||||||
|
* [3323814] - Arp support for Netscreen (David Baldwin)
|
||||||
|
* [3323821] - Support for Netscreen w/ WLAN (eg SSG5) (David Baldwin)
|
||||||
|
* [3599277] - Q-BRIDGE Support to collect VLAN in macsuck
|
||||||
|
* [3033731] - Alcatel-Lucent OmniSwich AMAP Support in new AMAP class
|
||||||
|
* [3598896] - Lantronix device support (J R Binks)
|
||||||
|
* [3598337] - Lantronix SLC support
|
||||||
|
* Support for Cisco ASA in L3::CiscoASA (Kraus/Hartmaier/Bernstein)
|
||||||
|
* Support for Avaya VSP 9000 series in L3::Passport
|
||||||
|
* Support for Avaya VSP 7000 series in L2::Baystack
|
||||||
|
* Support Avaya (Trapeze) Wireless Controllers in new class L2::NWSS2300
|
||||||
|
* Support Juniper (Trapeze) Wireless Controllers in new class L2::Trapeze
|
||||||
|
* Support for newer Radware Alteon ADC switches 4408/4416/5412/5224 and
|
||||||
|
older AWS 2000/3000 series in existing L3::AlteonAD
|
||||||
|
* Support for H3C & HP A-series in new class L3::H3C
|
||||||
|
* Support for Citrix Netscaler appliances in new class L7::Netscaler
|
||||||
|
* New configuration option IgnoreNetSNMPConf will ignore Net-SNMP
|
||||||
|
configuration files on object initialization
|
||||||
|
* Two new utilities added in t/util to assist in developing device
|
||||||
|
support; make_snmpdata.pl gathers SNMP data (snmpwalk) in a format that
|
||||||
|
can be used with test_class_mocked.pl which mocks an SNMP agent to
|
||||||
|
enable testing with no network access to a device.
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* UNIVERSAL::can() now works with dynamic methods
|
||||||
|
* Dynamically generated methods are added to symbol table to avoid
|
||||||
|
AUTOLOAD on subsequent calls
|
||||||
|
* L2::Airespace now supports 802.11n client tx rates
|
||||||
|
* L2::Airespace now reports AP Ethernet MAC as port MAC for radio ports
|
||||||
|
* CiscoStats improvements to determine os versions, eg IOS XE ver on Sup7L-E
|
||||||
|
* CiscoStats now reports 'ios-xe' if the device runs IOS XE (used to be 'ios')
|
||||||
|
* Improved support of XOS based Extreme devices
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* [3564920] - lldp_if gives wrong data for Enterasys
|
||||||
|
|
||||||
|
version 2.11 (2012-12-09)
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* Add fall-back for sysDescr on Force10
|
||||||
|
|
||||||
|
version 2.10 (2012-12-08)
|
||||||
|
|
||||||
|
[NEW FEATURES]
|
||||||
|
|
||||||
|
* Support for Force10 devices (W. Bulley)
|
||||||
|
|
||||||
|
version 2.09 (2012-11-28)
|
||||||
|
|
||||||
|
[NEW FEATURES]
|
||||||
|
|
||||||
|
* New method i_ssidmac() to get BSSID's from AP's with initial support
|
||||||
|
in L2::Aironet and Airespace classes
|
||||||
|
* Support for Avaya Secure Routers in new class L3::Tasman
|
||||||
|
* Add EDP and LLDP L2 Topology to L3::Extreme
|
||||||
|
* [3185393] Support for Juniper SSL VPN in new class L7::Neoteris
|
||||||
|
* [3381027] Support for Cisco Nexus in new class L3::Nexus
|
||||||
|
* [1424336] Support for Extreme Discovery Protocol (EDP)
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* [3017571] Add LLDP support for NetSNMP device class (begemot)
|
||||||
|
* [3418918] Extreme devices now report OS as either extremeware or xos
|
||||||
|
* [2809045] Strip preceding netscreen from model name in L3::Netscreen
|
||||||
|
* [] Classify Linksys 2024 as L3::Dell (Rogier Krieger)
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* Fixed logic to return cached data for table methods when available and
|
||||||
|
not a partial fetch
|
||||||
|
* Fix typo in PoD for Bridge.pm and CiscoConfig.pm (William Bulley)
|
||||||
|
* Fix/improve IPv6 neighbor cache handling, especially for Cisco Nexus
|
||||||
|
|
||||||
|
version 2.08 (2012-07-15)
|
||||||
|
|
||||||
|
[NEW FEATURES]
|
||||||
|
|
||||||
|
* Basic support for APC UPS devices
|
||||||
|
* [2993691] Support for SonicWALL devices in new class L3::SonicWALL (phishphreek)
|
||||||
|
* [2996795] Support for Kentrox devices in new class L2::Kentrox (phishphreek)
|
||||||
|
* [] Basic support for Blue Coat proxy devices in new class L3::BlueCoatSG (jeroenvi)
|
||||||
|
* [] Support Cisco 6500 / Sup2T in L3::C6500 class (jeroenvi)
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* Pseudo ENTITY-MIB methods added to L3::Juniper for hardware information
|
||||||
|
* Add method to report current transmit power of the radio interface,
|
||||||
|
dot11_cur_tx_pwr_mw(), in Airespace class
|
||||||
|
* [3085411] Activate L3 properties for Netgear GSM7224v2 (phishphreek)
|
||||||
|
* [3085413] SNMP OIDs for Netgear Serial and OS Ver (phishphreek)
|
||||||
|
* [3286549] Dell LLDP Support (Nico Giefing)
|
||||||
|
* [3469527] Netgear LLDP Support (Nic Bernstein)
|
||||||
|
* [3472052] moduleSerialNumber support for Cisco Stack (Slava)
|
||||||
|
* [3523320] Better VLAN support in Juniper class (Web Bulley)
|
||||||
|
* [3532261] LLDP support in C6500 and related (Carlos Vicente)
|
||||||
|
* [3538949] Updated switch models in L2::HP (jeroenvi)
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* Get OS version for Juniper devices not reporting in sysDescr
|
||||||
|
* Correct base MAC reporting for Juniper devices
|
||||||
|
* Correct reporting of SSID broadcast status in Airespace class
|
||||||
|
* [3541442] Change L2::Catalyst port names to what is reported in CDP
|
||||||
|
* [2132349] Add an additional check to get Foundry OS version
|
||||||
|
* [2929883] [3413999] LLDP interface mapping issue
|
||||||
|
* [3297786] LLDP TimeMark component defaults to zero (David Baldwin)
|
||||||
|
* [2988163] Detect Juniper SSG firewalls as Layer3::Netscreen (R. Kerr)
|
||||||
|
* [3317739] Fix for Baystack without POE on stack member 1 (David Baldwin)
|
||||||
|
* [2037444] os_ver fails on some Extreme versions (Robert Kerr)
|
||||||
|
* [2980789] Fix root_ip to try OSPF RouterID first (Brian De Wolf)
|
||||||
|
* [2986858] Fix the patch from this ticket (Oliver Gorwits)
|
||||||
|
* [3136084] Rename Allied Telesyn to Allied Telesis (Oliver Gorwits)
|
||||||
|
* [3268104] CiscoVTP.pm i_vlan_membership() array bounds (Michael Sanderson)
|
||||||
|
* [3497004] Clarify POD description of default values (a2w)
|
||||||
|
* [3502533] Layer2/Baystack interface indexes > 513 (Robert Nyqvist)
|
||||||
|
|
||||||
|
version 2.06 (2011-09-28)
|
||||||
|
|
||||||
|
[NEW FEATURES]
|
||||||
|
|
||||||
|
* Support for PacketFront devices in new class L3::PacketFront
|
||||||
|
* Support for Mikrotik devices in new class L3::Mikrotik
|
||||||
|
* Support for HP VirtualConnect switches in new class L2::HPVC
|
||||||
|
* Support for ADSL-LINE-MIB in new class AdslLine
|
||||||
|
|
||||||
|
[ENHANCEMENTS]
|
||||||
|
|
||||||
|
* POD clarification on i_speed() munging by Info.pm
|
||||||
|
* Added i_stack_status method that can be used for finding the parent
|
||||||
|
interface for e.g. ADSL interface speed determination
|
||||||
|
|
||||||
|
[BUG FIXES]
|
||||||
|
|
||||||
|
* [3344843] Fix returning serial() and os_ver() for web-managable HP
|
||||||
|
switches, introduced by HP/HP4000 class split, reported by J R Binks
|
||||||
|
* [2809033] Put L2-only Cisco blade switches in L3::C6500
|
||||||
|
* [3408506] Fix uninitialized value in IPv6 when neighbor state is
|
||||||
|
incomplete (Michael Borgelt)
|
||||||
|
|
||||||
|
version 2.05 (2011-06-23)
|
||||||
|
+ Fix broken function call in L2::Aironet
|
||||||
|
+ Promote L2::Aruba to L3::Aruba, as Aruba devices can be L3 entities and
|
||||||
|
provide L3 information.
|
||||||
|
|
||||||
|
version 2.04 (2011-03-31)
|
||||||
|
+ Support for older HP switch models moved to new L2::HP4000 class
|
||||||
|
+ Fix VLAN changing in L2::HP and L2::HP4000 classes
|
||||||
|
* Updated model lists in HP classes
|
||||||
|
+ [2980782] Added L3::CiscoFWSM for Cisco Firewall Services Modules
|
||||||
|
(Brian De Wolf)
|
||||||
|
+ Added L3::Pf for FreeBSD PFSense Firewalls (max)
|
||||||
|
* Added specific functions for neighbor mgmt addresses to CDP class
|
||||||
|
* Implemented os_bin() method in CiscoStats
|
||||||
|
+ [2980787] Fix for C1900 bp_index not containing interfaces.
|
||||||
|
(Brian De Wolf)
|
||||||
|
+ [2599795] Added vendor_i_type() method to HP and HP4000 clases
|
||||||
|
+ [2688801] Minor modification for obscure Proxim/Orinoco device
|
||||||
|
(jrbinks)
|
||||||
|
+ [3051443] Add PoE measured power per port to Cisco, Extrme and HP
|
||||||
|
classes (jeroenvi)
|
||||||
|
* Minor tweaks to support devices without sysServices
|
||||||
|
* Added Cisco CBS3xxx blade switches to L3::C6500
|
||||||
|
* Fix for FWSMs not being detected properly. Special thanks goes to
|
||||||
|
Jukka Pirhonen for pointing it out. (Brian De Wolf)
|
||||||
|
+ Added support for IPv6 to physical address mapping
|
||||||
|
* Added ME340x to L3::C3550
|
||||||
|
* Added new ProCurve models to HP class
|
||||||
|
* Fixed i_speed_raw not returning raw values (Alexander Hartmaier)
|
||||||
|
|
||||||
|
version 2.01 (06/12/09)
|
||||||
|
+ Added CiscoStpExtensions Class (Carlos Vicente)
|
||||||
|
+ Added Layer3::Arista (fenner)
|
||||||
|
+ [2020353] Added L3::Altiga for Cisco (Altiga) VPN3000 Concentrators
|
||||||
|
(Jeroen van Ingen)
|
||||||
|
|
||||||
|
* Fixed RFC1213-MIB vs IF-MIB collision in ifOperStatus
|
||||||
|
* Updated test_class.pl for better debug info and relative path
|
||||||
|
* Add cisco vendor detection by OID in Layer3.pm (Sam Stickland)
|
||||||
|
* Fix CaSe of EtherLike-MIB in EtherLike.pm (Alexander Hartmaier)
|
||||||
|
* Added Cisco FWSM to L3::Cisco
|
||||||
|
* Added s222_rp to L3::C6500
|
||||||
|
* Added CIGESM to L2::C2900
|
||||||
|
* Added Airespace WLC to L2::Airespace
|
||||||
|
* Updated POD and DeviceMatrix quite a bit
|
||||||
|
* Added ENTITY-MIB to CiscoStats for better model handling above
|
||||||
|
* Fix networkaddress handling in LLDP-MIB
|
||||||
|
* Added CiscoConfig to L2::Aironet, L3::C3550 classes
|
||||||
|
* Better SSID capabilities for L2::Aironet
|
||||||
|
* Fix CDP vs LLDP in c_id() for HP Class
|
||||||
|
* test_class.pl improvements
|
||||||
|
|
||||||
|
version 2.00 (08/01/08)
|
||||||
|
+ Support for Alcatel-Lucent OmniSwitch via L3::AlcatelLucent
|
||||||
|
+ Support for Alcatel-Lucent Service Router via L3::Timetra
|
||||||
|
+ Support for Alcatel-Lucent OmniAccess via L2::Aruba
|
||||||
|
|
||||||
|
* Silence warnings in MAU due to uninitialized variables
|
||||||
|
|
||||||
|
version 1.09 (07/22/08) - Beta/developer release
|
||||||
|
+ Added support for HP ProCurve Foundry OEM switches, such as the 9300
|
||||||
|
series, in new class L3::HP9300 (contributions from Douglas McKeown and
|
||||||
|
Ivan Auger)
|
||||||
|
+ Added support for CISCO-PAE-MIB in CiscoPortSecurity (Kesy)
|
||||||
|
+ Support for D-Link devices through L3::Dell
|
||||||
|
+ Support for Linksys SRW2048 through L3::Dell
|
||||||
|
+ Support for IBM BladeCenter 4-Port GB Ethernet Switch Module through
|
||||||
|
L3::Dell (Alex Kramarov)
|
||||||
|
+ Support for newer Nortel Alteon switches and Nortel BladeCenter Switch
|
||||||
|
Modules in L3::AlteonAD
|
||||||
|
+ Support for Cisco 1250 series through L2::Aironet
|
||||||
|
+ Updates to fan, power supply, and serial number methods in
|
||||||
|
L2::HP (Jeroen van Ingen)
|
||||||
|
+ Use Cisco Client Association MIBs for Aironet client reporting
|
||||||
|
via fw_mac
|
||||||
|
+ Support VLANs on Aironet
|
||||||
|
+ Get the proper radio MAC address from aironet in MBSS mode
|
||||||
|
+ Additional wireless statistics from Aironet
|
||||||
|
+ Add support to specify MIB to resolve leaf names conflicts in
|
||||||
|
%GLOBALS and %FUNCS.
|
||||||
|
+ Added munge_port_list() and modify_port_list() methods to assist in
|
||||||
|
working with PortList objects.
|
||||||
|
+ Added set_multi() method to enable a SNMP set command on several new
|
||||||
|
values in one request. Required for complex set operations
|
||||||
|
on some agents.
|
||||||
|
+ Infrastructure for SNMPv3 support:
|
||||||
|
+ Save the SecName passed into the constructor
|
||||||
|
+ Create an update() function, which replaces the underlying
|
||||||
|
SNMP session using different parameters.
|
||||||
|
+ Return the SecName instead of community from snmp_comm() when using
|
||||||
|
SNMPv3.
|
||||||
|
|
||||||
|
* L2::HP now isa Layer3 instead of Layer2 to support arpnip
|
||||||
|
(Dudley Freeman)
|
||||||
|
* Silence warnings from Cisco devices which don't return values for
|
||||||
|
extended VLAN range (1024-4096)
|
||||||
|
* Documentation coverage, spelling, and syntax updates
|
||||||
|
* set_i_pvid(), set_i_vlan(), set_add_i_vlan_tagged(),
|
||||||
|
set_remove_i_vlan_tagged() removed from Bridge and HP classes due to
|
||||||
|
incompatibility across devices.
|
||||||
|
|
||||||
|
version 1.07 (11/26/07) - Beta/developer release
|
||||||
|
|
||||||
|
version 1.05 (11/25/07) - CVS only. No official release
|
||||||
|
+ Added support for LLDP in new class LLDP (contributions from Bernhard
|
||||||
|
Augenstein)
|
||||||
|
+ Added device specific support for LLDP in L2::HP, L2::Baystack,
|
||||||
|
L3::Enterasys and L3::Foundry
|
||||||
|
+ Added support for Enterasys devices as new class L3::Enterasys
|
||||||
|
+ Added support for Dell PowerConnect switches as new class L3::Dell
|
||||||
|
+ Added basic support for generic routers running Microsoft Windows OS
|
||||||
|
as new class L3::Microsoft (begemot)
|
||||||
|
+ Added basic support for Sun routers as new class L3::Sun (begemot)
|
||||||
|
+ Added basic support for Juniper NetScreen devices as new class
|
||||||
|
L3::Netscreen (Kent Hamilton)
|
||||||
|
+ Added support for Cyclades terminal servers as new class L1::Cyclades
|
||||||
|
+ Added support for Cisco (Airespace) wireless controllers as new class
|
||||||
|
L2::Airespace
|
||||||
|
+ Added support for Nortel Ethernet Routing Switch 2500 series and
|
||||||
|
Business Ethernet Switches (David Sieb<65>rger)
|
||||||
|
+ Update of L3::Foundry to support all Foundry devices including newer
|
||||||
|
switches. Depreciate L2::Foundry.
|
||||||
|
+ Added generic device type detection using IANA assigned enterpise
|
||||||
|
number extracted from sysObjectID
|
||||||
|
+ Added ifDiscards and other missing entries from IF-MIB::ifEntry (Greg King)
|
||||||
|
+ Added CGESM devices to L2::C2900 class (Alexander Hartmaier)
|
||||||
|
+ Added support for dual speed 10/100 hubs and i_speed() in L1::Bayhub
|
||||||
|
+ Added i_ssidlist(), i_ssidbcast(), and i_80211channel() methods to
|
||||||
|
L2::Aruba, Airespace, and L2::NAP222x classes
|
||||||
|
+ New class IEEE802dot11 class for generic standards based wireless AP
|
||||||
|
support to include i_ssidlist()and i_80211channel() methods.
|
||||||
|
+ L2::Orinoco inherits from new IEEE802dot11 for i_ssidlist()and
|
||||||
|
i_80211channel() support.
|
||||||
|
+ Added new VLAN methods i_pvid(), i_vlan_membership(), set_i_pvid(),
|
||||||
|
set_i_vlan(), set_add_i_vlan_tagged(), set_remove_i_vlan_tagged() to
|
||||||
|
Bridge, CiscoVTP, Extreme, HP, and RapidCity classes.
|
||||||
|
+ Added set_i_speed_admin() method to RapidCity class,
|
||||||
|
+ Added set_i_duplex_admin() method to RapidCity class,
|
||||||
|
+ Added OSPF Neighbor Tables, SF Patch 1577918 to Layer 3 (Andrew Herrick)
|
||||||
|
+ Added CiscoConfig class, SF Patch 1555001 (Justin Hunter)
|
||||||
|
+ Enable load_ methods for %GLOBALS and MIB Leaf node names.
|
||||||
|
+ Enable dynamic methods in AUTOLOAD with MIB Leaf node names for loaded
|
||||||
|
MIBs without definition in %FUNCS or %GLOBALS. Single instance mib leafs
|
||||||
|
will be treated as a GLOBAL and returna scalar while mib leafs which
|
||||||
|
reside in a table will be treated as a FUNC and return a reference to a
|
||||||
|
hash.
|
||||||
|
+ Enable load_ methods for %GLOBALS and MIB Leaf node names.
|
||||||
|
+ Add loop detect option and code for getnext table column walks.
|
||||||
|
+ Add Layer3::NetSNMP for Net-SNMP-based hosts, part of
|
||||||
|
SF patch 1557529 (Bradley Baetz).
|
||||||
|
+ Add EIGRP Neighbor Tables to L3::Cisco SF Patch 1577927 (Andrew Herrick)
|
||||||
|
+ Additions to CiscoQOS and CiscoStats (Alexander Hartmaier)
|
||||||
|
+ Emulate ENTITY-MIB Physical Table methods for devices which don't
|
||||||
|
have ENTITY-MIB support in Airespace, Bayhub, Baystack, BayRS,
|
||||||
|
NortelStack, and Passport classes.
|
||||||
|
+ Enable use of MIB Leaf node names in SNMP sets.
|
||||||
|
+ Add POWER-ETHERNET-MIB and CISCO-POWER-ETHERNET-EXT-MIB support.
|
||||||
|
|
||||||
|
* Fix for bug where an SNMP error in any operation would cause subsequent
|
||||||
|
table get operations to fail while using the same session, originally
|
||||||
|
identified by Nicolai Petri.
|
||||||
|
* Enable single instance partial table fetches (Alexander Hartmaier)
|
||||||
|
* Enable partial table fetches in overriden table methods (Justin Hunter)
|
||||||
|
* Allow partial table fetches with load_ methods.
|
||||||
|
* Fixed vlan trunk port handling bug in L2:HP (Michael Robbert)
|
||||||
|
* Correct bp_port() definition in Bridge class (Reported by Nicolai Petri)
|
||||||
|
* Remove port security definitions from CiscoStack and move into new class
|
||||||
|
CiscoPortSecurity. Needed to support devices such a L3::C4000 which
|
||||||
|
support CISCO-PORT-SECURITY-MIB, but not CISCO-STACK-MIB.
|
||||||
|
(Reported by Prakash RudraRaju)
|
||||||
|
* Correct port numbering for Nortel 8110, 1100, 1150 in L3:Passport
|
||||||
|
(Reported by David Pinkoski)
|
||||||
|
* Documentation updates
|
||||||
|
* Translate OIDs returned by Entity MIB e_type
|
||||||
|
* Modify inheritance to use Cisco classes before generic classes
|
||||||
|
* Create e_index method in ENTITY-MIB to facilitate emulation methods in
|
||||||
|
other classes as entPhysicalIndex is not-accessible.
|
||||||
|
* Only return MAC from munge_mac() if it actually is a MAC. Fix for
|
||||||
|
netdisco where device would not be inserted in DB due to malformed MAC.
|
||||||
|
* Enable SUPER class calls to find autoloaded methods (Bernhard Augenstein)
|
||||||
|
* Clear attribute cache on sucessful SNMP set.
|
||||||
|
* Improve accuracy of operational and administrative duplex reporting on
|
||||||
|
devices using CiscoStack.
|
||||||
|
* All i_type() methods now use standard IANAifType values.
|
||||||
|
* Report bridge groups (VLANs) in L2::C1900.
|
||||||
|
* Turn on bulkwalk for C6500. Users with buggy OS versions can turn
|
||||||
|
it off when creating the object.
|
||||||
|
* c_ip() now attempts to return only IPV4 addresses, use c_addr() for all
|
||||||
|
address types.
|
||||||
|
|
||||||
|
version 1.04 (07/08/06)
|
||||||
|
+ Added C1130 and C1240 to L2::Aironet (Ralf Gross)
|
||||||
|
+ Added detection for Cisco 2960, 2940, 3400 w/ MetroBase
|
||||||
|
+ Added generic L2::Cisco Class
|
||||||
|
* Corrected detection for Cisco Supervisor Engine 2 and 32 (IOS).
|
||||||
|
* Fixed warnings in CiscoStack
|
||||||
|
* Updated ProCurve HP device detection for newer firmwares
|
||||||
|
|
||||||
|
version 1.03 (04/14/06) - Beta/developer release
|
||||||
|
* Use ipNetToMedia table instead of atTable for ARP
|
||||||
|
* Remove CiscoStack from Layer3::C4000
|
||||||
|
* Fixed bug in MAU class when polling devices without MAU-MIB support
|
||||||
|
|
||||||
|
version 1.01 (04/08/06) - Beta/developer release
|
||||||
|
+ Change version numbers to X.XX format. Odd releases are beta
|
||||||
|
or developer only releases. Even are official releases.
|
||||||
|
|
||||||
|
version 1.0 (04/07/06) - CVS only. No official release
|
||||||
|
+ Added Interface FlowControl status to CiscoStack (Nicolai Petri)
|
||||||
|
+ Added CiscoImage class (Matthew Tuttle)
|
||||||
|
+ Added C1200 and C350 IOS devices to L2::Aironet (Matthew Tuttle)
|
||||||
|
+ Added support for Foundry IronWare and gave L3::Foundry CPR
|
||||||
|
+ Added support for Foundry EdgeIrons as new class L2::Foundry
|
||||||
|
+ Added BulkWalk and BulkRepeaters options to new()
|
||||||
|
+ Added DebugSNMP option to new()
|
||||||
|
+ Added CISCO-ENTITY-VENDORTYPE-OID-MIB,CISCO-PRODUCTS-MIB,CISCO-STACK-MIB
|
||||||
|
to CiscoStats.pm for model()
|
||||||
|
+ Check for bulkwalk_no() method
|
||||||
|
+ Added Entity.pm to L3 and L2 classes per N. Petri's suggestion.
|
||||||
|
+ Added support for Passport/Accelar 1100 and 1200 series in L3::Passport
|
||||||
|
+ Added support for Passport/Accelar 8100 series in L3::Passport
|
||||||
|
+ Added support for Passport 1600 series as new class, L3::N1600
|
||||||
|
+ Added support for Extreme Alpine and Summit switches as new class
|
||||||
|
L3:Extreme (Mike Hunter and Eric Miller)
|
||||||
|
+ Added support for Aruba wireless switches (Eric Miller and Brian Chow)
|
||||||
|
+ Added support for Nortel 2700 series (Airespace) wireless switches
|
||||||
|
+ Added support for Synoptics hubs as new class L1:S3000
|
||||||
|
+ Added Cisco QOS and RTT classes (Alexander Hartmaier)
|
||||||
|
+ Added BGP Peer Table to L3 class (Carlos Vicente)
|
||||||
|
+ Added ipforwarding status to Info base class (Carlos Vicente)
|
||||||
|
+ Added STP port state to Bridge class (Alexander Barthel)
|
||||||
|
+ Added L3 support (arpnip) to Baystack class for routing capable switches
|
||||||
|
+ Added set_i_duplex_admin() and set_i_speed_admin() to C2900 class
|
||||||
|
(Justin Hunter)
|
||||||
|
+ Added set_i_duplex_admin() and set_i_speed_admin() to CiscoStack class
|
||||||
|
+ CDP added to Aironet class
|
||||||
|
+ Added Juniper class
|
||||||
|
+ Added support for Catalyst 4000 and 4500, get admin. duplex
|
||||||
|
and speed properly
|
||||||
|
+ Added i_speed_high(), which i_speed() uses if needed to support
|
||||||
|
interfaces >4Gbps
|
||||||
|
|
||||||
|
* More error checking in _load_attr() around bulkwalk code
|
||||||
|
* Minor warning fix in L3::Aironet::os_ver()
|
||||||
|
* Abstracted remaining Cisco stuff from L3 to L3::Cisco
|
||||||
|
* Removed all Cisco stuff from L2
|
||||||
|
* Expanded Entity.pm to cover the whole ENTITY-MIB and improved docs.
|
||||||
|
* changed all refs to $DEBUG to $self->debug() for reentrant code
|
||||||
|
* [ 1111284 ] Parameters not being set with AutoSpecify - fixed.
|
||||||
|
* Turned off BULKWALK for C1900 and C6500 classes.
|
||||||
|
* Added exception handling for V2 ENDOFMIBVIEW
|
||||||
|
* Fix in SONMP when topology not enabled
|
||||||
|
* Fix in L3::Passport root_ip()
|
||||||
|
* Fix in L3::Passport bp_index() some devices not returning complete index.
|
||||||
|
* Enable set_i_up_admin() in Bayhub
|
||||||
|
* Recognize new Nortel model names in Baystack and Passport classes
|
||||||
|
* Orinoco class should now recognize more models
|
||||||
|
* Cleanup model recognition in Baystack class, recognize more models
|
||||||
|
* Modify Catalyst class to use CISCO-STACK-MIB for brige port index mapping
|
||||||
|
some devices having problems returning complete index from BRIDGE-MIB
|
||||||
|
* Check root ip for reachability before assignment
|
||||||
|
* HP class should recognize more models
|
||||||
|
* Fix in HP class for models not returning full bp_index
|
||||||
|
* [ 1436103 ] L2::Aironet devices weren't getting their model
|
||||||
|
translated properly
|
||||||
|
|
||||||
|
verison 0.9 (11/15/04)
|
||||||
|
+ ** Added full Nortel/Bay/BayStack support
|
||||||
|
by new developer Eric Miller.
|
||||||
|
L2::Bay now depricated.
|
||||||
|
+ Added Alteon Ace support (Eric Miller)
|
||||||
|
+ Added Nortel Cotivity support (Eric Miller)
|
||||||
|
+ Added Nortel BayRS support (Eric Miller)
|
||||||
|
+ Added Nortel Centillion support (Eric Miller)
|
||||||
|
+ Added Nortel AP 222x support (Eric Miller)
|
||||||
|
+ Added Orinco AP support (Eric Miller)
|
||||||
|
+ Added i_lastchange() per suggestion of Nicolai Petri
|
||||||
|
+ Added BULKWALK patch by Bradley Baetz - This should
|
||||||
|
greatly speed up requests on SNMPv2c devices.
|
||||||
|
+ Added MibDirs option to new() to allow specifying non-system MIB
|
||||||
|
directories.
|
||||||
|
|
||||||
|
* Added C3560s to the C3550 class. Thanks to Nicolai.
|
||||||
|
* Fixed Bug where older Cisco's would append nulls to certain
|
||||||
|
CDP information. Would come up a 'DBD::Pg parser' error in Netdisco
|
||||||
|
* Changed so a failed _global() call is cached so it won't retry
|
||||||
|
an error over and over again if the same global is used.
|
||||||
|
* Added check in _set() to see if data came from sub or FUNCS/GLOBALS
|
||||||
|
Fails if came from sub.
|
||||||
|
|
||||||
version 0.8 (03/21/04)
|
version 0.8 (03/21/04)
|
||||||
+ Added Q-BRIDGE-MIB support to SNMP::Info::Bridge
|
+ Added Q-BRIDGE-MIB support to SNMP::Info::Bridge
|
||||||
@@ -16,7 +664,7 @@ version 0.8 (03/21/04)
|
|||||||
Contributions from Dmitry Sergienko:
|
Contributions from Dmitry Sergienko:
|
||||||
+ Added Cisco Aironet BR500 and AP1200 to L2::Aironet Class
|
+ Added Cisco Aironet BR500 and AP1200 to L2::Aironet Class
|
||||||
* Fixed the Port name alias for Catalyst 2900 devices
|
* Fixed the Port name alias for Catalyst 2900 devices
|
||||||
+ Added Support For ZiLEX DSLAMs and Allied Telesys Switches
|
+ Added Support For ZyXEL DSLAMs and Allied Telesys Switches
|
||||||
|
|
||||||
version 0.7 (08/14/03)
|
version 0.7 (08/14/03)
|
||||||
* Added Class for Catalyst 6500 Series - Layer3::C6500
|
* Added Class for Catalyst 6500 Series - Layer3::C6500
|
||||||
@@ -46,8 +694,10 @@ version 0.4 (04/29/03)
|
|||||||
* Added clear_cache() method
|
* Added clear_cache() method
|
||||||
* Added NO_SUCH support for snmpget (TABLE) calls to get SNMP MIB II data
|
* Added NO_SUCH support for snmpget (TABLE) calls to get SNMP MIB II data
|
||||||
from SNMP Version 1 devices.
|
from SNMP Version 1 devices.
|
||||||
* Methods load_all() and all() have changed their return value. Sorry but the API had to change.
|
* Methods load_all() and all() have changed their return value. Sorry but
|
||||||
* New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch() to make it more OO happy.
|
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
|
* Globals are now cached
|
||||||
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
|
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
|
||||||
detected in device_type()
|
detected in device_type()
|
||||||
@@ -60,8 +710,8 @@ version 0.4 (04/29/03)
|
|||||||
|
|
||||||
version 0.3 (03/06/03)
|
version 0.3 (03/06/03)
|
||||||
* Fixed HP model() warning
|
* Fixed HP model() warning
|
||||||
* Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE in _global
|
* Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE
|
||||||
and _load_attr
|
in _global and _load_attr
|
||||||
* Added more debugging
|
* Added more debugging
|
||||||
* Added info and munging for c_capabilities in SNMP::Info::CD
|
* Added info and munging for c_capabilities in SNMP::Info::CD
|
||||||
Thanks to Martin Lorensen <martin /at- lorensen.dk>
|
Thanks to Martin Lorensen <martin /at- lorensen.dk>
|
||||||
@@ -78,7 +728,8 @@ version 0.2 (02/19/03)
|
|||||||
* Added Spanning Tree Protocol (STP) methods to SNMP::Info::Bridge
|
* Added Spanning Tree Protocol (STP) methods to SNMP::Info::Bridge
|
||||||
* Removed HP Specific MIBS in SNMP::Info::Layer2 and cleaned up model()
|
* Removed HP Specific MIBS in SNMP::Info::Layer2 and cleaned up model()
|
||||||
* Added poke for Bay 450 Switches
|
* 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)
|
version 0.1 (12/30/02)
|
||||||
* Initial Release
|
* 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?
|
||||||
934
DeviceMatrix.txt
934
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.15';
|
||||||
|
|
||||||
|
%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.15';
|
||||||
|
|
||||||
|
%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
|
||||||
130
Info/Aggregate.pm
Normal file
130
Info/Aggregate.pm
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
# SNMP::Info::Aggregate
|
||||||
|
#
|
||||||
|
# Copyright (c) 2014 SNMP::Info Developers
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Aggregate;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info;
|
||||||
|
|
||||||
|
@SNMP::Info::Aggregate::ISA = qw/SNMP::Info Exporter/;
|
||||||
|
@SNMP::Info::Aggregate::EXPORT_OK = qw/agg_ports_ifstack/;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (); # IF-MIB
|
||||||
|
|
||||||
|
%GLOBALS = ();
|
||||||
|
|
||||||
|
%FUNCS = ();
|
||||||
|
|
||||||
|
%MUNGE = ();
|
||||||
|
|
||||||
|
sub agg_ports_ifstack {
|
||||||
|
my $dev = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $ifStack = $dev->ifStackStatus();
|
||||||
|
# TODO: if we want to do partial, we need to use inverse status
|
||||||
|
my $ifType = $dev->ifType();
|
||||||
|
|
||||||
|
my $ret = {};
|
||||||
|
|
||||||
|
foreach my $idx ( keys %$ifStack ) {
|
||||||
|
my ( $higher, $lower ) = split /\./, $idx;
|
||||||
|
next if ( $higher == 0 or $lower == 0 );
|
||||||
|
if ( $ifType->{ $higher } eq 'ieee8023adLag' ) {
|
||||||
|
$ret->{ $lower } = $higher;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Aggregate - SNMP Interface to ifStackTable Aggregated Links
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
SNMP::Info Developers
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $info = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myrouter',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $info->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
This class provides access to Aggregated Links configuration on devices
|
||||||
|
supporting C<ifStackTable>.
|
||||||
|
|
||||||
|
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
L<SNMP::Info>
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<IF-MIB>
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item C<agg_ports_ifstack>
|
||||||
|
|
||||||
|
Returns a HASH reference mapping from slave to master port for each member of
|
||||||
|
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||||
|
ifIndex of the corresponding master ports.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=cut
|
||||||
1854
Info/Airespace.pm
Normal file
1854
Info/Airespace.pm
Normal file
File diff suppressed because it is too large
Load Diff
862
Info/Bridge.pm
862
Info/Bridge.pm
File diff suppressed because it is too large
Load Diff
441
Info/CDP.pm
441
Info/CDP.pm
@@ -1,137 +1,213 @@
|
|||||||
# SNMP::Info::CDP
|
# SNMP::Info::CDP
|
||||||
# Max Baker <max@warped.org>
|
# $Id$
|
||||||
#
|
#
|
||||||
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
|
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2002,2003 Regents of the University of California
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
package SNMP::Info::CDP;
|
package SNMP::Info::CDP;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info;
|
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//;
|
@SNMP::Info::CDP::EXPORT_OK = qw//;
|
||||||
|
|
||||||
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MIBS_V1 %MUNGE $INIT/;
|
use vars
|
||||||
# Debug
|
qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT %CDP_CAPABILITIES/;
|
||||||
$DEBUG=0;
|
|
||||||
$SNMP::debugging=$DEBUG;
|
$VERSION = '3.15';
|
||||||
|
|
||||||
# Five data structures required by SNMP::Info
|
# Five data structures required by SNMP::Info
|
||||||
$INIT = 0;
|
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
|
||||||
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
|
|
||||||
%MIBS_V1 = ( 'CISCO-CDP-MIB-V1SMI' => 'cdpGlobalRun' );
|
|
||||||
# Notice we dont inherit the default GLOBALS and FUNCS
|
# Notice we dont inherit the default GLOBALS and FUNCS
|
||||||
# only the default MUNGE.
|
# only the default MUNGE.
|
||||||
%GLOBALS = (
|
%GLOBALS = (
|
||||||
'cdp_run' => 'cdpGlobalRun',
|
'cdp_run' => 'cdpGlobalRun',
|
||||||
'cdp_interval' => 'cdpGlobalMessageInterval',
|
'cdp_interval' => 'cdpGlobalMessageInterval',
|
||||||
'cdp_holdtime' => 'cdpGlobalHoldTime',
|
'cdp_holdtime' => 'cdpGlobalHoldTime',
|
||||||
'cdp_id' => 'cdpGlobalDeviceId',
|
'cdp_gid' => 'cdpGlobalDeviceId',
|
||||||
);
|
);
|
||||||
|
|
||||||
%FUNCS = (
|
%FUNCS = (
|
||||||
'c_index' => 'cdpCacheIfIndex',
|
'cdp_index' => 'cdpCacheIfIndex',
|
||||||
'c_proto' => 'cdpCacheAddressType',
|
'cdp_proto' => 'cdpCacheAddressType',
|
||||||
'c_ip' => 'cdpCacheAddress',
|
'cdp_addr' => 'cdpCacheAddress',
|
||||||
'c_ver' => 'cdpCacheVersion',
|
'cdp_ver' => 'cdpCacheVersion',
|
||||||
'c_id' => 'cdpCacheDeviceId',
|
'cdp_id' => 'cdpCacheDeviceId',
|
||||||
'c_port' => 'cdpCacheDevicePort',
|
'cdp_port' => 'cdpCacheDevicePort',
|
||||||
'c_platform' => 'cdpCachePlatform',
|
'cdp_platform' => 'cdpCachePlatform',
|
||||||
'c_capabilities' => 'cdpCacheCapabilities',
|
'cdp_capabilities' => 'cdpCacheCapabilities',
|
||||||
'c_domain' => 'cdpCacheVTPMgmtDomain',
|
'cdp_domain' => 'cdpCacheVTPMgmtDomain',
|
||||||
'c_vlan' => 'cdpCacheNativeVLAN',
|
'cdp_vlan' => 'cdpCacheNativeVLAN',
|
||||||
'c_duplex' => 'cdpCacheDuplex'
|
'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 = (
|
%MUNGE = (
|
||||||
'c_capabilities' => \&munge_caps,
|
'cdp_capabilities' => \&SNMP::Info::munge_bits,
|
||||||
'c_ip' => \&SNMP::Info::munge_ip
|
'cdp_platform' => \&SNMP::Info::munge_null,
|
||||||
);
|
'cdp_domain' => \&SNMP::Info::munge_null,
|
||||||
|
'cdp_port' => \&SNMP::Info::munge_null,
|
||||||
|
'cdp_id' => \&SNMP::Info::munge_null,
|
||||||
|
'cdp_ver' => \&SNMP::Info::munge_null,
|
||||||
|
'cdp_ip' => \&SNMP::Info::munge_ip,
|
||||||
|
'cdp_power' => \&munge_power,
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
sub munge_caps {
|
%CDP_CAPABILITIES = (
|
||||||
my $caps = shift;
|
'Router' => 0x001,
|
||||||
return undef unless defined $caps;
|
'Trans-Bridge' => 0x002,
|
||||||
|
'Source-Route-Bridge' => 0x004,
|
||||||
|
'Switch' => 0x008,
|
||||||
|
'Host' => 0x010,
|
||||||
|
'IGMP' => 0x020,
|
||||||
|
'Repeater' => 0x040,
|
||||||
|
'VoIP-Phone' => 0x080,
|
||||||
|
'Remotely-Managed-Device' => 0x100,
|
||||||
|
'Supports-STP-Dispute' => 0x200,
|
||||||
|
'Two-port Mac Relay' => 0x400,
|
||||||
|
);
|
||||||
|
|
||||||
my $bits = substr(unpack("B*",$caps),-7);
|
sub munge_power {
|
||||||
return $bits;
|
my $power = shift;
|
||||||
|
my $decimal = substr( $power, -3 );
|
||||||
|
$power =~ s/$decimal$/\.$decimal/;
|
||||||
|
return $power;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub hasCDP {
|
sub hasCDP {
|
||||||
my $cdp = shift;
|
my $cdp = shift;
|
||||||
|
|
||||||
my $ver = $cdp->{_version};
|
my $ver = $cdp->{_version};
|
||||||
|
|
||||||
|
|
||||||
# SNMP v1 clients dont have the globals
|
# SNMP v1 clients dont have the globals
|
||||||
if (defined $ver and $ver == 1){
|
if ( defined $ver and $ver == 1 ) {
|
||||||
my $c_ip = $cdp->c_ip();
|
my $cdp_ip = $cdp->cdp_ip();
|
||||||
|
|
||||||
# See if anything in cdp cache, if so we have cdp
|
# See if anything in cdp cache, if so we have cdp
|
||||||
return 1 if (defined $c_ip and scalar(keys %$c_ip)) ;
|
return 1 if ( defined $cdp_ip and scalar( keys %$cdp_ip ) );
|
||||||
return undef;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $cdp->cdp_run();
|
return $cdp->cdp_run();
|
||||||
}
|
}
|
||||||
|
|
||||||
sub c_if {
|
sub cdp_if {
|
||||||
my $cdp = shift;
|
my $cdp = shift;
|
||||||
|
|
||||||
# See if by some miracle Cisco implemented the cdpCacheIfIndex entry
|
# See if by some miracle Cisco implemented the cdpCacheIfIndex entry
|
||||||
my $c_index = $cdp->c_index();
|
my $cdp_index = $cdp->cdp_index();
|
||||||
return $c_index if defined $c_index;
|
return $cdp_index if defined $cdp_index;
|
||||||
|
|
||||||
# Nope, didn't think so. Now we fake it.
|
# Nope, didn't think so. Now we fake it.
|
||||||
my $c_ip = $cdp->c_ip();
|
my $cdp_ip = $cdp->cdp_ip();
|
||||||
unless (defined $c_ip){
|
unless ( defined $cdp_ip ) {
|
||||||
$cdp->{error} = "SNMP::Info::CDP::c_if() - Device doesn't have c_ip() data. Can't fake c_index()";
|
$cdp->error_throw(
|
||||||
$DEBUG and carp($cdp->error(1));
|
"SNMP::Info::CDP:cdp_if() - Device doesn't have cdp_ip() data. Can't fake cdp_index()"
|
||||||
return undef;
|
);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
my %c_if;
|
my %cdp_if;
|
||||||
foreach my $key (keys %$c_ip){
|
foreach my $key ( keys %$cdp_ip ) {
|
||||||
next unless defined $key;
|
next unless defined $key;
|
||||||
my $iid = $key;
|
my $iid = $key;
|
||||||
# Truncate .1 from cdp cache entry
|
|
||||||
$iid =~ s/\.\d+$//;
|
# Truncate .1 from cdp cache entry
|
||||||
$c_if{$key} = $iid;
|
$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;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub cdp_cap {
|
||||||
|
my $cdp = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
# Some devices return a hex-string, others return a space separated
|
||||||
|
# string, we need the raw data to determine return value and
|
||||||
|
# take appropriate action
|
||||||
|
my $cdp_caps = $cdp->cdp_capabilities_raw($partial) || {};
|
||||||
|
|
||||||
|
my %cdp_cap;
|
||||||
|
foreach my $key ( keys %$cdp_caps ) {
|
||||||
|
my $cap_raw = $cdp_caps->{$key};
|
||||||
|
next unless $cap_raw;
|
||||||
|
|
||||||
|
# Simple check, smallest single string is either Host or IGMP with a
|
||||||
|
# space added on the end for a length of 5, hex string is normally
|
||||||
|
# 4 bytes, but since only one byte was traditionally needed process
|
||||||
|
# as hex for a length of 4 or less
|
||||||
|
if ( length $cap_raw < 5 ) {
|
||||||
|
my $cap_hex = join( '',
|
||||||
|
map { sprintf "%x", $_ } unpack( 'C*', $cap_raw ) );
|
||||||
|
foreach my $capability ( keys %CDP_CAPABILITIES ) {
|
||||||
|
if ( ( hex $cap_hex ) & $CDP_CAPABILITIES{$capability} ) {
|
||||||
|
push( @{ $cdp_cap{$key} }, $capability );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
my @caps = split /\s/, $cap_raw;
|
||||||
|
push( @{ $cdp_cap{$key} }, @caps );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return \%cdp_cap;
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
@@ -139,11 +215,11 @@ __END__
|
|||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -162,15 +238,15 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
# Print out a map of device ports with CDP neighbors:
|
# Print out a map of device ports with CDP neighbors:
|
||||||
my $interfaces = $cdp->interfaces();
|
my $interfaces = $cdp->interfaces();
|
||||||
my $c_if = $cdp->c_if();
|
my $cdp_if = $cdp->cdp_if();
|
||||||
my $c_ip = $cdp->c_ip();
|
my $cdp_ip = $cdp->cdp_ip();
|
||||||
my $c_port = $cdp->c_port();
|
my $cdp_port = $cdp->cdp_port();
|
||||||
|
|
||||||
foreach my $cdp_key (keys %$c_ip){
|
foreach my $cdp_key (keys %$cdp_ip){
|
||||||
my $iid = $c_if->{$cdp_key};
|
my $iid = $cdp_if->{$cdp_key};
|
||||||
my $port = $interfaces->{$iid};
|
my $port = $interfaces->{$iid};
|
||||||
my $neighbor = $c_ip->{$cdp_key};
|
my $neighbor = $cdp_ip->{$cdp_key};
|
||||||
my $neighbor_port = $c_port->{$cdp_key};
|
my $neighbor_port = $cdp_port->{$cdp_key};
|
||||||
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,10 +255,12 @@ Max Baker (C<max@warped.org>)
|
|||||||
SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented
|
SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented
|
||||||
interface to CDP information through SNMP.
|
interface to CDP information through SNMP.
|
||||||
|
|
||||||
CDP is a Layer 2 protocol that supplies topology information of devices that also speak CDP,
|
CDP is a Layer 2 protocol that supplies topology information of devices that
|
||||||
mostly switches and routers. CDP is implemented in Cisco and some HP devices.
|
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.
|
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.
|
Check the return value to see if that data is held by the device.
|
||||||
@@ -195,7 +273,7 @@ None.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item CISCO-CDP-MIB
|
=item F<CISCO-CDP-MIB>
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -215,30 +293,31 @@ Accounts for SNMP version 1 devices which may have CDP but not cdp_run()
|
|||||||
|
|
||||||
=item $cdp->cdp_run()
|
=item $cdp->cdp_run()
|
||||||
|
|
||||||
Is CDP enabled on this device? Note that a lot of Cisco devices that implement
|
Is CDP enabled on this device? Note that a lot of Cisco devices that
|
||||||
CDP don't implement this value. @#%$!
|
implement CDP don't implement this value. @#%$!
|
||||||
|
|
||||||
(B<cdpGlobalRun>)
|
(C<cdpGlobalRun>)
|
||||||
|
|
||||||
=item $cdp->cdp_interval()
|
=item $cdp->cdp_interval()
|
||||||
|
|
||||||
Interval in seconds at which CDP messages are generated.
|
Interval in seconds at which CDP messages are generated.
|
||||||
|
|
||||||
(B<cdpGlobalMessageInterval>)
|
(C<cdpGlobalMessageInterval>)
|
||||||
|
|
||||||
=item $cdp->cdp_holdtime()
|
=item $cdp->cdp_holdtime()
|
||||||
|
|
||||||
Time in seconds that CDP messages are kept.
|
Time in seconds that CDP messages are kept.
|
||||||
|
|
||||||
(B<cdpGlobalHoldTime>)
|
(C<cdpGlobalHoldTime>)
|
||||||
|
|
||||||
=item $cdp->cdp_id()
|
=item $cdp->cdp_gid()
|
||||||
|
|
||||||
Returns CDP device ID.
|
Returns CDP device ID.
|
||||||
|
|
||||||
This is the device id broadcast via CDP to other devices, and is what is retrieved from remote devices with $cdp->id().
|
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
|
=back
|
||||||
|
|
||||||
@@ -251,129 +330,179 @@ to a hash.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item $cdp->c_capabilities()
|
=item $cdp->cdp_capabilities()
|
||||||
|
|
||||||
Returns Device Functional Capabilities. Results are munged into an ascii
|
Returns Device Functional Capabilities. Results are munged into an ascii
|
||||||
binary string, 7 digits long, MSB. Each digit represents a bit from the
|
binary string, MSB. Each digit represents a bit from the table below from
|
||||||
table below.
|
the CDP Capabilities Mapping to Smartport Type table within the
|
||||||
|
Cisco Small Business 200 Series Smart Switch Administration Guide,
|
||||||
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
|
L<http://www.cisco.com/c/en/us/support/switches/small-business-200-series-smart-switches/products-maintenance-guides-list.html>:
|
||||||
|
|
||||||
(Bit) - Description
|
(Bit) - Description
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item (0x40) - Provides level 1 functionality.
|
=item (0x400) - Two-Port MAC Relay.
|
||||||
|
|
||||||
=item (0x20) - The bridge or switch does not forward IGMP Report packets on nonrouter ports.
|
=item (0x200) - CAST Phone Port / CVTA / Supports-STP-Dispute depending
|
||||||
|
upon platform.
|
||||||
|
|
||||||
=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 (0x100) - Remotely-Managed Device.
|
||||||
|
|
||||||
=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 (0x80) - VoIP Phone.
|
||||||
|
|
||||||
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge would set both this bit and bit 0x02.
|
=item (0x40) - Provides level 1 functionality.
|
||||||
|
|
||||||
=item (0x02) - Performs level 2 transparent bridging.
|
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
|
||||||
|
non router ports.
|
||||||
|
|
||||||
=item (0x01) - Performs level 3 routing for at least one network layer protocol.
|
=item (0x10) - Sends and receives packets for at least one network layer
|
||||||
|
protocol. If the device is routing the protocol, this bit should not be set.
|
||||||
|
|
||||||
|
=item (0x08) - Performs level 2 switching. The difference between this bit
|
||||||
|
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
|
||||||
|
device is assumed to be deployed in a physical loop-free topology.
|
||||||
|
|
||||||
|
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
|
||||||
|
would set both this bit and bit 0x02.
|
||||||
|
|
||||||
|
=item (0x02) - Performs level 2 transparent bridging.
|
||||||
|
|
||||||
|
=item (0x01) - Performs level 3 routing for at least one network layer
|
||||||
|
protocol.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this information.
|
Thanks to Martin Lorensen for a pointer to the original information and
|
||||||
|
CPAN user Alex for updates.
|
||||||
|
|
||||||
(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.
|
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
|
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.
|
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,
|
Note that a lot devices don't implement $cdp->cdp_index(), So if it isn't
|
||||||
we fake it.
|
around, we fake it.
|
||||||
|
|
||||||
In order to map the cdp table entry back to the interfaces() entry, we truncate the last number
|
In order to map the cdp table entry back to the interfaces() entry, we
|
||||||
off of it :
|
truncate the last number off of it :
|
||||||
|
|
||||||
# it exists, yay.
|
# it exists, yay.
|
||||||
my $c_index = $device->c_index();
|
my $cdp_index = $device->cdp_index();
|
||||||
return $c_index if defined $c_index;
|
return $cdp_index if defined $cdp_index;
|
||||||
|
|
||||||
# if not, let's fake it
|
# if not, let's fake it
|
||||||
my $c_ip = $device->c_ip();
|
my $cdp_ip = $device->cdp_ip();
|
||||||
|
|
||||||
my %c_if
|
my %cdp_if
|
||||||
foreach my $key (keys %$c_ip){
|
foreach my $key (keys %$cdp_ip){
|
||||||
$iid = $key;
|
$iid = $key;
|
||||||
## Truncate off .1 from cdp response
|
## Truncate off .1 from cdp response
|
||||||
$iid =~ s/\.\d+$//;
|
$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.
|
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
|
Returns remote platform id
|
||||||
|
|
||||||
(B<cdpCachePlatform>)
|
(C<cdpCachePlatform>)
|
||||||
|
|
||||||
=item $cdp->c_port()
|
=item $cdp->cdp_port()
|
||||||
|
|
||||||
Returns remote port ID
|
Returns remote port ID
|
||||||
|
|
||||||
(B<cdpDevicePort>)
|
(C<cdpDevicePort>)
|
||||||
|
|
||||||
=item $cdp->c_proto()
|
=item $cdp->cdp_proto()
|
||||||
|
|
||||||
Returns remote address type received. Usually IP.
|
Returns remote address type received. Usually IP.
|
||||||
|
|
||||||
(B<cdpCacheAddressType>)
|
(C<cdpCacheAddressType>)
|
||||||
|
|
||||||
=item $cdp->c_ver()
|
=item $cdp->cdp_ver()
|
||||||
|
|
||||||
Returns remote hardware version
|
Returns remote hardware version
|
||||||
|
|
||||||
(B<cdpCacheVersion>)
|
(C<cdpCacheVersion>)
|
||||||
|
|
||||||
=item $cdp->c_vlan()
|
=item $cdp->cdp_vlan()
|
||||||
|
|
||||||
Returns the remote interface native 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>)
|
||||||
|
|
||||||
|
=item $cdp->cdp_cap()
|
||||||
|
|
||||||
|
Returns hash of arrays with each array containing the system capabilities
|
||||||
|
supported by the remote system. Possible elements in the array are
|
||||||
|
C<Router>, C<Trans-Bridge>, C<Source-Route-Bridge>, C<Switch>, C<Host>,
|
||||||
|
C<IGMP>, C<Repeater>, C<VoIP-Phone>, C<Remotely-Managed-Device>,
|
||||||
|
C<Supports-STP-Dispute>, and C<Two-port Mac Relay>.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 Data Munging Callback Subroutines
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $cdp->munge_power()
|
||||||
|
|
||||||
|
Inserts a decimal at the proper location.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
|
|||||||
150
Info/CiscoAgg.pm
Normal file
150
Info/CiscoAgg.pm
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
# SNMP::Info::CiscoAgg
|
||||||
|
#
|
||||||
|
# Copyright (c) 2014 SNMP::Info Developers
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::CiscoAgg;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
|
||||||
|
|
||||||
|
@SNMP::Info::CiscoAgg::ISA = qw/
|
||||||
|
SNMP::Info::IEEE802dot3ad
|
||||||
|
Exporter
|
||||||
|
/;
|
||||||
|
@SNMP::Info::CiscoAgg::EXPORT_OK = qw/
|
||||||
|
agg_ports
|
||||||
|
/;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::IEEE802dot3ad::MIBS,
|
||||||
|
'CISCO-PAGP-MIB' => 'pagpGroupIfIndex',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = ();
|
||||||
|
|
||||||
|
%FUNCS = ();
|
||||||
|
|
||||||
|
%MUNGE = ();
|
||||||
|
|
||||||
|
sub agg_ports_pagp {
|
||||||
|
my $dev = shift;
|
||||||
|
|
||||||
|
# Note that this mapping will miss any interfaces that are down during
|
||||||
|
# polling. If one of the members is up, we could use
|
||||||
|
# pagpAdminGroupCapability to figure things out, but if they're all
|
||||||
|
# down, we're hosed. Since we could be hosed anyway, we skip the fancy
|
||||||
|
# stuff.
|
||||||
|
my $mapping = {};
|
||||||
|
my $group = $dev->pagpGroupIfIndex;
|
||||||
|
for my $slave (keys %$group) {
|
||||||
|
my $master = $group->{$slave};
|
||||||
|
next if($master == 0 || $slave == $master);
|
||||||
|
|
||||||
|
$mapping->{$slave} = $master;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $mapping;
|
||||||
|
}
|
||||||
|
|
||||||
|
# until we have PAgP data and need to combine with LAG data
|
||||||
|
sub agg_ports {
|
||||||
|
my $ret = {%{agg_ports_pagp(@_)}, %{agg_ports_lag(@_)}};
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::CiscoAgg - SNMP Interface to Cisco Aggregated Links
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
SNMP::Info Developers
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $info = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myrouter',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $info->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
This class provides access to Aggregated Links configuration on Cisco devices.
|
||||||
|
It combines Cisco PAgP and IEEE 802.3ad information.
|
||||||
|
|
||||||
|
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
L<SNMP::Info::IEEE802dot3ad>
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<CISCO-PAGP-MIB>
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item C<agg_ports>
|
||||||
|
|
||||||
|
Returns a HASH reference mapping from slave to master port for each member of
|
||||||
|
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||||
|
ifIndex of the corresponding master ports.
|
||||||
|
|
||||||
|
=item C<agg_ports_pagp>
|
||||||
|
|
||||||
|
Implements the PAgP LAG info retrieval. Merged into C<agg_ports> data
|
||||||
|
automatically.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=cut
|
||||||
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.15';
|
||||||
|
|
||||||
|
%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.15';
|
||||||
|
|
||||||
|
%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.15';
|
||||||
|
|
||||||
|
%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.15';
|
||||||
|
|
||||||
|
%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.15';
|
||||||
|
|
||||||
|
%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.15';
|
||||||
|
|
||||||
|
%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
|
||||||
@@ -1,231 +1,298 @@
|
|||||||
# SNMP::Info::CiscoStack
|
# SNMP::Info::CiscoStack
|
||||||
# Max Baker <max@warped.org>
|
# $Id$
|
||||||
#
|
#
|
||||||
# Copyright (c)2003,2004 Max Baker
|
# Copyright (c) 2008 Max Baker
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the author nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
package SNMP::Info::CiscoStack;
|
package SNMP::Info::CiscoStack;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info;
|
use SNMP::Info;
|
||||||
|
|
||||||
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
|
@SNMP::Info::CiscoStack::ISA = qw/SNMP::Info Exporter/;
|
||||||
@SNMP::Info::CiscoStack::ISA = qw/SNMP::Info Exporter/;
|
|
||||||
@SNMP::Info::CiscoStack::EXPORT_OK = qw//;
|
@SNMP::Info::CiscoStack::EXPORT_OK = qw//;
|
||||||
|
|
||||||
$DEBUG=0;
|
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/;
|
||||||
$SNMP::debugging=$DEBUG;
|
|
||||||
|
|
||||||
$INIT = 0;
|
$VERSION = '3.15';
|
||||||
%MIBS = (
|
|
||||||
'CISCO-STACK-MIB' => 'ciscoStackMIB',
|
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );
|
||||||
);
|
|
||||||
|
|
||||||
%GLOBALS = (
|
%GLOBALS = (
|
||||||
'sysip' => 'sysIpAddr',
|
'sysip' => 'sysIpAddr',
|
||||||
'netmask' => 'sysNetMask',
|
'netmask' => 'sysNetMask',
|
||||||
'broadcast' => 'sysBroadcast',
|
'broadcast' => 'sysBroadcast',
|
||||||
'serial1' => 'chassisSerialNumber',
|
'serial1' => 'chassisSerialNumber',
|
||||||
'serial2' => 'chassisSerialNumberString',
|
'serial2' => 'chassisSerialNumberString',
|
||||||
'model1' => 'chassisModel',
|
'model1' => 'chassisModel',
|
||||||
'ps1_type' => 'chassisPs1Type',
|
'ps1_type' => 'chassisPs1Type',
|
||||||
'ps1_status' => 'chassisPs1Status',
|
'ps1_status' => 'chassisPs1Status',
|
||||||
'ps2_type' => 'chassisPs2Type',
|
'ps2_type' => 'chassisPs2Type',
|
||||||
'ps2_status' => 'chassisPs2Status',
|
'ps2_status' => 'chassisPs2Status',
|
||||||
'slots' => 'chassisNumSlots',
|
'slots' => 'chassisNumSlots',
|
||||||
'fan' => 'chassisFanStatus',
|
'fan' => 'chassisFanStatus',
|
||||||
);
|
);
|
||||||
|
|
||||||
%FUNCS = (
|
%FUNCS = (
|
||||||
'i_type2' => 'ifType',
|
|
||||||
# CISCO-STACK-MIB::moduleEntry
|
|
||||||
# These are blades in a catalyst device
|
|
||||||
'm_type' => 'moduleType',
|
|
||||||
'm_model' => 'moduleModel',
|
|
||||||
'm_serial' => 'moduleSerialNumber',
|
|
||||||
'm_status' => 'moduleStatus',
|
|
||||||
'm_name' => 'moduleName',
|
|
||||||
'm_ports' => 'moduleNumPorts',
|
|
||||||
'm_ports_status' => 'modulePortStatus',
|
|
||||||
'm_hwver' => 'moduleHwVersion',
|
|
||||||
'm_fwver' => 'moduleFwVersion',
|
|
||||||
'm_swver' => 'moduleSwVersion',
|
|
||||||
# Router Blades :
|
|
||||||
'm_ip' => 'moduleIPAddress',
|
|
||||||
'm_sub1' => 'moduleSubType',
|
|
||||||
'm_sub2' => 'moduleSubType2',
|
|
||||||
# CISCO-STACK-MIB::portEntry
|
|
||||||
'p_name' => 'portName',
|
|
||||||
'p_type' => 'portType',
|
|
||||||
'p_status' => 'portOperStatus',
|
|
||||||
'p_status2' => 'portAdditionalStatus',
|
|
||||||
'p_speed' => 'portAdminSpeed',
|
|
||||||
'p_duplex' => 'portDuplex',
|
|
||||||
'p_port' => 'portIfIndex',
|
|
||||||
# CISCO-STACK-MIB::PortCpbEntry
|
|
||||||
'p_speed_admin' => 'portCpbSpeed',
|
|
||||||
'p_duplex_admin' => 'portCpbDuplex',
|
|
||||||
);
|
|
||||||
|
|
||||||
%MUNGE = (
|
# CISCO-STACK-MIB::moduleEntry
|
||||||
'm_ports_status' => \&munge_port_status,
|
# These are blades in a catalyst device
|
||||||
'p_duplex_admin' => \&SNMP::Info::munge_bits,
|
'm_type' => 'moduleType',
|
||||||
);
|
'm_model' => 'moduleModel',
|
||||||
|
'm_serial' => 'moduleSerialNumber',
|
||||||
|
'm_serial_string' => 'moduleSerialNumberString',
|
||||||
|
'm_status' => 'moduleStatus',
|
||||||
|
'm_name' => 'moduleName',
|
||||||
|
'm_ports' => 'moduleNumPorts',
|
||||||
|
'm_ports_status' => 'modulePortStatus',
|
||||||
|
'm_hwver' => 'moduleHwVersion',
|
||||||
|
'm_fwver' => 'moduleFwVersion',
|
||||||
|
'm_swver' => 'moduleSwVersion',
|
||||||
|
|
||||||
%PORTSTAT = (1 => 'other',
|
# Router Blades :
|
||||||
2 => 'ok',
|
'm_ip' => 'moduleIPAddress',
|
||||||
3 => 'minorFault',
|
'm_sub1' => 'moduleSubType',
|
||||||
4 => 'majorFault');
|
'm_sub2' => 'moduleSubType2',
|
||||||
|
|
||||||
|
# CISCO-STACK-MIB::portEntry
|
||||||
|
'p_name' => 'portName',
|
||||||
|
'p_type' => 'portType',
|
||||||
|
'p_status' => 'portOperStatus',
|
||||||
|
'p_status2' => 'portAdditionalStatus',
|
||||||
|
'p_speed' => 'portAdminSpeed',
|
||||||
|
'p_duplex' => 'portDuplex',
|
||||||
|
'p_port' => 'portIfIndex',
|
||||||
|
'p_rx_flow_control' => 'portOperRxFlowControl',
|
||||||
|
'p_tx_flow_control' => 'portOperTxFlowControl',
|
||||||
|
'p_rx_flow_control_admin' => 'portAdminRxFlowControl',
|
||||||
|
'p_tx_flow_control_admin' => 'portAdminTxFlowControl',
|
||||||
|
'p_oidx' => 'portCrossIndex',
|
||||||
|
|
||||||
|
# CISCO-STACK-MIB::PortCpbEntry
|
||||||
|
'p_speed_admin' => 'portCpbSpeed',
|
||||||
|
'p_duplex_admin' => 'portCpbDuplex',
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
'm_ports_status' => \&munge_port_status,
|
||||||
|
'p_duplex_admin' => \&SNMP::Info::munge_bits,
|
||||||
|
);
|
||||||
|
|
||||||
|
%PORTSTAT = (
|
||||||
|
1 => 'other',
|
||||||
|
2 => 'ok',
|
||||||
|
3 => 'minorFault',
|
||||||
|
4 => 'majorFault'
|
||||||
|
);
|
||||||
|
|
||||||
# Changes binary byte describing each port into ascii, and returns
|
# Changes binary byte describing each port into ascii, and returns
|
||||||
# an ascii list separated by spaces.
|
# an ascii list separated by spaces.
|
||||||
sub munge_port_status {
|
sub munge_port_status {
|
||||||
my $status = shift;
|
my $status = shift;
|
||||||
my @vals = map($PORTSTAT{$_},unpack('C*',$status));
|
my @vals = map( $PORTSTAT{$_}, unpack( 'C*', $status ) );
|
||||||
return join(' ',@vals);
|
return join( ' ', @vals );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub serial {
|
sub serial {
|
||||||
my $stack = shift;
|
my $stack = shift;
|
||||||
my $serial1 = $stack->serial1();
|
my $serial1 = $stack->serial1();
|
||||||
my $serial2 = $stack->serial2();
|
my $serial2 = $stack->serial2();
|
||||||
|
|
||||||
return $serial1 if defined $serial1;
|
return $serial1 if defined $serial1;
|
||||||
return $serial2 if defined $serial2;
|
return $serial2 if defined $serial2;
|
||||||
return undef;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_type {
|
# Rules for older CatOS devices using CiscoStack
|
||||||
my $stack = shift;
|
#
|
||||||
|
# You can configure Ethernet and Fast Ethernet interfaces to either full
|
||||||
my $p_port = $stack->p_port();
|
# duplex or half duplex.
|
||||||
my $p_type = $stack->p_type();
|
#
|
||||||
|
# You cannot configure the duplex mode on Gigabit Ethernet ports (they are
|
||||||
# Get more generic port types from IF-MIB
|
# always in full-duplex mode).
|
||||||
my $i_type = $stack->i_type2();
|
#
|
||||||
|
# If you set the port speed to auto, duplex mode is automatically set to auto.
|
||||||
# Now Override w/ port entries
|
#
|
||||||
foreach my $port (keys %$p_type) {
|
# For operational duplex if portCpbDuplex is all zeros the port is a gigabit
|
||||||
my $iid = $p_port->{$port};
|
# port and duplex is always full. If the port is not operational and auto
|
||||||
$i_type->{$iid} = $p_type->{$port};
|
# return value will be undef since we don't know the operational status.
|
||||||
}
|
#
|
||||||
|
# Newer devices use ETHERLIKE-MIB to report operational duplex, this will be
|
||||||
return $i_type;
|
# checked in the device class.
|
||||||
}
|
|
||||||
|
|
||||||
# p_* functions are indexed to physical port. let's index these
|
|
||||||
# to snmp iid
|
|
||||||
sub i_name {
|
|
||||||
my $stack = shift;
|
|
||||||
|
|
||||||
my $p_port = $stack->p_port();
|
|
||||||
my $p_name = $stack->p_name();
|
|
||||||
|
|
||||||
my %i_name;
|
|
||||||
foreach my $port (keys %$p_name) {
|
|
||||||
my $iid = $p_port->{$port};
|
|
||||||
next unless defined $iid;
|
|
||||||
$i_name{$iid} = $p_name->{$port};
|
|
||||||
}
|
|
||||||
return \%i_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub i_duplex {
|
sub i_duplex {
|
||||||
my $stack = shift;
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
#my $i_duplex = $stack->SUPER::i_duplex();
|
my $p_port = $stack->p_port() || {};
|
||||||
my $p_port = $stack->p_port();
|
my $p_duplex = $stack->p_duplex() || {};
|
||||||
my $p_duplex = $stack->p_duplex();
|
my $p_duplex_cap = $stack->p_duplex_admin() || {};
|
||||||
|
|
||||||
my $i_duplex = {};
|
my $i_duplex = {};
|
||||||
foreach my $port (keys %$p_duplex) {
|
foreach my $port ( keys %$p_duplex ) {
|
||||||
my $iid = $p_port->{$port};
|
|
||||||
$i_duplex->{$iid} = $p_duplex->{$port};
|
|
||||||
}
|
|
||||||
return $i_duplex;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub i_duplex_admin {
|
|
||||||
my $stack = shift;
|
|
||||||
|
|
||||||
my $p_port = $stack->p_port();
|
|
||||||
my $p_duplex_admin = $stack->p_duplex_admin();
|
|
||||||
|
|
||||||
my %i_duplex_admin;
|
|
||||||
foreach my $port (keys %$p_duplex_admin) {
|
|
||||||
my $iid = $p_port->{$port};
|
my $iid = $p_port->{$port};
|
||||||
next unless defined $iid;
|
next unless defined $iid;
|
||||||
my $duplex = $p_duplex_admin->{$port};
|
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||||
next unless defined $duplex;
|
|
||||||
|
|
||||||
my $string = 'other';
|
# Test for gigabit
|
||||||
# see CISCO-STACK-MIB for a description of the bits
|
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) {
|
||||||
$string = 'half' if ($duplex =~ /001$/ or $duplex =~ /0100.$/);
|
$i_duplex->{$iid} = 'full';
|
||||||
$string = 'full' if ($duplex =~ /010$/ or $duplex =~ /100.0$/);
|
}
|
||||||
# we'll call it auto if both full and half are turned on, or if the
|
|
||||||
# specifically 'auto' flag bit is set.
|
# Auto is not a valid operational state
|
||||||
$string = 'auto'
|
elsif ( $p_duplex->{$port} eq 'auto' ) {
|
||||||
if ($duplex =~ /1..$/ or $duplex =~ /110..$/ or $duplex =~ /..011$/);
|
next;
|
||||||
|
}
|
||||||
$i_duplex_admin{$iid} = $string;
|
else {
|
||||||
|
$i_duplex->{$iid} = $p_duplex->{$port};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return \%i_duplex_admin;
|
return $i_duplex;
|
||||||
}
|
}
|
||||||
|
|
||||||
# $stack->interfaces() - Maps the ifIndex table to a physical port
|
# For administrative duplex if portCpbDuplex is all zeros the port is a gigabit
|
||||||
sub interfaces {
|
# port and duplex is always full. If portAdminSpeed is set to auto then the
|
||||||
my $self = shift;
|
# duplex will be auto, otherwise use portDuplex.
|
||||||
my $i_index = $self->i_index();
|
|
||||||
my $portnames = $self->p_port();
|
|
||||||
my %portmap = reverse %$portnames;
|
|
||||||
|
|
||||||
my %interfaces = ();
|
sub i_duplex_admin {
|
||||||
foreach my $iid (keys %$i_index) {
|
my $stack = shift;
|
||||||
my $if = $i_index->{$iid};
|
my $partial = shift;
|
||||||
my $port = $portmap{$iid};
|
|
||||||
$interfaces{$iid} = $port || $if;
|
my $p_port = $stack->p_port() || {};
|
||||||
|
my $p_duplex = $stack->p_duplex() || {};
|
||||||
|
my $p_duplex_cap = $stack->p_duplex_admin() || {};
|
||||||
|
my $p_speed = $stack->p_speed() || {};
|
||||||
|
|
||||||
|
my $i_duplex_admin = {};
|
||||||
|
foreach my $port ( keys %$p_duplex ) {
|
||||||
|
my $iid = $p_port->{$port};
|
||||||
|
next unless defined $iid;
|
||||||
|
next if ( defined $partial and $iid !~ /^$partial$/ );
|
||||||
|
|
||||||
|
# Test for gigabit
|
||||||
|
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 1 ) {
|
||||||
|
$i_duplex_admin->{$iid} = 'full';
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check admin speed for auto
|
||||||
|
elsif ( $p_speed->{$port} =~ /auto/ ) {
|
||||||
|
$i_duplex_admin->{$iid} = 'auto';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$i_duplex_admin->{$iid} = $p_duplex->{$port};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $i_duplex_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_speed_admin {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my %i_speed_admin;
|
||||||
|
my $p_port = $stack->p_port() || {};
|
||||||
|
my $p_speed = $stack->p_speed() || {};
|
||||||
|
|
||||||
|
my %speeds = (
|
||||||
|
'autoDetect' => 'auto',
|
||||||
|
'autoDetect10100' => 'auto',
|
||||||
|
's10000000' => '10 Mbps',
|
||||||
|
's100000000' => '100 Mbps',
|
||||||
|
's1000000000' => '1.0 Gbps',
|
||||||
|
's10G' => '10 Gbps',
|
||||||
|
);
|
||||||
|
|
||||||
|
%i_speed_admin
|
||||||
|
= map { $p_port->{$_} => $speeds{ $p_speed->{$_} } } keys %$p_port;
|
||||||
|
|
||||||
|
return \%i_speed_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_i_speed_admin {
|
||||||
|
|
||||||
|
# map speeds to those the switch will understand
|
||||||
|
my %speeds = qw/auto 1 10 10000000 100 100000000 1000 1000000000/;
|
||||||
|
|
||||||
|
my $stack = shift;
|
||||||
|
my ( $speed, $iid ) = @_;
|
||||||
|
my $p_port = $stack->p_port() || {};
|
||||||
|
my %reverse_p_port = reverse %$p_port;
|
||||||
|
|
||||||
|
$speed = lc($speed);
|
||||||
|
|
||||||
|
return 0 unless defined $speeds{$speed};
|
||||||
|
|
||||||
|
$iid = $reverse_p_port{$iid};
|
||||||
|
|
||||||
|
return $stack->set_p_speed( $speeds{$speed}, $iid );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_i_duplex_admin {
|
||||||
|
|
||||||
|
# map a textual duplex to an integer one the switch understands
|
||||||
|
my %duplexes = qw/half 1 full 2 auto 4/;
|
||||||
|
|
||||||
|
my $stack = shift;
|
||||||
|
my ( $duplex, $iid ) = @_;
|
||||||
|
if ( $duplex eq 'auto' ) {
|
||||||
|
$stack->error_throw(
|
||||||
|
"Software doesn't support setting auto duplex with
|
||||||
|
set_i_duplex_admin() you must use
|
||||||
|
set_i_speed_admin() and set both speed and duplex
|
||||||
|
to auto"
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return \%interfaces;
|
my $p_port = $stack->p_port() || {};
|
||||||
|
my %reverse_p_port = reverse %$p_port;
|
||||||
|
|
||||||
|
$duplex = lc($duplex);
|
||||||
|
|
||||||
|
return 0 unless defined $duplexes{$duplex};
|
||||||
|
|
||||||
|
$iid = $reverse_p_port{$iid};
|
||||||
|
|
||||||
|
return $stack->set_p_duplex( $duplexes{$duplex}, $iid );
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
SNMP::Info::CiscoStack - Perl5 Interface to CPU and Memory stats for Cisco Devices
|
SNMP::Info::CiscoStack - SNMP Interface to data from F<CISCO-STACK-MIB> and
|
||||||
|
F<CISCO-PORT-SECURITY-MIB>
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -233,14 +300,13 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $ciscostats = new SNMP::Info(
|
my $ciscostats = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
)
|
)
|
||||||
or die "Can't connect to DestHost.\n";
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
my $class = $ciscostats->class();
|
my $class = $ciscostats->class();
|
||||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
@@ -259,55 +325,53 @@ none.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item CISCO-STACK-MIB
|
=item F<CISCO-STACK-MIB>
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
|
||||||
|
|
||||||
=head1 GLOBALS
|
=head1 GLOBALS
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item $stack->broadcast()
|
=item $stack->broadcast()
|
||||||
|
|
||||||
(B<sysBroadcast>)
|
(C<sysBroadcast>)
|
||||||
|
|
||||||
=item $stack->fan()
|
=item $stack->fan()
|
||||||
|
|
||||||
(B<chassisFanStatus>)
|
(C<chassisFanStatus>)
|
||||||
|
|
||||||
=item $stack->model()
|
=item $stack->model()
|
||||||
|
|
||||||
(B<chassisModel>)
|
(C<chassisModel>)
|
||||||
|
|
||||||
=item $stack->netmask()
|
=item $stack->netmask()
|
||||||
|
|
||||||
(B<sysNetMask>)
|
(C<sysNetMask>)
|
||||||
|
|
||||||
=item $stack->ps1_type()
|
=item $stack->ps1_type()
|
||||||
|
|
||||||
(B<chassisPs1Type>)
|
(C<chassisPs1Type>)
|
||||||
|
|
||||||
=item $stack->ps2_type()
|
=item $stack->ps2_type()
|
||||||
|
|
||||||
(B<chassisPs2Type>)
|
(C<chassisPs2Type>)
|
||||||
|
|
||||||
=item $stack->ps1_status()
|
=item $stack->ps1_status()
|
||||||
|
|
||||||
(B<chassisPs1Status>)
|
(C<chassisPs1Status>)
|
||||||
|
|
||||||
=item $stack->ps2_status()
|
=item $stack->ps2_status()
|
||||||
|
|
||||||
(B<chassisPs2Status>)
|
(C<chassisPs2Status>)
|
||||||
|
|
||||||
=item $stack->serial()
|
=item $stack->serial()
|
||||||
|
|
||||||
(B<chassisSerialNumberString>) or (B<chassisSerialNumber>)
|
(C<chassisSerialNumberString>) or (C<chassisSerialNumber>)
|
||||||
|
|
||||||
=item $stack->slots()
|
=item $stack->slots()
|
||||||
|
|
||||||
(B<chassisNumSlots>)
|
(C<chassisNumSlots>)
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -317,10 +381,6 @@ MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item $stack->interfaces()
|
|
||||||
|
|
||||||
Crosses p_port() with i_index() to get physical names.
|
|
||||||
|
|
||||||
=item $stack->i_physical()
|
=item $stack->i_physical()
|
||||||
|
|
||||||
Returns a map to IID for ports that are physical ports, not vlans, etc.
|
Returns a map to IID for ports that are physical ports, not vlans, etc.
|
||||||
@@ -329,21 +389,59 @@ Returns a map to IID for ports that are physical ports, not vlans, etc.
|
|||||||
|
|
||||||
Crosses p_port() with p_type() and returns the results.
|
Crosses p_port() with p_type() and returns the results.
|
||||||
|
|
||||||
Overrides with ifType if p_type() isn't available.
|
Overrides with C<ifType> if p_type() isn't available.
|
||||||
|
|
||||||
=item $stack->i_name()
|
|
||||||
|
|
||||||
Crosses p_name with p_port and returns results.
|
|
||||||
|
|
||||||
=item $stack->i_duplex()
|
=item $stack->i_duplex()
|
||||||
|
|
||||||
Crosses p_duplex with p_port and returns results.
|
Returns reference to hash of iid to current link duplex setting.
|
||||||
|
|
||||||
|
First checks for fixed gigabit ports which are always full duplex. Next, if
|
||||||
|
the port is not operational and reported port duplex (C<portDuplex>) is auto
|
||||||
|
then the operational duplex can not be determined. Otherwise it uses the
|
||||||
|
reported port duplex (C<portDuplex>).
|
||||||
|
|
||||||
=item $stack->i_duplex_admin()
|
=item $stack->i_duplex_admin()
|
||||||
|
|
||||||
Crosses p_duplex_admin with p_port.
|
Returns reference to hash of iid to administrative duplex setting.
|
||||||
|
|
||||||
Munges bit_string returned from p_duplex_admin to get duplex settings.
|
First checks for fixed gigabit ports which are always full duplex. Next checks
|
||||||
|
the port administrative speed (C<portAdminSpeed>) which if set to
|
||||||
|
autonegotiate then the duplex will also autonegotiate, otherwise it uses the
|
||||||
|
reported port duplex (C<portDuplex>).
|
||||||
|
|
||||||
|
=item $stack->i_speed_admin()
|
||||||
|
|
||||||
|
Returns reference to hash of iid to administrative speed setting.
|
||||||
|
|
||||||
|
C<portAdminSpeed>
|
||||||
|
|
||||||
|
=item $stack->set_i_speed_admin(speed, ifIndex)
|
||||||
|
|
||||||
|
Sets port speed, must be supplied with speed and port C<ifIndex>
|
||||||
|
|
||||||
|
Speed choices are 'auto', '10', '100', '1000'
|
||||||
|
|
||||||
|
Crosses $stack->p_port() with $stack->p_duplex() to
|
||||||
|
utilize port C<ifIndex>.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
my %if_map = reverse %{$stack->interfaces()};
|
||||||
|
$stack->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})
|
||||||
|
or die "Couldn't change port speed. ",$stack->error(1);
|
||||||
|
|
||||||
|
=item $stack->set_i_duplex_admin(duplex, ifIndex)
|
||||||
|
|
||||||
|
Sets port duplex, must be supplied with duplex and port C<ifIndex>
|
||||||
|
|
||||||
|
Speed choices are 'auto', 'half', 'full'
|
||||||
|
|
||||||
|
Crosses $stack->p_port() with $stack->p_duplex() to
|
||||||
|
utilize port C<ifIndex>.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
my %if_map = reverse %{$stack->interfaces()};
|
||||||
|
$stack->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
|
||||||
|
or die "Couldn't change port duplex. ",$stack->error(1);
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -356,27 +454,27 @@ the Catalyst device.
|
|||||||
|
|
||||||
=item $stack->m_type()
|
=item $stack->m_type()
|
||||||
|
|
||||||
(B<moduleType>)
|
(C<moduleType>)
|
||||||
|
|
||||||
=item $stack->m_model()
|
=item $stack->m_model()
|
||||||
|
|
||||||
(B<moduleModel>)
|
(C<moduleModel>)
|
||||||
|
|
||||||
=item $stack->m_serial()
|
=item $stack->m_serial()
|
||||||
|
|
||||||
(B<moduleSerialNumber>)
|
(C<moduleSerialNumber>)
|
||||||
|
|
||||||
=item $stack->m_status()
|
=item $stack->m_status()
|
||||||
|
|
||||||
(B<moduleStatus>)
|
(C<moduleStatus>)
|
||||||
|
|
||||||
=item $stack->m_name()
|
=item $stack->m_name()
|
||||||
|
|
||||||
(B<moduleName>)
|
(C<moduleName>)
|
||||||
|
|
||||||
=item $stack->m_ports()
|
=item $stack->m_ports()
|
||||||
|
|
||||||
(B<moduleNumPorts>)
|
(C<moduleNumPorts>)
|
||||||
|
|
||||||
=item $stack->m_ports_status()
|
=item $stack->m_ports_status()
|
||||||
|
|
||||||
@@ -387,31 +485,31 @@ To see the status of port 4 :
|
|||||||
@ports_status = split(' ', $stack->m_ports_status() );
|
@ports_status = split(' ', $stack->m_ports_status() );
|
||||||
$port4 = $ports_status[3];
|
$port4 = $ports_status[3];
|
||||||
|
|
||||||
(B<modulePortStatus>)
|
(C<modulePortStatus>)
|
||||||
|
|
||||||
=item $stack->m_ports_hwver()
|
=item $stack->m_ports_hwver()
|
||||||
|
|
||||||
(B<moduleHwVersion>)
|
(C<moduleHwVersion>)
|
||||||
|
|
||||||
=item $stack->m_ports_fwver()
|
=item $stack->m_ports_fwver()
|
||||||
|
|
||||||
(B<moduleFwVersion>)
|
(C<moduleFwVersion>)
|
||||||
|
|
||||||
=item $stack->m_ports_swver()
|
=item $stack->m_ports_swver()
|
||||||
|
|
||||||
(B<moduleSwVersion>)
|
(C<moduleSwVersion>)
|
||||||
|
|
||||||
=item $stack->m_ports_ip()
|
=item $stack->m_ports_ip()
|
||||||
|
|
||||||
(B<moduleIPAddress>)
|
(C<moduleIPAddress>)
|
||||||
|
|
||||||
=item $stack->m_ports_sub1()
|
=item $stack->m_ports_sub1()
|
||||||
|
|
||||||
(B<moduleSubType>)
|
(C<moduleSubType>)
|
||||||
|
|
||||||
=item $stack->m_ports_sub2()
|
=item $stack->m_ports_sub2()
|
||||||
|
|
||||||
(B<moduleSubType2>)
|
(C<moduleSubType2>)
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -421,63 +519,118 @@ To see the status of port 4 :
|
|||||||
|
|
||||||
=item $stack->m_ip()
|
=item $stack->m_ip()
|
||||||
|
|
||||||
(B<moduleIPAddress>)
|
(C<moduleIPAddress>)
|
||||||
|
|
||||||
=item $stack->m_sub1()
|
=item $stack->m_sub1()
|
||||||
|
|
||||||
(B<moduleSubType>)
|
(C<moduleSubType>)
|
||||||
|
|
||||||
=item $stack->m_sub2()
|
=item $stack->m_sub2()
|
||||||
|
|
||||||
(B<moduleSubType2>)
|
(C<moduleSubType2>)
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Port Entry Table (CISCO-STACK-MIB::portTable)
|
=head2 Port Entry Table (C<CISCO-STACK-MIB::portTable>)
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item $stack->p_name()
|
=item $stack->p_name()
|
||||||
|
|
||||||
(B<portName>)
|
(C<portName>)
|
||||||
|
|
||||||
=item $stack->p_type()
|
=item $stack->p_type()
|
||||||
|
|
||||||
(B<portType>)
|
(C<portType>)
|
||||||
|
|
||||||
=item $stack->p_status()
|
=item $stack->p_status()
|
||||||
|
|
||||||
(B<portOperStatus>)
|
(C<portOperStatus>)
|
||||||
|
|
||||||
=item $stack->p_status2()
|
=item $stack->p_status2()
|
||||||
|
|
||||||
(B<portAdditionalStatus>)
|
(C<portAdditionalStatus>)
|
||||||
|
|
||||||
=item $stack->p_speed()
|
=item $stack->p_speed()
|
||||||
|
|
||||||
(B<portAdminSpeed>)
|
(C<portAdminSpeed>)
|
||||||
|
|
||||||
=item $stack->p_duplex()
|
=item $stack->p_duplex()
|
||||||
|
|
||||||
(B<portDuplex>)
|
(C<portDuplex>)
|
||||||
|
|
||||||
=item $stack->p_port()
|
=item $stack->p_port()
|
||||||
|
|
||||||
(B<portIfIndex>)
|
(C<portIfIndex>)
|
||||||
|
|
||||||
|
=item $stack->p_rx_flow_control()
|
||||||
|
|
||||||
|
Can be either C<on> C<off> or C<disagree>
|
||||||
|
|
||||||
|
"Indicates the receive flow control operational status of the port. If the
|
||||||
|
port could not agree with the far end on a link protocol, its operational
|
||||||
|
status will be disagree(3)."
|
||||||
|
|
||||||
|
C<portOperRxFlowControl>
|
||||||
|
|
||||||
|
=item $stack->p_tx_flow_control()
|
||||||
|
|
||||||
|
Can be either C<on> C<off> or C<disagree>
|
||||||
|
|
||||||
|
"Indicates the transmit flow control operational status of the port. If the
|
||||||
|
port could not agree with the far end on a link protocol, its operational
|
||||||
|
status will be disagree(3)."
|
||||||
|
|
||||||
|
C<portOperTxFlowControl>
|
||||||
|
|
||||||
|
=item $stack->p_rx_flow_control_admin()
|
||||||
|
|
||||||
|
Can be either C<on> C<off> or C<desired>
|
||||||
|
|
||||||
|
"Indicates the receive flow control administrative status set on the port. If
|
||||||
|
the status is set to on(1), the port will require the far end to send flow
|
||||||
|
control. If the status is set to off(2), the port will not allow far end to
|
||||||
|
send flow control. If the status is set to desired(3), the port will allow
|
||||||
|
the far end to send the flow control."
|
||||||
|
|
||||||
|
C<portAdminRxFlowControl>
|
||||||
|
|
||||||
|
=item $stack->p_tx_flow_control_admin()
|
||||||
|
|
||||||
|
Can be either C<on> C<off> or C<desired>
|
||||||
|
|
||||||
|
"Indicates the transmit flow control administrative status set on the port.
|
||||||
|
If the status is set to on(1), the port will send flow control to the far end. If
|
||||||
|
the status is set to off(2), the port will not send flow control to the far
|
||||||
|
end. If the status is set to desired(3), the port will send flow control to
|
||||||
|
the far end if the far end supports it."
|
||||||
|
|
||||||
|
C<portAdminTxFlowControl>
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Port Capability Table (CISCO-STACK-MIB::portCpbTable)
|
=head2 Port Capability Table (C<CISCO-STACK-MIB::portCpbTable>)
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item $stack->p_speed_admin()
|
=item $stack->p_speed_admin()
|
||||||
|
|
||||||
(B<portCpbSpeed>)
|
(C<portCpbSpeed>)
|
||||||
|
|
||||||
=item $stack->p_duplex_admin()
|
=item $stack->p_duplex_admin()
|
||||||
|
|
||||||
(B<portCpbDuplex>)
|
(C<portCpbDuplex>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 Data Munging Callback Subroutines
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $stack->munge_port_status()
|
||||||
|
|
||||||
|
Munges binary byte describing each port into ascii, and returns an ascii
|
||||||
|
list separated by spaces.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
|
|||||||
@@ -1,110 +1,242 @@
|
|||||||
# SNMP::Info::CiscoStats
|
# SNMP::Info::CiscoStats
|
||||||
# Max Baker <max@warped.org>
|
# $Id$
|
||||||
#
|
#
|
||||||
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
|
# Changes since Version 0.7 Copyright (c) 2008-2009 Max Baker and SNMP::Info Developers
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2003 Regents of the University of California
|
# Copyright (c) 2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
package SNMP::Info::CiscoStats;
|
package SNMP::Info::CiscoStats;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info;
|
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//;
|
@SNMP::Info::CiscoStats::EXPORT_OK = qw//;
|
||||||
|
|
||||||
$DEBUG=0;
|
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||||
$SNMP::debugging=$DEBUG;
|
|
||||||
|
|
||||||
$INIT = 0;
|
$VERSION = '3.15';
|
||||||
%MIBS = (
|
|
||||||
'RFC1213-MIB' => 'sysDescr',
|
%MIBS = (
|
||||||
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
|
'SNMPv2-MIB' => 'sysDescr',
|
||||||
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed'
|
'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 = (
|
%GLOBALS = (
|
||||||
'description' => 'sysDescr',
|
'description' => 'sysDescr',
|
||||||
# We will use the numeric OID's so that we don't require people
|
'ent_physical_software_rev' => 'entPhysicalSoftwareRev.1',
|
||||||
# to install v1 MIBs, which can conflict.
|
|
||||||
# OLD-CISCO-CPU-MIB:avgBusyPer
|
|
||||||
'ios_cpu' => '1.3.6.1.4.1.9.2.1.56.0',
|
|
||||||
'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
|
|
||||||
'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
|
|
||||||
# CISCO-PROCESS-MIB
|
|
||||||
'cat_cpu' => 'cpmCPUTotal5sec.9',
|
|
||||||
'cat_cpu_1min' => 'cpmCPUTotal1min.9',
|
|
||||||
'cat_cpu_5min' => 'cpmCPUTotal5min.9',
|
|
||||||
# CISCO-MEMORY-POOL-MIB
|
|
||||||
'mem_free' => 'ciscoMemoryPoolFree.1',
|
|
||||||
'mem_used' => 'ciscoMemoryPoolUsed.1',
|
|
||||||
);
|
|
||||||
|
|
||||||
%FUNCS = (
|
# 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 {
|
sub os {
|
||||||
my $l2 = shift;
|
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.
|
# order here matters - there are Catalysts that run IOS and have catalyst
|
||||||
return 'ios' if ($descr =~ /IOS/);
|
# in their description field, as well as Catalysts that run IOS-XE.
|
||||||
return 'catalyst' if ($descr =~ /catalyst/i);
|
return 'ios-xe' if ( $descr =~ /IOS-XE/ );
|
||||||
return undef;
|
return 'ios-xr' if ( $descr =~ /IOS XR/ );
|
||||||
|
return 'ios' if ( $descr =~ /IOS/ );
|
||||||
|
return 'catalyst' if ( $descr =~ /catalyst/i );
|
||||||
|
return 'css' if ( $descr =~ /Content Switch SW/ );
|
||||||
|
return 'css-sca' if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
|
||||||
|
return 'pix' if ( $descr =~ /Cisco PIX Security Appliance/ );
|
||||||
|
return 'asa' if ( $descr =~ /Cisco Adaptive Security Appliance/ );
|
||||||
|
return 'san-os' if ( $descr =~ /Cisco SAN-OS/ );
|
||||||
|
|
||||||
|
if ( $descr =~ /Application Control Engine Service Module/ ) {
|
||||||
|
# Only the admin context implements the entity MIB
|
||||||
|
return 'ace-admin' if defined $l2->ent_physical_software_rev();
|
||||||
|
return 'ace-context';
|
||||||
|
}
|
||||||
|
|
||||||
|
# Pre-version 3 FWSMs
|
||||||
|
return 'fwsm' if ( $descr =~ /Cisco Secure FWSM Firewall/ );
|
||||||
|
|
||||||
|
# Version 3+ FWSMs (currently untested against version 4)
|
||||||
|
if ( $descr =~ /Firewall Services Module/ ) {
|
||||||
|
|
||||||
|
my $model = $l2->model();
|
||||||
|
|
||||||
|
if ( defined $model && $model eq "WsSvcFwm1sc" ) {
|
||||||
|
# Only the admin context implements the entity MIB
|
||||||
|
return 'fwsm-admin' if defined $l2->ent_physical_software_rev();
|
||||||
|
return 'fwsm-context';
|
||||||
|
}
|
||||||
|
|
||||||
|
# Non context mode FWSM
|
||||||
|
return 'fwsm';
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub os_ver {
|
sub os_ver {
|
||||||
my $l2 = shift;
|
my $l2 = shift;
|
||||||
my $os = $l2->os();
|
my $os = $l2->os();
|
||||||
my $descr = $l2->description();
|
my $descr = $l2->description();
|
||||||
|
|
||||||
# Older Catalysts
|
# 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;
|
return $1;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Newer Catalysts and IOS devices
|
if ( defined $os
|
||||||
if (defined $descr and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ ){
|
and $os eq 'css'
|
||||||
|
and defined $descr
|
||||||
|
and $descr =~ m/Content Switch SW Version ([0-9\.\(\)]+) with SNMPv1\/v2c Agent/ )
|
||||||
|
{
|
||||||
return $1;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( defined $os
|
||||||
|
and $os eq 'ios-xr'
|
||||||
|
and defined $descr
|
||||||
|
and $descr =~ m/Version (\d+[\.\d]+)/ )
|
||||||
|
{
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Newer Catalysts and IOS devices
|
||||||
|
if ( defined $descr
|
||||||
|
and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ )
|
||||||
|
{
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generic fallback: try to determine running image from CISCO-IMAGE-MIB
|
||||||
|
my $image_info = $l2->ciscoImageString() || {};
|
||||||
|
foreach my $row (keys %$image_info) {
|
||||||
|
my $info_string = $image_info->{$row};
|
||||||
|
if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_bin {
|
||||||
|
my $self = shift;
|
||||||
|
my $rom_id = $self->rom_id();
|
||||||
|
if ($rom_id =~ m/Version ([^,]+),/) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub cpu {
|
sub cpu {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $ios_cpu = $self->ios_cpu();
|
my $ios_cpu = $self->ios_cpu();
|
||||||
return $ios_cpu if defined $ios_cpu;
|
return $ios_cpu if defined $ios_cpu;
|
||||||
my $cat_cpu = $self->cat_cpu();
|
my $cat_cpu = $self->cat_cpu();
|
||||||
@@ -112,7 +244,7 @@ sub cpu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub cpu_1min {
|
sub cpu_1min {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $ios_cpu_1min = $self->ios_cpu_1min();
|
my $ios_cpu_1min = $self->ios_cpu_1min();
|
||||||
return $ios_cpu_1min if defined $ios_cpu_1min;
|
return $ios_cpu_1min if defined $ios_cpu_1min;
|
||||||
my $cat_cpu_1min = $self->cat_cpu_1min();
|
my $cat_cpu_1min = $self->cat_cpu_1min();
|
||||||
@@ -120,19 +252,69 @@ sub cpu_1min {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub cpu_5min {
|
sub cpu_5min {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $ios_cpu_5min = $self->ios_cpu_5min();
|
my $ios_cpu_5min = $self->ios_cpu_5min();
|
||||||
return $ios_cpu_5min if defined $ios_cpu_5min;
|
return $ios_cpu_5min if defined $ios_cpu_5min;
|
||||||
my $cat_cpu_5min = $self->cat_cpu_5min();
|
my $cat_cpu_5min = $self->cat_cpu_5min();
|
||||||
return $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 {
|
sub mem_total {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my $mem_free = $self->mem_free();
|
|
||||||
my $mem_used = $self->mem_used();
|
my $mem_total;
|
||||||
return undef unless defined $mem_free and defined $mem_used;
|
|
||||||
return $mem_free + $mem_used;
|
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;
|
1;
|
||||||
@@ -140,23 +322,24 @@ __END__
|
|||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Eric Miller, Max Baker, Sam Stickland
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
# Let SNMP::Info determine the correct subclass for you.
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
my $ciscostats = new SNMP::Info(
|
my $ciscostats = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
# These arguments are passed directly on to SNMP::Session
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
)
|
)
|
||||||
or die "Can't connect to DestHost.\n";
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
my $class = $ciscostats->class();
|
my $class = $ciscostats->class();
|
||||||
@@ -164,24 +347,38 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory, os and
|
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory,
|
||||||
version information about Cisco Devices.
|
os and version information about Cisco Devices.
|
||||||
|
|
||||||
Use or create in a subclass of SNMP::Info. Do not use directly.
|
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||||
|
|
||||||
=head2 Inherited Classes
|
=head2 Inherited Classes
|
||||||
|
|
||||||
none.
|
None.
|
||||||
|
|
||||||
=head2 Required MIBs
|
=head2 Required MIBs
|
||||||
|
|
||||||
=over
|
=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
|
=back
|
||||||
|
|
||||||
@@ -207,67 +404,139 @@ Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
|
|||||||
|
|
||||||
Returns mem_free() + mem_used()
|
Returns mem_free() + mem_used()
|
||||||
|
|
||||||
|
=item $ciscostats->vendor()
|
||||||
|
|
||||||
|
'cisco'
|
||||||
|
|
||||||
=item $ciscostats->os()
|
=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
|
||||||
|
'ios-xr' for Cisco IOS XR
|
||||||
|
'pix' for Cisco PIX
|
||||||
|
'asa' for Cisco ASA
|
||||||
|
'fwsm' for Single-mode FWSM
|
||||||
|
'fwsm-admin' for Admin context of multi-context FWSM
|
||||||
|
'fwsm-context' for Standard context of multi-context FWSM
|
||||||
|
'ace-admin' for Admin context of ACE module
|
||||||
|
'ace-context' for Standard context of ACE module (NB: No OS version
|
||||||
|
detection is available, but will be the same as it's
|
||||||
|
'ace admin')
|
||||||
|
'css' for Cisco Content Switch
|
||||||
|
'css-sca' for Cisco Content Switch Secure Content Acceleration
|
||||||
|
'san-os' for Cisco SAN-OS
|
||||||
|
|
||||||
=item $ciscostats->os_ver()
|
=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()
|
=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> =
|
C<1.3.6.1.4.1.9.2.1.56.0> =
|
||||||
B<OLD-CISCO-CPU-MIB:avgBusyPer>
|
C<OLD-CISCO-CPU-MIB:avgBusyPer>
|
||||||
|
|
||||||
=item $ciscostats->ios_cpu_1min()
|
=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()
|
=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()
|
=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()
|
=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()
|
=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()
|
=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()
|
=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
|
=back
|
||||||
|
|
||||||
=head1 TABLE METHODS
|
=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
|
=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.15';
|
||||||
|
|
||||||
|
@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
|
||||||
823
Info/CiscoVTP.pm
823
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.15';
|
||||||
|
|
||||||
|
%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
|
# 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
|
# Copyright (c) 2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
package SNMP::Info::Entity;
|
package SNMP::Info::Entity;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info;
|
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//;
|
@SNMP::Info::Entity::EXPORT_OK = qw//;
|
||||||
|
|
||||||
$INIT = 0;
|
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||||
%MIBS = ('ENTITY-MIB' => 'entPhysicalSerialNum');
|
|
||||||
|
|
||||||
%GLOBALS = (
|
$VERSION = '3.15';
|
||||||
);
|
|
||||||
|
|
||||||
%FUNCS = (
|
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
|
||||||
'e_class' => 'entPhysicalClass',
|
|
||||||
'e_descr' => 'entPhysicalDescr',
|
|
||||||
'e_fwver' => 'entPhysicalFirmwareRev',
|
|
||||||
'e_hwver' => 'entPhysicalHardwareRev',
|
|
||||||
'e_map' => 'entAliasMappingIdentifier',
|
|
||||||
'e_model' => 'entPhysicalModelName',
|
|
||||||
'e_name' => 'entPhysicalName',
|
|
||||||
'e_parent' => 'entPhysicalContainedIn',
|
|
||||||
'e_serial' => 'entPhysicalSerialNum',
|
|
||||||
'e_swver' => 'entPhysicalSoftwareRev',
|
|
||||||
'e_type' => 'entPhysicalVendorType',
|
|
||||||
);
|
|
||||||
|
|
||||||
%MUNGE = (
|
%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 {
|
sub e_port {
|
||||||
my $entity = shift;
|
my $entity = shift;
|
||||||
my $e_map = $entity->e_map();
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $e_map = $entity->e_map($partial);
|
||||||
|
|
||||||
my %e_port;
|
my %e_port;
|
||||||
|
|
||||||
foreach my $e_id (keys %$e_map) {
|
foreach my $e_id ( keys %$e_map ) {
|
||||||
my $id = $e_id;
|
my $id = $e_id;
|
||||||
$id =~ s/\.0$//;
|
$id =~ s/\.0$//;
|
||||||
|
|
||||||
@@ -83,15 +108,18 @@ sub e_port {
|
|||||||
|
|
||||||
return \%e_port;
|
return \%e_port;
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -99,7 +127,6 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $entity = new SNMP::Info(
|
my $entity = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
@@ -111,11 +138,15 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
=head1 DESCRIPTION
|
=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.
|
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 (...);
|
my $entity = new SNMP::Info::Entity (...);
|
||||||
|
|
||||||
@@ -127,7 +158,7 @@ none.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item ENTITY-MIB
|
=item F<ENTITY-MIB>
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -146,43 +177,85 @@ to a hash.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
|
=item $entity->e_index()
|
||||||
|
|
||||||
|
Index
|
||||||
|
|
||||||
|
(C<entPhysicalIndex>)
|
||||||
|
|
||||||
|
=item $entity->e_alias()
|
||||||
|
|
||||||
|
Human entered, not usually used.
|
||||||
|
|
||||||
|
(C<entPhysicalAlias>)
|
||||||
|
|
||||||
=item $entity->e_class()
|
=item $entity->e_class()
|
||||||
|
|
||||||
|
Stack, Module, Container, Port ...
|
||||||
|
|
||||||
(C<entPhysicalClass>)
|
(C<entPhysicalClass>)
|
||||||
|
|
||||||
=item $entity->e_descr()
|
=item $entity->e_descr()
|
||||||
|
|
||||||
|
Human Friendly
|
||||||
|
|
||||||
(C<entPhysicalClass>)
|
(C<entPhysicalClass>)
|
||||||
|
|
||||||
=item $entity->e_fwver()
|
=item $entity->e_fwver()
|
||||||
|
|
||||||
(C<entPhysicalFirmwareRev>)
|
(C<entPhysicalFirmwareRev>)
|
||||||
|
|
||||||
|
=item $entity->e_fru()
|
||||||
|
|
||||||
|
BOOLEAN. Is a Field Replaceable unit?
|
||||||
|
|
||||||
|
(C<entPhysicalFRU>)
|
||||||
|
|
||||||
=item $entity->e_hwver()
|
=item $entity->e_hwver()
|
||||||
|
|
||||||
(C<entPhysicalHardwareRev>)
|
(C<entPhysicalHardwareRev>)
|
||||||
|
|
||||||
|
=item $entity->e_id()
|
||||||
|
|
||||||
|
This is human entered and not normally used.
|
||||||
|
|
||||||
|
(C<entPhysicalAssetID>)
|
||||||
|
|
||||||
=item $entity->e_map()
|
=item $entity->e_map()
|
||||||
|
|
||||||
|
See MIB.
|
||||||
|
|
||||||
(C<entAliasMappingIdentifier>)
|
(C<entAliasMappingIdentifier>)
|
||||||
|
|
||||||
=item $entity->e_model()
|
=item $entity->e_model()
|
||||||
|
|
||||||
|
Model Name of Entity.
|
||||||
|
|
||||||
(C<entPhysicalModelName>)
|
(C<entPhysicalModelName>)
|
||||||
|
|
||||||
=item $entity->e_name()
|
=item $entity->e_name()
|
||||||
|
|
||||||
|
More computer friendly name of entity. Parse me.
|
||||||
|
|
||||||
(C<entPhysicalName>)
|
(C<entPhysicalName>)
|
||||||
|
|
||||||
=item $entity->e_parent()
|
=item $entity->e_parent()
|
||||||
|
|
||||||
|
0 if root.
|
||||||
|
|
||||||
(C<entPhysicalContainedIn>)
|
(C<entPhysicalContainedIn>)
|
||||||
|
|
||||||
=item $entity->e_port()
|
=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()
|
$entity->e_map()
|
||||||
|
|
||||||
|
=item $entity->e_pos()
|
||||||
|
|
||||||
|
The relative position among all entities sharing the same parent.
|
||||||
|
|
||||||
|
(C<entPhysicalParentRelPos>)
|
||||||
|
|
||||||
=item $entity->e_serial()
|
=item $entity->e_serial()
|
||||||
|
|
||||||
(C<entPhysicalSerialNum>)
|
(C<entPhysicalSerialNum>)
|
||||||
@@ -193,8 +266,17 @@ $entity->e_map()
|
|||||||
|
|
||||||
=item $entity->e_type()
|
=item $entity->e_type()
|
||||||
|
|
||||||
|
This is an OID, which gets munged into the object name if the right
|
||||||
|
MIB is loaded.
|
||||||
|
|
||||||
(C<entPhysicalVendorType>)
|
(C<entPhysicalVendorType>)
|
||||||
|
|
||||||
|
=item $entity->e_vendor()
|
||||||
|
|
||||||
|
Vendor of Module.
|
||||||
|
|
||||||
|
(C<entPhysicalMfgName>)
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -1,81 +1,86 @@
|
|||||||
# SNMP::Info::EtherLike
|
# 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
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
package SNMP::Info::EtherLike;
|
package SNMP::Info::EtherLike;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info;
|
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//;
|
@SNMP::Info::EtherLike::EXPORT_OK = qw//;
|
||||||
|
|
||||||
$DEBUG=0;
|
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||||
$SNMP::debugging=$DEBUG;
|
|
||||||
|
|
||||||
$INIT = 0;
|
$VERSION = '3.15';
|
||||||
|
|
||||||
# Same info in both rfc1398 and this?
|
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
|
||||||
%MIBS = ('ETHERLIKE-MIB' => 'etherMIB' );
|
|
||||||
|
|
||||||
%GLOBALS = ();
|
%GLOBALS = ();
|
||||||
|
|
||||||
%FUNCS = (
|
%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;
|
1;
|
||||||
__END__
|
__END__
|
||||||
@@ -83,11 +88,11 @@ __END__
|
|||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -102,7 +107,8 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $class = $cdp->class();
|
my $class = $cdp->class();
|
||||||
print " Using device sub class : $class\n";
|
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 $interfaces = $el->interfaces();
|
||||||
my $el_index = $el->el_index();
|
my $el_index = $el->el_index();
|
||||||
my $el_duplex = $el->el_duplex();
|
my $el_duplex = $el->el_duplex();
|
||||||
@@ -112,19 +118,19 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $iid = $el_index->{$el_port};
|
my $iid = $el_index->{$el_port};
|
||||||
my $port = $interfaces->{$iid};
|
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";
|
print "PORT:$port set to duplex:$duplex\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies
|
SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies
|
||||||
access to the 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
|
=head2 Inherited Classes
|
||||||
|
|
||||||
@@ -134,7 +140,7 @@ None.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item ETHERLIKE-MIB
|
=item F<ETHERLIKE-MIB>
|
||||||
|
|
||||||
=back
|
=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
|
These are methods that return tables of information in the form of a reference
|
||||||
to a hash.
|
to a hash.
|
||||||
|
|
||||||
=head2 ETHERLIKE STATS TABLE (dot3StatsTable)
|
=head2 ETHERLIKE STATS TABLE (C<dot3StatsTable>)
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
@@ -163,77 +169,87 @@ to a hash.
|
|||||||
|
|
||||||
Returns reference to hash. Indexes Stats Table to the interface index (iid).
|
Returns reference to hash. Indexes Stats Table to the interface index (iid).
|
||||||
|
|
||||||
(B<dot3StatsIndex>)
|
(C<dot3StatsIndex>)
|
||||||
|
|
||||||
=item $el->el_duplex()
|
=item $el->el_duplex()
|
||||||
|
|
||||||
Returns reference to hash. Indexes Stats Table to Duplex Status of port.
|
Returns reference to hash. Indexes Stats Table to Duplex Status of port.
|
||||||
|
|
||||||
(B<dot3StatsDuplexStatus>)
|
(C<dot3StatsDuplexStatus>)
|
||||||
|
|
||||||
=item $el->el_chipset()
|
=item $el->el_chipset()
|
||||||
|
|
||||||
(B<dot3StatsEtherChipSet>)
|
(C<dot3StatsEtherChipSet>)
|
||||||
|
|
||||||
=item $el->el_coll_excess()
|
=item $el->el_coll_excess()
|
||||||
|
|
||||||
(B<dot3StatsExcessiveCollisions>)
|
(C<dot3StatsExcessiveCollisions>)
|
||||||
|
|
||||||
=item $el->el_coll_late()
|
=item $el->el_coll_late()
|
||||||
|
|
||||||
(B<dot3StatsLateCollisions>)
|
(C<dot3StatsLateCollisions>)
|
||||||
|
|
||||||
=item $el->el_coll_mult()
|
=item $el->el_coll_mult()
|
||||||
|
|
||||||
(B<dot3StatsMultipleCollisionFrames>)
|
(C<dot3StatsMultipleCollisionFrames>)
|
||||||
|
|
||||||
=item $el->el_coll_single()
|
=item $el->el_coll_single()
|
||||||
|
|
||||||
(B<dot3StatsSingleCollisionFrames>)
|
(C<dot3StatsSingleCollisionFrames>)
|
||||||
|
|
||||||
=item $el->el_error_alignment()
|
=item $el->el_error_alignment()
|
||||||
|
|
||||||
(B<dot3StatsAlignmentErrors>)
|
(C<dot3StatsAlignmentErrors>)
|
||||||
|
|
||||||
=item $el->el_error_fcs()
|
=item $el->el_error_fcs()
|
||||||
|
|
||||||
(B<dot3StatsFCSErrors>)
|
(C<dot3StatsFCSErrors>)
|
||||||
|
|
||||||
=item $el->el_error_cs()
|
=item $el->el_error_cs()
|
||||||
|
|
||||||
(B<dot3StatsCarrierSenseErrors>)
|
(C<dot3StatsCarrierSenseErrors>)
|
||||||
|
|
||||||
=item $el->el_error_frame()
|
=item $el->el_error_frame()
|
||||||
|
|
||||||
(B<dot3StatsFrameTooLongs>)
|
(C<dot3StatsFrameTooLongs>)
|
||||||
|
|
||||||
=item $el->el_error_mac_rec()
|
=item $el->el_error_mac_rec()
|
||||||
|
|
||||||
(B<dot3StatsInternalMacReceiveErrors>)
|
(C<dot3StatsInternalMacReceiveErrors>)
|
||||||
|
|
||||||
=item $el->el_error_mac_xmit()
|
=item $el->el_error_mac_xmit()
|
||||||
|
|
||||||
(B<dot3StatsInternalMacTransmitErrors>)
|
(C<dot3StatsInternalMacTransmitErrors>)
|
||||||
|
|
||||||
=item $el->el_error_sqe()
|
=item $el->el_error_sqe()
|
||||||
|
|
||||||
(B<dot3StatsSQETestErrors>)
|
(C<dot3StatsSQETestErrors>)
|
||||||
|
|
||||||
=item $el->el_error_symbol()
|
=item $el->el_error_symbol()
|
||||||
|
|
||||||
(B<dot3StatsSymbolErrors>)
|
(C<dot3StatsSymbolErrors>)
|
||||||
|
|
||||||
=item $el->el_xmit_defer()
|
=item $el->el_xmit_defer()
|
||||||
|
|
||||||
(B<dot3StatsDeferredTransmissions>)
|
(C<dot3StatsDeferredTransmissions>)
|
||||||
|
|
||||||
=item $el->el_coll_count()
|
=item $el->el_coll_count()
|
||||||
|
|
||||||
(B<dot3CollCount>)
|
(C<dot3CollCount>)
|
||||||
|
|
||||||
=item $el->el_coll_freq()
|
=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
|
=back
|
||||||
|
|
||||||
|
|||||||
422
Info/FDP.pm
Normal file
422
Info/FDP.pm
Normal file
@@ -0,0 +1,422 @@
|
|||||||
|
# SNMP::Info::FDP
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Bruce Rodger, Max Baker
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::FDP;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info;
|
||||||
|
|
||||||
|
@SNMP::Info::FDP::ISA = qw/SNMP::Info Exporter/;
|
||||||
|
@SNMP::Info::FDP::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
'fdp_run' => 'snFdpGlobalRun',
|
||||||
|
'fdp_interval' => 'snFdpGlobalMessageInterval',
|
||||||
|
'fdp_holdtime' => 'snFdpGlobalHoldTime',
|
||||||
|
'fdp_id' => 'snFdpGlobalDeviceId',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
'fdp_index' => 'snFdpCacheIfIndex',
|
||||||
|
'fdp_proto' => 'snFdpCacheAddressType',
|
||||||
|
'fdp_ip' => 'snFdpCacheAddress',
|
||||||
|
'fdp_ver' => 'snFdpCacheVersion',
|
||||||
|
'fdp_id' => 'snFdpCacheDeviceId',
|
||||||
|
'fdp_port' => 'snFdpCacheDevicePort',
|
||||||
|
'fdp_platform' => 'snFdpCachePlatform',
|
||||||
|
'fdp_capabilities' => 'snFdpCacheCapabilities',
|
||||||
|
'fdp_domain' => 'snFdpCacheVTPMgmtDomain',
|
||||||
|
'fdp_vlan' => 'snFdpCacheNativeVLAN',
|
||||||
|
'fdp_duplex' => 'snFdpCacheDuplex',
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
'fdp_capabilities' => \&SNMP::Info::munge_bits,
|
||||||
|
'fdp_ip' => \&SNMP::Info::munge_ip
|
||||||
|
);
|
||||||
|
|
||||||
|
sub fdp_run {
|
||||||
|
my $fdp = shift;
|
||||||
|
my $fdp_run = $fdp->orig_fdp_run();
|
||||||
|
|
||||||
|
# if fdp_run isn't implemented on device, assume FDP is on
|
||||||
|
return $fdp_run if defined $fdp_run;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub hasFDP {
|
||||||
|
my $fdp = shift;
|
||||||
|
|
||||||
|
my $ver = $fdp->{_version};
|
||||||
|
|
||||||
|
#my $ver = $fdp->fdp_ver;
|
||||||
|
|
||||||
|
# SNMP v1 clients dont have the globals
|
||||||
|
if ( defined $ver and $ver == 1 ) {
|
||||||
|
my $fdp_ip = $fdp->fdp_ip();
|
||||||
|
|
||||||
|
# See if anything in fdp cache, if so we have fdp
|
||||||
|
return 1 if ( defined $fdp_ip and scalar( keys %$fdp_ip ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $fdp->fdp_run();
|
||||||
|
}
|
||||||
|
|
||||||
|
sub fdp_if {
|
||||||
|
my $fdp = shift;
|
||||||
|
|
||||||
|
# See if by some miracle Cisco implemented the fdpCacheIfIndex entry
|
||||||
|
my $fdp_index = $fdp->fdp_index();
|
||||||
|
return $fdp_index if defined $fdp_index;
|
||||||
|
|
||||||
|
# Nope, didn't think so. Now we fake it.
|
||||||
|
my $fdp_ip = $fdp->fdp_ip();
|
||||||
|
unless ( defined $fdp_ip ) {
|
||||||
|
$fdp->error_throw(
|
||||||
|
"SNMP::Info::FDP:fdp_if() - Device doesn't have fdp_ip() data. Can't fake fdp_index()"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
my %fdp_if;
|
||||||
|
foreach my $key ( keys %$fdp_ip ) {
|
||||||
|
next unless defined $key;
|
||||||
|
my $iid = $key;
|
||||||
|
|
||||||
|
# Truncate .1 from fdp cache entry
|
||||||
|
$iid =~ s/\.\d+$//;
|
||||||
|
$fdp_if{$key} = $iid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return \%fdp_if;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::FDP - SNMP Interface to Foundry Discovery Protocol (FDP) using
|
||||||
|
SNMP
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Bruce Rodger, Max Baker
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
my $fdp = new SNMP::Info (
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'router',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
);
|
||||||
|
|
||||||
|
my $class = $fdp->class();
|
||||||
|
print " Using device sub class : $class\n";
|
||||||
|
|
||||||
|
$hasfdp = $fdp->hasFDP() ? 'yes' : 'no';
|
||||||
|
|
||||||
|
# Print out a map of device ports with FDP neighbors:
|
||||||
|
my $interfaces = $fdp->interfaces();
|
||||||
|
my $fdp_if = $fdp->fdp_if();
|
||||||
|
my $fdp_ip = $fdp->fdp_ip();
|
||||||
|
my $fdp_port = $fdp->fdp_port();
|
||||||
|
|
||||||
|
foreach my $fdp_key (keys %$fdp_ip){
|
||||||
|
my $iid = $fdp_if->{$fdp_key};
|
||||||
|
my $port = $interfaces->{$iid};
|
||||||
|
my $neighbor = $fdp_ip->{$fdp_key};
|
||||||
|
my $neighbor_port = $fdp_port->{$fdp_key};
|
||||||
|
print "Port : $port connected to $neighbor / $neighbor_port\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
SNMP::Info::FDP is a subclass of SNMP::Info that provides an object oriented
|
||||||
|
interface to FDP information through SNMP.
|
||||||
|
|
||||||
|
FDP is a Layer 2 protocol that supplies topology information of
|
||||||
|
devices that also speak FDP, mostly switches and routers. It has
|
||||||
|
similar functionality to Cisco's CDP, and the SNMP interface is
|
||||||
|
virtually identical. FDP is implemented in Brocade (Foundry) devices.
|
||||||
|
|
||||||
|
Create or use a device subclass that inherits this class. Do not use
|
||||||
|
directly.
|
||||||
|
|
||||||
|
Each device implements a subset of the global and cache entries.
|
||||||
|
Check the return value to see if that data is held by the device.
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
|
||||||
|
|
||||||
|
Needs a reasonably recent MIB. Works OK with B2R07604A.mib, but doesn't
|
||||||
|
work with B2R07600C.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 GLOBAL METHODS
|
||||||
|
|
||||||
|
These are methods that return scalar values from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $fdp->hasFDP()
|
||||||
|
|
||||||
|
Is FDP is active in this device?
|
||||||
|
|
||||||
|
Accounts for SNMP version 1 devices which may have FDP but not fdp_run()
|
||||||
|
|
||||||
|
=item $fdp->fdp_run()
|
||||||
|
|
||||||
|
Is FDP enabled on this device?
|
||||||
|
|
||||||
|
(C<fdpGlobalRun>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_interval()
|
||||||
|
|
||||||
|
Interval in seconds at which FDP messages are generated.
|
||||||
|
|
||||||
|
(C<fdpGlobalMessageInterval>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_holdtime()
|
||||||
|
|
||||||
|
Time in seconds that FDP messages are kept.
|
||||||
|
|
||||||
|
(C<fdpGlobalHoldTime>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_id()
|
||||||
|
|
||||||
|
Returns FDP device ID.
|
||||||
|
|
||||||
|
This is the device id broadcast via FDP to other devices, and is what is
|
||||||
|
retrieved from remote devices with $fdp->id().
|
||||||
|
|
||||||
|
(C<fdpGlobalDeviceId>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
CDP compatibility
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $fdp->fdp_interval()
|
||||||
|
|
||||||
|
Interval in seconds at which FDP messages are generated.
|
||||||
|
|
||||||
|
(C<fdpGlobalMessageInterval>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_holdtime()
|
||||||
|
|
||||||
|
Time in seconds that FDP messages are kept.
|
||||||
|
|
||||||
|
(C<fdpGlobalHoldTime>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_id()
|
||||||
|
|
||||||
|
Returns FDP device ID.
|
||||||
|
|
||||||
|
This is the device id broadcast via FDP to other devices, and is what is
|
||||||
|
retrieved from remote devices with $fdp->id().
|
||||||
|
|
||||||
|
(C<fdpGlobalDeviceId>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_run()
|
||||||
|
|
||||||
|
Is FDP enabled on this device?
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a reference
|
||||||
|
to a hash.
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
CDP compatibility
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $fdp->fdp_capabilities()
|
||||||
|
|
||||||
|
Returns Device Functional Capabilities. Results are munged into an ascii
|
||||||
|
binary string, MSB. Each digit represents a bit from the table below.
|
||||||
|
|
||||||
|
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
|
||||||
|
|
||||||
|
(Bit) - Description
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item (0x40) - Provides level 1 functionality.
|
||||||
|
|
||||||
|
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
|
||||||
|
non router ports.
|
||||||
|
|
||||||
|
=item (0x10) - Sends and receives packets for at least one network layer
|
||||||
|
protocol. If the device is routing the protocol, this bit should not be set.
|
||||||
|
|
||||||
|
=item (0x08) - Performs level 2 switching. The difference between this bit
|
||||||
|
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
|
||||||
|
device is assumed to be deployed in a physical loop-free topology.
|
||||||
|
|
||||||
|
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
|
||||||
|
would set both this bit and bit 0x02.
|
||||||
|
|
||||||
|
=item (0x02) - Performs level 2 transparent bridging.
|
||||||
|
|
||||||
|
=item (0x01) - Performs level 3 routing for at least one network layer
|
||||||
|
protocol.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
Thanks to Martin Lorensen for a pointer to this information.
|
||||||
|
|
||||||
|
(C<fdpCacheCapabilities>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_domain()
|
||||||
|
|
||||||
|
The CDP version of this returns remote VTP Management Domain as defined
|
||||||
|
in C<CISCO-VTP-MIB::managementDomainName>
|
||||||
|
|
||||||
|
(C<fdpCacheVTPMgmtDomain>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_duplex()
|
||||||
|
|
||||||
|
Returns the port duplex status from remote devices.
|
||||||
|
|
||||||
|
(C<fdpCacheDuplex>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_id()
|
||||||
|
|
||||||
|
Returns remote device id string
|
||||||
|
|
||||||
|
(C<fdpCacheDeviceId>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_if()
|
||||||
|
|
||||||
|
Returns the mapping to the SNMP Interface Table.
|
||||||
|
|
||||||
|
Note that a lot devices don't implement $fdp->fdp_index(), So if it isn't
|
||||||
|
around, we fake it.
|
||||||
|
|
||||||
|
In order to map the fdp table entry back to the interfaces() entry, we
|
||||||
|
truncate the last number off of it :
|
||||||
|
|
||||||
|
# it exists, yay.
|
||||||
|
my $fdp_index = $device->fdp_index();
|
||||||
|
return $fdp_index if defined $fdp_index;
|
||||||
|
|
||||||
|
# if not, let's fake it
|
||||||
|
my $fdp_ip = $device->fdp_ip();
|
||||||
|
|
||||||
|
my %fdp_if
|
||||||
|
foreach my $key (keys %$fdp_ip){
|
||||||
|
$iid = $key;
|
||||||
|
## Truncate off .1 from fdp response
|
||||||
|
$iid =~ s/\.\d+$//;
|
||||||
|
$fdp_if{$key} = $iid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return \%fdp_if;
|
||||||
|
|
||||||
|
|
||||||
|
=item $fdp->fdp_index()
|
||||||
|
|
||||||
|
Returns the mapping to the SNMP2 Interface table for FDP Cache Entries.
|
||||||
|
|
||||||
|
Most devices don't implement this, so you probably want to use $fdp->fdp_if()
|
||||||
|
instead.
|
||||||
|
|
||||||
|
See fdp_if() entry.
|
||||||
|
|
||||||
|
(C<fdpCacheIfIndex>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_ip()
|
||||||
|
|
||||||
|
Returns remote IP address
|
||||||
|
|
||||||
|
(C<fdpCacheAddress>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_platform()
|
||||||
|
|
||||||
|
Returns remote platform id
|
||||||
|
|
||||||
|
(C<fdpCachePlatform>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_port()
|
||||||
|
|
||||||
|
Returns remote port ID
|
||||||
|
|
||||||
|
(C<fdpDevicePort>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_proto()
|
||||||
|
|
||||||
|
Returns remote address type received. Usually IP.
|
||||||
|
|
||||||
|
(C<fdpCacheAddressType>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_ver()
|
||||||
|
|
||||||
|
Returns remote hardware version
|
||||||
|
|
||||||
|
(C<fdpCacheVersion>)
|
||||||
|
|
||||||
|
=item $fdp->fdp_vlan()
|
||||||
|
|
||||||
|
Returns the remote interface native VLAN.
|
||||||
|
|
||||||
|
(C<fdpCacheNativeVLAN>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=cut
|
||||||
407
Info/IEEE802dot11.pm
Normal file
407
Info/IEEE802dot11.pm
Normal file
@@ -0,0 +1,407 @@
|
|||||||
|
# SNMP::Info::IEEE802dot11
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Eric Miller
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::IEEE802dot11;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
|
||||||
|
@SNMP::Info::IEEE802dot11::ISA = qw/Exporter/;
|
||||||
|
@SNMP::Info::IEEE802dot11::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%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
|
||||||
141
Info/IEEE802dot3ad.pm
Normal file
141
Info/IEEE802dot3ad.pm
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
# SNMP::Info::IEEE802dot3ad
|
||||||
|
#
|
||||||
|
# Copyright (c) 2014 SNMP::Info Developers
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::IEEE802dot3ad;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::Aggregate;
|
||||||
|
|
||||||
|
@SNMP::Info::IEEE802dot3ad::ISA = qw/
|
||||||
|
SNMP::Info::Aggregate
|
||||||
|
Exporter
|
||||||
|
/;
|
||||||
|
@SNMP::Info::IEEE802dot3ad::EXPORT_OK = qw/
|
||||||
|
agg_ports_lag
|
||||||
|
/;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Aggregate::MIBS,
|
||||||
|
'IEEE8023-LAG-MIB' => 'dot3adAggPortSelectedAggID',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = ();
|
||||||
|
|
||||||
|
%FUNCS = ();
|
||||||
|
|
||||||
|
%MUNGE = ();
|
||||||
|
|
||||||
|
sub agg_ports_lag {
|
||||||
|
my $dev = shift;
|
||||||
|
|
||||||
|
# TODO: implement partial
|
||||||
|
my $masters = $dev->dot3adAggActorOperKey;
|
||||||
|
my $slaves = $dev->dot3adAggPortActorOperKey;
|
||||||
|
|
||||||
|
return {} unless
|
||||||
|
ref {} eq ref $masters and scalar keys %$masters
|
||||||
|
and ref {} eq ref $slaves and scalar keys %$slaves;
|
||||||
|
|
||||||
|
my $ret = {};
|
||||||
|
foreach my $s (keys %$slaves) {
|
||||||
|
next if $slaves->{$s} == 0;
|
||||||
|
foreach my $m (keys %$masters) {
|
||||||
|
next unless $masters->{$m} == $slaves->{$s};
|
||||||
|
$ret->{$s} = $m;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::IEEE802dot3ad - SNMP Interface to IEEE Aggregated Links
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
SNMP::Info Developers
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $info = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myrouter',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $info->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
This class provides access to Aggregated Links configuration on devices
|
||||||
|
implementing C<IEEE8023-LAG-MIB>.
|
||||||
|
|
||||||
|
Use or create in a subclass of SNMP::Info. Do not use directly.
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
L<SNMP::Info::Aggregate>
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<IEEE8023-LAG-MIB>
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item C<agg_ports_lag>
|
||||||
|
|
||||||
|
Returns a HASH reference mapping from slave to master port for each member of
|
||||||
|
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||||
|
ifIndex of the corresponding master ports.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=cut
|
||||||
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.15';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%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
|
||||||
599
Info/LLDP.pm
Normal file
599
Info/LLDP.pm
Normal file
@@ -0,0 +1,599 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
%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_rem_cap_spt' => 'lldpRemSysCapSupported',
|
||||||
|
|
||||||
|
# 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,
|
||||||
|
'lldp_rem_cap_spt' => \&SNMP::Info::munge_bits,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub hasLLDP {
|
||||||
|
my $lldp = shift;
|
||||||
|
|
||||||
|
# We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
|
||||||
|
# so we could be running LLDP but not return any useful information
|
||||||
|
my $lldp_cap = $lldp->lldp_sys_cap();
|
||||||
|
return 1 if defined $lldp_cap;
|
||||||
|
|
||||||
|
# If the device doesn't return local system capabilities, fallback by checking if it would report neighbors
|
||||||
|
my $lldp_rem = $lldp->lldp_rem_id() || {};
|
||||||
|
return 1 if scalar keys %$lldp_rem;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub lldp_if {
|
||||||
|
my $lldp = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $addr = $lldp->lldp_rem_pid($partial) || {};
|
||||||
|
my $i_descr = $lldp->i_description() || {};
|
||||||
|
my $i_alias = $lldp->i_alias() || {};
|
||||||
|
my %r_i_descr = reverse %$i_descr;
|
||||||
|
my %r_i_alias = reverse %$i_alias;
|
||||||
|
|
||||||
|
my %lldp_if;
|
||||||
|
foreach my $key ( keys %$addr ) {
|
||||||
|
my @aOID = split( '\.', $key );
|
||||||
|
my $port = $aOID[1];
|
||||||
|
next unless $port;
|
||||||
|
# Local LLDP port may not equate to ifIndex, see LldpPortNumber TEXTUAL-CONVENTION in LLDP-MIB.
|
||||||
|
# Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex,
|
||||||
|
# prefer ifDescr over ifAlias because using cross ref with description is correct behavior
|
||||||
|
# according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though.
|
||||||
|
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};
|
||||||
|
my $type = $ptype->{$key};
|
||||||
|
if ( $type and $type eq 'interfaceName' ) {
|
||||||
|
# If the pid claims to be an interface name,
|
||||||
|
# believe it.
|
||||||
|
$port = $pid->{$key};
|
||||||
|
}
|
||||||
|
unless ($port) {
|
||||||
|
$port = $pid->{$key};
|
||||||
|
next unless $port;
|
||||||
|
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 lldp_platform {
|
||||||
|
my $lldp = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $rid = $lldp->lldp_rem_id($partial) || {};
|
||||||
|
my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
|
||||||
|
my $name = $lldp->lldp_rem_sysname($partial) || {};
|
||||||
|
|
||||||
|
my %lldp_platform;
|
||||||
|
foreach my $key (keys %$rid) {
|
||||||
|
$lldp_platform{$key} = $desc->{$key} || $name->{$key};
|
||||||
|
}
|
||||||
|
return \%lldp_platform;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub lldp_cap {
|
||||||
|
my $lldp = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $lldp_caps = $lldp->lldp_rem_cap_spt($partial) || {};
|
||||||
|
|
||||||
|
# Encoded as BITS which Perl Net-SNMP implementation doesn't seem to
|
||||||
|
# be able to enumerate for us, so we have to get it from the MIB
|
||||||
|
# and enumerate ourselves
|
||||||
|
my $oid = SNMP::translateObj('lldpRemSysCapEnabled',0,1) || '';
|
||||||
|
my $enums = ((ref {} eq ref $SNMP::MIB{$oid}{'enums'}) ? $SNMP::MIB{$oid}{'enums'} : {});
|
||||||
|
my %r_enums = reverse %$enums;
|
||||||
|
|
||||||
|
my %lldp_cap;
|
||||||
|
foreach my $key ( keys %$lldp_caps ) {
|
||||||
|
my $cap_bits = $lldp_caps->{$key};
|
||||||
|
next unless $cap_bits;
|
||||||
|
|
||||||
|
my $count = 0;
|
||||||
|
foreach my $bit (split //,$cap_bits) {
|
||||||
|
if ( $bit ) {
|
||||||
|
push ( @{$lldp_cap{$key}}, $r_enums{$count});
|
||||||
|
}
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return \%lldp_cap;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sub 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) if scalar @oids > 4;
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
=item $lldp->lldp_platform()
|
||||||
|
|
||||||
|
Tries to return something useful from C<lldp_rem_sysdesc()> or
|
||||||
|
C<lldp_rem_sysname()>.
|
||||||
|
|
||||||
|
=item $lldp->lldp_cap()
|
||||||
|
|
||||||
|
Returns hash of arrays with each array containing the system capabilities
|
||||||
|
supported by the remote system. Possible elements in the array are
|
||||||
|
enumerated from C<LldpSystemCapabilitiesMap>.
|
||||||
|
|
||||||
|
=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 remote system. Results
|
||||||
|
are munged into an ascii binary string, LSB. Each digit represents a bit
|
||||||
|
from the table below:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item Bit 'other(0)' indicates that the system has capabilities other than
|
||||||
|
those listed below.
|
||||||
|
|
||||||
|
=item Bit 'repeater(1)' indicates that the system has repeater capability.
|
||||||
|
|
||||||
|
=item Bit 'bridge(2)' indicates that the system has bridge capability.
|
||||||
|
|
||||||
|
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
|
||||||
|
point capability.
|
||||||
|
|
||||||
|
=item Bit 'router(4)' indicates that the system has router capability.
|
||||||
|
|
||||||
|
=item Bit 'telephone(5)' indicates that the system has telephone capability.
|
||||||
|
|
||||||
|
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
|
||||||
|
Device capability (IETF RFC 2669 & 2670).
|
||||||
|
|
||||||
|
=item Bit 'stationOnly(7)' indicates that the system has only station
|
||||||
|
capability and nothing else."
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
(C<lldpRemSysCapEnabled>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=cut
|
||||||
236
Info/Layer1.pm
236
Info/Layer1.pm
@@ -1,81 +1,73 @@
|
|||||||
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
|
# SNMP::Info::Layer1 - SNMP Interface to Layer1 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
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
package SNMP::Info::Layer1;
|
package SNMP::Info::Layer1;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info;
|
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//;
|
@SNMP::Info::Layer1::EXPORT_OK = qw//;
|
||||||
|
|
||||||
$DEBUG=0;
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
|
||||||
$SNMP::debugging=$DEBUG;
|
|
||||||
|
|
||||||
# See SNMP::Info for the details of these data structures and
|
$VERSION = '3.15';
|
||||||
# the interworkings.
|
|
||||||
$INIT = 0;
|
|
||||||
|
|
||||||
%MIBS = ( %SNMP::Info::MIBS,
|
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
|
||||||
'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex'
|
|
||||||
);
|
|
||||||
|
|
||||||
%GLOBALS = (
|
%GLOBALS = (
|
||||||
%SNMP::Info::GLOBALS,
|
%SNMP::Info::GLOBALS,
|
||||||
'ports_managed' => 'ifNumber',
|
'ports_managed' => 'ifNumber',
|
||||||
'rptr_slots' => 'rptrGroupCapacity',
|
'rptr_slots' => 'rptrGroupCapacity',
|
||||||
'slots' => 'rptrGroupCapacity'
|
'slots' => 'rptrGroupCapacity'
|
||||||
);
|
);
|
||||||
|
|
||||||
%FUNCS = (
|
%FUNCS = (
|
||||||
%SNMP::Info::FUNCS,
|
%SNMP::Info::FUNCS,
|
||||||
'i_up2' => 'ifOperStatus',
|
'rptr_ports' => 'rptrGroupPortCapacity',
|
||||||
'i_up_admin2' => 'ifAdminStatus',
|
'rptr_port' => 'rptrPortIndex',
|
||||||
'rptr_ports' => 'rptrGroupPortCapacity',
|
'rptr_slot' => 'rptrPortGroupIndex',
|
||||||
'rptr_port' => 'rptrPortIndex',
|
'rptr_up_admin' => 'rptrPortAdminStatus',
|
||||||
'rptr_slot' => 'rptrPortGroupIndex',
|
'rptr_up' => 'rptrPortOperStatus',
|
||||||
'rptr_up_admin' => 'rptrPortAdminStatus',
|
'rptr_last_src' => 'rptrAddrTrackNewLastSrcAddress',
|
||||||
'rptr_up' => 'rptrPortOperStatus',
|
);
|
||||||
);
|
|
||||||
|
|
||||||
%MUNGE = (
|
%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
|
# Method OverRides
|
||||||
|
|
||||||
@@ -83,23 +75,23 @@ $INIT = 0;
|
|||||||
sub ports {
|
sub ports {
|
||||||
my $l1 = shift;
|
my $l1 = shift;
|
||||||
|
|
||||||
my $ports = $l1->ports_managed();
|
my $ports = $l1->ports_managed();
|
||||||
my $rptr_ports = $l1->rptr_ports();
|
my $rptr_ports = $l1->rptr_ports();
|
||||||
|
|
||||||
foreach my $group (keys %$rptr_ports){
|
foreach my $group ( keys %$rptr_ports ) {
|
||||||
$ports += $rptr_ports->{$group};
|
$ports += $rptr_ports->{$group};
|
||||||
}
|
}
|
||||||
|
|
||||||
return $ports;
|
return $ports;
|
||||||
}
|
}
|
||||||
|
|
||||||
# $l1->model() - Looks at sysObjectID which gives the oid of the system
|
# $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 {
|
sub model {
|
||||||
my $l1 = shift;
|
my $l1 = shift;
|
||||||
my $id = $l1->id();
|
my $id = $l1->id();
|
||||||
my $model = &SNMP::translateObj($id);
|
my $model = &SNMP::translateObj($id);
|
||||||
|
|
||||||
# HP
|
# HP
|
||||||
$model =~ s/^hpswitch//i;
|
$model =~ s/^hpswitch//i;
|
||||||
|
|
||||||
@@ -110,66 +102,73 @@ sub model {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub vendor {
|
sub vendor {
|
||||||
my $l1 = shift;
|
my $l1 = shift;
|
||||||
my $descr = $l1->description();
|
my $descr = $l1->description();
|
||||||
|
|
||||||
return 'hp' if ($descr =~ /hp/i);
|
return 'hp' if ( $descr =~ /hp/i );
|
||||||
return 'cisco' if ($descr =~ /(catalyst|cisco|ios)/i);
|
return 'cisco' if ( $descr =~ /(catalyst|cisco|ios)/i );
|
||||||
return 'allied' if ($descr =~ /allied/i);
|
return 'allied' if ( $descr =~ /allied/i );
|
||||||
return 'asante' if ($descr =~ /asante/i);
|
return 'asante' if ( $descr =~ /asante/i );
|
||||||
|
|
||||||
|
return 'unknown';
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# By Default we'll use the description field
|
# By Default we'll use the description field
|
||||||
sub interfaces {
|
sub interfaces {
|
||||||
my $l1 = shift;
|
my $l1 = shift;
|
||||||
my $interfaces = $l1->i_index();
|
my $partial = shift;
|
||||||
my $rptr_port = $l1->rptr_port();
|
|
||||||
|
|
||||||
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;
|
$interfaces->{$port} = $port;
|
||||||
}
|
}
|
||||||
return $interfaces;
|
return $interfaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_up_admin {
|
sub i_up_admin {
|
||||||
my $l1 = shift;
|
my $l1 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
my $i_up_admin = $l1->i_up_admin2();
|
my $i_up_admin = $l1->SUPER::i_up_admin($partial) || {};
|
||||||
my $rptr_up_admin = $l1->rptr_up_admin();
|
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};
|
my $up = $rptr_up_admin->{$key};
|
||||||
$i_up_admin->{$key} = 'up' if $up =~ /enabled/;
|
$i_up_admin->{$key} = 'up' if $up =~ /enabled/;
|
||||||
$i_up_admin->{$key} = 'down' if $up =~ /disabled/;
|
$i_up_admin->{$key} = 'down' if $up =~ /disabled/;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $i_up_admin;
|
return $i_up_admin;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_up {
|
sub i_up {
|
||||||
my $l1 = shift;
|
my $l1 = shift;
|
||||||
my $i_up = $l1->i_up2();
|
my $partial = shift;
|
||||||
my $rptr_up = $l1->rptr_up();
|
|
||||||
|
|
||||||
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};
|
my $up = $rptr_up->{$key};
|
||||||
$i_up->{$key} = 'up' if $up =~ /operational/;
|
$i_up->{$key} = 'up' if $up =~ /operational/;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $i_up;
|
return $i_up;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -177,14 +176,13 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $l1 = new SNMP::Info(
|
my $l1 = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 1
|
Version => 1
|
||||||
)
|
)
|
||||||
or die "Can't connect to DestHost.\n";
|
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";
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
# Let's get some basic Port information
|
# Let's get some basic Port information
|
||||||
@@ -201,14 +199,15 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
This class is usually used as a superclass for more specific device classes listed under
|
This class is usually used as a superclass for more specific device classes
|
||||||
SNMP::Info::Layer1::* Please read all docs under SNMP::Info first.
|
listed under SNMP::Info::Layer1::* Please read all docs under SNMP::Info
|
||||||
|
first.
|
||||||
|
|
||||||
Provides abstraction to the configuration information obtainable from a
|
Provides abstraction to the configuration information obtainable from a
|
||||||
Layer1 device through SNMP. Information is stored in a number of MIBs.
|
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
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
a more specific class using the method above.
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
my $l1 = new SNMP::Info::Layer1(...);
|
my $l1 = new SNMP::Info::Layer1(...);
|
||||||
|
|
||||||
@@ -224,15 +223,16 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item SNMP-REPEATER-MIB
|
=item F<SNMP-REPEATER-MIB>
|
||||||
|
|
||||||
=item Inherited Classes
|
|
||||||
|
|
||||||
MIBs required for SNMP::Info
|
|
||||||
|
|
||||||
=back
|
=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
|
=head1 GLOBALS
|
||||||
|
|
||||||
@@ -244,7 +244,7 @@ These are methods that return scalar value from SNMP
|
|||||||
|
|
||||||
Gets the number of ports under the interface mib
|
Gets the number of ports under the interface mib
|
||||||
|
|
||||||
(B<ifNumber>)
|
(C<ifNumber>)
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -252,9 +252,17 @@ Gets the number of ports under the interface mib
|
|||||||
|
|
||||||
=over
|
=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()
|
=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()
|
=item $l1->ports()
|
||||||
|
|
||||||
@@ -264,15 +272,15 @@ Adds the values from rptr_ports() and ports_managed()
|
|||||||
|
|
||||||
Number of 'groups' in the Repeater MIB
|
Number of 'groups' in the Repeater MIB
|
||||||
|
|
||||||
(B<rptrGroupCapacity>)
|
(C<rptrGroupCapacity>)
|
||||||
|
|
||||||
=back
|
=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
|
These are methods that return tables of information in the form of a reference
|
||||||
to a hash.
|
to a hash.
|
||||||
@@ -283,10 +291,16 @@ to a hash.
|
|||||||
|
|
||||||
=item $l1->interfaces()
|
=item $l1->interfaces()
|
||||||
|
|
||||||
|
Returns reference to the map between IID and physical Port.
|
||||||
|
|
||||||
=item $l1->i_up()
|
=item $l1->i_up()
|
||||||
|
|
||||||
|
Returns reference to map of IIDs to link status.
|
||||||
|
|
||||||
=item $l1->i_up_admin()
|
=item $l1->i_up_admin()
|
||||||
|
|
||||||
|
Returns reference to map of IIDs to administrative link status.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Repeater MIB
|
=head2 Repeater MIB
|
||||||
@@ -297,32 +311,36 @@ to a hash.
|
|||||||
|
|
||||||
Number of ports in each group.
|
Number of ports in each group.
|
||||||
|
|
||||||
(B<rptrGroupPortCapacity>)
|
(C<rptrGroupPortCapacity>)
|
||||||
|
|
||||||
=item $l1->rptr_port()
|
=item $l1->rptr_port()
|
||||||
|
|
||||||
Port number in Group
|
Port number in Group
|
||||||
|
|
||||||
(B<rptrPortIndex>)
|
(C<rptrPortIndex>)
|
||||||
|
|
||||||
=item $l1->rptr_slot()
|
=item $l1->rptr_slot()
|
||||||
|
|
||||||
Group (slot) Number for given port.
|
Group (slot) Number for given port.
|
||||||
|
|
||||||
(B<rptrPortGroupIndex>)
|
(C<rptrPortGroupIndex>)
|
||||||
|
|
||||||
=item $l1->rptr_up_admin()
|
=item $l1->rptr_up_admin()
|
||||||
|
|
||||||
(B<rptrPortAdminStatus>)
|
(C<rptrPortAdminStatus>)
|
||||||
|
|
||||||
=item $l1->rptr_up()
|
=item $l1->rptr_up()
|
||||||
|
|
||||||
(B<rptrPortOperStatus>)
|
(C<rptrPortOperStatus>)
|
||||||
|
|
||||||
|
=item $l1->rptr_last_src()
|
||||||
|
|
||||||
|
(C<rptrAddrTrackNewLastSrcAddress>)
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info
|
=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
|
=cut
|
||||||
|
|||||||
@@ -1,66 +1,60 @@
|
|||||||
# SNMP::Info::Layer1::Allied
|
# 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
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer1::Allied;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
|
use strict;
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info::Layer1;
|
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//;
|
@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.15';
|
||||||
|
|
||||||
# Set for No CDP
|
# Set for No CDP
|
||||||
%GLOBALS = (
|
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
|
||||||
%SNMP::Info::Layer1::GLOBALS,
|
|
||||||
'root_ip' => 'actualIPAddr',
|
|
||||||
);
|
|
||||||
|
|
||||||
%FUNCS = (%SNMP::Info::Layer1::FUNCS,
|
%FUNCS = (
|
||||||
'i_name2' => 'ifName',
|
%SNMP::Info::Layer1::FUNCS,
|
||||||
'ati_p_name' => 'portName',
|
'ati_p_name' => 'portName',
|
||||||
'ati_up' => 'linkTestLED',
|
'ati_up' => 'linkTestLED',
|
||||||
);
|
);
|
||||||
|
|
||||||
%MIBS = (
|
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ATI-MIB' => 'atiPortGroupIndex' );
|
||||||
%SNMP::Info::Layer1::MIBS,
|
|
||||||
'ATI-MIB' => 'atiPortGroupIndex'
|
|
||||||
);
|
|
||||||
|
|
||||||
%MUNGE = (%SNMP::Info::Layer1::MUNGE,
|
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
|
||||||
);
|
|
||||||
|
|
||||||
sub vendor {
|
sub vendor {
|
||||||
return 'allied';
|
return 'allied';
|
||||||
@@ -72,9 +66,9 @@ sub os {
|
|||||||
|
|
||||||
sub os_ver {
|
sub os_ver {
|
||||||
my $allied = shift;
|
my $allied = shift;
|
||||||
my $descr = $allied->description();
|
my $descr = $allied->description();
|
||||||
|
|
||||||
if ($descr =~ m/version (\d+\.\d+)/){
|
if ( $descr =~ m/version (\d+\.\d+)/ ) {
|
||||||
return $1;
|
return $1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -84,39 +78,40 @@ sub model {
|
|||||||
|
|
||||||
my $desc = $allied->description();
|
my $desc = $allied->description();
|
||||||
|
|
||||||
if ($desc =~ /(AT-\d{4}\S{1}?)/){
|
if ( $desc =~ /(AT-\d{4}\S{1}?)/ ) {
|
||||||
return $1;
|
return $1;
|
||||||
}
|
}
|
||||||
return undef;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_name{
|
sub i_name {
|
||||||
my $allied = shift;
|
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};
|
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;
|
return $i_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_up {
|
sub i_up {
|
||||||
my $allied = shift;
|
my $allied = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
my $i_up = SNMP::Info::Layer1::i_up($allied);
|
my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
|
||||||
my $ati_up = $allied->ati_up();
|
my $ati_up = $allied->ati_up($partial) || {};
|
||||||
|
|
||||||
foreach my $port (keys %$ati_up){
|
foreach my $port ( keys %$ati_up ) {
|
||||||
my $up = $ati_up->{$port};
|
my $up = $ati_up->{$port};
|
||||||
$i_up->{$port} = 'down' if $up eq 'linktesterror';
|
$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;
|
return $i_up;
|
||||||
}
|
}
|
||||||
1;
|
1;
|
||||||
@@ -128,7 +123,7 @@ SNMP::Info::Layer1::Allied - SNMP Interface to old Allied Hubs
|
|||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -136,14 +131,13 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $allied = new SNMP::Info(
|
my $allied = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myhub',
|
DestHost => 'myhub',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 1
|
Version => 1
|
||||||
)
|
)
|
||||||
or die "Can't connect to DestHost.\n";
|
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";
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
@@ -164,16 +158,14 @@ inherited methods.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item ATI-MIB
|
=item F<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.
|
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
|
=head2 Inherited MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
=head1 GLOBALS
|
=head1 GLOBALS
|
||||||
|
|
||||||
These are methods that return scalar value from SNMP
|
These are methods that return scalar value from SNMP
|
||||||
@@ -198,19 +190,19 @@ Culls Version from description()
|
|||||||
|
|
||||||
Returns IP Address of Managed Hub.
|
Returns IP Address of Managed Hub.
|
||||||
|
|
||||||
(B<actualIpAddr>)
|
(C<actualIpAddr>)
|
||||||
|
|
||||||
=item $allied->model()
|
=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
|
=back
|
||||||
|
|
||||||
=head2 Global Methods imported 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
|
=head2 Overrides
|
||||||
|
|
||||||
@@ -233,16 +225,16 @@ the values of ati_up() to 'up' and 'down'.
|
|||||||
|
|
||||||
=item $allied->ati_p_name()
|
=item $allied->ati_p_name()
|
||||||
|
|
||||||
(B<portName>)
|
(C<portName>)
|
||||||
|
|
||||||
=item $allied->ati_up()
|
=item $allied->ati_up()
|
||||||
|
|
||||||
(B<linkTestLED>)
|
(C<linkTestLED>)
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
=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
|
=cut
|
||||||
|
|||||||
@@ -1,81 +1,72 @@
|
|||||||
# SNMP::Info::Layer1::Asante
|
# 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
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer1::Asante;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
|
use strict;
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info::Layer1;
|
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//;
|
@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.15';
|
||||||
|
|
||||||
# Set for No CDP
|
# Set for No CDP
|
||||||
%GLOBALS = (
|
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
|
||||||
%SNMP::Info::Layer1::GLOBALS,
|
|
||||||
);
|
|
||||||
|
|
||||||
%FUNCS = (%SNMP::Info::Layer1::FUNCS,
|
%FUNCS = (
|
||||||
'i_speed2' => 'ifSpeed',
|
%SNMP::Info::Layer1::FUNCS,
|
||||||
'i_mac2' => 'ifPhysAddress',
|
'asante_port' => 'ePortIndex',
|
||||||
'i_descr2' => 'ifDescr',
|
'asante_group' => 'ePortGrpIndex',
|
||||||
'i_name2' => 'ifName',
|
'i_type' => 'ePortStateType',
|
||||||
'asante_port' => 'ePortIndex',
|
'asante_up' => 'ePortStateLinkStatus',
|
||||||
'asante_group' => 'ePortGrpIndex',
|
);
|
||||||
'i_type' => 'ePortStateType',
|
|
||||||
'asante_up' => 'ePortStateLinkStatus',
|
|
||||||
);
|
|
||||||
|
|
||||||
%MIBS = (
|
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-HUB1012-MIB' => 'asante' );
|
||||||
%SNMP::Info::Layer1::MIBS,
|
|
||||||
'ASANTE-HUB1012-MIB' => 'asante'
|
|
||||||
);
|
|
||||||
|
|
||||||
%MUNGE = (%SNMP::Info::Layer1::MUNGE,
|
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
|
||||||
'i_mac2' => \&SNMP::Info::munge_mac,
|
|
||||||
'i_speed2' => \&SNMP::Info::munge_speed,
|
|
||||||
);
|
|
||||||
|
|
||||||
sub interfaces {
|
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;
|
my %interfaces;
|
||||||
|
|
||||||
foreach my $port (keys %$rptr_port){
|
foreach my $port ( keys %$rptr_port ) {
|
||||||
$interfaces{$port} = $port;
|
$interfaces{$port} = $port;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,13 +79,13 @@ sub os {
|
|||||||
|
|
||||||
sub os_ver {
|
sub os_ver {
|
||||||
my $asante = shift;
|
my $asante = shift;
|
||||||
my $descr = $asante->description();
|
my $descr = $asante->description();
|
||||||
|
|
||||||
if ($descr =~ /software v(\d+\.\d+)/){
|
if ( $descr =~ /software v(\d+\.\d+)/ ) {
|
||||||
return $1;
|
return $1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub vendor {
|
sub vendor {
|
||||||
return 'asante';
|
return 'asante';
|
||||||
}
|
}
|
||||||
@@ -102,31 +93,33 @@ sub vendor {
|
|||||||
sub model {
|
sub model {
|
||||||
my $asante = shift;
|
my $asante = shift;
|
||||||
|
|
||||||
my $id = $asante->id();
|
my $id = $asante->id();
|
||||||
my $model = &SNMP::translateObj($id);
|
my $model = &SNMP::translateObj($id);
|
||||||
|
|
||||||
return $model;
|
return $model;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_up {
|
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 = {};
|
my $i_up = {};
|
||||||
foreach my $port (keys %$asante_up){
|
foreach my $port ( keys %$asante_up ) {
|
||||||
my $up = $asante_up->{$port};
|
my $up = $asante_up->{$port};
|
||||||
$i_up->{$port} = 'down' if $up =~ /on/;
|
$i_up->{$port} = 'down' if $up =~ /on/;
|
||||||
$i_up->{$port} = 'up' if $up =~ /off/;
|
$i_up->{$port} = 'up' if $up =~ /off/;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $i_up;
|
return $i_up;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_speed {
|
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;
|
my %i_speed;
|
||||||
|
|
||||||
@@ -136,9 +129,10 @@ sub i_speed {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub i_mac {
|
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;
|
my %i_mac;
|
||||||
|
|
||||||
@@ -148,13 +142,14 @@ sub i_mac {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub i_description {
|
sub i_description {
|
||||||
return undef;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_name {
|
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;
|
my %i_name;
|
||||||
|
|
||||||
@@ -162,7 +157,9 @@ sub i_name {
|
|||||||
|
|
||||||
return \%i_name;
|
return \%i_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
@@ -171,7 +168,7 @@ SNMP::Info::Layer1::Asante - SNMP Interface to old Asante 1012 Hubs
|
|||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -179,14 +176,13 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $asante = new SNMP::Info(
|
my $asante = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
)
|
)
|
||||||
or die "Can't connect to DestHost.\n";
|
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";
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
@@ -206,14 +202,14 @@ Asante device through SNMP.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item ASANTE-HUB1012-MIB
|
=item F<ASANTE-HUB1012-MIB>
|
||||||
|
|
||||||
Download from http://www.mibdepot.com
|
|
||||||
|
|
||||||
=item MIBs listed in SNMP::Info::Layer1
|
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
|
=head2 Inherited MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
=head1 GLOBALS
|
=head1 GLOBALS
|
||||||
|
|
||||||
=head2 Overrides
|
=head2 Overrides
|
||||||
@@ -232,28 +228,36 @@ Culls software version from description()
|
|||||||
|
|
||||||
Returns 'asante' :)
|
Returns 'asante' :)
|
||||||
|
|
||||||
=item $asante->root_ip()
|
|
||||||
|
|
||||||
Returns IP Address of Managed Hub.
|
|
||||||
|
|
||||||
(B<actualIpAddr>)
|
|
||||||
|
|
||||||
=item $asante->model()
|
=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
|
=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
|
=head2 Overrides
|
||||||
|
|
||||||
=over
|
=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()
|
=item $asante->i_name()
|
||||||
|
|
||||||
Returns reference to map of IIDs to human-set port 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()
|
=item $asante->i_up()
|
||||||
|
|
||||||
Returns reference to map of IIDs to link status. Changes
|
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
|
=back
|
||||||
|
|
||||||
@@ -271,16 +279,16 @@ the values of ati_up() to 'up' and 'down'.
|
|||||||
|
|
||||||
=item $asante->ati_p_name()
|
=item $asante->ati_p_name()
|
||||||
|
|
||||||
(B<portName>)
|
(C<portName>)
|
||||||
|
|
||||||
=item $asante->ati_up()
|
=item $asante->ati_up()
|
||||||
|
|
||||||
(B<linkTestLED>)
|
(C<linkTestLED>)
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::Layer1
|
=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
|
=cut
|
||||||
|
|||||||
736
Info/Layer1/Bayhub.pm
Normal file
736
Info/Layer1/Bayhub.pm
Normal file
@@ -0,0 +1,736 @@
|
|||||||
|
# SNMP::Info::Layer1::Bayhub
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Eric Miller, Max Baker
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer1::Bayhub;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::SONMP;
|
||||||
|
use SNMP::Info::NortelStack;
|
||||||
|
use SNMP::Info::Layer2;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer1::Bayhub::ISA
|
||||||
|
= qw/SNMP::Info::SONMP SNMP::Info::NortelStack SNMP::Info::Layer2 Exporter/;
|
||||||
|
@SNMP::Info::Layer1::Bayhub::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer2::MIBS,
|
||||||
|
%SNMP::Info::NortelStack::MIBS,
|
||||||
|
%SNMP::Info::SONMP::MIBS,
|
||||||
|
'S5-ETHERNET-COMMON-MIB' => 's5EnPortTable',
|
||||||
|
'S5-COMMON-STATS-MIB' => 's5CmStat',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
|
||||||
|
%SNMP::Info::SONMP::GLOBALS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer2::FUNCS,
|
||||||
|
%SNMP::Info::NortelStack::FUNCS,
|
||||||
|
%SNMP::Info::SONMP::FUNCS,
|
||||||
|
|
||||||
|
# S5-ETHERNET-COMMON-MIB::s5EnPortTable
|
||||||
|
'bayhub_pb_index' => 's5EnPortBrdIndx',
|
||||||
|
'bayhub_pp_index' => 's5EnPortIndx',
|
||||||
|
'bayhub_up_admin' => 's5EnPortPartStatus',
|
||||||
|
'bayhub_up' => 's5EnPortLinkStatus',
|
||||||
|
|
||||||
|
# S5-ETHERNET-COMMON-MIB::s5EnPortExtTable
|
||||||
|
'bayhub_p_speed' => 's5EnPortExtActiveSpeed',
|
||||||
|
'bayhub_p_cap' => 's5EnPortExtHwCapability',
|
||||||
|
'bayhub_p_adv' => 's5EnPortExtAutoNegAdv',
|
||||||
|
|
||||||
|
# S5-COMMON-STATS-MIB::s5CmSNodeTable
|
||||||
|
'bayhub_nb_index' => 's5CmSNodeBrdIndx',
|
||||||
|
'bayhub_np_index' => 's5CmSNodePortIndx',
|
||||||
|
'fw_mac' => 's5CmSNodeMacAddr',
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::NortelStack::MUNGE,
|
||||||
|
%SNMP::Info::SONMP::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub layers {
|
||||||
|
return '00000011';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'bay_hub';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'avaya';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $id = $bayhub->id();
|
||||||
|
return unless defined $id;
|
||||||
|
my $model = &SNMP::translateObj($id);
|
||||||
|
return $id unless defined $model;
|
||||||
|
$model =~ s/^sreg-//i;
|
||||||
|
|
||||||
|
return 'Baystack Hub' if ( $model =~ /BayStack/ );
|
||||||
|
return '5000' if ( $model =~ /5000/ );
|
||||||
|
return '5005' if ( $model =~ /5005/ );
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Hubs do not support ifMIB requirements for get MAC
|
||||||
|
# and port status
|
||||||
|
|
||||||
|
sub i_index {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $b_index = $bayhub->bayhub_pb_index($partial) || {};
|
||||||
|
my $p_index = $bayhub->bayhub_pp_index($partial) || {};
|
||||||
|
my $model = $bayhub->model() || 'Baystack Hub';
|
||||||
|
|
||||||
|
my %i_index;
|
||||||
|
foreach my $iid ( keys %$b_index ) {
|
||||||
|
my $board = $b_index->{$iid};
|
||||||
|
next unless defined $board;
|
||||||
|
my $port = $p_index->{$iid} || 0;
|
||||||
|
|
||||||
|
if ( $model eq 'Baystack Hub' ) {
|
||||||
|
my $comidx = $board;
|
||||||
|
if ( !( $comidx % 5 ) ) {
|
||||||
|
$board = ( $board / 5 );
|
||||||
|
}
|
||||||
|
elsif ( $comidx =~ /[16]$/ ) {
|
||||||
|
$board = int( $board / 5 );
|
||||||
|
$port = 25;
|
||||||
|
}
|
||||||
|
elsif ( $comidx =~ /[27]$/ ) {
|
||||||
|
$board = int( $board / 5 );
|
||||||
|
$port = 26;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $index = ( $board * 256 ) + $port;
|
||||||
|
|
||||||
|
$i_index{$iid} = $index;
|
||||||
|
}
|
||||||
|
return \%i_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Partials don't really help in this class, but implemented
|
||||||
|
# for consistency
|
||||||
|
|
||||||
|
sub interfaces {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $i_index = $bayhub->i_index() || {};
|
||||||
|
|
||||||
|
my %if;
|
||||||
|
foreach my $iid ( keys %$i_index ) {
|
||||||
|
my $index = $i_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
|
||||||
|
# Index numbers are deterministic slot * 256 + port
|
||||||
|
my $port = $index % 256;
|
||||||
|
my $slot = int( $index / 256 );
|
||||||
|
|
||||||
|
my $slotport = "$slot.$port";
|
||||||
|
|
||||||
|
$if{$index} = $slotport;
|
||||||
|
}
|
||||||
|
|
||||||
|
return \%if;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_duplex {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $port_index = $bayhub->i_index() || {};
|
||||||
|
|
||||||
|
my %i_duplex;
|
||||||
|
foreach my $iid ( keys %$port_index ) {
|
||||||
|
my $index = $port_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
|
||||||
|
my $duplex = 'half';
|
||||||
|
$i_duplex{$index} = $duplex;
|
||||||
|
}
|
||||||
|
return \%i_duplex;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_duplex_admin {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $port_index = $bayhub->i_index() || {};
|
||||||
|
|
||||||
|
my %i_duplex_admin;
|
||||||
|
foreach my $iid ( keys %$port_index ) {
|
||||||
|
my $index = $port_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
|
||||||
|
my $duplex = 'half';
|
||||||
|
$i_duplex_admin{$index} = $duplex;
|
||||||
|
}
|
||||||
|
return \%i_duplex_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_speed {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $port_index = $bayhub->i_index() || {};
|
||||||
|
my $port_speed = $bayhub->bayhub_p_speed() || {};
|
||||||
|
|
||||||
|
my %i_speed;
|
||||||
|
foreach my $iid ( keys %$port_index ) {
|
||||||
|
my $index = $port_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
my $speed = $port_speed->{$iid} || '10 Mbps';
|
||||||
|
|
||||||
|
$speed = '10 Mbps' if $speed =~ /bps10M/i;
|
||||||
|
$speed = '100 Mbps' if $speed =~ /bps100M/i;
|
||||||
|
$i_speed{$index} = $speed;
|
||||||
|
}
|
||||||
|
return \%i_speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_up {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $port_index = $bayhub->i_index() || {};
|
||||||
|
my $link_stat = $bayhub->bayhub_up() || {};
|
||||||
|
|
||||||
|
my %i_up;
|
||||||
|
foreach my $iid ( keys %$port_index ) {
|
||||||
|
my $index = $port_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
my $link_stat = $link_stat->{$iid};
|
||||||
|
next unless defined $link_stat;
|
||||||
|
|
||||||
|
$link_stat = 'up' if $link_stat =~ /on/i;
|
||||||
|
$link_stat = 'down' if $link_stat =~ /off/i;
|
||||||
|
|
||||||
|
$i_up{$index} = $link_stat;
|
||||||
|
}
|
||||||
|
return \%i_up;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_up_admin {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $i_index = $bayhub->i_index() || {};
|
||||||
|
my $link_stat = $bayhub->bayhub_up_admin() || {};
|
||||||
|
|
||||||
|
my %i_up_admin;
|
||||||
|
foreach my $iid ( keys %$i_index ) {
|
||||||
|
my $index = $i_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
my $link_stat = $link_stat->{$iid};
|
||||||
|
next unless defined $link_stat;
|
||||||
|
|
||||||
|
$i_up_admin{$index} = $link_stat;
|
||||||
|
}
|
||||||
|
return \%i_up_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_i_up_admin {
|
||||||
|
|
||||||
|
# map setting to those the hub will understand
|
||||||
|
my %setting = qw/up 2 down 3/;
|
||||||
|
|
||||||
|
my $bayhub = shift;
|
||||||
|
my ( $setting, $iid ) = @_;
|
||||||
|
|
||||||
|
my $i_index = $bayhub->i_index() || {};
|
||||||
|
my %reverse_i_index = reverse %$i_index;
|
||||||
|
|
||||||
|
$setting = lc($setting);
|
||||||
|
|
||||||
|
return 0 unless defined $setting{$setting};
|
||||||
|
|
||||||
|
$iid = $reverse_i_index{$iid};
|
||||||
|
|
||||||
|
return $bayhub->set_bayhub_up_admin( $setting{$setting}, $iid );
|
||||||
|
}
|
||||||
|
|
||||||
|
# Hubs do not support the standard Bridge MIB
|
||||||
|
sub bp_index {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $b_index = $bayhub->bayhub_nb_index() || {};
|
||||||
|
my $p_index = $bayhub->bayhub_np_index() || {};
|
||||||
|
my $model = $bayhub->model() || 'Baystack Hub';
|
||||||
|
|
||||||
|
my %bp_index;
|
||||||
|
foreach my $iid ( keys %$b_index ) {
|
||||||
|
my $board = $b_index->{$iid};
|
||||||
|
next unless defined $board;
|
||||||
|
my $port = $p_index->{$iid} || 0;
|
||||||
|
|
||||||
|
if ( $model eq 'Baystack Hub' ) {
|
||||||
|
my $comidx = $board;
|
||||||
|
if ( !( $comidx % 5 ) ) {
|
||||||
|
$board = ( $board / 5 );
|
||||||
|
}
|
||||||
|
elsif ( $comidx =~ /[16]$/ ) {
|
||||||
|
$board = int( $board / 5 );
|
||||||
|
$port = 25;
|
||||||
|
}
|
||||||
|
elsif ( $comidx =~ /[27]$/ ) {
|
||||||
|
$board = int( $board / 5 );
|
||||||
|
$port = 26;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $index = ( $board * 256 ) + $port;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
|
||||||
|
$bp_index{$index} = $index;
|
||||||
|
}
|
||||||
|
return \%bp_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub fw_mac {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $bayhub->SUPER::fw_mac($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub fw_port {
|
||||||
|
my $bayhub = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $b_index = $bayhub->bayhub_nb_index($partial) || {};
|
||||||
|
my $p_index = $bayhub->bayhub_np_index($partial) || {};
|
||||||
|
my $model = $bayhub->model() || 'Baystack Hub';
|
||||||
|
|
||||||
|
my %fw_port;
|
||||||
|
foreach my $iid ( keys %$b_index ) {
|
||||||
|
my $board = $b_index->{$iid};
|
||||||
|
next unless defined $board;
|
||||||
|
my $port = $p_index->{$iid} || 0;
|
||||||
|
|
||||||
|
if ( $model eq 'Baystack Hub' ) {
|
||||||
|
my $comidx = $board;
|
||||||
|
if ( !( $comidx % 5 ) ) {
|
||||||
|
$board = ( $board / 5 );
|
||||||
|
}
|
||||||
|
elsif ( $comidx =~ /[16]$/ ) {
|
||||||
|
$board = int( $board / 5 );
|
||||||
|
$port = 25;
|
||||||
|
}
|
||||||
|
elsif ( $comidx =~ /[27]$/ ) {
|
||||||
|
$board = int( $board / 5 );
|
||||||
|
$port = 26;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $index = ( $board * 256 ) + $port;
|
||||||
|
|
||||||
|
$fw_port{$iid} = $index;
|
||||||
|
}
|
||||||
|
return \%fw_port;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub index_factor {
|
||||||
|
return 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub slot_offset {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Devices do not support ENTITY-MIB use proprietary methods.
|
||||||
|
|
||||||
|
sub e_index {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_index($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_class {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_class($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_descr {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_descr($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_name {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_name($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_fwver {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_fwver($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_hwver {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_hwver($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_parent {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_parent($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_pos {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_pos($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_serial {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_serial($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_swver {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_swver($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_type {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_type($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_vendor {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->ns_e_vendor($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay/Nortel/Avaya Hubs
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
#Let SNMP::Info determine the correct subclass for you.
|
||||||
|
|
||||||
|
my $bayhub = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $bayhub->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Provides abstraction to the configuration information obtainable from a
|
||||||
|
Bay hub device through SNMP. Also provides device MAC to port mapping through
|
||||||
|
the proprietary MIB.
|
||||||
|
|
||||||
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
|
my $bayhub = new SNMP::Info::Layer1::Bayhub(...);
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer2
|
||||||
|
|
||||||
|
=item SNMP::Info::NortelStack
|
||||||
|
|
||||||
|
=item SNMP::Info::SONMP
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<S5-ETHERNET-COMMON-MIB>
|
||||||
|
|
||||||
|
=item F<S5-COMMON-STATS-MIB>
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Inherited MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::NortelStack/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $bayhub->vendor()
|
||||||
|
|
||||||
|
Returns 'avaya'
|
||||||
|
|
||||||
|
=item $bayhub->os()
|
||||||
|
|
||||||
|
Returns 'bay_hub'
|
||||||
|
|
||||||
|
=item $bayhub->model()
|
||||||
|
|
||||||
|
Cross references $bayhub->id() to the F<SYNOPTICS-MIB> and returns
|
||||||
|
the results.
|
||||||
|
|
||||||
|
Removes either Baystack Hub, 5000, or 5005 depending on the model.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $bayhub->layers()
|
||||||
|
|
||||||
|
Returns 00000011. Class emulates Layer 2 functionality through proprietary
|
||||||
|
MIBs.
|
||||||
|
|
||||||
|
=item $bayhub->index_factor()
|
||||||
|
|
||||||
|
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||||
|
reserved per slot within the device MIB. Returns 256.
|
||||||
|
|
||||||
|
=item $bayhub->slot_offset()
|
||||||
|
|
||||||
|
Required by SNMP::Info::SONMP. Offset if slot numbering does not
|
||||||
|
start at 0. Returns 0.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::NortelStack
|
||||||
|
|
||||||
|
See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a reference
|
||||||
|
to a hash.
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $bayhub->i_index()
|
||||||
|
|
||||||
|
Returns reference to map of IIDs to Interface index.
|
||||||
|
|
||||||
|
Since hubs do not support C<ifIndex>, the interface index is created using the
|
||||||
|
formula (board * 256 + port).
|
||||||
|
|
||||||
|
=item $bayhub->interfaces()
|
||||||
|
|
||||||
|
Returns reference to map of IIDs to physical ports.
|
||||||
|
|
||||||
|
=item $bayhub->i_duplex()
|
||||||
|
|
||||||
|
Returns half, hubs do not support full duplex.
|
||||||
|
|
||||||
|
=item $bayhub->i_duplex_admin()
|
||||||
|
|
||||||
|
Returns half, hubs do not support full duplex.
|
||||||
|
|
||||||
|
=item $bayhub->i_speed()
|
||||||
|
|
||||||
|
Returns interface speed.
|
||||||
|
|
||||||
|
=item $bayhub->i_up()
|
||||||
|
|
||||||
|
Returns (C<s5EnPortLinkStatus>) for each port. Translates on/off to up/down.
|
||||||
|
|
||||||
|
=item $bayhub->i_up_admin()
|
||||||
|
|
||||||
|
Returns (C<s5EnPortPartStatus>) for each port.
|
||||||
|
|
||||||
|
=item $bayhub->set_i_up_admin(state, ifIndex)
|
||||||
|
|
||||||
|
Sets port state, must be supplied with state and port C<ifIndex>
|
||||||
|
|
||||||
|
State choices are 'up' or 'down'
|
||||||
|
|
||||||
|
Example:
|
||||||
|
my %if_map = reverse %{$bayhub->interfaces()};
|
||||||
|
$bayhub->set_i_up_admin('down', $if_map{'1.1'})
|
||||||
|
or die "Couldn't change port state. ",$bayhub->error(1);
|
||||||
|
|
||||||
|
=item $bayhub->bp_index()
|
||||||
|
|
||||||
|
Simulates bridge MIB by returning reference to a hash containing the index for
|
||||||
|
both the keys and values.
|
||||||
|
|
||||||
|
=item $bayhub->fw_port()
|
||||||
|
|
||||||
|
Returns reference to map of IIDs of the C<S5-COMMON-STATS-MIB::s5CmSNodeTable>
|
||||||
|
to the Interface index.
|
||||||
|
|
||||||
|
=item $bayhub->fw_mac()
|
||||||
|
|
||||||
|
(C<s5CmSNodeMacAddr>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Pseudo F<ENTITY-MIB> Information
|
||||||
|
|
||||||
|
These devices do not support F<ENTITY-MIB>. These methods emulate Physical
|
||||||
|
Table methods using F<S5-CHASSIS-MIB>. See
|
||||||
|
L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $bayhub->e_index()
|
||||||
|
|
||||||
|
Returns ns_e_index().
|
||||||
|
|
||||||
|
=item $bayhub->e_class()
|
||||||
|
|
||||||
|
Returns ns_e_class().
|
||||||
|
|
||||||
|
=item $bayhub->e_descr()
|
||||||
|
|
||||||
|
Returns ns_e_descr().
|
||||||
|
|
||||||
|
=item $bayhub->e_name()
|
||||||
|
|
||||||
|
Returns ns_e_name().
|
||||||
|
|
||||||
|
=item $bayhub->e_fwver()
|
||||||
|
|
||||||
|
Returns ns_e_fwver().
|
||||||
|
|
||||||
|
=item $bayhub->e_hwver()
|
||||||
|
|
||||||
|
Returns ns_e_hwver().
|
||||||
|
|
||||||
|
=item $bayhub->e_parent()
|
||||||
|
|
||||||
|
Returns ns_e_parent().
|
||||||
|
|
||||||
|
=item $bayhub->e_pos()
|
||||||
|
|
||||||
|
Returns ns_e_pos().
|
||||||
|
|
||||||
|
=item $bayhub->e_serial()
|
||||||
|
|
||||||
|
Returns ns_e_serial().
|
||||||
|
|
||||||
|
=item $bayhub->e_swver()
|
||||||
|
|
||||||
|
Returns ns_e_swver().
|
||||||
|
|
||||||
|
=item $bayhub->e_type()
|
||||||
|
|
||||||
|
Returns ns_e_type().
|
||||||
|
|
||||||
|
=item $bayhub->e_vendor()
|
||||||
|
|
||||||
|
Returns ns_e_vendor().
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::NortelStack
|
||||||
|
|
||||||
|
See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
444
Info/Layer1/Cyclades.pm
Normal file
444
Info/Layer1/Cyclades.pm
Normal file
@@ -0,0 +1,444 @@
|
|||||||
|
# SNMP::Info::Layer1::Cyclades
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Eric Miller
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer1::Cyclades;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::Layer1;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer1::Cyclades::ISA = qw/SNMP::Info::Layer1 Exporter/;
|
||||||
|
@SNMP::Info::Layer1::Cyclades::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%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
|
||||||
555
Info/Layer1/S3000.pm
Normal file
555
Info/Layer1/S3000.pm
Normal file
@@ -0,0 +1,555 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer2::MIBS,
|
||||||
|
'SYNOPTICS-ETHERNET-MIB' => 's3EnetPortTable',
|
||||||
|
'SYNOPTICS-COMMON-MIB' => 's3AgentType',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer2::GLOBALS,
|
||||||
|
|
||||||
|
# From SYNOPTICS-COMMON-MIB
|
||||||
|
'os_bin' => 's3AgentFwVer',
|
||||||
|
's3000_major_ver' => 's3AgentSwMajorVer',
|
||||||
|
's3000_minor_ver' => 's3AgentSwMinorVer',
|
||||||
|
's3000_maint_ver' => 's3AgentSwMaintVer',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer2::FUNCS,
|
||||||
|
|
||||||
|
# SYNOPTICS-ETHERNET-MIB::s3EnetPortTable
|
||||||
|
's3000_pb_index' => 's3EnetPortBoardIndex',
|
||||||
|
's3000_pp_index' => 's3EnetPortIndex',
|
||||||
|
's3000_up_admin' => 's3EnetPortPartStatus',
|
||||||
|
's3000_up' => 's3EnetPortLinkStatus',
|
||||||
|
|
||||||
|
# SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable
|
||||||
|
's3000_nb_index' => 's3EnetShowNodesSlotIndex',
|
||||||
|
's3000_np_index' => 's3EnetShowNodesPortIndex',
|
||||||
|
'fw_mac' => 's3EnetShowNodesMacAddress',
|
||||||
|
|
||||||
|
# SYNOPTICS-ETHERNET-MIB::s3EnetTopNmmTable
|
||||||
|
's3000_topo_port' => 's3EnetTopNmmPort',
|
||||||
|
's3000_topo_mac' => 's3EnetTopNmmMacAddr',
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::Layer2::MUNGE, 's3000_topo_mac' => \&SNMP::Info::munge_mac
|
||||||
|
);
|
||||||
|
|
||||||
|
sub layers {
|
||||||
|
return '00000011';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'synoptics';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'nortel';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $id = $s3000->id();
|
||||||
|
return unless defined $id;
|
||||||
|
my $model = &SNMP::translateObj($id);
|
||||||
|
return $id unless defined $model;
|
||||||
|
$model =~ s/^s3reg-//i;
|
||||||
|
|
||||||
|
return $1 if ( $model =~ /((\d+){3}[\dX])/ );
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_ver {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $major_ver = $s3000->s3000_major_ver() || 0;
|
||||||
|
my $minor_ver = $s3000->s3000_minor_ver() || 0;
|
||||||
|
my $maint_ver = $s3000->s3000_maint_ver() || 0;
|
||||||
|
|
||||||
|
my $ver = "$major_ver.$minor_ver.$maint_ver";
|
||||||
|
return $ver;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub mac {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $topo_port = $s3000->s3000_topo_port();
|
||||||
|
my $topo_mac = $s3000->s3000_topo_mac();
|
||||||
|
|
||||||
|
foreach my $entry ( keys %$topo_port ) {
|
||||||
|
my $port = $topo_port->{$entry};
|
||||||
|
next unless $port == 0;
|
||||||
|
my $mac = $topo_mac->{$entry};
|
||||||
|
return $mac;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Topology turned off, not supported.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Hubs do not support ifMIB requirements for get MAC
|
||||||
|
# and port status
|
||||||
|
|
||||||
|
sub i_index {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $b_index = $s3000->s3000_pb_index($partial) || {};
|
||||||
|
my $p_index = $s3000->s3000_pp_index($partial) || {};
|
||||||
|
|
||||||
|
my %i_index;
|
||||||
|
foreach my $iid ( keys %$b_index ) {
|
||||||
|
my $board = $b_index->{$iid};
|
||||||
|
next unless defined $board;
|
||||||
|
my $port = $p_index->{$iid} || 0;
|
||||||
|
|
||||||
|
# We need to make up an index for multiple board instances.
|
||||||
|
my $index = ( $board * 256 ) + $port;
|
||||||
|
|
||||||
|
$i_index{$iid} = $index;
|
||||||
|
}
|
||||||
|
return \%i_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Partials don't really help in this class, but implemented
|
||||||
|
# for consistency
|
||||||
|
|
||||||
|
sub interfaces {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $i_index = $s3000->i_index() || {};
|
||||||
|
|
||||||
|
my %if;
|
||||||
|
foreach my $iid ( keys %$i_index ) {
|
||||||
|
my $index = $i_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
|
||||||
|
# Index numbers are deterministic slot * 256 + port - see i_index()
|
||||||
|
my $port = $index % 256;
|
||||||
|
my $slot = int( $index / 256 );
|
||||||
|
|
||||||
|
my $slotport = "$slot.$port";
|
||||||
|
|
||||||
|
$if{$index} = $slotport;
|
||||||
|
}
|
||||||
|
|
||||||
|
return \%if;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_duplex {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $port_index = $s3000->i_index() || {};
|
||||||
|
|
||||||
|
my %i_duplex;
|
||||||
|
foreach my $iid ( keys %$port_index ) {
|
||||||
|
my $index = $port_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
|
||||||
|
# Hubs only function half duplex
|
||||||
|
my $duplex = 'half';
|
||||||
|
$i_duplex{$index} = $duplex;
|
||||||
|
}
|
||||||
|
return \%i_duplex;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_duplex_admin {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $port_index = $s3000->i_index() || {};
|
||||||
|
|
||||||
|
my %i_duplex_admin;
|
||||||
|
foreach my $iid ( keys %$port_index ) {
|
||||||
|
my $index = $port_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
|
||||||
|
# Hubs only function half duplex
|
||||||
|
my $duplex = 'half';
|
||||||
|
$i_duplex_admin{$index} = $duplex;
|
||||||
|
}
|
||||||
|
return \%i_duplex_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_speed {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $port_index = $s3000->i_index() || {};
|
||||||
|
|
||||||
|
my %i_speed;
|
||||||
|
foreach my $iid ( keys %$port_index ) {
|
||||||
|
my $index = $port_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
|
||||||
|
# These hubs only support 10 Mbs
|
||||||
|
my $speed = '10000000';
|
||||||
|
$i_speed{$index} = $speed;
|
||||||
|
}
|
||||||
|
return \%i_speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_up {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $port_index = $s3000->i_index() || {};
|
||||||
|
my $link_stat = $s3000->s3000_up() || {};
|
||||||
|
|
||||||
|
my %i_up;
|
||||||
|
foreach my $iid ( keys %$port_index ) {
|
||||||
|
my $index = $port_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
my $link_stat = $link_stat->{$iid};
|
||||||
|
next unless defined $link_stat;
|
||||||
|
|
||||||
|
$link_stat = 'up' if $link_stat =~ /on/i;
|
||||||
|
$link_stat = 'down' if $link_stat =~ /off/i;
|
||||||
|
|
||||||
|
$i_up{$index} = $link_stat;
|
||||||
|
}
|
||||||
|
return \%i_up;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_up_admin {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $i_index = $s3000->i_index() || {};
|
||||||
|
my $link_stat = $s3000->s3000_up_admin() || {};
|
||||||
|
|
||||||
|
my %i_up_admin;
|
||||||
|
foreach my $iid ( keys %$i_index ) {
|
||||||
|
my $index = $i_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
my $link_stat = $link_stat->{$iid};
|
||||||
|
next unless defined $link_stat;
|
||||||
|
|
||||||
|
$i_up_admin{$index} = $link_stat;
|
||||||
|
}
|
||||||
|
return \%i_up_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_i_up_admin {
|
||||||
|
|
||||||
|
# map setting to those the hub will understand
|
||||||
|
my %setting = qw/up 2 down 3/;
|
||||||
|
|
||||||
|
my $s3000 = shift;
|
||||||
|
my ( $setting, $iid ) = @_;
|
||||||
|
|
||||||
|
my $i_index = $s3000->i_index() || {};
|
||||||
|
my %reverse_i_index = reverse %$i_index;
|
||||||
|
|
||||||
|
$setting = lc($setting);
|
||||||
|
|
||||||
|
return 0 unless defined $setting{$setting};
|
||||||
|
|
||||||
|
$iid = $reverse_i_index{$iid};
|
||||||
|
|
||||||
|
return $s3000->set_s3000_up_admin( $setting{$setting}, $iid );
|
||||||
|
}
|
||||||
|
|
||||||
|
# Hubs do not support the standard Bridge MIB
|
||||||
|
sub bp_index {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $b_index = $s3000->s3000_nb_index() || {};
|
||||||
|
my $p_index = $s3000->s3000_np_index() || {};
|
||||||
|
my $model = $s3000->model();
|
||||||
|
|
||||||
|
my %bp_index;
|
||||||
|
foreach my $iid ( keys %$b_index ) {
|
||||||
|
my $board = $b_index->{$iid};
|
||||||
|
next unless defined $board;
|
||||||
|
my $port = $p_index->{$iid} || 0;
|
||||||
|
|
||||||
|
my $index = ( $board * 256 ) + $port;
|
||||||
|
next if ( defined $partial and $index !~ /^$partial$/ );
|
||||||
|
|
||||||
|
$bp_index{$index} = $index;
|
||||||
|
}
|
||||||
|
return \%bp_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub fw_mac {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $s3000->SUPER::fw_mac($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub fw_port {
|
||||||
|
my $s3000 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $b_index = $s3000->s3000_nb_index($partial) || {};
|
||||||
|
my $p_index = $s3000->s3000_np_index($partial) || {};
|
||||||
|
my $model = $s3000->model();
|
||||||
|
|
||||||
|
my %fw_port;
|
||||||
|
foreach my $iid ( keys %$b_index ) {
|
||||||
|
my $board = $b_index->{$iid};
|
||||||
|
next unless defined $board;
|
||||||
|
my $port = $p_index->{$iid} || 0;
|
||||||
|
|
||||||
|
my $index = ( $board * 256 ) + $port;
|
||||||
|
|
||||||
|
$fw_port{$iid} = $index;
|
||||||
|
}
|
||||||
|
return \%fw_port;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer1::S3000 - SNMP Interface to Synoptics / Nortel Hubs
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
#Let SNMP::Info determine the correct subclass for you.
|
||||||
|
|
||||||
|
my $s3000 = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $s3000->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Provides abstraction to the configuration information obtainable from a
|
||||||
|
Bay hub device through SNMP. Also provides device MAC to port mapping through
|
||||||
|
the proprietary MIB.
|
||||||
|
|
||||||
|
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
|
||||||
275
Info/Layer2.pm
275
Info/Layer2.pm
@@ -1,101 +1,89 @@
|
|||||||
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
|
# SNMP::Info::Layer2 - SNMP Interface to Layer2 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
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
package SNMP::Info::Layer2;
|
package SNMP::Info::Layer2;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info;
|
use SNMP::Info;
|
||||||
use SNMP::Info::Bridge;
|
use SNMP::Info::Bridge;
|
||||||
use SNMP::Info::CDP;
|
use SNMP::Info::Entity;
|
||||||
use SNMP::Info::CiscoStats;
|
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::Entity SNMP::Info::PowerEthernet Exporter/;
|
||||||
@SNMP::Info::Layer2::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::CDP SNMP::Info::CiscoStats Exporter/;
|
|
||||||
@SNMP::Info::Layer2::EXPORT_OK = qw//;
|
@SNMP::Info::Layer2::EXPORT_OK = qw//;
|
||||||
|
|
||||||
$DEBUG=0;
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
|
||||||
$SNMP::debugging=$DEBUG;
|
|
||||||
|
|
||||||
# See SNMP::Info for the details of these data structures and
|
$VERSION = '3.15';
|
||||||
# the interworkings.
|
|
||||||
$INIT = 0;
|
|
||||||
|
|
||||||
%MIBS = ( %SNMP::Info::MIBS,
|
%MIBS = (
|
||||||
%SNMP::Info::Bridge::MIBS,
|
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||||
%SNMP::Info::CDP::MIBS,
|
%SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::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
|
|
||||||
);
|
|
||||||
|
|
||||||
%GLOBALS = (
|
%GLOBALS = (
|
||||||
%SNMP::Info::GLOBALS,
|
%SNMP::Info::GLOBALS,
|
||||||
%SNMP::Info::Bridge::GLOBALS,
|
%SNMP::Info::Bridge::GLOBALS,
|
||||||
%SNMP::Info::CDP::GLOBALS,
|
%SNMP::Info::Entity::GLOBALS,
|
||||||
%SNMP::Info::CiscoStats::GLOBALS,
|
%SNMP::Info::PowerEthernet::GLOBALS,
|
||||||
'serial1' => '.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
'serial1' =>
|
||||||
);
|
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||||
|
);
|
||||||
|
|
||||||
%FUNCS = (
|
%FUNCS = (
|
||||||
%SNMP::Info::FUNCS,
|
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
|
||||||
%SNMP::Info::Bridge::FUNCS,
|
%SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS,
|
||||||
%SNMP::Info::CDP::FUNCS,
|
);
|
||||||
%SNMP::Info::CiscoStats::FUNCS,
|
|
||||||
'ent_serial' => 'entPhysicalSerialNum',
|
|
||||||
'ent_chassis'=> 'entPhysicalDescr',
|
|
||||||
);
|
|
||||||
|
|
||||||
%MUNGE = (
|
%MUNGE = (
|
||||||
# Inherit all the built in munging
|
|
||||||
%SNMP::Info::MUNGE,
|
# Inherit all the built in munging
|
||||||
%SNMP::Info::Bridge::MUNGE,
|
%SNMP::Info::MUNGE,
|
||||||
%SNMP::Info::CDP::MUNGE,
|
%SNMP::Info::Bridge::MUNGE,
|
||||||
%SNMP::Info::CiscoStats::MUNGE,
|
%SNMP::Info::Entity::MUNGE,
|
||||||
);
|
%SNMP::Info::PowerEthernet::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
# Method OverRides
|
# Method OverRides
|
||||||
|
|
||||||
# $l2->model() - Looks at sysObjectID which gives the oid of the system
|
# $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 {
|
sub model {
|
||||||
my $l2 = shift;
|
my $l2 = shift;
|
||||||
my $id = $l2->id();
|
my $id = $l2->id();
|
||||||
my $model = &SNMP::translateObj($id);
|
my $model = &SNMP::translateObj($id) || $id || '';
|
||||||
|
|
||||||
# HP
|
# HP
|
||||||
$model =~ s/^hpswitch//i;
|
$model =~ s/^hpswitch//i;
|
||||||
|
|
||||||
@@ -108,15 +96,15 @@ sub model {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub vendor {
|
sub vendor {
|
||||||
my $l2 = shift;
|
my $l2 = shift;
|
||||||
my $model = $l2->model();
|
my $model = $l2->model();
|
||||||
my $descr = $l2->description();
|
my $descr = $l2->description();
|
||||||
|
|
||||||
if ($model =~ /hp/i or $descr =~ /hp/i) {
|
if ( $model =~ /hp/i or $descr =~ /\bhp\b/i ) {
|
||||||
return 'hp';
|
return 'hp';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i) {
|
if ( $model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i ) {
|
||||||
return 'cisco';
|
return 'cisco';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,64 +112,66 @@ sub vendor {
|
|||||||
|
|
||||||
sub serial {
|
sub serial {
|
||||||
my $l2 = shift;
|
my $l2 = shift;
|
||||||
|
|
||||||
my $serial1 = $l2->serial1();
|
my $serial1 = $l2->serial1();
|
||||||
my $ent_chassis = $l2->ent_chassis() || {};
|
my $e_descr = $l2->e_descr() || {};
|
||||||
my $ent_serial = $l2->ent_serial() || {};
|
my $e_serial = $l2->e_serial() || {};
|
||||||
|
|
||||||
my $serial2 = $ent_serial->{1} || undef;
|
my $serial2 = $e_serial->{1} || undef;
|
||||||
my $chassis = $ent_chassis->{1} || undef;
|
my $chassis = $e_descr->{1} || undef;
|
||||||
|
|
||||||
# precedence
|
# precedence
|
||||||
# serial2,chassis parse,serial1
|
# serial2,chassis parse,serial1
|
||||||
return $serial2 if (defined $serial2 and $serial2 !~ /^\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;
|
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_ignore {
|
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 = ();
|
my %i_ignore = ();
|
||||||
|
|
||||||
foreach my $if (keys %$i_type){
|
foreach my $if ( keys %$i_type ) {
|
||||||
my $type = $i_type->{$if};
|
my $type = $i_type->{$if};
|
||||||
$i_ignore{$if}++
|
$i_ignore{$if}++
|
||||||
if $type =~ /(loopback|propvirtual|other|cpu)/i;
|
if $type =~ /(loopback|other|cpu)/i;
|
||||||
}
|
}
|
||||||
|
|
||||||
return \%i_ignore;
|
return \%i_ignore;
|
||||||
}
|
}
|
||||||
|
|
||||||
# By Default we'll use the description field
|
|
||||||
sub interfaces {
|
sub interfaces {
|
||||||
my $l2 = shift;
|
my $l2 = shift;
|
||||||
my $interfaces = $l2->i_index();
|
my $partial = shift;
|
||||||
my $i_descr = $l2->i_description();
|
|
||||||
my $i_name = $l2->i_name();
|
|
||||||
|
|
||||||
my %if;
|
my $interfaces = $l2->i_index($partial) || {};
|
||||||
foreach my $iid (keys %$interfaces){
|
my $i_descr = $l2->i_description($partial) || {};
|
||||||
|
|
||||||
|
# Replace the Index with the ifDescr field.
|
||||||
|
# Check for duplicates in ifDescr, if so uniquely identify by adding
|
||||||
|
# ifIndex to repeated values
|
||||||
|
my %seen;
|
||||||
|
foreach my $iid ( keys %$i_descr ) {
|
||||||
my $port = $i_descr->{$iid};
|
my $port = $i_descr->{$iid};
|
||||||
my $name = $i_name->{$iid};
|
|
||||||
$port = $name if (defined $name and $name !~ /^\s*$/);
|
|
||||||
next unless defined $port;
|
next unless defined $port;
|
||||||
|
if ( $seen{$port}++ ) {
|
||||||
# Cisco 1900 has a space in some of its port descr.
|
$interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
|
||||||
# get rid of any weird characters
|
}
|
||||||
$port =~ s/[^\d\/,()\w]+//gi;
|
else {
|
||||||
|
$interfaces->{$iid} = $port;
|
||||||
# Translate Cisco 2926,etc. from 1/5 to 1.5
|
}
|
||||||
$port =~ s/\//\./ if ($port =~ /^\d+\/\d+$/);
|
|
||||||
|
|
||||||
$if{$iid} = $port;
|
|
||||||
}
|
}
|
||||||
|
return $interfaces;
|
||||||
return \%if
|
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
@@ -189,11 +179,11 @@ __END__
|
|||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -201,7 +191,6 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $l2 = new SNMP::Info(
|
my $l2 = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
@@ -224,14 +213,15 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
This class is usually used as a superclass for more specific device classes listed under
|
This class is usually used as a superclass for more specific device classes
|
||||||
SNMP::Info::Layer2::* Please read all docs under SNMP::Info first.
|
listed under SNMP::Info::Layer2::* Please read all docs under SNMP::Info
|
||||||
|
first.
|
||||||
|
|
||||||
Provides abstraction to the configuration information obtainable from a
|
Provides abstraction to the configuration information obtainable from a
|
||||||
Layer2 device through SNMP. Information is stored in a number of MIBs.
|
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
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
a more specific class using the method above.
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
my $l2 = new SNMP::Info::Layer2(...);
|
my $l2 = new SNMP::Info::Layer2(...);
|
||||||
|
|
||||||
@@ -243,9 +233,7 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=item SNMP::Info::Bridge
|
=item SNMP::Info::Bridge
|
||||||
|
|
||||||
=item SNMP::Info::CDP
|
=item SNMP::Info::Entity
|
||||||
|
|
||||||
=item SNMP::Info::CiscoStats
|
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -253,21 +241,13 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item CISCO-PRODUCTS-MIB
|
|
||||||
|
|
||||||
Needed for ID of Cisco Products
|
|
||||||
|
|
||||||
=item CISCO-STACK-MIB
|
|
||||||
|
|
||||||
Needed for ID of Cisco Products
|
|
||||||
|
|
||||||
=item Inherited Classes
|
=item Inherited Classes
|
||||||
|
|
||||||
MIBs required by the inherited classes listed above.
|
MIBs required by the inherited classes listed above.
|
||||||
|
|
||||||
=back
|
=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
|
=head1 GLOBALS
|
||||||
|
|
||||||
@@ -282,31 +262,31 @@ These are methods that return scalar value from SNMP
|
|||||||
Cross references $l2->id() with product IDs in the
|
Cross references $l2->id() with product IDs in the
|
||||||
Cisco MIBs.
|
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()
|
=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
|
=back
|
||||||
|
|
||||||
=head2 Globals imported from SNMP::Info
|
=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
|
=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.
|
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||||
|
|
||||||
=head2 Globals imported from SNMP::Info::CiscoStats
|
|
||||||
|
|
||||||
See documentation in SNMP::Info::CiscoStats for details.
|
|
||||||
|
|
||||||
=head1 TABLE METHODS
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
@@ -319,32 +299,29 @@ to a hash.
|
|||||||
|
|
||||||
=item $l2->interfaces()
|
=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()
|
=item $l2->i_ignore()
|
||||||
|
|
||||||
Returns reference to hash. Increments value of IID if port is to be ignored.
|
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
|
=back
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info
|
=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
|
=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.
|
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
|
||||||
|
|
||||||
See documentation in SNMP::Info::CiscoStats for details.
|
|
||||||
|
|
||||||
=cut
|
=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.15';
|
||||||
|
|
||||||
|
%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,83 +1,132 @@
|
|||||||
# SNMP::Info::Layer2::Aironet
|
# 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
|
# Copyright (c) 2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer2::Aironet;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
|
use strict;
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info::Layer2;
|
use SNMP::Info::Layer2;
|
||||||
use SNMP::Info::Entity;
|
use SNMP::Info::Entity;
|
||||||
use SNMP::Info::EtherLike;
|
use SNMP::Info::EtherLike;
|
||||||
|
use SNMP::Info::CiscoStats;
|
||||||
|
use SNMP::Info::CiscoConfig;
|
||||||
|
use SNMP::Info::CDP;
|
||||||
|
use SNMP::Info::IEEE802dot11;
|
||||||
|
|
||||||
@SNMP::Info::Layer2::Aironet::ISA = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike Exporter/;
|
@SNMP::Info::Layer2::Aironet::ISA
|
||||||
|
= qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
|
||||||
|
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
|
||||||
@SNMP::Info::Layer2::Aironet::EXPORT_OK = qw//;
|
@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.15';
|
||||||
|
|
||||||
# Set for No CDP
|
|
||||||
%GLOBALS = (
|
%GLOBALS = (
|
||||||
%SNMP::Info::Layer2::GLOBALS,
|
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||||
%SNMP::Info::Entity::GLOBALS,
|
%SNMP::Info::Layer2::GLOBALS,
|
||||||
%SNMP::Info::EtherLike::GLOBALS,
|
%SNMP::Info::Entity::GLOBALS,
|
||||||
'serial' => 'entPhysicalSerialNum.1',
|
%SNMP::Info::EtherLike::GLOBALS,
|
||||||
'descr' => 'sysDescr'
|
%SNMP::Info::CiscoStats::GLOBALS,
|
||||||
);
|
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||||
|
%SNMP::Info::CDP::GLOBALS,
|
||||||
|
'serial' => 'entPhysicalSerialNum.1',
|
||||||
|
'descr' => 'sysDescr'
|
||||||
|
);
|
||||||
|
|
||||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
%FUNCS = (
|
||||||
%SNMP::Info::Entity::FUNCS,
|
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||||
%SNMP::Info::EtherLike::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 = (
|
%MIBS = (
|
||||||
%SNMP::Info::Layer2::MIBS,
|
%SNMP::Info::IEEE802dot11::MIBS,
|
||||||
%SNMP::Info::Entity::MIBS,
|
%SNMP::Info::Layer2::MIBS,
|
||||||
%SNMP::Info::EtherLike::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,
|
%MUNGE = (
|
||||||
%SNMP::Info::Entity::MUNGE,
|
%SNMP::Info::IEEE802dot11::MUNGE,
|
||||||
%SNMP::Info::EtherLike::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 {
|
sub vendor {
|
||||||
|
|
||||||
# Sorry, but it's true.
|
# Sorry, but it's true.
|
||||||
return 'cisco';
|
return 'cisco';
|
||||||
}
|
}
|
||||||
|
|
||||||
sub interfaces {
|
sub interfaces {
|
||||||
my $aironet = shift;
|
my $aironet = shift;
|
||||||
my $i_description = $aironet->i_description();
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $i_description = $aironet->i_description($partial);
|
||||||
|
|
||||||
return $i_description;
|
return $i_description;
|
||||||
}
|
}
|
||||||
@@ -85,7 +134,7 @@ sub interfaces {
|
|||||||
# Tag on e_descr.1
|
# Tag on e_descr.1
|
||||||
sub description {
|
sub description {
|
||||||
my $aironet = shift;
|
my $aironet = shift;
|
||||||
my $descr = $aironet->descr();
|
my $descr = $aironet->descr();
|
||||||
my $e_descr = $aironet->e_descr();
|
my $e_descr = $aironet->e_descr();
|
||||||
|
|
||||||
$descr = "$e_descr->{1} $descr" if defined $e_descr->{1};
|
$descr = "$e_descr->{1} $descr" if defined $e_descr->{1};
|
||||||
@@ -96,10 +145,12 @@ sub description {
|
|||||||
# Fetch duplex from EtherLike
|
# Fetch duplex from EtherLike
|
||||||
sub i_duplex {
|
sub i_duplex {
|
||||||
my $aironet = shift;
|
my $aironet = shift;
|
||||||
my $el_duplex = $aironet->el_duplex();
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $el_duplex = $aironet->el_duplex($partial);
|
||||||
|
|
||||||
my %i_duplex;
|
my %i_duplex;
|
||||||
foreach my $d (keys %$el_duplex){
|
foreach my $d ( keys %$el_duplex ) {
|
||||||
my $val = $el_duplex->{$d};
|
my $val = $el_duplex->{$d};
|
||||||
next unless defined $val;
|
next unless defined $val;
|
||||||
$i_duplex{$d} = 'full' if $val =~ /full/i;
|
$i_duplex{$d} = 'full' if $val =~ /full/i;
|
||||||
@@ -109,16 +160,314 @@ sub i_duplex {
|
|||||||
return \%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;
|
1;
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -126,7 +475,6 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $aironet = new SNMP::Info(
|
my $aironet = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
@@ -138,7 +486,8 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
=head1 DESCRIPTION
|
=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 :
|
Note there are two classes for Aironet devices :
|
||||||
|
|
||||||
@@ -154,8 +503,8 @@ This class is for devices running Cisco IOS software (newer)
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
a more specific class using the method above.
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
my $aironet = new SNMP::Info::Layer2::Aironet(...);
|
my $aironet = new SNMP::Info::Layer2::Aironet(...);
|
||||||
|
|
||||||
@@ -169,6 +518,10 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...);
|
|||||||
|
|
||||||
=item SNMP::Info::EtherLike
|
=item SNMP::Info::EtherLike
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoStats
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoConfig
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Required MIBs
|
=head2 Required MIBs
|
||||||
@@ -193,23 +546,47 @@ Adds info from method e_descr() from SNMP::Info::Entity
|
|||||||
|
|
||||||
=item $aironet->vendor()
|
=item $aironet->vendor()
|
||||||
|
|
||||||
Returns 'cisco' :)
|
Returns 'cisco'
|
||||||
|
|
||||||
|
=item $aironet->description()
|
||||||
|
|
||||||
|
System description
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Globals imported from SNMP::Info::Layer2
|
=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
|
=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
|
=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
|
=head2 Overrides
|
||||||
|
|
||||||
@@ -219,22 +596,80 @@ See documentation in SNMP::Info::EtherLike for details.
|
|||||||
|
|
||||||
Uses the i_description() field.
|
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()
|
=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
|
=back
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
=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
|
=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
|
=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
|
=cut
|
||||||
|
|||||||
@@ -1,65 +1,62 @@
|
|||||||
# SNMP::Info::Layer2::Allied
|
# 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.
|
# 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:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of Netdisco nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer2::Allied;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
|
use strict;
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info::Layer2;
|
use SNMP::Info::Layer2;
|
||||||
use SNMP::Info::Layer1;
|
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//;
|
@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 = (
|
$VERSION = '3.15';
|
||||||
%SNMP::Info::Layer2::GLOBALS
|
|
||||||
);
|
|
||||||
|
|
||||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||||
'ip_adresses'=> 'atNetAddress',
|
|
||||||
'ip_mac' => 'atPhysAddress',
|
|
||||||
'i_name' => 'ifName',
|
|
||||||
'i_up2' => 'ifOperStatus',
|
|
||||||
);
|
|
||||||
|
|
||||||
%MIBS = (
|
%FUNCS = (
|
||||||
%SNMP::Info::Layer2::MIBS,
|
%SNMP::Info::Layer2::FUNCS,
|
||||||
'AtiSwitch-MIB' => 'atiswitchProductType',
|
'ip_adresses' => 'atNetAddress',
|
||||||
'AtiStackInfo-MIB' => 'atiswitchEnhancedStacking',
|
'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 {
|
sub vendor {
|
||||||
return 'allied';
|
return 'allied';
|
||||||
@@ -71,9 +68,9 @@ sub os {
|
|||||||
|
|
||||||
sub os_ver {
|
sub os_ver {
|
||||||
my $allied = shift;
|
my $allied = shift;
|
||||||
my $descr = $allied->description();
|
my $descr = $allied->description();
|
||||||
|
|
||||||
if ($descr =~ m/version (\d+\.\d+)/){
|
if ( $descr =~ m/version (\d+\.\d+)/ ) {
|
||||||
return $1;
|
return $1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -83,50 +80,48 @@ sub model {
|
|||||||
|
|
||||||
my $desc = $allied->description();
|
my $desc = $allied->description();
|
||||||
|
|
||||||
if ($desc =~ /(AT-80\d{2}\S*)/){
|
if ( $desc =~ /(AT-80\d{2}\S*)/ ) {
|
||||||
return $1;
|
return $1;
|
||||||
}
|
}
|
||||||
return undef;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ip {
|
sub root_ip {
|
||||||
my $allied = shift;
|
my $allied = shift;
|
||||||
my $ip_hash = $allied->ip_addresses();
|
my $ip_hash = $allied->ip_addresses();
|
||||||
my $ip;
|
|
||||||
my $found_ip;
|
my $found_ip;
|
||||||
|
|
||||||
foreach $ip (values %{$ip_hash}) {
|
foreach my $ip ( values %{$ip_hash} ) {
|
||||||
my $found_ip = SNMP::Info::munge_ip($ip) if (defined $ip);
|
$found_ip = SNMP::Info::munge_ip($ip) if ( defined $ip );
|
||||||
last; # this is only one IP address
|
last; # this is only one IP address
|
||||||
}
|
}
|
||||||
return $found_ip;
|
return $found_ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub mac{
|
sub mac {
|
||||||
my $allied = shift;
|
my $allied = shift;
|
||||||
my $mac_hash = $allied->ip_mac();
|
my $mac_hash = $allied->ip_mac();
|
||||||
my $mac;
|
|
||||||
my $found_mac;
|
my $found_mac;
|
||||||
|
|
||||||
foreach $mac (values %{$mac_hash}) {
|
foreach my $mac ( values %{$mac_hash} ) {
|
||||||
$found_mac = SNMP::Info::munge_mac($mac);
|
$found_mac = SNMP::Info::munge_mac($mac);
|
||||||
last; # this is only one MAC address
|
last; # this is only one MAC address
|
||||||
}
|
}
|
||||||
return $found_mac;
|
return $found_mac;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_up {
|
sub i_up {
|
||||||
my $allied = shift;
|
my $allied = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
my $i_up = SNMP::Info::Layer1::i_up($allied);
|
my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
|
||||||
my $i_up2 = $allied->i_up2();
|
|
||||||
|
|
||||||
foreach my $port (keys %$ati_up){
|
foreach my $port ( keys %$i_up ) {
|
||||||
my $up = $ati_up->{$port};
|
my $up = $i_up->{$port};
|
||||||
$i_up->{$port} = 'down' if $up eq 'linktesterror';
|
$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;
|
return $i_up;
|
||||||
}
|
}
|
||||||
1;
|
1;
|
||||||
@@ -134,11 +129,11 @@ __END__
|
|||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesyn switches
|
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesis switches
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker, Dmitry Sergienko <dmitry@trifle.net>
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -146,14 +141,13 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $allied = new SNMP::Info(
|
my $allied = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myhub',
|
DestHost => 'myhub',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 1
|
Version => 1
|
||||||
)
|
)
|
||||||
or die "Can't connect to DestHost.\n";
|
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";
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
@@ -166,7 +160,7 @@ inherited methods.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item SNMP::Info::Layer1
|
=item SNMP::Info::Layer2
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -174,16 +168,18 @@ inherited methods.
|
|||||||
|
|
||||||
=over
|
=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
|
Download for your device from ftp://ftp.allied-telesyn.com/pub/switches/mibs/
|
||||||
|
|
||||||
MIBs listed in SNMP::Info::Layer1 and its inherited classes.
|
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
|
=head2 Inherited MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
=head1 GLOBALS
|
=head1 GLOBALS
|
||||||
|
|
||||||
These are methods that return scalar value from SNMP
|
These are methods that return scalar value from SNMP
|
||||||
@@ -206,30 +202,30 @@ Culls Version from description()
|
|||||||
|
|
||||||
=item $allied->root_ip()
|
=item $allied->root_ip()
|
||||||
|
|
||||||
Returns IP Address of Managed Hub.
|
Returns IP Address of Managed Device.
|
||||||
|
|
||||||
(B<actualIpAddr>)
|
(C<actualIpAddr>)
|
||||||
|
|
||||||
=item $allied->model()
|
=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
|
=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
|
=head2 Overrides
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item $allied->i_name()
|
|
||||||
|
|
||||||
Returns reference to map of IIDs to human-set port name.
|
|
||||||
|
|
||||||
=item $allied->i_up()
|
=item $allied->i_up()
|
||||||
|
|
||||||
Returns reference to map of IIDs to link status. Changes
|
Returns reference to map of IIDs to link status. Changes
|
||||||
@@ -237,10 +233,8 @@ the values of ati_up() to 'up' and 'down'.
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Allied MIB
|
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
=over
|
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -1,485 +0,0 @@
|
|||||||
# SNMP::Info::Layer2::Bay
|
|
||||||
# Max Baker <max@warped.org>
|
|
||||||
#
|
|
||||||
# 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.8;
|
|
||||||
# $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};
|
|
||||||
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
|
|
||||||
|
|
||||||
# Let SNMP::Info determine the correct subclass for you.
|
|
||||||
my $bay = new SNMP::Info(
|
|
||||||
AutoSpecify => 1,
|
|
||||||
Debug => 1,
|
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
|
||||||
Community => 'public',
|
|
||||||
Version => 2
|
|
||||||
)
|
|
||||||
or die "Can't connect to DestHost.\n";
|
|
||||||
|
|
||||||
my $class = $bay->class();
|
|
||||||
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
|
||||||
|
|
||||||
Provides abstraction to the configuration information obtainable from a
|
|
||||||
Bay device through SNMP.
|
|
||||||
|
|
||||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
|
||||||
a more specific class using the method above.
|
|
||||||
|
|
||||||
my $bay = new SNMP::Info::Layer2::Bay(...);
|
|
||||||
|
|
||||||
=head2 Inherited Classes
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item SNMP::Info::Layer2
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head2 Required MIBs
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item SYNOPTICS-ROOT-MIB
|
|
||||||
|
|
||||||
=item S5-ETH-MULTISEG-TOPOLOGY-MIB
|
|
||||||
|
|
||||||
=item Inherited classes
|
|
||||||
|
|
||||||
MIBs required by SNMP::Info::Layer2 and its superclasses.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
Bay MIBs can be found on the CD that came with your product.
|
|
||||||
|
|
||||||
Or, if you still have a service contract they can be downloaded at
|
|
||||||
www.nortelnetworks.com
|
|
||||||
|
|
||||||
They have also been seen at : http://www.inotech.com/mibs/vendor/baynetworks/synoptics/synoptics.asp
|
|
||||||
|
|
||||||
Or http://www.oidview.com/mibs/detail.html under Synoptics. Check also www.mibdepot.com
|
|
||||||
|
|
||||||
=head1 GLOBALS
|
|
||||||
|
|
||||||
These are methods that return scalar value from SNMP
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item $bay->vendor()
|
|
||||||
|
|
||||||
Returns 'bay' :)
|
|
||||||
|
|
||||||
=item $bay->model()
|
|
||||||
|
|
||||||
Cross references $bay->id() to the SYNOPTICS-MIB and returns
|
|
||||||
the results. 303s and 304s have the same ID, so we have a hack
|
|
||||||
to return depending on which it is.
|
|
||||||
|
|
||||||
Removes sreg- from the model name
|
|
||||||
|
|
||||||
=item $bay->cdp_id()
|
|
||||||
|
|
||||||
Returns the IP that the device is sending out for its Nmm topology info.
|
|
||||||
|
|
||||||
(B<s5EnMsTopIpAddr>)
|
|
||||||
|
|
||||||
=item $bay->cdp_run()
|
|
||||||
|
|
||||||
Returns if the S5-ETH-MULTISEG-TOPOLOGY info is on for this device.
|
|
||||||
|
|
||||||
(B<s5EnMsTopStatus>)
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head2 Globals imported from SNMP::Info::Layer2
|
|
||||||
|
|
||||||
See documentation in SNMP::Info::Layer2 for details.
|
|
||||||
|
|
||||||
=head1 TABLE ENTRIES
|
|
||||||
|
|
||||||
These are methods that return tables of information in the form of a reference
|
|
||||||
to a hash.
|
|
||||||
|
|
||||||
=head2 Overrides
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item $bay->interfaces()
|
|
||||||
|
|
||||||
Returns reference to map of IIDs to physical ports.
|
|
||||||
|
|
||||||
Currently simply returns the B<ifIndex>
|
|
||||||
|
|
||||||
=item $bay->i_ignore()
|
|
||||||
|
|
||||||
Returns reference to hash of IIDs to ignore.
|
|
||||||
|
|
||||||
Simply calls the SNMP::Info::Layer2::i_ignore() fn for this.
|
|
||||||
|
|
||||||
=item $bay->i_mac()
|
|
||||||
|
|
||||||
Returns the B<ifPhysAddress> table entries.
|
|
||||||
|
|
||||||
Removes all entries matching '00:00:00:00:00:00' -- Certain
|
|
||||||
older revisions of Bay 303 and 304 firmware report all zeros
|
|
||||||
for each port mac.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head2 Psuedo CDP information
|
|
||||||
|
|
||||||
All entries with port=0 are local and ignored.
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item $bay->c_if()
|
|
||||||
|
|
||||||
Returns referenece to hash. Key: port.1 Value: port (iid)
|
|
||||||
|
|
||||||
=item $bay->c_ip()
|
|
||||||
|
|
||||||
Returns referenece to hash. Key: port.1
|
|
||||||
|
|
||||||
The value of each hash entry can either be a scalar or an array.
|
|
||||||
A scalar value is most likely a direct neighbor to that port.
|
|
||||||
It is possible that there is a non-bay device in between this device and the remote device.
|
|
||||||
|
|
||||||
An array value represents a list of seen devices. The only time you will get an array
|
|
||||||
of nieghbors, is if there is a non-bay device in between two or more devices.
|
|
||||||
|
|
||||||
Use the data from the Layer2 Topology Table below to dig deeper.
|
|
||||||
|
|
||||||
=item $bay->port()
|
|
||||||
|
|
||||||
Returns reference to hash. Key: port.1 Value: port
|
|
||||||
|
|
||||||
=item $bay->platform()
|
|
||||||
|
|
||||||
Returns reference to hash. Key: port.1 Value: Remote Device Type
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head2 Layer2 Topology info (s5EnMsTopNmmTable)
|
|
||||||
|
|
||||||
=over
|
|
||||||
|
|
||||||
=item $bay->bay_topo_slot()
|
|
||||||
|
|
||||||
Returns reference to hash. Key: Table entry, Value:slot number
|
|
||||||
|
|
||||||
(B<s5EnMsTopNmmSlot>)
|
|
||||||
|
|
||||||
=item $bay->bay_topo_port()
|
|
||||||
|
|
||||||
Returns reference to hash. Key: Table entry, Value:Port Number (interface iid)
|
|
||||||
|
|
||||||
(B<s5EnMsTopNmmPort>)
|
|
||||||
|
|
||||||
=item $bay->bay_topo_ip()
|
|
||||||
|
|
||||||
Returns reference to hash. Key: Table entry, Value:Remote IP address of entry
|
|
||||||
|
|
||||||
(B<s5EnMsTopNmmIpAddr>)
|
|
||||||
|
|
||||||
=item $bay->bay_topo_seg()
|
|
||||||
|
|
||||||
Returns reference to hash. Key: Table entry, Value:Remote Segment ID
|
|
||||||
|
|
||||||
(B<s5EnMsTopNmmSegId>)
|
|
||||||
|
|
||||||
=item $bay->bay_topo_mac
|
|
||||||
(B<s5EnMsTopNmmMacAddr>)
|
|
||||||
|
|
||||||
Returns reference to hash. Key: Table entry, Value:Remote MAC address
|
|
||||||
|
|
||||||
=item $bay->bay_topo_platform
|
|
||||||
|
|
||||||
Returns reference to hash. Key: Table entry, Value:Remote Device Type
|
|
||||||
|
|
||||||
(B<s5EnMsTopNmmChassisType>)
|
|
||||||
|
|
||||||
=item $bay->bay_topo_localseg
|
|
||||||
|
|
||||||
Returns reference to hash. Key: Table entry, Value:Boolean, if bay_topo_seg() is local
|
|
||||||
|
|
||||||
(B<s5EnMsTopNmmLocalSeg>)
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::Layer2
|
|
||||||
|
|
||||||
See documentation in SNMP::Info::Layer2 for details.
|
|
||||||
|
|
||||||
=cut
|
|
||||||
623
Info/Layer2/Baystack.pm
Normal file
623
Info/Layer2/Baystack.pm
Normal file
@@ -0,0 +1,623 @@
|
|||||||
|
# SNMP::Info::Layer2::Baystack
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer2::Baystack;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::SONMP;
|
||||||
|
use SNMP::Info::NortelStack;
|
||||||
|
use SNMP::Info::RapidCity;
|
||||||
|
use SNMP::Info::LLDP;
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer2::Baystack::ISA
|
||||||
|
= qw/SNMP::Info::SONMP SNMP::Info::NortelStack
|
||||||
|
SNMP::Info::RapidCity SNMP::Info::LLDP
|
||||||
|
SNMP::Info::Layer3 Exporter/;
|
||||||
|
@SNMP::Info::Layer2::Baystack::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer3::MIBS, %SNMP::Info::LLDP::MIBS,
|
||||||
|
%SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS,
|
||||||
|
%SNMP::Info::SONMP::MIBS,
|
||||||
|
'BAY-STACK-PETH-EXT-MIB' => 'bspePethPsePortExtMeasuredPower',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%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,
|
||||||
|
'peth_port_power' => 'bspePethPsePortExtMeasuredPower',
|
||||||
|
);
|
||||||
|
|
||||||
|
# 450's report full duplex as speed = 20mbps?!
|
||||||
|
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
|
||||||
|
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
|
||||||
|
$SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps';
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
|
||||||
|
%SNMP::Info::RapidCity::MUNGE, %SNMP::Info::NortelStack::MUNGE,
|
||||||
|
%SNMP::Info::SONMP::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
my $baystack = shift;
|
||||||
|
my $descr = $baystack->description() || "";
|
||||||
|
my $model = $baystack->model() || "";
|
||||||
|
|
||||||
|
if ( $descr =~ /Business Ethernet Switch.*SW:v/i ) {
|
||||||
|
return 'bes';
|
||||||
|
}
|
||||||
|
if ( ( ( $model =~ /(420|425|BPS)/ ) and ( $descr =~ m/SW:v[1-2]/i ) )
|
||||||
|
or ( ( $model =~ /(410|450|380)/ ) ) )
|
||||||
|
{
|
||||||
|
return 'baystack';
|
||||||
|
}
|
||||||
|
if ( $model =~ /VSP/ ) {
|
||||||
|
return 'vsp';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'boss';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_bin {
|
||||||
|
my $baystack = shift;
|
||||||
|
my $descr = $baystack->description();
|
||||||
|
return unless defined $descr;
|
||||||
|
|
||||||
|
# 303 / 304
|
||||||
|
if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 450
|
||||||
|
if ( $descr =~ m/FW:V(\d+\.\d+)/ ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $descr =~ m/FW:(\d+\.\d+\.\d+\.\d+)/i ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'avaya';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $baystack = shift;
|
||||||
|
my $id = $baystack->id();
|
||||||
|
return unless defined $id;
|
||||||
|
my $model = &SNMP::translateObj($id);
|
||||||
|
return $id unless defined $model;
|
||||||
|
|
||||||
|
my $descr = $baystack->description();
|
||||||
|
|
||||||
|
return '303' if ( defined $descr and $descr =~ /\D303\D/ );
|
||||||
|
return '304' if ( defined $descr and $descr =~ /\D304\D/ );
|
||||||
|
return 'BPS' if ( $model =~ /BPS2000/i );
|
||||||
|
|
||||||
|
# Pull sreg- from all
|
||||||
|
$model =~ s/^sreg-//;
|
||||||
|
# Strip ES/ERS/BayStack etc. from those families
|
||||||
|
$model =~ s/^(E(R)?S|BayStack|Ethernet(Routing)?Switch)-?//;
|
||||||
|
$model =~ s/-ethSwitchNMM//;
|
||||||
|
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub interfaces {
|
||||||
|
my $baystack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $i_index = $baystack->i_index($partial) || {};
|
||||||
|
my $index_factor = $baystack->index_factor();
|
||||||
|
my $slot_offset = $baystack->slot_offset();
|
||||||
|
|
||||||
|
my %if;
|
||||||
|
foreach my $iid ( keys %$i_index ) {
|
||||||
|
my $index = $i_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
|
||||||
|
# Ignore cascade ports
|
||||||
|
next if $index > $index_factor * 8;
|
||||||
|
|
||||||
|
my $port = ( $index % $index_factor );
|
||||||
|
my $slot = ( int( $index / $index_factor ) ) + $slot_offset;
|
||||||
|
|
||||||
|
my $slotport = "$slot.$port";
|
||||||
|
$if{$iid} = $slotport;
|
||||||
|
}
|
||||||
|
return \%if;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_mac {
|
||||||
|
my $baystack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $i_mac = $baystack->orig_i_mac($partial) || {};
|
||||||
|
|
||||||
|
my %i_mac;
|
||||||
|
|
||||||
|
# Baystack 303's with a hw rev < 2.11.4.5 report the mac as all zeros
|
||||||
|
foreach my $iid ( keys %$i_mac ) {
|
||||||
|
my $mac = $i_mac->{$iid};
|
||||||
|
next unless defined $mac;
|
||||||
|
next if $mac eq '00:00:00:00:00:00';
|
||||||
|
$i_mac{$iid} = $mac;
|
||||||
|
}
|
||||||
|
return \%i_mac;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_name {
|
||||||
|
my $baystack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $i_index = $baystack->i_index($partial) || {};
|
||||||
|
my $i_alias = $baystack->i_alias($partial) || {};
|
||||||
|
my $i_name2 = $baystack->orig_i_name($partial) || {};
|
||||||
|
|
||||||
|
my %i_name;
|
||||||
|
foreach my $iid ( keys %$i_name2 ) {
|
||||||
|
my $name = $i_name2->{$iid};
|
||||||
|
my $alias = $i_alias->{$iid};
|
||||||
|
$i_name{$iid}
|
||||||
|
= ( defined $alias and $alias !~ /^\s*$/ )
|
||||||
|
? $alias
|
||||||
|
: $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return \%i_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub index_factor {
|
||||||
|
my $baystack = shift;
|
||||||
|
my $model = $baystack->model() || "";
|
||||||
|
my $os = $baystack->os();
|
||||||
|
my $os_ver = $baystack->os_ver();
|
||||||
|
my $op_mode = $baystack->ns_op_mode();
|
||||||
|
|
||||||
|
$op_mode = 'pure' unless defined $op_mode;
|
||||||
|
if ( $os_ver =~ m/^(\d+)\./ ) {
|
||||||
|
$os_ver = $1;
|
||||||
|
} else {
|
||||||
|
$os_ver = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $index_factor = 32;
|
||||||
|
$index_factor = 64
|
||||||
|
if ( ( $model =~ /(470)/ )
|
||||||
|
or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) );
|
||||||
|
$index_factor = 128
|
||||||
|
if ( ( $model =~ /(5[56]\d\d)|VSP/ )
|
||||||
|
and ( $os_ver >= 6 ) );
|
||||||
|
|
||||||
|
return $index_factor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Newer devices support ENTITY-MIB, use if available otherwise use proprietary
|
||||||
|
# methods.
|
||||||
|
|
||||||
|
sub e_index {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_index($partial) || $stack->ns_e_index($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_class {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_class($partial) || $stack->ns_e_class($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_descr {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_descr($partial) || $stack->ns_e_descr($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_name {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_name($partial) || $stack->ns_e_name($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_fwver {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_fwver($partial) || $stack->ns_e_fwver($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_hwver {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_hwver($partial) || $stack->ns_e_hwver($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_parent {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_parent($partial) || $stack->ns_e_parent($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_pos {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_pos($partial) || $stack->ns_e_pos($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_serial {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_serial($partial) || $stack->ns_e_serial($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_swver {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_swver($partial) || $stack->ns_e_swver($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_type {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_type($partial) || $stack->ns_e_type($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub e_vendor {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $stack->SUPER::e_vendor($partial) || $stack->ns_e_vendor($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
# fix for stack of switches without POE on module 1
|
||||||
|
# https://sourceforge.net/tracker/?func=detail&aid=3317739&group_id=70362&atid=527529
|
||||||
|
sub peth_port_ifindex {
|
||||||
|
my $stack = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my %peth_port_ifindex = ();
|
||||||
|
my $poe_port_st = $stack->peth_port_status($partial);
|
||||||
|
my $if_index = $stack->interfaces($partial);
|
||||||
|
|
||||||
|
foreach my $i (keys %$if_index) {
|
||||||
|
next unless defined $poe_port_st->{$if_index->{$i}};
|
||||||
|
$peth_port_ifindex{$if_index->{$i}} = $i;
|
||||||
|
}
|
||||||
|
return \%peth_port_ifindex;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer2::Baystack - SNMP Interface to Avaya Ethernet Switch
|
||||||
|
(Baystack) and VSP 7000 series switches
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $baystack = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $baystack->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Provides abstraction to the configuration information obtainable from an
|
||||||
|
Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series
|
||||||
|
through SNMP.
|
||||||
|
|
||||||
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
|
my $baystack = new SNMP::Info::Layer2::Baystack(...);
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::SONMP
|
||||||
|
|
||||||
|
=item SNMP::Info::NortelStack
|
||||||
|
|
||||||
|
=item SNMP::Info::RapidCity
|
||||||
|
|
||||||
|
=item SNMP::Info::LLDP
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer3
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<BAY-STACK-PETH-EXT-MIBB>
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Inherited MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::NortelStack/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::RapidCity/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $baystack->vendor()
|
||||||
|
|
||||||
|
Returns 'avaya'
|
||||||
|
|
||||||
|
=item $baystack->model()
|
||||||
|
|
||||||
|
Cross references $baystack->id() to the F<SYNOPTICS-MIB> and returns
|
||||||
|
the results. 303s and 304s have the same ID, so we have a hack
|
||||||
|
to return depending on which it is.
|
||||||
|
|
||||||
|
Returns BPS for Business Policy Switch
|
||||||
|
|
||||||
|
For others extracts and returns the switch numeric designation.
|
||||||
|
|
||||||
|
=item $baystack->os()
|
||||||
|
|
||||||
|
Returns 'baystack' or 'boss' depending on software version.
|
||||||
|
|
||||||
|
=item $baystack->os_bin()
|
||||||
|
|
||||||
|
Returns the firmware version extracted from C<sysDescr>.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $baystack->index_factor()
|
||||||
|
|
||||||
|
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||||
|
reserved per slot within the device MIB.
|
||||||
|
|
||||||
|
Index factor on the Baystack switches are determined by the formula: Index
|
||||||
|
Factor = 64 if (model = 470 or (os eq 'boss' and operating in pure mode))
|
||||||
|
or else Index factor = 32.
|
||||||
|
|
||||||
|
Returns either 32 or 64 based upon the formula.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::NortelStack
|
||||||
|
|
||||||
|
See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::RapidCity
|
||||||
|
|
||||||
|
See L<SNMP::Info::RapidCity/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::LLDP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a reference
|
||||||
|
to a hash.
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $baystack->interfaces()
|
||||||
|
|
||||||
|
Returns reference to the map between IID and physical Port.
|
||||||
|
|
||||||
|
Slot and port numbers on the Baystack switches are determined by the
|
||||||
|
formula:
|
||||||
|
|
||||||
|
port = (Interface index % Index factor)
|
||||||
|
slot = (int(Interface index / Index factor)) + Slot offset
|
||||||
|
|
||||||
|
The physical port name is returned as slot.port.
|
||||||
|
|
||||||
|
=item $baystack->i_ignore()
|
||||||
|
|
||||||
|
Returns reference to hash of IIDs to ignore.
|
||||||
|
|
||||||
|
=item $baystack->i_mac()
|
||||||
|
|
||||||
|
Returns the C<ifPhysAddress> table entries.
|
||||||
|
|
||||||
|
Removes all entries matching '00:00:00:00:00:00' -- Certain
|
||||||
|
revisions of Baystack firmware report all zeros for each port mac.
|
||||||
|
|
||||||
|
=item $baystack->i_name()
|
||||||
|
|
||||||
|
Crosses C<ifName> with C<ifAlias> and returns the human set port name if
|
||||||
|
exists.
|
||||||
|
|
||||||
|
=item $baystack->peth_port_ifindex()
|
||||||
|
|
||||||
|
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
|
||||||
|
|
||||||
|
=item $baystack->peth_port_power()
|
||||||
|
|
||||||
|
Power supplied by PoE ports, in milliwatts
|
||||||
|
|
||||||
|
(C<bspePethPsePortExtMeasuredPower>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 F<ENTITY-MIB> Information
|
||||||
|
|
||||||
|
For older devices which do not support F<ENTITY-MIB>, these methods emulate
|
||||||
|
Physical Table methods using F<S5-CHASSIS-MIB>. See
|
||||||
|
L<SNMP::Info::NortelStack/"TABLE METHODS"> for details on ns_e_* methods.
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $baystack->e_index()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalDescr>, this will try ns_e_index().
|
||||||
|
Note that this is based on C<entPhysicalDescr> due to implementation
|
||||||
|
details of SNMP::Info::Entity::e_index().
|
||||||
|
|
||||||
|
=item $baystack->e_class()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalClass>, this will try ns_e_class().
|
||||||
|
|
||||||
|
=item $baystack->e_descr()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalDescr>, this will try ns_e_descr().
|
||||||
|
|
||||||
|
=item $baystack->e_name()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalName>, this will try ns_e_name().
|
||||||
|
|
||||||
|
=item $baystack->e_fwver()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalFirmwareRev>, this will try
|
||||||
|
ns_e_fwver().
|
||||||
|
|
||||||
|
=item $baystack->e_hwver()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalHardwareRev>, this will try
|
||||||
|
ns_e_hwver().
|
||||||
|
|
||||||
|
=item $baystack->e_parent()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalContainedIn>, this will try
|
||||||
|
ns_e_parent().
|
||||||
|
|
||||||
|
=item $baystack->e_pos()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalParentRelPos>, this will try
|
||||||
|
ns_e_pos().
|
||||||
|
|
||||||
|
=item $baystack->e_serial()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalSerialNum>, this will try
|
||||||
|
ns_e_serial().
|
||||||
|
|
||||||
|
=item $baystack->e_swver()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalSoftwareRev>, this will try
|
||||||
|
ns_e_swver().
|
||||||
|
|
||||||
|
=item $baystack->e_type()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalVendorType>, this will try
|
||||||
|
ns_e_type().
|
||||||
|
|
||||||
|
=item $baystack->e_vendor()
|
||||||
|
|
||||||
|
If the device doesn't support C<entPhysicalMfgName>, this will try
|
||||||
|
ns_e_vendor().
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::NortelStack
|
||||||
|
|
||||||
|
See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::RapidCity
|
||||||
|
|
||||||
|
See L<SNMP::Info::RapidCity/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
@@ -1,84 +1,100 @@
|
|||||||
# SNMP::Info::Layer2::C1900
|
# 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
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer2::C1900;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
|
use SNMP::Info::CDP;
|
||||||
|
use SNMP::Info::CiscoStats;
|
||||||
|
use SNMP::Info::CiscoConfig;
|
||||||
use SNMP::Info::Layer2;
|
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//;
|
@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.15';
|
||||||
|
|
||||||
# Set for No CDP
|
|
||||||
%GLOBALS = (
|
%GLOBALS = (
|
||||||
%SNMP::Info::Layer2::GLOBALS,
|
%SNMP::Info::Layer2::GLOBALS,
|
||||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||||
'c1900_flash_status' => 'upgradeFlashBankStatus',
|
%SNMP::Info::CiscoStats::GLOBALS,
|
||||||
);
|
%SNMP::Info::CDP::GLOBALS,
|
||||||
|
'c1900_flash_status' => 'upgradeFlashBankStatus',
|
||||||
|
);
|
||||||
|
|
||||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
%FUNCS = (
|
||||||
%SNMP::Info::CiscoVTP::FUNCS,
|
%SNMP::Info::Layer2::FUNCS,
|
||||||
'i_type2' => 'ifType',
|
%SNMP::Info::CiscoConfig::FUNCS,
|
||||||
'i_name2' => 'ifName',
|
%SNMP::Info::CiscoStats::FUNCS,
|
||||||
# ESSWITCH-MIB
|
%SNMP::Info::CDP::FUNCS,
|
||||||
'c1900_p_index' => 'swPortIndex',
|
|
||||||
'c1900_p_ifindex' => 'swPortIfIndex',
|
|
||||||
'c1900_p_duplex' => 'swPortDuplexStatus',
|
|
||||||
'c1900_p_duplex_admin' => 'swPortFullDuplex',
|
|
||||||
'c1900_p_name' => 'swPortName',
|
|
||||||
'c1900_p_up_admin' => 'swPortAdminStatus',
|
|
||||||
'c1900_p_type' => 'swPortMediaCapability',
|
|
||||||
'c1900_p_media' => 'swPortConnectorType',
|
|
||||||
);
|
|
||||||
|
|
||||||
%MIBS = (
|
# ESSWITCH-MIB
|
||||||
%SNMP::Info::Layer2::MIBS,
|
'c1900_p_index' => 'swPortIndex',
|
||||||
%SNMP::Info::CiscoVTP::MIBS,
|
'c1900_p_ifindex' => 'swPortIfIndex',
|
||||||
# Also known as the ESSWITCH-MIB
|
'c1900_p_duplex' => 'swPortDuplexStatus',
|
||||||
'STAND-ALONE-ETHERNET-SWITCH-MIB' => 'series2000'
|
'c1900_p_duplex_admin' => 'swPortFullDuplex',
|
||||||
);
|
'c1900_p_name' => 'swPortName',
|
||||||
|
'c1900_p_up_admin' => 'swPortAdminStatus',
|
||||||
|
'c1900_p_type' => 'swPortMediaCapability',
|
||||||
|
'c1900_p_media' => 'swPortConnectorType',
|
||||||
|
);
|
||||||
|
|
||||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
%MIBS = (
|
||||||
%SNMP::Info::CiscoVTP::MUNGE,
|
%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 {
|
sub vendor {
|
||||||
return 'cisco';
|
return 'cisco';
|
||||||
}
|
}
|
||||||
|
|
||||||
sub os {
|
sub os {
|
||||||
return 'catalyst';
|
return 'catalyst';
|
||||||
}
|
}
|
||||||
@@ -89,128 +105,175 @@ sub os_ver {
|
|||||||
# Check for superclass one
|
# Check for superclass one
|
||||||
my $os_ver = $c1900->SUPER::os_ver();
|
my $os_ver = $c1900->SUPER::os_ver();
|
||||||
return $os_ver if defined $os_ver;
|
return $os_ver if defined $os_ver;
|
||||||
|
|
||||||
my $c1900_flash_status = $c1900->c1900_flash_status();
|
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 $1;
|
||||||
}
|
}
|
||||||
return undef;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
sub cisco_comm_indexing {
|
|
||||||
1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub interfaces {
|
sub interfaces {
|
||||||
my $c1900 = shift;
|
my $c1900 = shift;
|
||||||
my $i_descr = $c1900->i_description();
|
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*$//;
|
$i_descr->{$iid} =~ s/\s*$//;
|
||||||
}
|
}
|
||||||
return $i_descr;
|
return $i_descr;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_duplex {
|
sub i_duplex {
|
||||||
my $c1900 = shift;
|
my $c1900 = shift;
|
||||||
|
my $partial = shift;
|
||||||
my $interfaces = $c1900->interfaces();
|
|
||||||
my $c1900_p_index = $c1900->c1900_p_index();
|
|
||||||
my $c1900_p_duplex = $c1900->c1900_p_duplex();
|
|
||||||
|
|
||||||
|
|
||||||
my %reverse_1900 = reverse %$c1900_p_index;
|
my $c1900_p_duplex = $c1900->c1900_p_duplex($partial) || {};
|
||||||
|
|
||||||
my %i_duplex;
|
my %i_duplex;
|
||||||
foreach my $if (keys %$interfaces){
|
foreach my $if ( keys %$c1900_p_duplex ) {
|
||||||
my $port_1900 = $reverse_1900{$if};
|
my $duplex = $c1900_p_duplex->{$if};
|
||||||
next unless defined $port_1900;
|
next unless defined $duplex;
|
||||||
my $duplex = $c1900_p_duplex->{$port_1900};
|
|
||||||
next unless defined $duplex;
|
|
||||||
|
|
||||||
$duplex = 'half' if $duplex =~ /half/i;
|
$duplex = 'half' if $duplex =~ /half/i;
|
||||||
$duplex = 'full' if $duplex =~ /full/i;
|
$duplex = 'full' if $duplex =~ /full/i;
|
||||||
$i_duplex{$if}=$duplex;
|
$i_duplex{$if} = $duplex;
|
||||||
}
|
}
|
||||||
return \%i_duplex;
|
return \%i_duplex;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_duplex_admin {
|
sub i_duplex_admin {
|
||||||
my $c1900 = shift;
|
my $c1900 = shift;
|
||||||
|
my $partial = shift;
|
||||||
my $interfaces = $c1900->interfaces();
|
|
||||||
my $c1900_p_index = $c1900->c1900_p_index();
|
|
||||||
my $c1900_p_admin = $c1900->c1900_p_duplex_admin();
|
|
||||||
|
|
||||||
|
|
||||||
my %reverse_1900 = reverse %$c1900_p_index;
|
my $c1900_p_admin = $c1900->c1900_p_duplex_admin($partial) || {};
|
||||||
|
|
||||||
my %i_duplex_admin;
|
my %i_duplex_admin;
|
||||||
foreach my $if (keys %$interfaces){
|
foreach my $if ( keys %$c1900_p_admin ) {
|
||||||
my $port_1900 = $reverse_1900{$if};
|
my $duplex = $c1900_p_admin->{$if};
|
||||||
next unless defined $port_1900;
|
next unless defined $duplex;
|
||||||
my $duplex = $c1900_p_admin->{$port_1900};
|
|
||||||
next unless defined $duplex;
|
|
||||||
|
|
||||||
$duplex = 'half' if $duplex =~ /disabled/i;
|
$duplex = 'half' if $duplex =~ /disabled/i;
|
||||||
$duplex = 'full' if $duplex =~ /flow control/i;
|
$duplex = 'full' if $duplex =~ /flow control/i;
|
||||||
$duplex = 'full' if $duplex =~ /enabled/i;
|
$duplex = 'full' if $duplex =~ /enabled/i;
|
||||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||||
$i_duplex_admin{$if}=$duplex;
|
$i_duplex_admin{$if} = $duplex;
|
||||||
}
|
}
|
||||||
return \%i_duplex_admin;
|
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 {
|
sub i_name {
|
||||||
my $c1900 = shift;
|
my $c1900 = shift;
|
||||||
my $i_name = $c1900->i_name2();
|
my $partial = shift;
|
||||||
my $c1900_p_name = $c1900->c1900_p_name();
|
|
||||||
|
my $i_name = $c1900->orig_i_name($partial) || {};
|
||||||
foreach my $port (keys %$c1900_p_name){
|
my $c1900_p_name = $c1900->c1900_p_name($partial) || {};
|
||||||
|
|
||||||
|
foreach my $port ( keys %$c1900_p_name ) {
|
||||||
my $name = $c1900_p_name->{$port};
|
my $name = $c1900_p_name->{$port};
|
||||||
next unless defined $name;
|
next unless defined $name;
|
||||||
next unless $name !~ /^\s*$/;
|
next unless $name !~ /^\s*$/;
|
||||||
$i_name->{$port} = $name;
|
$i_name->{$port} = $name;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $i_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;
|
1;
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -218,7 +281,6 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $c1900 = new SNMP::Info(
|
my $c1900 = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 1
|
Version => 1
|
||||||
@@ -230,13 +292,13 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Provides abstraction to the configuration information obtainable from a Catalyst 1900 device through SNMP.
|
Provides abstraction to the configuration information obtainable from a
|
||||||
See SNMP::Info for full documentation
|
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.
|
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
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
a more specific class using the method above.
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
my $c1900 = new SNMP::Info::Layer2::C1900(...);
|
my $c1900 = new SNMP::Info::Layer2::C1900(...);
|
||||||
|
|
||||||
@@ -244,6 +306,12 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::CDP
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoStats
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoConfig
|
||||||
|
|
||||||
=item SNMP::Info::Layer2
|
=item SNMP::Info::Layer2
|
||||||
|
|
||||||
=back
|
=back
|
||||||
@@ -252,18 +320,24 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=over
|
=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
|
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
|
=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
|
=head1 GLOBALS
|
||||||
|
|
||||||
These are methods that return scalar value from SNMP
|
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.
|
Usually contains the version of the software loaded in flash.
|
||||||
Used by os_ver()
|
Used by os_ver()
|
||||||
|
|
||||||
B<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
|
C<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
|
||||||
|
|
||||||
=item $c1900->os()
|
=item $c1900->os()
|
||||||
|
|
||||||
@@ -294,43 +368,92 @@ Returns 'cisco' :)
|
|||||||
|
|
||||||
=back
|
=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
|
=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
|
=head2 Overrides
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
|
=item $c1900->interfaces()
|
||||||
|
|
||||||
|
Returns reference to the map between IID and physical Port.
|
||||||
|
|
||||||
=item $c1900->i_duplex()
|
=item $c1900->i_duplex()
|
||||||
|
|
||||||
Returns reference to map of IIDs to current link 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()
|
=item $c1900->i_duplex_admin()
|
||||||
|
|
||||||
Returns reference to hash of IIDs to admin duplex setting
|
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()
|
=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
|
=back
|
||||||
|
|
||||||
=head2 STAND-ALONE-ETHERNET-SWITCH-MIB Switch Port Table Entries:
|
=head2 F<STAND-ALONE-ETHERNET-SWITCH-MIB> Switch Port Table Entries:
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
@@ -338,48 +461,81 @@ c1900_p_type() and c1900_p_media() if they exist.
|
|||||||
|
|
||||||
Maps the Switch Port Table to the IID
|
Maps the Switch Port Table to the IID
|
||||||
|
|
||||||
B<swPortIfIndex>
|
C<swPortIfIndex>
|
||||||
|
|
||||||
=item $c1900->c1900_p_duplex()
|
=item $c1900->c1900_p_duplex()
|
||||||
|
|
||||||
Gives Port Duplex Info
|
Gives Port Duplex Info
|
||||||
|
|
||||||
B<swPortDuplexStatus>
|
(C<swPortDuplexStatus>)
|
||||||
|
|
||||||
=item $c1900->c1900_p_duplex_admin()
|
=item $c1900->c1900_p_duplex_admin()
|
||||||
|
|
||||||
Gives admin setting for Duplex Info
|
Gives admin setting for Duplex Info
|
||||||
|
|
||||||
B<swPortFullDuplex>
|
(C<swPortFullDuplex>)
|
||||||
|
|
||||||
=item $c1900->c1900_p_name()
|
=item $c1900->c1900_p_name()
|
||||||
|
|
||||||
Gives human set name for port
|
Gives human set name for port
|
||||||
|
|
||||||
B<swPortName>
|
(C<swPortName>)
|
||||||
|
|
||||||
=item $c1900->c1900_p_up_admin()
|
=item $c1900->c1900_p_up_admin()
|
||||||
|
|
||||||
Gives Admin status of port enabled.
|
Gives Admin status of port enabled.
|
||||||
|
|
||||||
B<swPortAdminStatus>
|
(C<swPortAdminStatus>)
|
||||||
|
|
||||||
=item $c1900->c1900_p_type()
|
=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()
|
=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
|
=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
|
=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
|
=cut
|
||||||
|
|||||||
@@ -1,148 +1,230 @@
|
|||||||
# SNMP::Info::Layer2::C2900
|
# 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
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer2::C2900;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info::Layer2;
|
|
||||||
use SNMP::Info::CiscoVTP;
|
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//;
|
@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.15';
|
||||||
|
|
||||||
# Set for No CDP
|
|
||||||
%GLOBALS = (
|
%GLOBALS = (
|
||||||
%SNMP::Info::Layer2::GLOBALS,
|
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
|
||||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
|
||||||
);
|
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||||
|
);
|
||||||
|
|
||||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
%FUNCS = (
|
||||||
%SNMP::Info::CiscoVTP::FUNCS,
|
%SNMP::Info::Layer2::FUNCS,
|
||||||
'i_name' => 'ifAlias',
|
%SNMP::Info::CiscoConfig::FUNCS,
|
||||||
# C2900PortEntry
|
%SNMP::Info::CiscoStats::FUNCS,
|
||||||
'c2900_p_index' => 'c2900PortIfIndex',
|
%SNMP::Info::CDP::FUNCS,
|
||||||
'c2900_p_duplex' => 'c2900PortDuplexStatus',
|
%SNMP::Info::CiscoVTP::FUNCS,
|
||||||
'c2900_p_duplex_admin' => 'c2900PortDuplexState',
|
'i_name' => 'ifAlias',
|
||||||
'c2900_p_speed_admin' => 'c2900PortAdminSpeed',
|
|
||||||
);
|
|
||||||
|
|
||||||
%MIBS = ( %SNMP::Info::Layer2::MIBS,
|
# C2900PortEntry
|
||||||
%SNMP::Info::CiscoVTP::MIBS,
|
'c2900_p_index' => 'c2900PortIfIndex',
|
||||||
'CISCO-C2900-MIB' => 'ciscoC2900MIB',
|
'c2900_p_duplex' => 'c2900PortDuplexStatus',
|
||||||
);
|
'c2900_p_duplex_admin' => 'c2900PortDuplexState',
|
||||||
|
'c2900_p_speed_admin' => 'c2900PortAdminSpeed',
|
||||||
|
);
|
||||||
|
|
||||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
|
%MIBS = (
|
||||||
%SNMP::Info::CiscoVTP::MUNGE,
|
%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 {
|
sub vendor {
|
||||||
return 'cisco';
|
return 'cisco';
|
||||||
}
|
}
|
||||||
|
|
||||||
sub cisco_comm_indexing {
|
sub cisco_comm_indexing {
|
||||||
1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_duplex {
|
sub i_duplex {
|
||||||
my $c2900 = shift;
|
my $c2900 = shift;
|
||||||
|
my $partial = shift;
|
||||||
my $interfaces = $c2900->interfaces();
|
|
||||||
my $c2900_p_index = $c2900->c2900_p_index();
|
my $interfaces = $c2900->interfaces($partial);
|
||||||
|
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||||
my $c2900_p_duplex = $c2900->c2900_p_duplex();
|
my $c2900_p_duplex = $c2900->c2900_p_duplex();
|
||||||
|
|
||||||
|
|
||||||
my %reverse_2900 = reverse %$c2900_p_index;
|
my %reverse_2900 = reverse %$c2900_p_index;
|
||||||
|
|
||||||
my %i_duplex;
|
my %i_duplex;
|
||||||
foreach my $if (keys %$interfaces){
|
foreach my $if ( keys %$interfaces ) {
|
||||||
my $port_2900 = $reverse_2900{$if};
|
my $port_2900 = $reverse_2900{$if};
|
||||||
next unless defined $port_2900;
|
next unless defined $port_2900;
|
||||||
my $duplex = $c2900_p_duplex->{$port_2900};
|
my $duplex = $c2900_p_duplex->{$port_2900};
|
||||||
next unless defined $duplex;
|
next unless defined $duplex;
|
||||||
|
|
||||||
$duplex = 'half' if $duplex =~ /half/i;
|
$duplex = 'half' if $duplex =~ /half/i;
|
||||||
$duplex = 'full' if $duplex =~ /full/i;
|
$duplex = 'full' if $duplex =~ /full/i;
|
||||||
$i_duplex{$if}=$duplex;
|
$i_duplex{$if} = $duplex;
|
||||||
}
|
}
|
||||||
return \%i_duplex;
|
return \%i_duplex;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_duplex_admin {
|
sub i_duplex_admin {
|
||||||
my $c2900 = shift;
|
my $c2900 = shift;
|
||||||
|
my $partial = shift;
|
||||||
my $interfaces = $c2900->interfaces();
|
|
||||||
my $c2900_p_index = $c2900->c2900_p_index();
|
my $interfaces = $c2900->interfaces($partial);
|
||||||
|
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||||
my $c2900_p_admin = $c2900->c2900_p_duplex_admin();
|
my $c2900_p_admin = $c2900->c2900_p_duplex_admin();
|
||||||
|
|
||||||
|
|
||||||
my %reverse_2900 = reverse %$c2900_p_index;
|
my %reverse_2900 = reverse %$c2900_p_index;
|
||||||
|
|
||||||
my %i_duplex_admin;
|
my %i_duplex_admin;
|
||||||
foreach my $if (keys %$interfaces){
|
foreach my $if ( keys %$interfaces ) {
|
||||||
my $port_2900 = $reverse_2900{$if};
|
my $port_2900 = $reverse_2900{$if};
|
||||||
next unless defined $port_2900;
|
next unless defined $port_2900;
|
||||||
my $duplex = $c2900_p_admin->{$port_2900};
|
my $duplex = $c2900_p_admin->{$port_2900};
|
||||||
next unless defined $duplex;
|
next unless defined $duplex;
|
||||||
|
|
||||||
$duplex = 'half' if $duplex =~ /half/i;
|
$duplex = 'half' if $duplex =~ /half/i;
|
||||||
$duplex = 'full' if $duplex =~ /full/i;
|
$duplex = 'full' if $duplex =~ /full/i;
|
||||||
$duplex = 'auto' if $duplex =~ /auto/i;
|
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||||
$i_duplex_admin{$if}=$duplex;
|
$i_duplex_admin{$if} = $duplex;
|
||||||
}
|
}
|
||||||
return \%i_duplex_admin;
|
return \%i_duplex_admin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub i_speed_admin {
|
||||||
|
my $c2900 = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my %i_speed_admin;
|
||||||
|
my $p_port = $c2900->p_port() || {};
|
||||||
|
my $interfaces = $c2900->interfaces($partial);
|
||||||
|
my $c2900_p_index = $c2900->c2900_p_index() || {};
|
||||||
|
|
||||||
|
my %reverse_2900 = reverse %$c2900_p_index;
|
||||||
|
my $c2900_p_speed
|
||||||
|
= $c2900->c2900_p_speed_admin( $reverse_2900{$partial} );
|
||||||
|
|
||||||
|
my %speeds = (
|
||||||
|
'autoDetect' => 'auto',
|
||||||
|
's10000000' => '10 Mbps',
|
||||||
|
's100000000' => '100 Mbps',
|
||||||
|
);
|
||||||
|
|
||||||
|
%i_speed_admin
|
||||||
|
= map { $c2900_p_index->{$_} => $speeds{ $c2900_p_speed->{$_} } }
|
||||||
|
keys %$c2900_p_index;
|
||||||
|
|
||||||
|
return \%i_speed_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_i_speed_admin {
|
||||||
|
my $c2900 = shift;
|
||||||
|
my ( $speed, $iid ) = @_;
|
||||||
|
|
||||||
|
# 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.
|
# Use i_descritption for port key, cuz i_name can be manually entered.
|
||||||
sub interfaces {
|
sub interfaces {
|
||||||
my $c2900 = shift;
|
my $c2900 = shift;
|
||||||
my $interfaces = $c2900->i_index();
|
my $partial = shift;
|
||||||
my $i_descr = $c2900->i_description();
|
|
||||||
|
my $interfaces = $c2900->i_index($partial) || {};
|
||||||
|
my $i_descr = $c2900->i_description($partial) || {};
|
||||||
|
|
||||||
my %if;
|
my %if;
|
||||||
foreach my $iid (keys %$interfaces){
|
foreach my $iid ( keys %$interfaces ) {
|
||||||
my $port = $i_descr->{$iid};
|
my $port = $i_descr->{$iid};
|
||||||
next unless defined $port;
|
next unless defined $port;
|
||||||
|
|
||||||
$port =~ s/\./\//g if( $port =~ /\d+\.\d+$/);
|
$port =~ s/\./\//g if ( $port =~ /\d+\.\d+$/ );
|
||||||
$port =~ s/[^\d\/,()\w]+//gi;
|
$port =~ s/[^\d\/,()\w]+//gi;
|
||||||
|
|
||||||
$if{$iid} = $port;
|
$if{$iid} = $port;
|
||||||
}
|
}
|
||||||
|
|
||||||
return \%if
|
return \%if;
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
@@ -150,26 +232,27 @@ __END__
|
|||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
# Let SNMP::Info determine the correct subclass for you.
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
my $c2900 = new SNMP::Info(
|
my $c2900 = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
# These arguments are passed directly to SNMP::Session
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
)
|
)
|
||||||
or die "Can't connect to DestHost.\n";
|
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";
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
@@ -177,8 +260,8 @@ Max Baker (C<max@warped.org>)
|
|||||||
Provides abstraction to the configuration information obtainable from a
|
Provides abstraction to the configuration information obtainable from a
|
||||||
C2900 device through SNMP.
|
C2900 device through SNMP.
|
||||||
|
|
||||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
a more specific class using the method above.
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
my $c2900 = new SNMP::Info::Layer2::C2900(...);
|
my $c2900 = new SNMP::Info::Layer2::C2900(...);
|
||||||
|
|
||||||
@@ -186,28 +269,40 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item SNMP::Info::Layer2
|
|
||||||
|
|
||||||
=item SNMP::Info::CiscoVTP
|
=item SNMP::Info::CiscoVTP
|
||||||
|
|
||||||
|
=item SNMP::Info::CDP
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoStats
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoConfig
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer2
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Required MIBs
|
=head2 Required MIBs
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item CISCO-C2900-MIB
|
=item F<CISCO-C2900-MIB>
|
||||||
|
|
||||||
Part of the v2 MIBs from Cisco.
|
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
|
=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
|
=head1 GLOBALS
|
||||||
|
|
||||||
These are methods that return scalar value from SNMP
|
These are methods that return scalar value from SNMP
|
||||||
@@ -218,19 +313,35 @@ These are methods that return scalar value from SNMP
|
|||||||
|
|
||||||
=item $c2900->vendor()
|
=item $c2900->vendor()
|
||||||
|
|
||||||
Returns 'cisco' :)
|
Returns 'cisco' :)
|
||||||
|
|
||||||
|
=item $c2900->cisco_comm_indexing()
|
||||||
|
|
||||||
|
Returns 1. Use vlan indexing.
|
||||||
|
|
||||||
=back
|
=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
|
=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
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
See documentation in SNMP::Info::CiscoVTP for details.
|
|
||||||
|
|
||||||
=head1 TABLE ENTRIES
|
|
||||||
|
|
||||||
These are methods that return tables of information in the form of a reference
|
These are methods that return tables of information in the form of a reference
|
||||||
to a hash.
|
to a hash.
|
||||||
@@ -241,68 +352,122 @@ to a hash.
|
|||||||
|
|
||||||
=item $c2900->interfaces()
|
=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
|
Next all dots are changed for forward slashes so that the physical port name
|
||||||
is the same as the broadcasted CDP port name.
|
is the same as the broad-casted CDP port name.
|
||||||
(Ethernet0.1 -> Ethernet0/1)
|
(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()
|
=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()
|
=item $c2900->i_duplex_admin()
|
||||||
|
|
||||||
Returns reference to hash of IIDs to admin duplex setting
|
Returns reference to hash of IIDs to admin duplex setting
|
||||||
|
|
||||||
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin;
|
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin()
|
||||||
|
|
||||||
|
=item $c2900->i_speed_admin()
|
||||||
|
|
||||||
|
Returns reference to hash of IIDs to admin speed setting.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 C2900-MIB Port Entry Table
|
=head2 F<C2900-MIB> Port Entry Table
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item $c2900->c2900_p_index()
|
=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()
|
=item $c2900->c2900_p_duplex()
|
||||||
|
|
||||||
Gives Port Duplex Info
|
Gives Port Duplex Info
|
||||||
|
|
||||||
B<c2900PortDuplexStatus>
|
(C<c2900PortDuplexStatus>)
|
||||||
|
|
||||||
=item $c2900->c2900_p_duplex_admin()
|
=item $c2900->c2900_p_duplex_admin()
|
||||||
|
|
||||||
Gives admin setting for Duplex Info
|
Gives admin setting for Duplex Info
|
||||||
|
|
||||||
B<c2900PortDuplexState>
|
|
||||||
|
|
||||||
|
(C<c2900PortDuplexState>)
|
||||||
|
|
||||||
=item $c2900->c2900_p_speed_admin()
|
=item $c2900->c2900_p_speed_admin()
|
||||||
|
|
||||||
Gives Admin speed of port
|
Gives Admin speed of port
|
||||||
|
|
||||||
B<c2900PortAdminSpeed>
|
(C<c2900PortAdminSpeed>)
|
||||||
|
|
||||||
=back
|
=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
|
=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
|
=cut
|
||||||
|
|||||||
@@ -1,77 +1,82 @@
|
|||||||
# SNMP::Info::Layer2::Catalyst
|
# SNMP::Info::Layer2::Catalyst
|
||||||
# Max Baker <max@warped.org>
|
# $Id$
|
||||||
#
|
#
|
||||||
# Copyright (c) 2002,2003 Regents of the University of California
|
# 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.
|
# 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:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer2::Catalyst;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info::Layer2;
|
|
||||||
use SNMP::Info::CiscoVTP;
|
|
||||||
use SNMP::Info::CiscoStack;
|
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
|
||||||
@SNMP::Info::Layer2::Catalyst::ISA = qw/SNMP::Info::CiscoStack SNMP::Info::Layer2
|
= qw/SNMP::Info::CiscoStack SNMP::Info::CiscoVTP
|
||||||
SNMP::Info::CiscoVTP Exporter/;
|
SNMP::Info::CDP SNMP::Info::CiscoStats
|
||||||
|
SNMP::Info::CiscoPortSecurity
|
||||||
|
SNMP::Info::Layer2 Exporter/;
|
||||||
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
|
@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
|
$VERSION = '3.15';
|
||||||
# the interworkings.
|
|
||||||
$INIT = 0;
|
|
||||||
|
|
||||||
%MIBS = ( %SNMP::Info::Layer2::MIBS,
|
%MIBS = (
|
||||||
%SNMP::Info::CiscoVTP::MIBS,
|
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
|
||||||
%SNMP::Info::CiscoStack::MIBS,
|
%SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
|
||||||
);
|
%SNMP::Info::CiscoVTP::MIBS, %SNMP::Info::CiscoStack::MIBS,
|
||||||
|
);
|
||||||
|
|
||||||
%GLOBALS = (
|
%GLOBALS = (
|
||||||
%SNMP::Info::Layer2::GLOBALS,
|
%SNMP::Info::Layer2::GLOBALS,
|
||||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
%SNMP::Info::CiscoPortSecurity::GLOBALS,
|
||||||
%SNMP::Info::CiscoStack::GLOBALS,
|
%SNMP::Info::CiscoStats::GLOBALS,
|
||||||
);
|
%SNMP::Info::CDP::GLOBALS,
|
||||||
|
%SNMP::Info::CiscoVTP::GLOBALS,
|
||||||
|
%SNMP::Info::CiscoStack::GLOBALS,
|
||||||
|
);
|
||||||
|
|
||||||
%FUNCS = (
|
%FUNCS = (
|
||||||
%SNMP::Info::Layer2::FUNCS,
|
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||||
%SNMP::Info::CiscoVTP::FUNCS,
|
%SNMP::Info::CiscoStats::FUNCS, %SNMP::Info::CDP::FUNCS,
|
||||||
%SNMP::Info::CiscoStack::FUNCS,
|
%SNMP::Info::CiscoVTP::FUNCS, %SNMP::Info::CiscoStack::FUNCS,
|
||||||
);
|
);
|
||||||
|
|
||||||
%MUNGE = (
|
%MUNGE = (
|
||||||
%SNMP::Info::Layer2::MUNGE,
|
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||||
%SNMP::Info::CiscoVTP::MUNGE,
|
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||||
%SNMP::Info::CiscoStack::MUNGE,
|
%SNMP::Info::CiscoVTP::MUNGE, %SNMP::Info::CiscoStack::MUNGE,
|
||||||
);
|
);
|
||||||
|
|
||||||
# Overidden Methods
|
# Overidden Methods
|
||||||
|
|
||||||
@@ -82,9 +87,9 @@ sub i_physical {
|
|||||||
my $p_port = $cat->p_port();
|
my $p_port = $cat->p_port();
|
||||||
|
|
||||||
my %i_physical;
|
my %i_physical;
|
||||||
foreach my $port (keys %$p_port) {
|
foreach my $port ( keys %$p_port ) {
|
||||||
my $iid = $p_port->{$port};
|
my $iid = $p_port->{$port};
|
||||||
$i_physical{$iid} = 1;
|
$i_physical{$iid} = 1;
|
||||||
}
|
}
|
||||||
return \%i_physical;
|
return \%i_physical;
|
||||||
}
|
}
|
||||||
@@ -98,20 +103,74 @@ sub os {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub os_ver {
|
sub os_ver {
|
||||||
my $cat = shift;
|
my $cat = shift;
|
||||||
my $os_ver = $cat->SUPER::os_ver();
|
my $os_ver = $cat->SUPER::os_ver();
|
||||||
return $os_ver if defined $os_ver;
|
return $os_ver if defined $os_ver;
|
||||||
|
|
||||||
my $m_swver = $cat->m_swver();
|
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.
|
# assume .1 entry is the chassis and the sw version we want.
|
||||||
return $m_swver->{1} if defined $m_swver->{1};
|
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 {
|
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;
|
1;
|
||||||
@@ -119,11 +178,12 @@ __END__
|
|||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -131,7 +191,6 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $cat = new SNMP::Info(
|
my $cat = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
@@ -143,21 +202,25 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
=head1 DESCRIPTION
|
=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
|
This class includes the Catalyst 2920, 4000, 5000, 6000 (hybrid mode)
|
||||||
switches run IOS, like the 2900 and 3550 families. Cisco Catalyst 1900 switches use their
|
families.
|
||||||
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 2950 series devices, which fall under the
|
This subclass is not for all devices that have the name Catalyst. Note that
|
||||||
Catalyst 5000 family.
|
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
|
See SNMP::Info::device_type() for specifics.
|
||||||
return all their data if connected via Version 1.
|
|
||||||
|
|
||||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
Note: Some older Catalyst switches will only talk SNMP version 1. Some
|
||||||
a more specific class using the method above.
|
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(...);
|
my $cat = new SNMP::Info::Layer2::Catalyst(...);
|
||||||
|
|
||||||
@@ -165,11 +228,17 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item SNMP::Info::Layer2
|
=item SNMP::Info::CiscoStack
|
||||||
|
|
||||||
=item SNMP::Info::CiscoVTP
|
=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
|
=back
|
||||||
|
|
||||||
@@ -179,11 +248,18 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=item Inherited Classes' MIBs
|
=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
|
=back
|
||||||
|
|
||||||
@@ -208,35 +284,93 @@ it grabs $cat->m_swver()->{1} and uses that.
|
|||||||
|
|
||||||
Returns 'cisco'
|
Returns 'cisco'
|
||||||
|
|
||||||
|
=item $cat->cisco_comm_indexing()
|
||||||
|
|
||||||
|
Returns 1. Use vlan indexing.
|
||||||
|
|
||||||
=back
|
=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
|
=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
|
These are methods that return tables of information in the form of a reference
|
||||||
to a hash.
|
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
|
=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
|
=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::Layer2::CiscoSTack
|
|
||||||
|
|
||||||
See documentation in SNMP::Info::Layer2::CiscoStack for details.
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
535
Info/Layer2/Centillion.pm
Normal file
535
Info/Layer2/Centillion.pm
Normal file
@@ -0,0 +1,535 @@
|
|||||||
|
# SNMP::Info::Layer2::Centillion
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Eric Miller
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer2::Centillion;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info;
|
||||||
|
use SNMP::Info::Bridge;
|
||||||
|
use SNMP::Info::NortelStack;
|
||||||
|
use SNMP::Info::SONMP;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer2::Centillion::ISA
|
||||||
|
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/;
|
||||||
|
@SNMP::Info::Layer2::Centillion::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::MIBS,
|
||||||
|
%SNMP::Info::Bridge::MIBS,
|
||||||
|
%SNMP::Info::NortelStack::MIBS,
|
||||||
|
%SNMP::Info::SONMP::MIBS,
|
||||||
|
'CENTILLION-DOT3-EXTENSIONS-MIB' => 'cnDot3ExtnTable',
|
||||||
|
'S5-COMMON-STATS-MIB' => 's5CmStat',
|
||||||
|
'CENTILLION-VLAN-MIB' => 'cnVlanENETMgt',
|
||||||
|
'CENTILLION-CONFIG-MIB' => 'sysTFTPStart',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::GLOBALS,
|
||||||
|
%SNMP::Info::Bridge::GLOBALS,
|
||||||
|
%SNMP::Info::NortelStack::GLOBALS,
|
||||||
|
%SNMP::Info::SONMP::GLOBALS,
|
||||||
|
'tftp_action' => 'sysTFTPStart',
|
||||||
|
'tftp_host' => 'sysTFTPIpAddress',
|
||||||
|
'tftp_file' => 'sysTFTPFileName',
|
||||||
|
'tftp_type' => 'sysTFTPFileType',
|
||||||
|
'tftp_result' => 'sysTFTPResult',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::FUNCS,
|
||||||
|
%SNMP::Info::Bridge::FUNCS,
|
||||||
|
%SNMP::Info::NortelStack::FUNCS,
|
||||||
|
%SNMP::Info::SONMP::FUNCS,
|
||||||
|
|
||||||
|
# CENTILLION-DOT3-EXTENSIONS-MIB::cnDot3ExtnTable
|
||||||
|
'centillion_p_index' => 'cnDot3ExtnIfIndex',
|
||||||
|
'centillion_p_duplex' => 'cnDot3ExtnIfOperConnectionType',
|
||||||
|
'centillion_p_duplex_admin' => 'cnDot3ExtnIfAdminConnectionType',
|
||||||
|
|
||||||
|
# S5-COMMON-STATS-MIB::s5CmSNodeTable
|
||||||
|
'fw_mac' => 's5CmSNodeMacAddr',
|
||||||
|
'fw_port' => 's5CmSNodeIfIndx',
|
||||||
|
|
||||||
|
# CENTILLION-VLAN-MIB::cnVlanPortMemberTable
|
||||||
|
'centillion_i_vlan_index' => 'cnVlanPortMemberIfIndex',
|
||||||
|
'centillion_i_vlan' => 'cnVlanPortMemberVID',
|
||||||
|
'centillion_i_vlan_type' => 'cnVlanPortMemberIngressType',
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
|
||||||
|
# Inherit all the built in munging
|
||||||
|
%SNMP::Info::MUNGE,
|
||||||
|
%SNMP::Info::Bridge::MUNGE,
|
||||||
|
%SNMP::Info::NortelStack::MUNGE,
|
||||||
|
%SNMP::Info::SONMP::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'centillion';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'nortel';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_ignore {
|
||||||
|
my $centillion = shift;
|
||||||
|
my $descr = $centillion->i_description();
|
||||||
|
|
||||||
|
my %i_ignore;
|
||||||
|
foreach my $if ( keys %$descr ) {
|
||||||
|
my $type = $descr->{$if};
|
||||||
|
|
||||||
|
# Skip virtual interfaces
|
||||||
|
$i_ignore{$if}++ if $type =~ /(VE|VID|vc|lp)/i;
|
||||||
|
}
|
||||||
|
return \%i_ignore;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub interfaces {
|
||||||
|
my $centillion = shift;
|
||||||
|
my $i_index = $centillion->i_index();
|
||||||
|
my $i_descr = $centillion->i_description();
|
||||||
|
|
||||||
|
my %if;
|
||||||
|
foreach my $iid ( keys %$i_index ) {
|
||||||
|
my $index = $i_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
my $descr = $i_descr->{$iid};
|
||||||
|
|
||||||
|
# Skip ATM and virtual interfaces
|
||||||
|
next if $descr =~ /(VE|VID|vc|lp)/i;
|
||||||
|
|
||||||
|
# Index numbers are deterministic slot * 256 + port
|
||||||
|
my $port = $index % 256;
|
||||||
|
my $slot = int( $index / 256 );
|
||||||
|
my $slotport = "$slot.$port";
|
||||||
|
|
||||||
|
$slotport = "$descr" if $descr =~ /(mcp)/i;
|
||||||
|
|
||||||
|
$if{$index} = $slotport;
|
||||||
|
}
|
||||||
|
|
||||||
|
return \%if;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_duplex {
|
||||||
|
my $centillion = shift;
|
||||||
|
|
||||||
|
my $port_index = $centillion->centillion_p_index();
|
||||||
|
my $port_duplex = $centillion->centillion_p_duplex();
|
||||||
|
|
||||||
|
my %i_duplex;
|
||||||
|
foreach my $iid ( keys %$port_index ) {
|
||||||
|
my $index = $port_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
my $duplex = $port_duplex->{$iid};
|
||||||
|
next unless defined $duplex;
|
||||||
|
|
||||||
|
$duplex = 'half' if $duplex =~ /half/i;
|
||||||
|
$duplex = 'full' if $duplex =~ /full/i;
|
||||||
|
$i_duplex{$index} = $duplex;
|
||||||
|
}
|
||||||
|
return \%i_duplex;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_duplex_admin {
|
||||||
|
my $centillion = shift;
|
||||||
|
|
||||||
|
my $port_index = $centillion->centillion_p_index();
|
||||||
|
my $port_admin = $centillion->centillion_p_duplex_admin();
|
||||||
|
|
||||||
|
my %i_duplex_admin;
|
||||||
|
foreach my $iid ( keys %$port_index ) {
|
||||||
|
my $index = $port_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
my $duplex = $port_admin->{$iid};
|
||||||
|
next unless defined $duplex;
|
||||||
|
|
||||||
|
$duplex = 'half' if $duplex =~ /half/i;
|
||||||
|
$duplex = 'full' if $duplex =~ /full/i;
|
||||||
|
$duplex = 'auto' if $duplex =~ /auto/i;
|
||||||
|
$i_duplex_admin{$index} = $duplex;
|
||||||
|
}
|
||||||
|
return \%i_duplex_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_vlan {
|
||||||
|
my $centillion = shift;
|
||||||
|
|
||||||
|
my $cn_vlan_index = $centillion->centillion_i_vlan_index();
|
||||||
|
my $cn_vlan = $centillion->centillion_i_vlan();
|
||||||
|
|
||||||
|
my %i_vlan;
|
||||||
|
foreach my $iid ( keys %$cn_vlan_index ) {
|
||||||
|
my $index = $cn_vlan_index->{$iid};
|
||||||
|
next unless defined $index;
|
||||||
|
my $vlan = $cn_vlan->{$iid};
|
||||||
|
next unless defined $vlan;
|
||||||
|
|
||||||
|
$i_vlan{$index} = $vlan;
|
||||||
|
}
|
||||||
|
return \%i_vlan;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $centillion = shift;
|
||||||
|
my $id = $centillion->id();
|
||||||
|
return unless defined $id;
|
||||||
|
my $model = &SNMP::translateObj($id);
|
||||||
|
return $id unless defined $model;
|
||||||
|
$model =~ s/^sreg-//i;
|
||||||
|
|
||||||
|
return '5000BH' if ( $model =~ /5000BH/ );
|
||||||
|
return '5005BH' if ( $model =~ /5005BH/ );
|
||||||
|
return 'C100' if ( $model =~ /Centillion100/ );
|
||||||
|
return 'C50N' if ( $model =~ /Centillion50N/ );
|
||||||
|
return 'C50T' if ( $model =~ /Centillion50T/ );
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub bp_index {
|
||||||
|
my $centillion = shift;
|
||||||
|
my $index = $centillion->fw_port();
|
||||||
|
|
||||||
|
my %bp_index;
|
||||||
|
foreach my $iid ( keys %$index ) {
|
||||||
|
my $b_index = $index->{$iid};
|
||||||
|
next unless defined $b_index;
|
||||||
|
|
||||||
|
#Index value is the same as ifIndex
|
||||||
|
$bp_index{$b_index} = $b_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
return \%bp_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub index_factor {
|
||||||
|
return 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub slot_offset {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub fw_mac {
|
||||||
|
my $centillion = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $centillion->SUPER::fw_mac($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub fw_port {
|
||||||
|
my $centillion = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $centillion->SUPER::fw_port($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer2::Centillion - SNMP Interface to Nortel Centillion based
|
||||||
|
ATM Switches
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $centillion = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $centillion->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Provides abstraction to the configuration information obtainable from a
|
||||||
|
Centillion device through SNMP.
|
||||||
|
|
||||||
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
|
my $centillion = new SNMP::Info::Layer2::centillion(...);
|
||||||
|
|
||||||
|
Note: This class supports version 4.X and 5.X which are VLAN based rather
|
||||||
|
than bridge group based.
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info
|
||||||
|
|
||||||
|
=item SNMP::Info::Bridge
|
||||||
|
|
||||||
|
=item SNMP::Info::NortelStack
|
||||||
|
|
||||||
|
=item SNMP::Info::SONMP
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<CENTILLION-DOT3-EXTENSIONS-MIB>
|
||||||
|
|
||||||
|
=item F<S5-COMMON-STATS-MIB>
|
||||||
|
|
||||||
|
=item F<CENTILLION-VLAN-MIB>
|
||||||
|
|
||||||
|
=item F<CENTILLION-CONFIG-MIB>
|
||||||
|
|
||||||
|
=item Inherited Classes' MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::NortelStack/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $centillion->vendor()
|
||||||
|
|
||||||
|
Returns 'Nortel'
|
||||||
|
|
||||||
|
=item $centillion->model()
|
||||||
|
|
||||||
|
Cross references $centillion->id() to the F<SYNOPTICS-MIB> and returns
|
||||||
|
the results.
|
||||||
|
|
||||||
|
Removes C<sreg-> from the model name
|
||||||
|
|
||||||
|
=item $centillion->os()
|
||||||
|
|
||||||
|
Returns 'Centillion'
|
||||||
|
|
||||||
|
=item $centillion->tftp_action()
|
||||||
|
|
||||||
|
(C<sysTFTPStart>)
|
||||||
|
|
||||||
|
=item $centillion->tftp_host()
|
||||||
|
|
||||||
|
(C<sysTFTPIpAddress>)
|
||||||
|
|
||||||
|
=item $centillion->tftp_file()
|
||||||
|
|
||||||
|
(C<sysTFTPFileName>)
|
||||||
|
|
||||||
|
=item $centillion->tftp_type()
|
||||||
|
|
||||||
|
(C<sysTFTPFileType>)
|
||||||
|
|
||||||
|
=item $centillion->tftp_result()
|
||||||
|
|
||||||
|
(C<sysTFTPResult>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $centillion->layers()
|
||||||
|
|
||||||
|
Returns 00000011. Class emulates Layer 2 functionality through proprietary
|
||||||
|
MIBs.
|
||||||
|
|
||||||
|
=item $centillion->index_factor()
|
||||||
|
|
||||||
|
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||||
|
reserved per slot within the device MIB. Returns 256.
|
||||||
|
|
||||||
|
=item $centillion->slot_offset()
|
||||||
|
|
||||||
|
Required by SNMP::Info::SONMP. Offset if slot numbering does not
|
||||||
|
start at 0. Returns 0.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Bridge
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::NortelStack
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::NortelStack/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a reference
|
||||||
|
to a hash.
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $centillion->interfaces()
|
||||||
|
|
||||||
|
Returns reference to the map between IID and physical Port.
|
||||||
|
|
||||||
|
Slot and port numbers on the Passport switches are determined by the
|
||||||
|
formula:
|
||||||
|
port = index % 256
|
||||||
|
slot = int(index / 256)
|
||||||
|
|
||||||
|
The physical port name is returned as slot.port.
|
||||||
|
|
||||||
|
=item $centillion->i_duplex()
|
||||||
|
|
||||||
|
Returns reference to map of IIDs to current link duplex
|
||||||
|
|
||||||
|
=item $centillion->i_duplex_admin()
|
||||||
|
|
||||||
|
Returns reference to hash of IIDs to admin duplex setting
|
||||||
|
|
||||||
|
=item $centillion->i_ignore()
|
||||||
|
|
||||||
|
Returns reference to hash of IIDs to ignore.
|
||||||
|
|
||||||
|
=item $centillion->fw_mac()
|
||||||
|
|
||||||
|
(C<s5CmSNodeMacAddr>)
|
||||||
|
|
||||||
|
=item $centillion->fw_port()
|
||||||
|
|
||||||
|
(C<s5CmSNodeIfIndx>)
|
||||||
|
|
||||||
|
=item $centillion->bp_index()
|
||||||
|
|
||||||
|
Returns a mapping between C<ifIndex> and the Bridge Table.
|
||||||
|
|
||||||
|
=item $centillion->i_vlan()
|
||||||
|
|
||||||
|
Returns a mapping between C<ifIndex> and the VLAN.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Centillion 802.3 Extension Table (C<cnDot3ExtnTable>)
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $centillion->centillion_p_index()
|
||||||
|
|
||||||
|
Returns reference to hash. Maps table IIDs to Interface IIDs
|
||||||
|
|
||||||
|
(C<cnDot3ExtnIfIndex>)
|
||||||
|
|
||||||
|
=item $centillion->centillion_p_duplex()
|
||||||
|
|
||||||
|
Returns reference to hash. Maps port operational duplexes to IIDs
|
||||||
|
|
||||||
|
(C<cnDot3ExtnIfOperConnectionType>)
|
||||||
|
|
||||||
|
=item $centillion->rc_centillion_p_duplex_admin()
|
||||||
|
|
||||||
|
Returns reference to hash. Maps port admin duplexes to IIDs
|
||||||
|
|
||||||
|
(C<cnDot3ExtnIfAdminConnectionType>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Centillion VLAN Table (C<cnVlanPortMemberTable>)
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $centillion->centillion_i_vlan_index()
|
||||||
|
|
||||||
|
Returns reference to hash. Key: Table entry, Value: Index
|
||||||
|
|
||||||
|
(C<cnVlanPortMemberIfIndex>)
|
||||||
|
|
||||||
|
=item $centillion->centillion_i_vlan()
|
||||||
|
|
||||||
|
Returns reference to hash. Key: Table entry, Value: VLAN ID
|
||||||
|
|
||||||
|
(C<cnVlanPortMemberVID>)
|
||||||
|
|
||||||
|
=item $centillion->centillion_i_vlan_type()
|
||||||
|
|
||||||
|
Returns reference to hash. Key: Table entry, Value: VLAN Type
|
||||||
|
|
||||||
|
(C<cnVlanPortMemberIngressType>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::NortelStack
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
242
Info/Layer2/Cisco.pm
Normal file
242
Info/Layer2/Cisco.pm
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
# SNMP::Info::Layer2::Cisco
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Max Baker
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer2::Cisco;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::CiscoVTP;
|
||||||
|
use SNMP::Info::CDP;
|
||||||
|
use SNMP::Info::CiscoStats;
|
||||||
|
use SNMP::Info::CiscoImage;
|
||||||
|
use SNMP::Info::CiscoRTT;
|
||||||
|
use SNMP::Info::CiscoQOS;
|
||||||
|
use SNMP::Info::CiscoConfig;
|
||||||
|
use SNMP::Info::Layer2;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer2::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||||
|
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
|
||||||
|
SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
|
||||||
|
SNMP::Info::CiscoConfig SNMP::Info::Layer2
|
||||||
|
Exporter/;
|
||||||
|
@SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%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
|
||||||
264
Info/Layer2/CiscoSB.pm
Normal file
264
Info/Layer2/CiscoSB.pm
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
# SNMP::Info::Layer2::CiscoSB
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013 Nic Bernstein
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2003 Regents of the University of California
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer2::CiscoSB;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::Layer2;
|
||||||
|
use SNMP::Info::Entity;
|
||||||
|
use SNMP::Info::EtherLike;
|
||||||
|
use SNMP::Info::CiscoStats;
|
||||||
|
use SNMP::Info::CiscoConfig;
|
||||||
|
use SNMP::Info::CDP;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer2::CiscoSB::ISA
|
||||||
|
= qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
|
||||||
|
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
|
||||||
|
@SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
# This will be filled in with the device's index into the EntPhysicalEntry
|
||||||
|
# table by the serial() function.
|
||||||
|
our $index = undef;
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer2::GLOBALS,
|
||||||
|
%SNMP::Info::Entity::GLOBALS,
|
||||||
|
%SNMP::Info::EtherLike::GLOBALS,
|
||||||
|
%SNMP::Info::CiscoStats::GLOBALS,
|
||||||
|
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||||
|
%SNMP::Info::CDP::GLOBALS,
|
||||||
|
'descr' => 'sysDescr'
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer2::FUNCS,
|
||||||
|
%SNMP::Info::Entity::FUNCS,
|
||||||
|
%SNMP::Info::EtherLike::FUNCS,
|
||||||
|
%SNMP::Info::CiscoStats::FUNCS,
|
||||||
|
%SNMP::Info::CiscoConfig::FUNCS,
|
||||||
|
%SNMP::Info::CDP::FUNCS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer2::MIBS,
|
||||||
|
%SNMP::Info::Entity::MIBS,
|
||||||
|
%SNMP::Info::EtherLike::MIBS,
|
||||||
|
%SNMP::Info::CiscoStats::MIBS,
|
||||||
|
%SNMP::Info::CiscoConfig::MIBS,
|
||||||
|
%SNMP::Info::CDP::MIBS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::Layer2::MUNGE,
|
||||||
|
%SNMP::Info::Entity::MUNGE,
|
||||||
|
%SNMP::Info::EtherLike::MUNGE,
|
||||||
|
%SNMP::Info::CiscoStats::MUNGE,
|
||||||
|
%SNMP::Info::CiscoConfig::MUNGE,
|
||||||
|
%SNMP::Info::CDP::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'cisco';
|
||||||
|
}
|
||||||
|
|
||||||
|
# Walk the entPhysicalSerialNum table and return the first serial found
|
||||||
|
sub serial {
|
||||||
|
my $ciscosb = shift;
|
||||||
|
my $e_serial = $ciscosb->e_serial();
|
||||||
|
|
||||||
|
# Find entity table entry for this unit
|
||||||
|
foreach my $e ( sort keys %$e_serial ) {
|
||||||
|
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
|
||||||
|
return $e_serial->{$e};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_ver {
|
||||||
|
my $ciscosb = shift;
|
||||||
|
my $os_ver = $ciscosb->e_swver();
|
||||||
|
|
||||||
|
return $os_ver->{$index} if defined $index;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Grab e_model from Entity and tag on e_hwver
|
||||||
|
sub model {
|
||||||
|
my $ciscosb = shift;
|
||||||
|
my $e_model = $ciscosb->e_model();
|
||||||
|
my $e_hwver = $ciscosb->e_hwver();
|
||||||
|
|
||||||
|
if (defined ($index)) {
|
||||||
|
my $model = "$e_model->{$index} $e_hwver->{$index}";
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
return $ciscosb->description();
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifDescr is the same for all interfaces in a class, but the ifName is
|
||||||
|
# unique, so let's use that for port name.
|
||||||
|
sub interfaces {
|
||||||
|
my $ciscosb = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $interfaces = $ciscosb->i_name($partial);
|
||||||
|
|
||||||
|
return $interfaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer2::CiscoSB - SNMP Interface to Cisco Small Business series
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Nic Bernstein (shamelessly stolen from Max Baker's Aironet code)
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $ciscosb = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $ciscosb->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Provides interface to SNMP Data available on Cisco Small Business (nee LinkSys)
|
||||||
|
managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1)]
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer2
|
||||||
|
|
||||||
|
=item SNMP::Info::Entity
|
||||||
|
|
||||||
|
=item SNMP::Info::EtherLike
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoStats
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoConfig
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item Inherited Classes
|
||||||
|
|
||||||
|
MIBs required by the inherited classes listed above.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $ciscosb->vendor()
|
||||||
|
|
||||||
|
Returns 'cisco'
|
||||||
|
|
||||||
|
=item $ciscosb->os_ver()
|
||||||
|
|
||||||
|
Returns software version (C<entPhysicalSoftwareRev>)
|
||||||
|
|
||||||
|
=item $ciscosb->serial()
|
||||||
|
|
||||||
|
Returns serial number of unit (C<entPhysicalSerialNum>)
|
||||||
|
|
||||||
|
=item $ciscosb->model()
|
||||||
|
|
||||||
|
Returns model and hardware revision of unit
|
||||||
|
(C<entPhysicalModelName+entPhysicalHardwareRev>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Entity
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::EtherLike
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $ciscosb->interfaces()
|
||||||
|
|
||||||
|
Uses the i_name() field.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Entity
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::EtherLike
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
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.15';
|
||||||
|
|
||||||
|
%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
|
||||||
214
Info/Layer2/HPVC.pm
Normal file
214
Info/Layer2/HPVC.pm
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
# 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;
|
||||||
|
use SNMP::Info::LLDP;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer2::HPVC::ISA
|
||||||
|
= qw/SNMP::Info::Layer2 SNMP::Info::LLDP Exporter/;
|
||||||
|
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer2::MIBS,
|
||||||
|
%SNMP::Info::LLDP::MIBS,
|
||||||
|
'HPVC-MIB' => 'vcDomainName',
|
||||||
|
'CPQSINFO-MIB' => 'cpqSiSysSerialNum',
|
||||||
|
'HPVCMODULE-MIB' => 'vcModuleDomainName',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer2::GLOBALS,
|
||||||
|
%SNMP::Info::LLDP::GLOBALS,
|
||||||
|
'serial1' => 'cpqSiSysSerialNum.0',
|
||||||
|
'os_ver' => 'cpqHoSWRunningVersion.1',
|
||||||
|
'os_bin' => 'cpqHoFwVerVersion.1',
|
||||||
|
'productname' => 'cpqSiProductName.0',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer2::FUNCS,
|
||||||
|
%SNMP::Info::LLDP::FUNCS,
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
# Inherit all the built in munging
|
||||||
|
%SNMP::Info::Layer2::MUNGE,
|
||||||
|
%SNMP::Info::LLDP::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.15';
|
||||||
|
|
||||||
|
%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.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
|
||||||
|
%SNMP::Info::SONMP::MIBS, %SNMP::Info::Airespace::MIBS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::GLOBALS, %SNMP::Info::Bridge::GLOBALS,
|
||||||
|
%SNMP::Info::SONMP::GLOBALS, %SNMP::Info::Airespace::GLOBALS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
|
||||||
|
%SNMP::Info::SONMP::FUNCS, %SNMP::Info::Airespace::FUNCS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::MUNGE, %SNMP::Info::Bridge::MUNGE,
|
||||||
|
%SNMP::Info::SONMP::MUNGE, %SNMP::Info::Airespace::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'nortel';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'nortel';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $n2270 = shift;
|
||||||
|
my $id = $n2270->id();
|
||||||
|
return unless defined $id;
|
||||||
|
my $model = &SNMP::translateObj($id);
|
||||||
|
return $id unless defined $model;
|
||||||
|
$model =~ s/^sreg-WLANSecuritySwitch//i;
|
||||||
|
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub index_factor {
|
||||||
|
return 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub slot_offset {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer2::N2270 - SNMP Interface to Nortel 2270 Series Wireless
|
||||||
|
Switch
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
#Let SNMP::Info determine the correct subclass for you.
|
||||||
|
|
||||||
|
my $n2270 = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $n2270->class();
|
||||||
|
print " Using device sub class : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Provides abstraction to the configuration information obtainable from a
|
||||||
|
Nortel 2270 Series Wireless Switch through SNMP.
|
||||||
|
|
||||||
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
|
my $n2270 = new SNMP::Info::Layer2::N2270(...);
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info
|
||||||
|
|
||||||
|
=item SNMP::Info::Bridge
|
||||||
|
|
||||||
|
=item SNMP::Info::SONMP
|
||||||
|
|
||||||
|
=item SNMP::Info::Airespace
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item Inherited Classes' MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $n2270->vendor()
|
||||||
|
|
||||||
|
Returns 'nortel'
|
||||||
|
|
||||||
|
=item $n2270->os()
|
||||||
|
|
||||||
|
Returns 'nortel'
|
||||||
|
|
||||||
|
=item $n2270->model()
|
||||||
|
|
||||||
|
Cross references $bayhub->id() to the F<SYNOPTICS-ROOT-MIB> and returns
|
||||||
|
the results.
|
||||||
|
|
||||||
|
Removes C<sreg-WLANSecuritySwitch> from the model name
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $bayhub->index_factor()
|
||||||
|
|
||||||
|
Required by SNMP::Info::SONMP. Number representing the number of ports
|
||||||
|
reserved per slot within the device MIB. Returns 256.
|
||||||
|
|
||||||
|
=item $bayhub->slot_offset()
|
||||||
|
|
||||||
|
Required by SNMP::Info::SONMP. Offset if slot numbering does not
|
||||||
|
start at 0. Returns 0.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Bridge
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::SONMP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::Airespace
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Airespace/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a reference
|
||||||
|
to a hash.
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item None
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Airespace
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
586
Info/Layer2/NAP222x.pm
Normal file
586
Info/Layer2/NAP222x.pm
Normal file
@@ -0,0 +1,586 @@
|
|||||||
|
# SNMP::Info::Layer2::NAP222x
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Eric Miller
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer2::NAP222x;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::SONMP;
|
||||||
|
use SNMP::Info::IEEE802dot11;
|
||||||
|
use SNMP::Info::Layer2;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer2::NAP222x::ISA
|
||||||
|
= qw/SNMP::Info::SONMP SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
|
||||||
|
@SNMP::Info::Layer2::NAP222x::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,
|
||||||
|
%SNMP::Info::SONMP::MIBS, 'NORTEL-WLAN-AP-MIB' => 'ntWlanSwHardwareVer',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer2::GLOBALS,
|
||||||
|
%SNMP::Info::IEEE802dot11::GLOBALS,
|
||||||
|
%SNMP::Info::SONMP::GLOBALS,
|
||||||
|
'nt_hw_ver' => 'ntWlanSwHardwareVer',
|
||||||
|
'nt_fw_ver' => 'ntWlanSwBootRomVer',
|
||||||
|
'nt_sw_ver' => 'ntWlanSwOpCodeVer',
|
||||||
|
'nt_cc' => 'ntWlanSwCountryCode',
|
||||||
|
'tftp_action' => 'ntWlanTransferStart',
|
||||||
|
'tftp_host' => 'ntWlanFileServer',
|
||||||
|
'tftp_file' => 'ntWlanDestFile',
|
||||||
|
'tftp_type' => 'ntWlanFileType',
|
||||||
|
'tftp_result' => 'ntWlanFileTransferStatus',
|
||||||
|
'tftp_xtype' => 'ntWlanTransferType',
|
||||||
|
'tftp_src_file' => 'ntWlanSrcFile',
|
||||||
|
'ftp_user' => 'ntWlanUserName',
|
||||||
|
'ftp_pass' => 'ntWlanPassword',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer2::FUNCS,
|
||||||
|
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||||
|
%SNMP::Info::SONMP::FUNCS,
|
||||||
|
|
||||||
|
# From ntWlanPortTable
|
||||||
|
'nt_prt_name' => 'ntWlanPortName',
|
||||||
|
'nt_dpx_admin' => 'ntWlanPortCapabilities',
|
||||||
|
'nt_auto' => 'ntWlanPortAutonegotiation',
|
||||||
|
'nt_dpx' => 'ntWlanPortSpeedDpxStatus',
|
||||||
|
|
||||||
|
# From ntWlanDot11PhyOperationTable
|
||||||
|
'nt_i_broadcast' => 'ntWlanDot11ClosedSystem',
|
||||||
|
|
||||||
|
# From ntWlanApVlanTable
|
||||||
|
'nt_i_vlan' => 'ntWlanApVlanDefaultVid',
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE,
|
||||||
|
%SNMP::Info::SONMP::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'nortel';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_bin {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $bin = $nap222x->nt_fw_ver();
|
||||||
|
return unless defined $bin;
|
||||||
|
|
||||||
|
if ( $bin =~ m/(\d+\.\d+\.\d+)/ ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $descr = $nap222x->description();
|
||||||
|
return unless defined $descr;
|
||||||
|
|
||||||
|
return 'AP-2220' if ( $descr =~ /2220/ );
|
||||||
|
return 'AP-2221' if ( $descr =~ /2221/ );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub mac {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $i_mac = $nap222x->i_mac();
|
||||||
|
|
||||||
|
# Return Interface MAC
|
||||||
|
foreach my $entry ( keys %$i_mac ) {
|
||||||
|
my $sn = $i_mac->{$entry};
|
||||||
|
next unless $sn;
|
||||||
|
return $sn;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub serial {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $i_mac = $nap222x->i_mac();
|
||||||
|
|
||||||
|
# Return Interface MAC
|
||||||
|
foreach my $entry ( keys %$i_mac ) {
|
||||||
|
my $sn = $i_mac->{$entry};
|
||||||
|
next unless $sn;
|
||||||
|
return $sn;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub interfaces {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $interfaces = $nap222x->i_index($partial) || {};
|
||||||
|
my $description = $nap222x->i_description($partial) || {};
|
||||||
|
|
||||||
|
my %interfaces = ();
|
||||||
|
foreach my $iid ( keys %$interfaces ) {
|
||||||
|
my $desc = $description->{$iid};
|
||||||
|
next unless defined $desc;
|
||||||
|
next if $desc =~ /lo/i;
|
||||||
|
|
||||||
|
$interfaces{$iid} = $desc;
|
||||||
|
}
|
||||||
|
return \%interfaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_duplex {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $mode = $nap222x->nt_dpx($partial) || {};
|
||||||
|
my $port_name = $nap222x->nt_prt_name($partial) || {};
|
||||||
|
my $interfaces = $nap222x->interfaces($partial) || {};
|
||||||
|
|
||||||
|
my %i_duplex;
|
||||||
|
foreach my $if ( keys %$interfaces ) {
|
||||||
|
my $port = $interfaces->{$if};
|
||||||
|
next unless $port =~ /dp/i;
|
||||||
|
foreach my $idx ( keys %$mode ) {
|
||||||
|
my $name = $port_name->{$idx} || 'unknown';
|
||||||
|
next unless $name eq $port;
|
||||||
|
my $duplex = $mode->{$idx};
|
||||||
|
|
||||||
|
$duplex = 'other' unless defined $duplex;
|
||||||
|
$duplex = 'half' if $duplex =~ /half/i;
|
||||||
|
$duplex = 'full' if $duplex =~ /full/i;
|
||||||
|
|
||||||
|
$i_duplex{$if} = $duplex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return \%i_duplex;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_duplex_admin {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $dpx_admin = $nap222x->nt_dpx_admin($partial) || {};
|
||||||
|
my $nt_auto = $nap222x->nt_auto($partial) || {};
|
||||||
|
my $interfaces = $nap222x->interfaces($partial) || {};
|
||||||
|
my $port_name = $nap222x->nt_prt_name($partial) || {};
|
||||||
|
|
||||||
|
my %i_duplex_admin;
|
||||||
|
foreach my $if ( keys %$interfaces ) {
|
||||||
|
my $port = $interfaces->{$if};
|
||||||
|
next unless $port =~ /dp/i;
|
||||||
|
foreach my $idx ( keys %$dpx_admin ) {
|
||||||
|
my $name = $port_name->{$idx} || 'unknown';
|
||||||
|
next unless $name eq $port;
|
||||||
|
my $duplex = $dpx_admin->{$idx};
|
||||||
|
my $auto = $nt_auto->{$idx};
|
||||||
|
|
||||||
|
$duplex = 'other' unless defined $duplex;
|
||||||
|
$duplex = 'half'
|
||||||
|
if ( $duplex =~ /half/i and $auto =~ /disabled/i );
|
||||||
|
$duplex = 'full'
|
||||||
|
if ( $duplex =~ /full/i and $auto =~ /disabled/i );
|
||||||
|
$duplex = 'auto' if $auto =~ /enabled/i;
|
||||||
|
|
||||||
|
$i_duplex_admin{$if} = $duplex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return \%i_duplex_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_name {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $interfaces = $nap222x->interfaces($partial) || {};
|
||||||
|
|
||||||
|
my %i_name;
|
||||||
|
foreach my $if ( keys %$interfaces ) {
|
||||||
|
my $desc = $interfaces->{$if};
|
||||||
|
next unless defined $desc;
|
||||||
|
|
||||||
|
my $name = 'unknown';
|
||||||
|
$name = 'Ethernet Interface' if $desc =~ /dp/i;
|
||||||
|
$name = 'Wireless Interface B' if $desc =~ /ndc/i;
|
||||||
|
$name = 'Wireless Interface A' if $desc =~ /ar/i;
|
||||||
|
|
||||||
|
$i_name{$if} = $name;
|
||||||
|
}
|
||||||
|
return \%i_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
# dot1dBasePortTable does not exist and dot1dTpFdbPort does not map to ifIndex
|
||||||
|
sub bp_index {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $interfaces = $nap222x->interfaces($partial) || {};
|
||||||
|
|
||||||
|
my %bp_index;
|
||||||
|
foreach my $iid ( keys %$interfaces ) {
|
||||||
|
my $desc = $interfaces->{$iid};
|
||||||
|
next unless defined $desc;
|
||||||
|
next unless $desc =~ /(ndc|ar)/i;
|
||||||
|
|
||||||
|
my $port = 1;
|
||||||
|
$port = 2 if $desc =~ /ndc/i;
|
||||||
|
|
||||||
|
$bp_index{$port} = $iid;
|
||||||
|
}
|
||||||
|
return \%bp_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Indicies don't match anywhere in these devices! Need to override to match
|
||||||
|
# IfIndex.
|
||||||
|
sub i_ssidlist {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
# modify partial to match index
|
||||||
|
if ( defined $partial ) {
|
||||||
|
$partial = $partial - 2;
|
||||||
|
}
|
||||||
|
my $ssids = $nap222x->orig_i_ssidlist($partial) || {};
|
||||||
|
|
||||||
|
my %i_ssidlist;
|
||||||
|
foreach my $iid ( keys %$ssids ) {
|
||||||
|
my $port = $iid + 2;
|
||||||
|
my $ssid = $ssids->{$iid};
|
||||||
|
next unless defined $ssid;
|
||||||
|
|
||||||
|
$i_ssidlist{$port} = $ssid;
|
||||||
|
}
|
||||||
|
return \%i_ssidlist;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_ssidbcast {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
# modify partial to match index
|
||||||
|
if ( defined $partial ) {
|
||||||
|
$partial = $partial - 2;
|
||||||
|
}
|
||||||
|
my $bcast = $nap222x->nt_i_broadcast($partial) || {};
|
||||||
|
|
||||||
|
my %i_ssidbcast;
|
||||||
|
foreach my $iid ( keys %$bcast ) {
|
||||||
|
my $port = $iid + 2;
|
||||||
|
my $bc = $bcast->{$iid};
|
||||||
|
next unless defined $bc;
|
||||||
|
|
||||||
|
$i_ssidbcast{$port} = $bc;
|
||||||
|
}
|
||||||
|
return \%i_ssidbcast;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_80211channel {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
# modify partial to match index
|
||||||
|
if ( defined $partial ) {
|
||||||
|
$partial = $partial - 2;
|
||||||
|
}
|
||||||
|
my $phy_type = $nap222x->dot11_phy_type($partial) || {};
|
||||||
|
my $cur_freq = $nap222x->dot11_cur_freq() || {};
|
||||||
|
my $cur_ch = $nap222x->dot11_cur_ch() || {};
|
||||||
|
|
||||||
|
my %i_80211channel;
|
||||||
|
foreach my $iid ( keys %$phy_type ) {
|
||||||
|
my $port = $iid + 2;
|
||||||
|
my $type = $phy_type->{$iid};
|
||||||
|
next unless defined $type;
|
||||||
|
if ( $type =~ /dsss/ ) {
|
||||||
|
my $ch = $cur_ch->{1};
|
||||||
|
next unless defined $ch;
|
||||||
|
$i_80211channel{$port} = $ch;
|
||||||
|
}
|
||||||
|
elsif ( $type =~ /ofdm/ ) {
|
||||||
|
my $ch = $cur_freq->{0};
|
||||||
|
next unless defined $ch;
|
||||||
|
$i_80211channel{$port} = $ch;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return \%i_80211channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_vlan {
|
||||||
|
my $nap222x = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
# modify partial to match index
|
||||||
|
if ( defined $partial ) {
|
||||||
|
$partial = $partial - 2;
|
||||||
|
}
|
||||||
|
my $vlans = $nap222x->nt_i_vlan($partial) || {};
|
||||||
|
|
||||||
|
my %i_vlan;
|
||||||
|
foreach my $iid ( keys %$vlans ) {
|
||||||
|
my $port = $iid + 2;
|
||||||
|
my $vlan = $vlans->{$iid};
|
||||||
|
next unless defined $vlan;
|
||||||
|
|
||||||
|
$i_vlan{$port} = $vlan;
|
||||||
|
}
|
||||||
|
return \%i_vlan;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer2::NAP222x - SNMP Interface to Nortel 2220 Series Access
|
||||||
|
Points
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $nap222x = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $nap222x->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Provides abstraction to the configuration information obtainable from a Nortel
|
||||||
|
2220 series wireless Access Points through SNMP.
|
||||||
|
|
||||||
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
|
my $nap222x = new SNMP::Info::Layer2::NAP222x(...);
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::SONMP
|
||||||
|
|
||||||
|
=item SNMP::Info::IEEE802dot11
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer2
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<NORTEL-WLAN-AP-MIB>
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Inherited MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $nap222x->model()
|
||||||
|
|
||||||
|
Returns the model extracted from C<sysDescr>.
|
||||||
|
|
||||||
|
=item $nap222x->os()
|
||||||
|
|
||||||
|
Returns 'nortel'
|
||||||
|
|
||||||
|
=item $nap222x->os_bin()
|
||||||
|
|
||||||
|
Returns the firmware version extracted from C<ntWlanSwBootRomVer>.
|
||||||
|
|
||||||
|
=item $nap222x->mac()
|
||||||
|
|
||||||
|
Returns the MAC address of the first Ethernet Interface.
|
||||||
|
|
||||||
|
=item $nap222x->serial()
|
||||||
|
|
||||||
|
Returns the MAC address of the first Ethernet Interface.
|
||||||
|
|
||||||
|
=item $nap222x->nt_hw_ver()
|
||||||
|
|
||||||
|
Returns the hardware version.
|
||||||
|
|
||||||
|
(C<ntWlanSwHardwareVer>)
|
||||||
|
|
||||||
|
=item $nap222x->nt_cc()
|
||||||
|
|
||||||
|
Returns the country code of the AP.
|
||||||
|
|
||||||
|
(C<ntWlanSwHardwareVer>)
|
||||||
|
|
||||||
|
=item $nap222x->tftp_action()
|
||||||
|
|
||||||
|
(C<ntWlanTransferStart>)
|
||||||
|
|
||||||
|
=item $nap222x->tftp_host()
|
||||||
|
|
||||||
|
(C<ntWlanFileServer>)
|
||||||
|
|
||||||
|
=item $nap222x->tftp_file()
|
||||||
|
|
||||||
|
(C<ntWlanDestFile>)
|
||||||
|
|
||||||
|
=item $nap222x->tftp_type()
|
||||||
|
|
||||||
|
(C<ntWlanFileType>)
|
||||||
|
|
||||||
|
=item $nap222x->tftp_result()
|
||||||
|
|
||||||
|
(C<ntWlanFileTransferStatus>)
|
||||||
|
|
||||||
|
=item $nap222x->tftp_xtype()
|
||||||
|
|
||||||
|
(C<ntWlanTransferType>)
|
||||||
|
|
||||||
|
=item $nap222x->tftp_src_file()
|
||||||
|
|
||||||
|
(C<ntWlanSrcFile>)
|
||||||
|
|
||||||
|
=item $nap222x->ftp_user()
|
||||||
|
|
||||||
|
(C<ntWlanUserName>)
|
||||||
|
|
||||||
|
=item $nap222x->ftp_pass()
|
||||||
|
|
||||||
|
(C<ntWlanPassword>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::SONMP
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
|
||||||
|
|
||||||
|
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a reference
|
||||||
|
to a hash.
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $nap222x->interfaces()
|
||||||
|
|
||||||
|
Returns reference to map of IIDs to physical ports.
|
||||||
|
|
||||||
|
=item $nap222x->i_duplex()
|
||||||
|
|
||||||
|
Returns reference to hash. Maps port operational duplexes to IIDs.
|
||||||
|
|
||||||
|
(C<ntWlanPortSpeedDpxStatus>)
|
||||||
|
|
||||||
|
=item $nap222x->i_duplex_admin()
|
||||||
|
|
||||||
|
Returns reference to hash. Maps port admin duplexes to IIDs.
|
||||||
|
|
||||||
|
(C<ntWlanPortCapabilities>)
|
||||||
|
|
||||||
|
=item $nap222x->i_name()
|
||||||
|
|
||||||
|
Returns a human name based upon port description.
|
||||||
|
|
||||||
|
=item $nap222x->bp_index()
|
||||||
|
|
||||||
|
Returns a mapping between C<ifIndex> and the Bridge Table. This does not
|
||||||
|
exist in the MIB and bridge port index is not the same as C<ifIndex> so it is
|
||||||
|
created.
|
||||||
|
|
||||||
|
=item $nap222x->i_ssidlist()
|
||||||
|
|
||||||
|
Returns reference to hash. SSID's recognized by the radio interface.
|
||||||
|
|
||||||
|
=item $nap222x->i_ssidbcast()
|
||||||
|
|
||||||
|
Returns reference to hash. Indicates whether the SSID is broadcast.
|
||||||
|
|
||||||
|
=item $nap222x->i_80211channel()
|
||||||
|
|
||||||
|
Returns reference to hash. Current operating frequency channel of the radio
|
||||||
|
interface.
|
||||||
|
|
||||||
|
=item $nap222x->i_vlan()
|
||||||
|
|
||||||
|
The default Vlan ID of the radio interfaces.
|
||||||
|
|
||||||
|
(C<ntWlanApVlanDefaultVid>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::SONMP
|
||||||
|
|
||||||
|
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
|
||||||
|
|
||||||
|
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
1299
Info/Layer2/NWSS2300.pm
Normal file
1299
Info/Layer2/NWSS2300.pm
Normal file
File diff suppressed because it is too large
Load Diff
457
Info/Layer2/Netgear.pm
Normal file
457
Info/Layer2/Netgear.pm
Normal file
@@ -0,0 +1,457 @@
|
|||||||
|
# SNMP::Info::Layer2::Netgear
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Bill Fenner
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer2::Netgear;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::Layer2;
|
||||||
|
use SNMP::Info::Entity;
|
||||||
|
use SNMP::Info::LLDP;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Entity SNMP::Info::Layer2 Exporter/;
|
||||||
|
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
# This will be filled in with the device's index into the EntPhysicalEntry
|
||||||
|
# table by the serial() function.
|
||||||
|
our $index = undef;
|
||||||
|
|
||||||
|
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::Entity::MIBS, %SNMP::Info::LLDP::MIBS, );
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Entity::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
|
||||||
|
ng_fsosver => '.1.3.6.1.4.1.4526.11.11.1.0',
|
||||||
|
ng_gsmserial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
|
||||||
|
ng_gsmosver => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Entity::FUNCS, %SNMP::Info::LLDP::FUNCS, );
|
||||||
|
|
||||||
|
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Entity::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'netgear';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'netgear';
|
||||||
|
}
|
||||||
|
|
||||||
|
# We will attempt to use Entity-MIB if present. In that case, we will
|
||||||
|
# also set the shared variable $index, which is used by other functions
|
||||||
|
# to index within Entity-MIB tables. This assumes, of course, that there
|
||||||
|
# is only one serial number (entPhysicalSerialNum) present in the table.
|
||||||
|
sub serial {
|
||||||
|
my $netgear = shift;
|
||||||
|
my $serial = undef;
|
||||||
|
|
||||||
|
my $e_serial = $netgear->e_serial();
|
||||||
|
if (defined($e_serial)) { # This unit sports the Entity-MIB
|
||||||
|
# Find entity table entry for this unit
|
||||||
|
foreach my $e ( keys %$e_serial ) {
|
||||||
|
if (defined ($e_serial->{$e}) and $e_serial->{$e} !~ /^\s*$/) {
|
||||||
|
$index = $e;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $e_serial->{$index} if defined $index;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Without Enitity-MIB, we've got to work our way through a bunch of
|
||||||
|
# different locales...
|
||||||
|
return $netgear->ng_gsmserial() if defined $netgear->model and $netgear->model =~ m/GSM\d/i;;
|
||||||
|
return 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
# If device supports Entity-MIB, index into that to divine model and
|
||||||
|
# hardware version, otherwise default to sysDescr.
|
||||||
|
sub model {
|
||||||
|
my $netgear = shift;
|
||||||
|
if (defined($index)) {
|
||||||
|
my $model = $netgear->e_descr();
|
||||||
|
my $e_hwver = $netgear->e_hwver();
|
||||||
|
|
||||||
|
$model = "$model->{$index} $e_hwver->{$index}";
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
return $netgear->description();
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifDescr is the same for all interfaces in a class, but the ifName is
|
||||||
|
# unique, so let's use that for port name. If all else fails,
|
||||||
|
# concatentate ifDesc and ifIndex.
|
||||||
|
sub interfaces {
|
||||||
|
my $netgear = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $interfaces = $netgear->i_index($partial) || {};
|
||||||
|
my $i_descr = $netgear->i_description($partial) || {};
|
||||||
|
my $i_name = $netgear->i_name($partial);
|
||||||
|
my $i_isset = ();
|
||||||
|
# Replace the description with the ifName field, if set
|
||||||
|
foreach my $iid ( keys %$i_name ) {
|
||||||
|
my $name = $i_name->{$iid};
|
||||||
|
next unless defined $name;
|
||||||
|
if (defined $name and $name !~ /^\s*$/) {
|
||||||
|
$interfaces->{$iid} = $name;
|
||||||
|
$i_isset->{$iid} = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# Replace the Index with the ifDescr field, appended with index
|
||||||
|
# number, to deal with devices with non-unique ifDescr.
|
||||||
|
foreach my $iid ( keys %$i_descr ) {
|
||||||
|
my $port = $i_descr->{$iid} . '-' . $iid;
|
||||||
|
next unless defined $port;
|
||||||
|
next if (defined $i_isset->{$iid} and $i_isset->{$iid} == 1);
|
||||||
|
$interfaces->{$iid} = $port;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $interfaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
# these seem to work for GSM models but not GS
|
||||||
|
# https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529
|
||||||
|
sub os_ver {
|
||||||
|
my $netgear = shift;
|
||||||
|
my $serial = $netgear->serial(); # Make sure that index gets primed
|
||||||
|
if (defined($index)) {
|
||||||
|
my $os_ver = $netgear->e_swver();
|
||||||
|
return $os_ver->{$index} if defined $os_ver;
|
||||||
|
}
|
||||||
|
return $netgear->ng_gsmosver() if defined $netgear->model and $netgear->model =~ m/GSM\d/i;
|
||||||
|
return $netgear->ng_fsosver() if defined $netgear->model and $netgear->model =~ m/FS\d/i;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Use LLDP
|
||||||
|
|
||||||
|
sub hasCDP {
|
||||||
|
my $netgear = shift;
|
||||||
|
return $netgear->hasLLDP() || $netgear->SUPER::hasCDP();
|
||||||
|
}
|
||||||
|
|
||||||
|
sub c_ip {
|
||||||
|
my $netgear = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $cdp = $netgear->SUPER::c_ip($partial) || {};
|
||||||
|
my $lldp = $netgear->lldp_ip($partial) || {};
|
||||||
|
|
||||||
|
my %c_ip;
|
||||||
|
foreach my $iid ( keys %$cdp ) {
|
||||||
|
my $ip = $cdp->{$iid};
|
||||||
|
next unless defined $ip;
|
||||||
|
|
||||||
|
$c_ip{$iid} = $ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $iid ( keys %$lldp ) {
|
||||||
|
my $ip = $lldp->{$iid};
|
||||||
|
next unless defined $ip;
|
||||||
|
|
||||||
|
$c_ip{$iid} = $ip;
|
||||||
|
}
|
||||||
|
return \%c_ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub c_if {
|
||||||
|
my $netgear = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $lldp = $netgear->lldp_if($partial) || {};
|
||||||
|
my $cdp = $netgear->SUPER::c_if($partial) || {};
|
||||||
|
|
||||||
|
my %c_if;
|
||||||
|
foreach my $iid ( keys %$cdp ) {
|
||||||
|
my $if = $cdp->{$iid};
|
||||||
|
next unless defined $if;
|
||||||
|
|
||||||
|
$c_if{$iid} = $if;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $iid ( keys %$lldp ) {
|
||||||
|
my $if = $lldp->{$iid};
|
||||||
|
next unless defined $if;
|
||||||
|
|
||||||
|
$c_if{$iid} = $if;
|
||||||
|
}
|
||||||
|
return \%c_if;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub c_port {
|
||||||
|
my $netgear = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $lldp = $netgear->lldp_port($partial) || {};
|
||||||
|
my $cdp = $netgear->SUPER::c_port($partial) || {};
|
||||||
|
|
||||||
|
my %c_port;
|
||||||
|
foreach my $iid ( keys %$cdp ) {
|
||||||
|
my $port = $cdp->{$iid};
|
||||||
|
next unless defined $port;
|
||||||
|
|
||||||
|
$c_port{$iid} = $port;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $iid ( keys %$lldp ) {
|
||||||
|
my $port = $lldp->{$iid};
|
||||||
|
next unless defined $port;
|
||||||
|
|
||||||
|
$c_port{$iid} = $port;
|
||||||
|
}
|
||||||
|
return \%c_port;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub c_id {
|
||||||
|
my $netgear = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $lldp = $netgear->lldp_id($partial) || {};
|
||||||
|
my $cdp = $netgear->SUPER::c_id($partial) || {};
|
||||||
|
|
||||||
|
my %c_id;
|
||||||
|
foreach my $iid ( keys %$cdp ) {
|
||||||
|
my $id = $cdp->{$iid};
|
||||||
|
next unless defined $id;
|
||||||
|
|
||||||
|
$c_id{$iid} = $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $iid ( keys %$lldp ) {
|
||||||
|
my $id = $lldp->{$iid};
|
||||||
|
next unless defined $id;
|
||||||
|
|
||||||
|
$c_id{$iid} = $id;
|
||||||
|
}
|
||||||
|
return \%c_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub c_platform {
|
||||||
|
my $netgear = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $lldp = $netgear->lldp_rem_sysdesc($partial) || {};
|
||||||
|
my $cdp = $netgear->SUPER::c_platform($partial) || {};
|
||||||
|
|
||||||
|
my %c_platform;
|
||||||
|
foreach my $iid ( keys %$cdp ) {
|
||||||
|
my $platform = $cdp->{$iid};
|
||||||
|
next unless defined $platform;
|
||||||
|
|
||||||
|
$c_platform{$iid} = $platform;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $iid ( keys %$lldp ) {
|
||||||
|
my $platform = $lldp->{$iid};
|
||||||
|
next unless defined $platform;
|
||||||
|
|
||||||
|
$c_platform{$iid} = $platform;
|
||||||
|
}
|
||||||
|
return \%c_platform;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Bill Fenner and Zoltan Erszenyi,
|
||||||
|
Hacked in LLDP support from Baystack.pm by
|
||||||
|
Nic Bernstein <nic@onlight.com>
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $netgear = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $netgear->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Provides abstraction to the configuration information obtainable from a
|
||||||
|
Netgear device through SNMP. See inherited classes' documentation for
|
||||||
|
inherited methods.
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer2
|
||||||
|
=item SNMP::Info::Entity
|
||||||
|
=item SNMP::Info::LLDP
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item Inherited Classes' MIBs
|
||||||
|
|
||||||
|
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
|
||||||
|
classes.
|
||||||
|
|
||||||
|
See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $netgear->vendor()
|
||||||
|
|
||||||
|
Returns 'netgear'
|
||||||
|
|
||||||
|
=item $netgear->os()
|
||||||
|
|
||||||
|
Returns 'netgear'
|
||||||
|
|
||||||
|
=item $netgear->model()
|
||||||
|
|
||||||
|
Returns concatenation of $e_model and $e_hwver if Entity MIB present,
|
||||||
|
otherwise returns description()
|
||||||
|
|
||||||
|
=item $netgear->os_ver()
|
||||||
|
|
||||||
|
Returns OS Version.
|
||||||
|
|
||||||
|
=item $netgear->serial()
|
||||||
|
|
||||||
|
Returns Serial Number if available (older FS switches have no accessible
|
||||||
|
serial number).
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Entity
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::LLDP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of
|
||||||
|
a reference to a hash.
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $netgear->interfaces()
|
||||||
|
|
||||||
|
Uses the i_name() field.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Topology information
|
||||||
|
|
||||||
|
Based upon the software version devices may support Link Layer Discovery
|
||||||
|
Protocol (LLDP).
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $netgear->hasCDP()
|
||||||
|
|
||||||
|
Returns true if the device is running LLDP.
|
||||||
|
|
||||||
|
=item $netgear->c_if()
|
||||||
|
|
||||||
|
Returns reference to hash. Key: iid Value: local device port (interfaces)
|
||||||
|
|
||||||
|
=item $netgear->c_ip()
|
||||||
|
|
||||||
|
Returns reference to hash. Key: iid Value: remote IPv4 address
|
||||||
|
|
||||||
|
If multiple entries exist with the same local port, c_if(), with the same IPv4
|
||||||
|
address, c_ip(), it may be a duplicate entry.
|
||||||
|
|
||||||
|
If multiple entries exist with the same local port, c_if(), with different
|
||||||
|
IPv4 addresses, c_ip(), there is either a non-LLDP device in between two or
|
||||||
|
more devices or multiple devices which are not directly connected.
|
||||||
|
|
||||||
|
Use the data from the Layer2 Topology Table below to dig deeper.
|
||||||
|
|
||||||
|
=item $netgear->c_port()
|
||||||
|
|
||||||
|
Returns reference to hash. Key: iid Value: remote port (interfaces)
|
||||||
|
|
||||||
|
=item $netgear->c_id()
|
||||||
|
|
||||||
|
Returns reference to hash. Key: iid Value: string value used to identify the
|
||||||
|
chassis component associated with the remote system.
|
||||||
|
|
||||||
|
=item $netgear->c_platform()
|
||||||
|
|
||||||
|
Returns reference to hash. Key: iid Value: Remote Device Type
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Entity
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
312
Info/Layer2/Orinoco.pm
Normal file
312
Info/Layer2/Orinoco.pm
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
# SNMP::Info::Layer2::Orinoco
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Eric Miller
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer2::Orinoco;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::IEEE802dot11;
|
||||||
|
use SNMP::Info::Layer2;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer2::Orinoco::ISA
|
||||||
|
= qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
|
||||||
|
@SNMP::Info::Layer2::Orinoco::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer2::MIBS,
|
||||||
|
%SNMP::Info::IEEE802dot11::MIBS,
|
||||||
|
|
||||||
|
#'ORiNOCO-MIB' => 'orinoco',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS
|
||||||
|
= ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, );
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer2::FUNCS,
|
||||||
|
%SNMP::Info::IEEE802dot11::FUNCS,
|
||||||
|
|
||||||
|
# ORiNOCO-MIB:oriWirelessIfPropertiesTable
|
||||||
|
#'ori_ssid' => 'oriWirelessIfNetworkName',
|
||||||
|
#'ori_channel' => 'oriWirelessIfChannel',
|
||||||
|
#'ori_closed_sys' => 'oriWirelessIfClosedSystem',
|
||||||
|
# ORiNOCO-MIB:oriSystemInvMgmtComponentTable
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, );
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'orinoco';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_ver {
|
||||||
|
my $orinoco = shift;
|
||||||
|
|
||||||
|
my $descr = $orinoco->description();
|
||||||
|
return unless defined $descr;
|
||||||
|
|
||||||
|
if ( $descr =~ m/V(\d+\.\d+)/ ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
if ( $descr =~ m/v(\d+\.\d+\.\d+)/ ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_bin {
|
||||||
|
my $orinoco = shift;
|
||||||
|
|
||||||
|
my $descr = $orinoco->description();
|
||||||
|
return unless defined $descr;
|
||||||
|
|
||||||
|
if ( $descr =~ m/V(\d+\.\d+)$/ ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
if ( $descr =~ m/v(\d+\.\d+\.\d+)$/ ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'proxim';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $orinoco = shift;
|
||||||
|
|
||||||
|
my $descr = $orinoco->description();
|
||||||
|
return unless defined $descr;
|
||||||
|
|
||||||
|
return $1 if ( $descr =~ /(AP-\d+)/ );
|
||||||
|
return 'WavePOINT-II' if ( $descr =~ /WavePOINT-II/ );
|
||||||
|
return 'Outdoor Router' if ( $descr =~ /Wireless Router/ );
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub serial {
|
||||||
|
my $orinoco = shift;
|
||||||
|
|
||||||
|
my $descr = $orinoco->description();
|
||||||
|
return unless defined $descr;
|
||||||
|
|
||||||
|
$descr = $1 if $descr =~ /SN-(\S+)/;
|
||||||
|
return $descr;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_ignore {
|
||||||
|
my $orinoco = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $descr = $orinoco->i_description($partial) || {};
|
||||||
|
|
||||||
|
my %i_ignore;
|
||||||
|
foreach my $if ( keys %$descr ) {
|
||||||
|
my $type = $descr->{$if};
|
||||||
|
|
||||||
|
# Skip virtual interfaces
|
||||||
|
$i_ignore{$if}++ if $type =~ /(lo|empty|PCMCIA)/i;
|
||||||
|
}
|
||||||
|
return \%i_ignore;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub interfaces {
|
||||||
|
my $orinoco = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $interfaces = $orinoco->i_index($partial) || {};
|
||||||
|
my $descriptions = $orinoco->i_description($partial) || {};
|
||||||
|
|
||||||
|
my %interfaces = ();
|
||||||
|
foreach my $iid ( keys %$interfaces ) {
|
||||||
|
my $desc = $descriptions->{$iid};
|
||||||
|
next unless defined $desc;
|
||||||
|
next if $desc =~ /(lo|empty|PCMCIA)/i;
|
||||||
|
|
||||||
|
$desc = 'AMD' if $desc =~ /AMD/;
|
||||||
|
|
||||||
|
$interfaces{$iid} = $desc;
|
||||||
|
}
|
||||||
|
return \%interfaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sub i_ssidbcast {
|
||||||
|
# my $orinoco = shift;
|
||||||
|
# my $partial = shift;
|
||||||
|
#
|
||||||
|
# my $bcast = $orinoco->ori_closed_sys($partial) || {};
|
||||||
|
#
|
||||||
|
# my %i_ssidbcast;
|
||||||
|
# foreach my $iid (keys %$bcast){
|
||||||
|
# my $bc = $bcast->{$iid};
|
||||||
|
# next unless defined $bc;
|
||||||
|
#
|
||||||
|
# $i_ssidbcast{$iid} = $bc;
|
||||||
|
# }
|
||||||
|
# return \%i_ssidbcast;
|
||||||
|
#}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer2::Orinoco - SNMP Interface to Orinoco Series Access Points
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $orinoco = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $orinoco->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Provides abstraction to the configuration information obtainable from
|
||||||
|
Orinoco Access Point through SNMP. Orinoco devices have been manufactured
|
||||||
|
by Proxim, Agere, and Lucent.
|
||||||
|
|
||||||
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
|
my $orinoco = new SNMP::Info::Layer2::Orinoco(...);
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer2
|
||||||
|
|
||||||
|
=item SNMP::Info::IEEE802dot11
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Inherited MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $orinoco->vendor()
|
||||||
|
|
||||||
|
Returns 'proxim'
|
||||||
|
|
||||||
|
=item $orinoco->model()
|
||||||
|
|
||||||
|
Returns the model extracted from C<sysDescr>.
|
||||||
|
|
||||||
|
=item $orinoco->os()
|
||||||
|
|
||||||
|
Returns 'Orinoco'
|
||||||
|
|
||||||
|
=item $orinoco->os_ver()
|
||||||
|
|
||||||
|
Returns the software version extracted from C<sysDescr>.
|
||||||
|
|
||||||
|
=item $orinoco->os_bin()
|
||||||
|
|
||||||
|
Returns the firmware version extracted from C<sysDescr>.
|
||||||
|
|
||||||
|
=item $orinoco->serial()
|
||||||
|
|
||||||
|
Returns the serial number extracted from C<sysDescr>.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
|
||||||
|
|
||||||
|
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a reference
|
||||||
|
to a hash.
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $orinoco->interfaces()
|
||||||
|
|
||||||
|
Returns reference to map of IIDs to physical ports.
|
||||||
|
|
||||||
|
=item $orinoco->i_ignore()
|
||||||
|
|
||||||
|
Returns reference to hash of IIDs to ignore.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer2
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
|
||||||
|
|
||||||
|
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
1303
Info/Layer2/Trapeze.pm
Normal file
1303
Info/Layer2/Trapeze.pm
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,67 +1,63 @@
|
|||||||
# SNMP::Info::Layer2::ZyXEL_DSLAM
|
# 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.
|
# 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:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of Netdisco nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer2::ZyXEL_DSLAM;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
|
use strict;
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info::Layer2;
|
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//;
|
@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.15';
|
||||||
|
|
||||||
# Set for No CDP
|
# Set for No CDP
|
||||||
%GLOBALS = (
|
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
|
||||||
%SNMP::Info::Layer2::GLOBALS
|
|
||||||
);
|
|
||||||
|
|
||||||
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
|
%FUNCS = (
|
||||||
'ip_adresses' => 'ipAdEntAddr',
|
%SNMP::Info::Layer2::FUNCS,
|
||||||
'i_name' => 'ifDescr',
|
'ip_adresses' => 'ipAdEntAddr',
|
||||||
'i_description' => 'adslLineConfProfile',
|
'i_name' => 'ifDescr',
|
||||||
);
|
'i_description' => 'adslLineConfProfile',
|
||||||
|
);
|
||||||
|
|
||||||
%MIBS = (
|
%MIBS
|
||||||
%SNMP::Info::Layer2::MIBS,
|
= ( %SNMP::Info::Layer2::MIBS, 'ADSL-LINE-MIB' => 'adslLineConfProfile' );
|
||||||
'ADSL-LINE-MIB' => 'adslLineConfProfile'
|
|
||||||
);
|
|
||||||
|
|
||||||
%MUNGE = (%SNMP::Info::Layer2::MUNGE
|
|
||||||
);
|
|
||||||
|
|
||||||
|
%MUNGE = ( %SNMP::Info::Layer2::MUNGE );
|
||||||
|
|
||||||
sub layers {
|
sub layers {
|
||||||
my $zyxel = shift;
|
my $zyxel = shift;
|
||||||
my $layers = $zyxel->layers();
|
my $layers = $zyxel->layers();
|
||||||
return $layers if defined $layers;
|
return $layers if defined $layers;
|
||||||
|
|
||||||
@@ -80,11 +76,11 @@ sub os {
|
|||||||
sub os_ver {
|
sub os_ver {
|
||||||
my $zyxel = shift;
|
my $zyxel = shift;
|
||||||
my $descr = $zyxel->description();
|
my $descr = $zyxel->description();
|
||||||
|
|
||||||
if ($descr =~ m/version (\S+) /){
|
if ( $descr =~ m/version (\S+) / ) {
|
||||||
return $1;
|
return $1;
|
||||||
}
|
}
|
||||||
return undef;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub model {
|
sub model {
|
||||||
@@ -92,23 +88,26 @@ sub model {
|
|||||||
|
|
||||||
my $desc = $zyxel->description();
|
my $desc = $zyxel->description();
|
||||||
|
|
||||||
if ($desc =~ /8-port ADSL Module\(Annex A\)/){
|
if ( $desc =~ /8-port ADSL Module\(Annex A\)/ ) {
|
||||||
return "AAM1008-61";
|
return "AAM1008-61";
|
||||||
} elsif ($desc =~ /8-port ADSL Module\(Annex B\)/){
|
}
|
||||||
|
elsif ( $desc =~ /8-port ADSL Module\(Annex B\)/ ) {
|
||||||
return "AAM1008-63";
|
return "AAM1008-63";
|
||||||
}
|
}
|
||||||
return undef;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub ip{
|
sub ip {
|
||||||
my $zyxel = shift;
|
my $zyxel = shift;
|
||||||
my $ip_hash = $zyxel->ip_addresses();
|
my $ip_hash = $zyxel->ip_addresses();
|
||||||
my $ip;
|
my $found_ip;
|
||||||
|
|
||||||
foreach $ip (keys %{$ip_hash}) {
|
foreach my $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}$/);
|
$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;
|
1;
|
||||||
__END__
|
__END__
|
||||||
@@ -127,7 +126,6 @@ Dmitry Sergienko (C<dmitry@trifle.net>)
|
|||||||
my $zyxel = new SNMP::Info(
|
my $zyxel = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myhub',
|
DestHost => 'myhub',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 1
|
Version => 1
|
||||||
@@ -155,13 +153,12 @@ inherited methods.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item ADSL-LINE-MIB
|
=item F<ADSL-LINE-MIB>
|
||||||
|
|
||||||
This MIB assumedly obtainable through ZyXEL or possibly included with your device.
|
|
||||||
|
|
||||||
=item Inherited Classes
|
=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
|
=back
|
||||||
|
|
||||||
@@ -189,19 +186,23 @@ Culls Version from description()
|
|||||||
|
|
||||||
Returns IP Address of DSLAM.
|
Returns IP Address of DSLAM.
|
||||||
|
|
||||||
(B<ipAdEntAddr>)
|
(C<ipAdEntAddr>)
|
||||||
|
|
||||||
=item $zyxel->model()
|
=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
|
=back
|
||||||
|
|
||||||
=head2 Global Methods imported from SNMP::Info::Layer2
|
=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
|
=head2 Overrides
|
||||||
|
|
||||||
@@ -209,7 +210,7 @@ See documentation in SNMP::Info::Layer2 for details.
|
|||||||
|
|
||||||
=item $zyxel->i_name()
|
=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()
|
=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
|
=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
|
=cut
|
||||||
|
|||||||
726
Info/Layer3.pm
726
Info/Layer3.pm
@@ -1,138 +1,201 @@
|
|||||||
# SNMP::Info::Layer3 - SNMP Interface to Layer3 devices
|
# 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
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
package SNMP::Info::Layer3;
|
package SNMP::Info::Layer3;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info;
|
use SNMP::Info;
|
||||||
use SNMP::Info::CDP;
|
|
||||||
use SNMP::Info::CiscoStats;
|
|
||||||
use SNMP::Info::Bridge;
|
use SNMP::Info::Bridge;
|
||||||
use SNMP::Info::EtherLike;
|
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::PowerEthernet SNMP::Info::IPv6
|
||||||
@SNMP::Info::Layer3::ISA = qw/SNMP::Info SNMP::Info::CDP SNMP::Info::Bridge
|
SNMP::Info::Entity SNMP::Info::EtherLike
|
||||||
SNMP::Info::EtherLike SNMP::Info::CiscoStats Exporter/;
|
SNMP::Info::Bridge SNMP::Info::AdslLine
|
||||||
|
SNMP::Info Exporter/;
|
||||||
@SNMP::Info::Layer3::EXPORT_OK = qw//;
|
@SNMP::Info::Layer3::EXPORT_OK = qw//;
|
||||||
|
|
||||||
$DEBUG=0;
|
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||||
$SNMP::debugging=$DEBUG;
|
|
||||||
|
|
||||||
$INIT = 0;
|
$VERSION = '3.15';
|
||||||
|
|
||||||
%MIBS = ( %SNMP::Info::MIBS,
|
%MIBS = (
|
||||||
%SNMP::Info::Bridge::MIBS,
|
%SNMP::Info::MIBS,
|
||||||
%SNMP::Info::CDP::MIBS,
|
%SNMP::Info::AdslLine::MIBS,
|
||||||
%SNMP::Info::CiscoStats::MIBS,
|
%SNMP::Info::Bridge::MIBS,
|
||||||
%SNMP::Info::EtherLike::MIBS,
|
%SNMP::Info::EtherLike::MIBS,
|
||||||
'ENTITY-MIB' => 'entPhysicalName',
|
%SNMP::Info::Entity::MIBS,
|
||||||
'CISCO-PRODUCTS-MIB' => 'sysName',
|
%SNMP::Info::PowerEthernet::MIBS,
|
||||||
'OSPF-MIB' => 'ospfRouterId',
|
%SNMP::Info::IPv6::MIBS,
|
||||||
);
|
'IP-MIB' => 'ipNetToMediaIfIndex',
|
||||||
|
'OSPF-MIB' => 'ospfRouterId',
|
||||||
|
'BGP4-MIB' => 'bgpIdentifier',
|
||||||
|
);
|
||||||
|
|
||||||
%GLOBALS = (
|
%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 = (
|
# Inherit the super class ones
|
||||||
%SNMP::Info::FUNCS,
|
%SNMP::Info::GLOBALS,
|
||||||
%SNMP::Info::CDP::FUNCS,
|
%SNMP::Info::AdslLine::GLOBALS,
|
||||||
%SNMP::Info::CiscoStats::FUNCS,
|
%SNMP::Info::Bridge::GLOBALS,
|
||||||
%SNMP::Info::Bridge::FUNCS,
|
%SNMP::Info::EtherLike::GLOBALS,
|
||||||
%SNMP::Info::EtherLike::FUNCS,
|
%SNMP::Info::Entity::GLOBALS,
|
||||||
# IFMIB
|
%SNMP::Info::PowerEthernet::GLOBALS,
|
||||||
'i_name2' => 'ifName',
|
%SNMP::Info::IPv6::GLOBALS,
|
||||||
# Address Translation Table (ARP Cache)
|
'mac' => 'ifPhysAddress.1',
|
||||||
'at_index' => 'atIfIndex',
|
'serial1' =>
|
||||||
'at_paddr' => 'atPhysAddress',
|
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
|
||||||
'at_netaddr' => 'atNetAddress',
|
'router_ip' => 'ospfRouterId.0',
|
||||||
'ospf_ip' => 'ospfHostIpAddress',
|
'bgp_id' => 'bgpIdentifier.0',
|
||||||
'ent_serial' => 'entPhysicalSerialNum',
|
'bgp_local_as' => 'bgpLocalAs.0',
|
||||||
'ent_chassis'=> 'entPhysicalDescr',
|
);
|
||||||
);
|
|
||||||
|
%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 = (
|
%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
|
# Method OverRides
|
||||||
|
|
||||||
sub root_ip {
|
sub root_ip {
|
||||||
my $l3 = shift;
|
my $l3 = shift;
|
||||||
|
|
||||||
my $router_ip = $l3->router_ip();
|
my $router_ip = $l3->router_ip();
|
||||||
my $ospf_ip = $l3->ospf_ip();
|
my $ospf_ip = $l3->ospf_ip();
|
||||||
|
|
||||||
# return the first one found here (should be only)
|
# if the router ip exists and is a route advertised by the device we prefer
|
||||||
if (defined $ospf_ip and scalar(keys %$ospf_ip)){
|
# it over the others
|
||||||
foreach my $key (keys %$ospf_ip){
|
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};
|
my $ip = $ospf_ip->{$key};
|
||||||
print " SNMP::Layer3::root_ip() using $ip\n" if $DEBUG;
|
next if $ip eq '0.0.0.0';
|
||||||
|
next unless $l3->snmp_connect_ip($ip);
|
||||||
|
print " SNMP::Layer3::root_ip() using $ip\n" if $l3->debug();
|
||||||
return $ip;
|
return $ip;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $router_ip if defined $router_ip;
|
return;
|
||||||
return undef;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_ignore {
|
sub i_ignore {
|
||||||
my $l3 = shift;
|
my $l3 = shift;
|
||||||
|
my $partial = shift;
|
||||||
my $interfaces = $l3->interfaces();
|
|
||||||
|
my $interfaces = $l3->interfaces($partial) || {};
|
||||||
|
|
||||||
my %i_ignore;
|
my %i_ignore;
|
||||||
foreach my $if (keys %$interfaces) {
|
foreach my $if ( keys %$interfaces ) {
|
||||||
|
|
||||||
# lo -> cisco aironet 350 loopback
|
# 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}++;
|
$i_ignore{$if}++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,34 +204,45 @@ sub i_ignore {
|
|||||||
|
|
||||||
sub serial {
|
sub serial {
|
||||||
my $l3 = shift;
|
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;
|
|
||||||
|
|
||||||
# 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 undef;
|
my $serial1 = $l3->serial1();
|
||||||
|
my $e_parent = $l3->e_parent() || {};
|
||||||
|
|
||||||
|
foreach my $iid ( keys %$e_parent ) {
|
||||||
|
my $parent = $e_parent->{$iid};
|
||||||
|
if ( $parent eq '0' ) {
|
||||||
|
my $serial = $l3->e_serial($iid);
|
||||||
|
if ( $serial ) {
|
||||||
|
return $serial->{$iid};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
my $descr = $l3->e_descr($iid);
|
||||||
|
if ( $descr and $descr =~ /serial#?:\s*([a-z0-9]+)/i )
|
||||||
|
{
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# $l3->model() - the sysObjectID returns an IID to an entry in
|
# $l3->model() - the sysObjectID returns an IID to an entry in
|
||||||
# the CISCO-PRODUCT-MIB. Look it up and return it.
|
# the CISCO-PRODUCT-MIB. Look it up and return it.
|
||||||
sub model {
|
sub model {
|
||||||
my $l3 = shift;
|
my $l3 = shift;
|
||||||
my $id = $l3->id();
|
my $id = $l3->id();
|
||||||
|
|
||||||
unless (defined $id){
|
unless ( defined $id ) {
|
||||||
print " SNMP::Info::Layer3::model() - Device does not support sysObjectID\n" if $DEBUG;
|
print
|
||||||
return undef;
|
" SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
|
||||||
|
if $l3->debug();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $model = &SNMP::translateObj($id);
|
my $model = &SNMP::translateObj($id);
|
||||||
|
|
||||||
return $id unless defined $model;
|
return $id unless defined $model;
|
||||||
@@ -180,31 +254,35 @@ sub model {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub i_name {
|
sub i_name {
|
||||||
my $l3 = shift;
|
my $l3 = shift;
|
||||||
my $i_index = $l3->i_index();
|
my $partial = shift;
|
||||||
my $i_alias = $l3->i_alias();
|
|
||||||
my $i_name2 = $l3->i_name2();
|
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;
|
my %i_name;
|
||||||
foreach my $iid (keys %$i_name2){
|
foreach my $iid ( keys %$i_name2 ) {
|
||||||
my $name = $i_name2->{$iid};
|
my $name = $i_name2->{$iid};
|
||||||
my $alias = $i_alias->{$iid};
|
my $alias = $i_alias->{$iid};
|
||||||
$i_name{$iid} = (defined $alias and $alias !~ /^\s*$/) ?
|
$i_name{$iid}
|
||||||
$alias :
|
= ( defined $alias and $alias !~ /^\s*$/ )
|
||||||
$name;
|
? $alias
|
||||||
|
: $name;
|
||||||
}
|
}
|
||||||
|
|
||||||
return \%i_name;
|
return \%i_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub i_duplex {
|
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;
|
my %i_index;
|
||||||
foreach my $el_port (keys %$el_duplex){
|
foreach my $el_port ( keys %$el_duplex ) {
|
||||||
my $iid = $el_index->{$el_port};
|
my $iid = $el_index->{$el_port};
|
||||||
next unless defined $iid;
|
next unless defined $iid;
|
||||||
my $duplex = $el_duplex->{$el_port};
|
my $duplex = $el_duplex->{$el_port};
|
||||||
@@ -220,40 +298,78 @@ sub i_duplex {
|
|||||||
|
|
||||||
# $l3->interfaces() - Map the Interfaces to their physical names
|
# $l3->interfaces() - Map the Interfaces to their physical names
|
||||||
sub interfaces {
|
sub interfaces {
|
||||||
my $l3 = shift;
|
my $l3 = shift;
|
||||||
my $interfaces = $l3->i_index();
|
my $partial = shift;
|
||||||
my $descriptions = $l3->i_description();
|
|
||||||
|
|
||||||
my %interfaces = ();
|
my $interfaces = $l3->i_index($partial);
|
||||||
foreach my $iid (keys %$interfaces){
|
my $i_descr = $l3->i_description($partial);
|
||||||
my $desc = $descriptions->{$iid};
|
|
||||||
next unless defined $desc;
|
|
||||||
|
|
||||||
$interfaces{$iid} = $desc;
|
# Check for duplicates in ifDescr, if so uniquely identify by adding
|
||||||
|
# ifIndex to repeated values
|
||||||
|
my %seen;
|
||||||
|
foreach my $iid ( keys %$i_descr ) {
|
||||||
|
my $port = $i_descr->{$iid};
|
||||||
|
next unless defined $port;
|
||||||
|
if ( $seen{$port}++ ) {
|
||||||
|
$interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$interfaces->{$iid} = $port;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return $interfaces;
|
||||||
return \%interfaces;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub vendor {
|
sub vendor {
|
||||||
my $l3 = shift;
|
my $l3 = shift;
|
||||||
|
|
||||||
my $descr = $l3->description();
|
my $descr = $l3->description();
|
||||||
|
my $id = $l3->id();
|
||||||
|
|
||||||
return 'cisco' if ($descr =~ /(cisco|ios)/i);
|
# .1.3.6.1.4.1.9.1 is the CISCO-PRODUCTS-MIB
|
||||||
return 'foundry' if ($descr =~ /foundry/i);
|
# .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;
|
1;
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -261,14 +377,13 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $l3 = new SNMP::Info(
|
my $l3 = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
)
|
)
|
||||||
or die "Can't connect to DestHost.\n";
|
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";
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
# Let's get some basic Port information
|
# Let's get some basic Port information
|
||||||
@@ -284,14 +399,15 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
This class is usually used as a superclass for more specific device classes listed under
|
This class is usually used as a superclass for more specific device classes
|
||||||
SNMP::Info::Layer3::* Please read all docs under SNMP::Info first.
|
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.
|
Provides generic methods for accessing SNMP data for Layer 3 network devices.
|
||||||
Includes support for Layer2+3 devices.
|
Includes support for Layer2+3 devices.
|
||||||
|
|
||||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
a more specific class using the method above.
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
my $l3 = new SNMP::Info::Layer3(...);
|
my $l3 = new SNMP::Info::Layer3(...);
|
||||||
|
|
||||||
@@ -301,33 +417,43 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=item SNMP::Info
|
=item SNMP::Info
|
||||||
|
|
||||||
=item SNMP::Info::Bridge
|
=item SNMP::Info::Bridge (For L2/L3 devices)
|
||||||
|
|
||||||
=item SNMP::Info::CDP
|
|
||||||
|
|
||||||
=item SNMP::Info::CiscoStats
|
|
||||||
|
|
||||||
=item SNMP::Info::EtherLike
|
=item SNMP::Info::EtherLike
|
||||||
|
|
||||||
|
=item SNMP::Info::Entity
|
||||||
|
|
||||||
|
=item SNMP::Info::PowerEthernet
|
||||||
|
|
||||||
|
=item SNMP::Info::IPv6
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Required MIBs
|
=head2 Required MIBs
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item CISCO-PRODUCTS-MIB
|
=item F<IP-MIB>
|
||||||
|
|
||||||
=item ENTITY-MIB
|
=item F<OSPF-MIB>
|
||||||
|
|
||||||
=item OSPF-MIB
|
=item F<BGP4-MIB>
|
||||||
|
|
||||||
=item Inherited Classes
|
|
||||||
|
|
||||||
MIBs required by the inherited classes listed above.
|
|
||||||
|
|
||||||
=back
|
=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
|
=head1 GLOBALS
|
||||||
|
|
||||||
@@ -335,21 +461,27 @@ These are methods that return scalar value from SNMP
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item $l3->chassis()
|
|
||||||
|
|
||||||
Returns Chassis type (model).
|
|
||||||
|
|
||||||
(B<entPhysicalDescr.1>)
|
|
||||||
|
|
||||||
=item $l3->mac()
|
=item $l3->mac()
|
||||||
|
|
||||||
Returns root port mac address
|
Returns root port mac address
|
||||||
|
|
||||||
(B<ifPhysAddress.1>)
|
(C<ifPhysAddress.1>)
|
||||||
|
|
||||||
=item $l3->router_ip()
|
=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
|
=back
|
||||||
|
|
||||||
@@ -359,41 +491,44 @@ Returns root port mac address
|
|||||||
|
|
||||||
=item $l3->model()
|
=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.
|
Removes 'cisco' from cisco devices for readability.
|
||||||
|
|
||||||
=item $l3->serial()
|
=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()
|
=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
|
=back
|
||||||
|
|
||||||
=head2 Globals imported from SNMP::Info
|
=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
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
See documentation in SNMP::Info::EtherLike for details.
|
|
||||||
|
|
||||||
=head1 TABLE ENTRIES
|
|
||||||
|
|
||||||
These are methods that return tables of information in the form of a reference
|
These are methods that return tables of information in the form of a reference
|
||||||
to a hash.
|
to a hash.
|
||||||
@@ -404,7 +539,8 @@ to a hash.
|
|||||||
|
|
||||||
=item $l3->interfaces()
|
=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()
|
Only returns those iids that have a description listed in $l3->i_description()
|
||||||
|
|
||||||
@@ -418,7 +554,7 @@ Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
|
|||||||
|
|
||||||
Returns reference to hash of iid to human set name.
|
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()
|
=item $l3->i_duplex()
|
||||||
|
|
||||||
@@ -427,52 +563,244 @@ Returns reference to hash of iid to current link duplex setting.
|
|||||||
Maps $l3->el_index() to $l3->el_duplex, then culls out
|
Maps $l3->el_index() to $l3->el_duplex, then culls out
|
||||||
full,half, or auto and sets the map to that value.
|
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
|
=back
|
||||||
|
|
||||||
=head2 ARP Cache Entries
|
=head2 F<IP-MIB> Arp Cache Table (C<ipNetToMediaTable>)
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item $l3->at_index()
|
=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()
|
=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()
|
=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
|
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
|
=back
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info
|
=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
|
=head2 Table Methods imported from SNMP::Info::Bridge
|
||||||
|
|
||||||
See documentation in SNMP::Info::Bridge for details.
|
See L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::CDP
|
|
||||||
|
|
||||||
See documentation in SNMP::Info::CDP for details.
|
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
|
||||||
|
|
||||||
See documentation in SNMP::Info::CiscoStats for details.
|
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::EtherLike
|
=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
|
=cut
|
||||||
|
|||||||
@@ -1,88 +1,89 @@
|
|||||||
# SNMP::Info::Layer3::Aironet
|
# 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
|
# Copyright (c) 2002,2003 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer3::Aironet;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info::Layer3;
|
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//;
|
@SNMP::Info::Layer3::Aironet::EXPORT_OK = qw//;
|
||||||
|
|
||||||
$DEBUG=0;
|
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
|
||||||
$SNMP::debugging=$DEBUG;
|
|
||||||
|
|
||||||
$INIT = 0;
|
$VERSION = '3.15';
|
||||||
%MIBS = (
|
|
||||||
%SNMP::Info::Layer3::MIBS,
|
%MIBS = (
|
||||||
'AWCVX-MIB' => 'awcIfTable',
|
%SNMP::Info::Layer3::MIBS,
|
||||||
'IEEE802dot11-MIB' => 'dot11StationID',
|
'AWCVX-MIB' => 'awcIfTable',
|
||||||
);
|
'IEEE802dot11-MIB' => 'dot11StationID',
|
||||||
|
);
|
||||||
|
|
||||||
%GLOBALS = (
|
%GLOBALS = (
|
||||||
%SNMP::Info::Layer3::GLOBALS,
|
%SNMP::Info::Layer3::GLOBALS,
|
||||||
'mac' => 'dot11StationID.2',
|
'mac' => 'dot11StationID.2',
|
||||||
# AWC Ethernet Table
|
|
||||||
'awc_duplex' => 'awcEtherDuplex.0',
|
|
||||||
);
|
|
||||||
|
|
||||||
%FUNCS = (
|
# AWC Ethernet Table
|
||||||
%SNMP::Info::Layer3::FUNCS,
|
'awc_duplex' => 'awcEtherDuplex.0',
|
||||||
'i_mac2' => 'ifPhysAddress',
|
);
|
||||||
'i_mtu2' => 'ifMtu',
|
|
||||||
'i_ssid' => 'dot11DesiredSSID',
|
%FUNCS = (
|
||||||
# Bridge-mib overrides
|
%SNMP::Info::Layer3::FUNCS,
|
||||||
'fw_mac2' => 'dot1dTpFdbAddress',
|
'i_mac2' => 'ifPhysAddress',
|
||||||
'fw_port2' => 'dot1dTpFdbPort',
|
'i_mtu2' => 'ifMtu',
|
||||||
'bp_index2' => 'dot1dBasePortIfIndex',
|
'i_ssid' => 'dot11DesiredSSID',
|
||||||
# AWC Interface Table (awcIfTable)
|
|
||||||
'awc_default_mac' => 'awcIfDefaultPhyAddress',
|
# Bridge-mib overrides
|
||||||
'awc_mac' => 'awcIfPhyAddress',
|
'fw_mac2' => 'dot1dTpFdbAddress',
|
||||||
'awc_ip' => 'awcIfIpAddress',
|
'fw_port2' => 'dot1dTpFdbPort',
|
||||||
'awc_netmask' => 'awcIfIpNetMask',
|
'bp_index2' => 'dot1dBasePortIfIndex',
|
||||||
'awc_msdu' => 'awcIfMSDUMaxLength',
|
|
||||||
);
|
# AWC Interface Table (awcIfTable)
|
||||||
|
'awc_default_mac' => 'awcIfDefaultPhyAddress',
|
||||||
|
'awc_mac' => 'awcIfPhyAddress',
|
||||||
|
'awc_ip' => 'awcIfIpAddress',
|
||||||
|
'awc_netmask' => 'awcIfIpNetMask',
|
||||||
|
'awc_msdu' => 'awcIfMSDUMaxLength',
|
||||||
|
);
|
||||||
|
|
||||||
%MUNGE = (
|
%MUNGE = (
|
||||||
# Inherit all the built in munging
|
|
||||||
%SNMP::Info::Layer3::MUNGE,
|
# Inherit all the built in munging
|
||||||
'i_mac2' => \&SNMP::Info::munge_mac,
|
%SNMP::Info::Layer3::MUNGE,
|
||||||
'awc_mac' => \&SNMP::Info::munge_mac,
|
'i_mac2' => \&SNMP::Info::munge_mac,
|
||||||
'fw_mac2' => \&SNMP::Info::munge_mac,
|
'awc_mac' => \&SNMP::Info::munge_mac,
|
||||||
);
|
'fw_mac2' => \&SNMP::Info::munge_mac,
|
||||||
|
);
|
||||||
|
|
||||||
sub os {
|
sub os {
|
||||||
return 'aironet';
|
return 'aironet';
|
||||||
@@ -90,35 +91,35 @@ sub os {
|
|||||||
|
|
||||||
sub os_ver {
|
sub os_ver {
|
||||||
my $aironet = shift;
|
my $aironet = shift;
|
||||||
my $descr = $aironet->description();
|
my $descr = $aironet->description() || '';
|
||||||
|
|
||||||
# CAP340 11.21, AP4800-E 11.21
|
# 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;
|
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 $1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return undef;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Override wireless port with static info
|
# Override wireless port with static info
|
||||||
sub bp_index {
|
sub bp_index {
|
||||||
my $aironet = shift;
|
my $aironet = shift;
|
||||||
my $interfaces = $aironet->interfaces();
|
my $interfaces = $aironet->interfaces();
|
||||||
my $bp_index = $aironet->bp_index2();
|
my $bp_index = $aironet->bp_index2();
|
||||||
|
|
||||||
foreach my $iid (keys %$interfaces){
|
foreach my $iid ( keys %$interfaces ) {
|
||||||
my $port = $interfaces->{$iid};
|
my $port = $interfaces->{$iid};
|
||||||
|
|
||||||
# Hardwire the wireless port to the transparent bridge port
|
# Hardwire the wireless port to the transparent bridge port
|
||||||
if ($port =~ /awc/){
|
if ( $port =~ /awc/ ) {
|
||||||
$bp_index->{0}=$iid;
|
$bp_index->{0} = $iid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $bp_index;
|
return $bp_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,16 +128,16 @@ sub fw_mac {
|
|||||||
my $aironet = shift;
|
my $aironet = shift;
|
||||||
my $fw_mac = $aironet->fw_mac2();
|
my $fw_mac = $aironet->fw_mac2();
|
||||||
my $fw_port = $aironet->fw_port2();
|
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
|
# 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};
|
my $port = $fw_port->{$fw};
|
||||||
next unless defined $port;
|
next unless defined $port;
|
||||||
delete $fw_mac->{$fw} if $port == 0;
|
delete $fw_mac->{$fw} if $port == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach my $bs (keys %$bs_mac){
|
foreach my $bs ( keys %$bs_mac ) {
|
||||||
my $entry = $bs;
|
my $entry = $bs;
|
||||||
$entry =~ s/\.0$//;
|
$entry =~ s/\.0$//;
|
||||||
$fw_mac->{$entry} = $bs_mac->{$bs};
|
$fw_mac->{$entry} = $bs_mac->{$bs};
|
||||||
@@ -149,10 +150,9 @@ sub fw_mac {
|
|||||||
sub fw_port {
|
sub fw_port {
|
||||||
my $aironet = shift;
|
my $aironet = shift;
|
||||||
my $fw_port = $aironet->fw_port2();
|
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;
|
my $entry = $bs;
|
||||||
$entry =~ s/\.0$//;
|
$entry =~ s/\.0$//;
|
||||||
$fw_port->{$entry} = $bs_port->{$bs};
|
$fw_port->{$entry} = $bs_port->{$bs};
|
||||||
@@ -161,18 +161,17 @@ sub fw_port {
|
|||||||
return $fw_port;
|
return $fw_port;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub i_duplex {
|
sub i_duplex {
|
||||||
my $aironet = shift;
|
my $aironet = shift;
|
||||||
my $interfaces = $aironet->interfaces();
|
my $interfaces = $aironet->interfaces();
|
||||||
my $awc_duplex = $aironet->awc_duplex();
|
my $awc_duplex = $aironet->awc_duplex();
|
||||||
|
|
||||||
my %i_duplex;
|
my %i_duplex;
|
||||||
|
|
||||||
foreach my $iid (keys %$interfaces){
|
foreach my $iid ( keys %$interfaces ) {
|
||||||
my $name = $interfaces->{$iid};
|
my $name = $interfaces->{$iid};
|
||||||
|
|
||||||
if ($name =~ /fec/){
|
if ( $name =~ /fec/ ) {
|
||||||
$i_duplex{$iid} = $awc_duplex;
|
$i_duplex{$iid} = $awc_duplex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -186,7 +185,7 @@ sub i_mac {
|
|||||||
my $i_mac = $aironet->i_mac2();
|
my $i_mac = $aironet->i_mac2();
|
||||||
my $awc_mac = $aironet->awc_mac();
|
my $awc_mac = $aironet->awc_mac();
|
||||||
|
|
||||||
foreach my $iid (keys %$awc_mac){
|
foreach my $iid ( keys %$awc_mac ) {
|
||||||
next unless defined $i_mac->{$iid};
|
next unless defined $i_mac->{$iid};
|
||||||
$i_mac->{$iid} = $awc_mac->{$iid};
|
$i_mac->{$iid} = $awc_mac->{$iid};
|
||||||
}
|
}
|
||||||
@@ -195,14 +194,14 @@ sub i_mac {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub i_ignore {
|
sub i_ignore {
|
||||||
my $aironet = shift;
|
my $aironet = shift;
|
||||||
my $interfaces = $aironet->interfaces();
|
my $interfaces = $aironet->interfaces();
|
||||||
|
|
||||||
my %i_ignore;
|
my %i_ignore;
|
||||||
foreach my $if (keys %$interfaces){
|
foreach my $if ( keys %$interfaces ) {
|
||||||
$i_ignore{$if}++ if ($interfaces->{$if} =~ /(rptr|lo)/);
|
$i_ignore{$if}++ if ( $interfaces->{$if} =~ /(rptr|lo)/ );
|
||||||
}
|
}
|
||||||
|
|
||||||
return \%i_ignore;
|
return \%i_ignore;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,11 +215,12 @@ __END__
|
|||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -228,7 +228,6 @@ Max Baker (C<max@warped.org>)
|
|||||||
my $aironet = new SNMP::Info(
|
my $aironet = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
@@ -240,8 +239,8 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
SNMP::Info subclass to provide access to SNMP data for an Aironet device running Aironet software,
|
SNMP::Info subclass to provide access to SNMP data for an Aironet device
|
||||||
not cisco IOS.
|
running Aironet software, not cisco IOS.
|
||||||
|
|
||||||
Note there are two classes for Aironet devices :
|
Note there are two classes for Aironet devices :
|
||||||
|
|
||||||
@@ -257,8 +256,8 @@ This class is for devices running Cisco IOS software (newer)
|
|||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
For speed or debugging purposes you can call the subclass directly, but not after determining
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
a more specific class using the method above.
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
my $aironet = new SNMP::Info::Layer3::Aironet(...);
|
my $aironet = new SNMP::Info::Layer3::Aironet(...);
|
||||||
|
|
||||||
@@ -274,14 +273,14 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item AWCVX-MIB
|
=item F<AWCVX-MIB>
|
||||||
|
|
||||||
=item IEEE802dot11-MIB
|
=item F<IEEE802dot11-MIB>
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
These MIBs are now included in the v2.tar.gz archive available from ftp.cisco.com. Make sure you
|
These MIBs are now included in the v2.tar.gz archive available from
|
||||||
have a current version.
|
ftp.cisco.com. Make sure you have a current version.
|
||||||
|
|
||||||
=head1 GLOBALS
|
=head1 GLOBALS
|
||||||
|
|
||||||
@@ -293,13 +292,13 @@ These are methods that return scalar value from SNMP
|
|||||||
|
|
||||||
Gives the admin duplex setting for the Ethernet Port.
|
Gives the admin duplex setting for the Ethernet Port.
|
||||||
|
|
||||||
B<awcEtherDuplex.0>
|
C<awcEtherDuplex.0>
|
||||||
|
|
||||||
=item $aironet->mac()
|
=item $aironet->mac()
|
||||||
|
|
||||||
Gives the MAC Address of the wireless side
|
Gives the MAC Address of the wireless side
|
||||||
|
|
||||||
B<dot11StationID.2>
|
C<dot11StationID.2>
|
||||||
|
|
||||||
=item $aironet->os()
|
=item $aironet->os()
|
||||||
|
|
||||||
@@ -317,9 +316,9 @@ Returns 'cisco'.
|
|||||||
|
|
||||||
=head2 Globals imported from SNMP::Info::Layer3
|
=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
|
These are methods that return tables of information in the form of a reference
|
||||||
to a hash.
|
to a hash.
|
||||||
@@ -330,18 +329,18 @@ to a hash.
|
|||||||
|
|
||||||
=item $aironet->bp_index()
|
=item $aironet->bp_index()
|
||||||
|
|
||||||
Takes the bp_index() value from SNMP::Info::Bridge and overrides the wireless port
|
Takes the bp_index() value from SNMP::Info::Bridge and overrides the wireless
|
||||||
to be assigned to the transparent bridge port (port 0)
|
port to be assigned to the transparent bridge port (port 0)
|
||||||
|
|
||||||
=item $aironet->fw_mac()
|
=item $aironet->fw_mac()
|
||||||
|
|
||||||
Adds static table entries from bs_mac() to port 0 so that wireless MAC addresses will
|
Adds static table entries from bs_mac() to port 0 so that wireless MAC
|
||||||
be reported. Forwarding table entries for port 0 are removed.
|
addresses will be reported. Forwarding table entries for port 0 are removed.
|
||||||
|
|
||||||
=item $aironet->fw_port()
|
=item $aironet->fw_port()
|
||||||
|
|
||||||
Adds the static table port mappings to the forwarding table port mappings by adding
|
Adds the static table port mappings to the forwarding table port mappings by
|
||||||
bs_port() to fw_port()
|
adding bs_port() to fw_port()
|
||||||
|
|
||||||
=item $aironet->i_duplex()
|
=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.
|
Gives the default MAC address of each interface.
|
||||||
|
|
||||||
B<awcIfDefaultPhyAddress>
|
C<awcIfDefaultPhyAddress>
|
||||||
|
|
||||||
=item $aironet->awc_mac()
|
=item $aironet->awc_mac()
|
||||||
|
|
||||||
Gives the actual MAC address of each interface.
|
Gives the actual MAC address of each interface.
|
||||||
|
|
||||||
B<awcIfPhyAddress>
|
C<awcIfPhyAddress>
|
||||||
|
|
||||||
=item $aironet->awc_ip()
|
=item $aironet->awc_ip()
|
||||||
|
|
||||||
Gives the IP Address assigned to each interface.
|
Gives the IP Address assigned to each interface.
|
||||||
|
|
||||||
B<awcIfIpAddress>
|
C<awcIfIpAddress>
|
||||||
|
|
||||||
=item $aironet->awc_netmask()
|
=item $aironet->awc_netmask()
|
||||||
|
|
||||||
Gives the NetMask for each interface.
|
Gives the NetMask for each interface.
|
||||||
|
|
||||||
B<awcIfIpNetMask>
|
C<awcIfIpNetMask>
|
||||||
|
|
||||||
=item $aironet->awc_msdu()
|
=item $aironet->awc_msdu()
|
||||||
|
|
||||||
B<awcIfMSDUMaxLength>
|
C<awcIfMSDUMaxLength>
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::Layer3
|
=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
|
=cut
|
||||||
|
|||||||
466
Info/Layer3/AlcatelLucent.pm
Normal file
466
Info/Layer3/AlcatelLucent.pm
Normal file
@@ -0,0 +1,466 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
%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);
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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->bp_index()
|
||||||
|
|
||||||
|
Work around various bugs in the F<BRIDGE-MIB> and
|
||||||
|
F<Q-BRIDGE-MIB> implementations, by returning both
|
||||||
|
C<ifIndex> and C<dot1dBasePort> mappings to C<ifIndex> values.
|
||||||
|
|
||||||
|
=item $alu->i_duplex_admin()
|
||||||
|
|
||||||
|
Returns info from F<MAU-MIB>
|
||||||
|
|
||||||
|
=item $alu->i_speed_admin()
|
||||||
|
|
||||||
|
Returns info from F<MAU-MIB>
|
||||||
|
|
||||||
|
=item $alu->peth_port_ifindex()
|
||||||
|
|
||||||
|
Returns the C<ifIndex> value for power-ethernet ports
|
||||||
|
using the OmniSwitch algorithm.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::MAU
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::LLDP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
600
Info/Layer3/AlteonAD.pm
Normal file
600
Info/Layer3/AlteonAD.pm
Normal file
@@ -0,0 +1,600 @@
|
|||||||
|
# SNMP::Info::Layer3::AlteonAD
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Eric Miller
|
||||||
|
# All Rights Reserved
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer3::AlteonAD;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::AlteonAD::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||||
|
@SNMP::Info::Layer3::AlteonAD::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer3::MIBS,
|
||||||
|
'ALTEON-ROOT-MIB' => 'aceswitch184',
|
||||||
|
'ALTEON-TIGON-SWITCH-MIB' => 'hwPowerSupplyStatus',
|
||||||
|
'ALTEON-CHEETAH-SWITCH-MIB' => 'hwFanStatus',
|
||||||
|
'ALTEON-TS-PHYSICAL-MIB' => 'agPortTableMaxEnt',
|
||||||
|
'ALTEON-CS-PHYSICAL-MIB' => 'vlanCurCfgLearn',
|
||||||
|
'ALTEON-TS-NETWORK-MIB' => 'ripCurCfgSupply',
|
||||||
|
'ALTEON-CHEETAH-NETWORK-MIB' => 'ripCurCfgIntfSupply',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer3::GLOBALS,
|
||||||
|
'old_sw_ver' => 'ALTEON_TIGON_SWITCH_MIB__agSoftwareVersion',
|
||||||
|
'new_sw_ver' => 'ALTEON_CHEETAH_SWITCH_MIB__agSoftwareVersion',
|
||||||
|
'old_tftp_action' => 'ALTEON_TIGON_SWITCH_MIB__agTftpAction',
|
||||||
|
'new_tftp_action' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpAction',
|
||||||
|
'old_tftp_host' => 'ALTEON_TIGON_SWITCH_MIB__agTftpServer',
|
||||||
|
'new_tftp_host' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpServer',
|
||||||
|
'old_tftp_file' => 'ALTEON_TIGON_SWITCH_MIB__agTftpCfgFileName',
|
||||||
|
'new_tftp_file' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpCfgFileName',
|
||||||
|
'old_tftp_result' => 'ALTEON_TIGON_SWITCH_MIB__agTftpLastActionStatus',
|
||||||
|
'new_tftp_result' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpLastActionStatus',
|
||||||
|
'old_ip_max' => 'ALTEON_TS_NETWORK_MIB__ipInterfaceTableMax',
|
||||||
|
'new_ip_max' => 'ALTEON_CHEETAH_NETWORK_MIB__ipInterfaceTableMax',
|
||||||
|
'fan' => 'ALTEON_CHEETAH_SWITCH_MIB__hwFanStatus',
|
||||||
|
'old_ps1_stat' => 'ALTEON_TIGON_SWITCH_MIB__hwPowerSupplyStatus',
|
||||||
|
'old_ps2_stat' => 'ALTEON_TIGON_SWITCH_MIB__hwRedundantPSStatus',
|
||||||
|
'new_ps_stat' => 'ALTEON_CHEETAH_SWITCH_MIB__hwPowerSupplyStatus',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer3::FUNCS,
|
||||||
|
|
||||||
|
# From agPortCurCfgTable
|
||||||
|
'old_ag_p_cfg_idx' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgIndx',
|
||||||
|
'new_ag_p_cfg_idx' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgIndx',
|
||||||
|
'old_ag_p_cfg_pref' => 'agPortCurCfgPrefLink',
|
||||||
|
'new_ag_p_cfg_pref' => 'agPortCurCfgPreferred',
|
||||||
|
'old_ag_p_cfg_pvid' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgPVID',
|
||||||
|
'new_ag_p_cfg_pvid' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgPVID',
|
||||||
|
'old_ag_p_cfg_fe_auto' =>
|
||||||
|
'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgFastEthAutoNeg',
|
||||||
|
'new_ag_p_cfg_fe_auto' =>
|
||||||
|
'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgFastEthAutoNeg',
|
||||||
|
'old_ag_p_cfg_fe_mode' =>
|
||||||
|
'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgFastEthMode',
|
||||||
|
'new_ag_p_cfg_fe_mode' =>
|
||||||
|
'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgFastEthMode',
|
||||||
|
'old_ag_p_cfg_ge_auto' =>
|
||||||
|
'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgGigEthAutoNeg',
|
||||||
|
'new_ag_p_cfg_ge_auto' =>
|
||||||
|
'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgGigEthAutoNeg',
|
||||||
|
'old_ag_p_cfg_name' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgPortName',
|
||||||
|
'new_ag_p_cfg_name' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgPortName',
|
||||||
|
|
||||||
|
# From portInfoTable
|
||||||
|
'old_p_info_idx' => 'ALTEON_TS_PHYSICAL_MIB__portInfoIndx',
|
||||||
|
'new_p_info_idx' => 'ALTEON_CHEETAH_SWITCH_MIB__portInfoIndx',
|
||||||
|
'old_p_info_mode' => 'ALTEON_TS_PHYSICAL_MIB__portInfoMode',
|
||||||
|
'new_p_info_mode' => 'ALTEON_CHEETAH_SWITCH_MIB__portInfoMode',
|
||||||
|
|
||||||
|
# From ipCurCfgIntfTable
|
||||||
|
'old_ip_cfg_vlan' => 'ALTEON_TS_NETWORK_MIB__ipCurCfgIntfVlan',
|
||||||
|
'new_ip_cfg_vlan' => 'ALTEON_CHEETAH_NETWORK_MIB__ipCurCfgIntfVlan',
|
||||||
|
|
||||||
|
# From vlanCurCfgTable
|
||||||
|
'old_vlan_id' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgVlanId',
|
||||||
|
'new_vlan_id' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgVlanId',
|
||||||
|
'old_vlan_state' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgState',
|
||||||
|
'new_vlan_state' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgState',
|
||||||
|
'old_vlan_name' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgVlanName',
|
||||||
|
'new_vlan_name' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgVlanName',
|
||||||
|
'old_vlan_ports' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgPorts',
|
||||||
|
'new_vlan_ports' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgPorts',
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $alteon = shift;
|
||||||
|
|
||||||
|
my $id = $alteon->id();
|
||||||
|
|
||||||
|
unless ( defined $id ) {
|
||||||
|
print
|
||||||
|
" SNMP::Info::Layer3::AlteonAD::model() - Device does not support sysObjectID\n"
|
||||||
|
if $alteon->debug();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $model = &SNMP::translateObj($id);
|
||||||
|
|
||||||
|
return $id unless defined $model;
|
||||||
|
|
||||||
|
$model =~ s/^(aceswitch|aws|ods)//;
|
||||||
|
$model =~ s/^acedirector/AD/;
|
||||||
|
$model =~ s/^(copper|fiber)Module/BladeCenter GbESM/;
|
||||||
|
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'radware';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'alteon';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_ver {
|
||||||
|
my $alteon = shift;
|
||||||
|
my $version = $alteon->new_sw_ver() || $alteon->old_sw_ver();
|
||||||
|
return unless defined $version;
|
||||||
|
|
||||||
|
return $version;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ps1_status {
|
||||||
|
my $alteon = shift;
|
||||||
|
my $old_ps = $alteon->old_ps1_stat();
|
||||||
|
my $new_ps = $alteon->new_ps_stat();
|
||||||
|
|
||||||
|
return $old_ps if $old_ps;
|
||||||
|
|
||||||
|
if ($new_ps) {
|
||||||
|
return 'ok' if ($new_ps eq 'singlePowerSupplyOk');
|
||||||
|
return 'failed' if ($new_ps eq 'firstPowerSupplyFailed');
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ps2_status {
|
||||||
|
my $alteon = shift;
|
||||||
|
my $old_ps = $alteon->old_ps2_stat();
|
||||||
|
my $new_ps = $alteon->new_ps_stat();
|
||||||
|
|
||||||
|
return $old_ps if $old_ps;
|
||||||
|
|
||||||
|
if ($new_ps) {
|
||||||
|
return 'ok' if ($new_ps eq 'doublePowerSupplyOk');
|
||||||
|
return 'failed' if ($new_ps eq 'secondPowerSupplyFailed');
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub interfaces {
|
||||||
|
my $alteon = shift;
|
||||||
|
my $interfaces = $alteon->i_index();
|
||||||
|
my $descriptions = $alteon->i_description();
|
||||||
|
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||||
|
|
||||||
|
my %interfaces = ();
|
||||||
|
foreach my $iid ( keys %$interfaces ) {
|
||||||
|
my $desc = $descriptions->{$iid};
|
||||||
|
next unless defined $desc;
|
||||||
|
|
||||||
|
if ( $desc =~ /(^net\d+)/ ) {
|
||||||
|
$desc = $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# IP interfaces are first followed by physical, number possible
|
||||||
|
# varies by switch model
|
||||||
|
elsif ( defined $ip_max and $iid > $ip_max ) {
|
||||||
|
$desc = ( $iid % $ip_max );
|
||||||
|
$desc = 'mgmt' if $desc == 231;
|
||||||
|
}
|
||||||
|
$interfaces{$iid} = $desc;
|
||||||
|
}
|
||||||
|
return \%interfaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_duplex {
|
||||||
|
my $alteon = shift;
|
||||||
|
|
||||||
|
my $p_mode = $alteon->new_p_info_mode()
|
||||||
|
|| $alteon->old_p_info_mode()
|
||||||
|
|| {};
|
||||||
|
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||||
|
|
||||||
|
my %i_duplex;
|
||||||
|
foreach my $if ( keys %$p_mode ) {
|
||||||
|
my $duplex = $p_mode->{$if};
|
||||||
|
next unless defined $duplex;
|
||||||
|
|
||||||
|
$duplex = 'half' if $duplex =~ /half/i;
|
||||||
|
$duplex = 'full' if $duplex =~ /full/i;
|
||||||
|
|
||||||
|
my $idx;
|
||||||
|
$idx = $if + $ip_max if ( defined $ip_max );
|
||||||
|
|
||||||
|
$i_duplex{$idx} = $duplex;
|
||||||
|
}
|
||||||
|
return \%i_duplex;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_duplex_admin {
|
||||||
|
my $alteon = shift;
|
||||||
|
|
||||||
|
my $ag_pref
|
||||||
|
= $alteon->new_ag_p_cfg_pref()
|
||||||
|
|| $alteon->old_ag_p_cfg_pref()
|
||||||
|
|| {};
|
||||||
|
my $ag_fe_auto
|
||||||
|
= $alteon->new_ag_p_cfg_fe_auto()
|
||||||
|
|| $alteon->old_ag_p_cfg_fe_auto()
|
||||||
|
|| {};
|
||||||
|
my $ag_fe_mode
|
||||||
|
= $alteon->new_ag_p_cfg_fe_mode()
|
||||||
|
|| $alteon->old_ag_p_cfg_fe_mode()
|
||||||
|
|| {};
|
||||||
|
my $ag_ge_auto
|
||||||
|
= $alteon->new_ag_p_cfg_ge_auto()
|
||||||
|
|| $alteon->old_ag_p_cfg_ge_auto()
|
||||||
|
|| {};
|
||||||
|
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||||
|
my $i_speed = $alteon->i_speed() || {};
|
||||||
|
|
||||||
|
my %i_duplex_admin;
|
||||||
|
foreach my $if ( keys %$ag_ge_auto ) {
|
||||||
|
my $pref = $ag_pref->{$if} || '';
|
||||||
|
my $speed = $i_speed->{$if} || '';
|
||||||
|
my $ge_auto = $ag_ge_auto->{$if} || '';
|
||||||
|
my $fe_auto = $ag_fe_auto->{$if} || '';
|
||||||
|
my $fe_mode = $ag_fe_mode->{$if} || '';
|
||||||
|
|
||||||
|
# Default to auto
|
||||||
|
my $string = 'auto';
|
||||||
|
|
||||||
|
if ( $ge_auto =~ /off/i
|
||||||
|
&& ( $pref =~ /gigabit/i || $speed eq '1.0 Gbps' ) )
|
||||||
|
{
|
||||||
|
$string = 'full';
|
||||||
|
}
|
||||||
|
if ( $fe_auto =~ /off/i
|
||||||
|
&& ( $pref =~ /fast/i || $speed =~ /100?\sMbps/ ) )
|
||||||
|
{
|
||||||
|
$string = 'half'
|
||||||
|
if ( $fe_mode =~ /half/i );
|
||||||
|
$string = 'full'
|
||||||
|
if ( $fe_mode =~ /full/i );
|
||||||
|
}
|
||||||
|
|
||||||
|
my $idx;
|
||||||
|
$idx = $if + $ip_max if ( defined $ip_max );
|
||||||
|
|
||||||
|
$i_duplex_admin{$idx} = $string;
|
||||||
|
}
|
||||||
|
return \%i_duplex_admin;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_name {
|
||||||
|
my $alteon = shift;
|
||||||
|
|
||||||
|
my $p_name = $alteon->new_ag_p_cfg_name()
|
||||||
|
|| $alteon->old_ag_p_cfg_name()
|
||||||
|
|| {};
|
||||||
|
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||||
|
|
||||||
|
my %i_name;
|
||||||
|
foreach my $iid ( keys %$p_name ) {
|
||||||
|
my $name = $p_name->{$iid};
|
||||||
|
next unless defined $name;
|
||||||
|
my $idx;
|
||||||
|
$idx = $iid + $ip_max if ( defined $ip_max );
|
||||||
|
$i_name{$idx} = $name;
|
||||||
|
}
|
||||||
|
return \%i_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub v_index {
|
||||||
|
my $alteon = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $alteon->new_vlan_id($partial) || $alteon->old_vlan_id($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub v_name {
|
||||||
|
my $alteon = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $alteon->new_vlan_name($partial)
|
||||||
|
|| $alteon->old_vlan_name($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_vlan {
|
||||||
|
my $alteon = shift;
|
||||||
|
|
||||||
|
my $ag_vlans = $alteon->new_ag_p_cfg_pvid()
|
||||||
|
|| $alteon->old_ag_p_cfg_pvid()
|
||||||
|
|| {};
|
||||||
|
my $ip_vlans = $alteon->new_ip_cfg_vlan()
|
||||||
|
|| $alteon->old_ip_cfg_vlan()
|
||||||
|
|| {};
|
||||||
|
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||||
|
|
||||||
|
my %i_vlan;
|
||||||
|
foreach my $if ( keys %$ip_vlans ) {
|
||||||
|
my $ip_vlanid = $ip_vlans->{$if};
|
||||||
|
next unless defined $ip_vlanid;
|
||||||
|
|
||||||
|
$i_vlan{$if} = $ip_vlanid;
|
||||||
|
}
|
||||||
|
foreach my $if ( keys %$ag_vlans ) {
|
||||||
|
my $ag_vlanid = $ag_vlans->{$if};
|
||||||
|
next unless defined $ag_vlanid;
|
||||||
|
|
||||||
|
my $idx;
|
||||||
|
$idx = $if + $ip_max if ( defined $ip_max );
|
||||||
|
$i_vlan{$idx} = $ag_vlanid;
|
||||||
|
}
|
||||||
|
return \%i_vlan;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_vlan_membership {
|
||||||
|
my $alteon = shift;
|
||||||
|
|
||||||
|
my $v_ports = $alteon->old_vlan_ports()
|
||||||
|
|| $alteon->new_vlan_ports()
|
||||||
|
|| {};
|
||||||
|
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||||
|
|
||||||
|
my $i_vlan_membership = {};
|
||||||
|
foreach my $vlan ( keys %$v_ports ) {
|
||||||
|
my $portlist = [ split( //, unpack( "B*", $v_ports->{$vlan} ) ) ];
|
||||||
|
my $ret = [];
|
||||||
|
|
||||||
|
# Convert portlist bit array to ifIndex array
|
||||||
|
for ( my $i = 0; $i <= scalar(@$portlist); $i++ ) {
|
||||||
|
my $idx;
|
||||||
|
$idx = $i + $ip_max if ( defined $ip_max );
|
||||||
|
push( @{$ret}, $idx ) if ( @$portlist[$i] );
|
||||||
|
}
|
||||||
|
|
||||||
|
#Create HoA ifIndex -> VLAN array
|
||||||
|
foreach my $port ( @{$ret} ) {
|
||||||
|
push( @{ $i_vlan_membership->{$port} }, $vlan );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $i_vlan_membership;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Bridge MIB does not map Bridge Port to ifIndex correctly on some code
|
||||||
|
# versions
|
||||||
|
sub bp_index {
|
||||||
|
my $alteon = shift;
|
||||||
|
|
||||||
|
my $b_index = $alteon->orig_bp_index();
|
||||||
|
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
|
||||||
|
|
||||||
|
my %bp_index;
|
||||||
|
foreach my $iid ( keys %$b_index ) {
|
||||||
|
my $port = $b_index->{$iid};
|
||||||
|
next unless defined $port;
|
||||||
|
$port = $port + $ip_max if ( defined $ip_max and $iid == $ip_max );
|
||||||
|
|
||||||
|
$bp_index{$iid} = $port;
|
||||||
|
}
|
||||||
|
return \%bp_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Radware Alteon ADC
|
||||||
|
Switches.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $alteon = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $alteon->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Abstraction subclass for Radware Alteon Series ADC switches and
|
||||||
|
Nortel BladeCenter Layer2-3 GbE Switch Modules.
|
||||||
|
|
||||||
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
|
my $alteon = new SNMP::Info::Layer3::AlteonAD(...);
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer3
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<ALTEON-ROOT-MIB>
|
||||||
|
|
||||||
|
=item F<ALTEON-TIGON-SWITCH-MIB>
|
||||||
|
|
||||||
|
=item F<ALTEON-TS-PHYSICAL-MIB>
|
||||||
|
|
||||||
|
=item F<ALTEON-TS-NETWORK-MIB>
|
||||||
|
|
||||||
|
=item F<ALTEON-CS-PHYSICAL-MIB>
|
||||||
|
|
||||||
|
=item F<ALTEON-CHEETAH-SWITCH-MIB>
|
||||||
|
|
||||||
|
=item F<ALTEON-CHEETAH-NETWORK-MIB>
|
||||||
|
|
||||||
|
=item Inherited Classes' MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $alteon->model()
|
||||||
|
|
||||||
|
Returns model type. Checks $alteon->id() against the F<ALTEON-ROOT-MIB> and
|
||||||
|
then parses out C<aceswitch>, C<aws>, and C<ods> replaces C<acedirector>
|
||||||
|
with AD, and replaces copperModule/fiberModule with BladeCenter GbESM.
|
||||||
|
|
||||||
|
=item $alteon->vendor()
|
||||||
|
|
||||||
|
Returns 'radware'
|
||||||
|
|
||||||
|
=item $alteon->os()
|
||||||
|
|
||||||
|
Returns 'alteon'
|
||||||
|
|
||||||
|
=item $alteon->os_ver()
|
||||||
|
|
||||||
|
Returns the software version reported by C<agSoftwareVersion>
|
||||||
|
|
||||||
|
=item $alteon->tftp_action()
|
||||||
|
|
||||||
|
(C<agTftpAction>)
|
||||||
|
|
||||||
|
=item $alteon->tftp_host()
|
||||||
|
|
||||||
|
(C<agTftpServer>)
|
||||||
|
|
||||||
|
=item $alteon->tftp_file()
|
||||||
|
|
||||||
|
(C<agTftpCfgFileName>)
|
||||||
|
|
||||||
|
=item $alteon->tftp_result()
|
||||||
|
|
||||||
|
(C<agTftpLastActionStatus>)
|
||||||
|
|
||||||
|
=item $alteon->fan()
|
||||||
|
|
||||||
|
(C<hwFanStatus>)
|
||||||
|
|
||||||
|
=item $alteon->ps1_status()
|
||||||
|
|
||||||
|
Returns status of primary power supply
|
||||||
|
|
||||||
|
=item $alteon->ps2_status()
|
||||||
|
|
||||||
|
Returns status of redundant power supply
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a
|
||||||
|
reference to a hash.
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $alteon->interfaces()
|
||||||
|
|
||||||
|
Returns reference to the map between IID and physical port.
|
||||||
|
|
||||||
|
Utilizes description for network interfaces. Ports are determined by
|
||||||
|
formula (C<ifIndex mod 256>).
|
||||||
|
|
||||||
|
=item $alteon->i_duplex()
|
||||||
|
|
||||||
|
Returns reference to hash. Maps port operational duplexes to IIDs.
|
||||||
|
|
||||||
|
=item $alteon->i_duplex_admin()
|
||||||
|
|
||||||
|
Returns reference to hash. Maps port admin duplexes to IIDs.
|
||||||
|
|
||||||
|
=item $alteon->i_vlan()
|
||||||
|
|
||||||
|
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||||
|
|
||||||
|
=item $alteon->i_vlan_membership()
|
||||||
|
|
||||||
|
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
|
||||||
|
IDs. These are the VLANs which are members of the egress list for the port.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
my $interfaces = $alteon->interfaces();
|
||||||
|
my $vlans = $alteon->i_vlan_membership();
|
||||||
|
|
||||||
|
foreach my $iid (sort keys %$interfaces) {
|
||||||
|
my $port = $interfaces->{$iid};
|
||||||
|
my $vlan = join(',', sort(@{$vlans->{$iid}}));
|
||||||
|
print "Port: $port VLAN: $vlan\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
=item $alteon->v_index()
|
||||||
|
|
||||||
|
Returns VLAN IDs
|
||||||
|
|
||||||
|
=item $alteon->v_name()
|
||||||
|
|
||||||
|
Human-entered name for vlans.
|
||||||
|
|
||||||
|
=item $alteon->i_name()
|
||||||
|
|
||||||
|
Maps (C<agPortCurCfgPortName>) to port and returns the human set port name if
|
||||||
|
exists.
|
||||||
|
|
||||||
|
=item $alteon->bp_index()
|
||||||
|
|
||||||
|
Returns a mapping between C<ifIndex> and the Bridge Table.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
392
Info/Layer3/Altiga.pm
Normal file
392
Info/Layer3/Altiga.pm
Normal file
@@ -0,0 +1,392 @@
|
|||||||
|
# SNMP::Info::Layer3::Altiga
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Jeroen van Ingen Schenau
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer3::Altiga;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::Altiga::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||||
|
@SNMP::Info::Layer3::Altiga::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE
|
||||||
|
$int_include_vpn $fake_idx $type_class/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%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
|
||||||
276
Info/Layer3/Arista.pm
Normal file
276
Info/Layer3/Arista.pm
Normal file
@@ -0,0 +1,276 @@
|
|||||||
|
# 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;
|
||||||
|
use SNMP::Info::Aggregate;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::Arista::ISA = qw/
|
||||||
|
SNMP::Info::Aggregate
|
||||||
|
SNMP::Info::LLDP
|
||||||
|
SNMP::Info::MAU
|
||||||
|
SNMP::Info::Layer3 Exporter
|
||||||
|
/;
|
||||||
|
@SNMP::Info::Layer3::Arista::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer3::MIBS,
|
||||||
|
%SNMP::Info::MAU::MIBS,
|
||||||
|
%SNMP::Info::LLDP::MIBS,
|
||||||
|
%SNMP::Info::Aggregate::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;
|
||||||
|
}
|
||||||
|
|
||||||
|
# The LLDP MIB leaves it up in the air what the index means.
|
||||||
|
# On EOS, it's a dot1d port.
|
||||||
|
sub lldp_if {
|
||||||
|
my $arista = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
# We pick a column that someone else is likely to want,
|
||||||
|
# so that the cache means that hopefully this doesn't
|
||||||
|
# cause any more SNMP transactions in total.
|
||||||
|
my $desc = $arista->lldp_rem_desc($partial) || {};
|
||||||
|
my $bp_index = $arista->bp_index() || {};
|
||||||
|
|
||||||
|
my $lldp_if = {};
|
||||||
|
foreach my $key ( keys %$desc ) {
|
||||||
|
my @aOID = split( '\.', $key );
|
||||||
|
my $port = $aOID[1];
|
||||||
|
$lldp_if->{$key} = $bp_index->{$port};
|
||||||
|
}
|
||||||
|
return $lldp_if;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub agg_ports { return agg_ports_ifstack(@_) }
|
||||||
|
|
||||||
|
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::Aggregate
|
||||||
|
|
||||||
|
=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::Aggregate/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
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->i_duplex_admin()
|
||||||
|
|
||||||
|
Returns info from F<MAU-MIB>
|
||||||
|
|
||||||
|
=item $arista->i_speed_admin()
|
||||||
|
|
||||||
|
Returns info from F<MAU-MIB>
|
||||||
|
|
||||||
|
=item $arista->lldp_if()
|
||||||
|
|
||||||
|
Returns the mapping to the SNMP Interface Table.
|
||||||
|
|
||||||
|
=item C<agg_ports>
|
||||||
|
|
||||||
|
Returns a HASH reference mapping from slave to master port for each member of
|
||||||
|
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||||
|
ifIndex of the corresponding master ports.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
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
|
||||||
1770
Info/Layer3/Aruba.pm
Normal file
1770
Info/Layer3/Aruba.pm
Normal file
File diff suppressed because it is too large
Load Diff
1648
Info/Layer3/BayRS.pm
Normal file
1648
Info/Layer3/BayRS.pm
Normal file
File diff suppressed because it is too large
Load Diff
168
Info/Layer3/BlueCoatSG.pm
Normal file
168
Info/Layer3/BlueCoatSG.pm
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
package SNMP::Info::Layer3::BlueCoatSG;
|
||||||
|
|
||||||
|
# Copyright (c) 2011 Netdisco Project
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::BlueCoatSG::ISA = qw/SNMP::Info::Layer3 Exporter/;
|
||||||
|
@SNMP::Info::Layer3::BlueCoatSG::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%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
|
# SNMP::Info::Layer3::C3550
|
||||||
# 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
|
# Copyright (c) 2004 Regents of the University of California
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions are met:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the University of California, Santa Cruz nor the
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer3::C3550;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info::Layer3;
|
|
||||||
use SNMP::Info::CiscoVTP;
|
use SNMP::Info::CiscoVTP;
|
||||||
use SNMP::Info::CiscoStack;
|
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//;
|
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
|
||||||
|
|
||||||
$DEBUG=0;
|
$VERSION = '3.15';
|
||||||
|
|
||||||
# See SNMP::Info for the details of these data structures and
|
# NOTE: Order creates precedence
|
||||||
# the interworkings.
|
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
|
||||||
$INIT = 0;
|
# 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 = (
|
%MIBS = (
|
||||||
%SNMP::Info::Layer3::MIBS,
|
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoPower::MIBS,
|
||||||
%SNMP::Info::CiscoVTP::MIBS,
|
%SNMP::Info::CiscoConfig::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
|
||||||
%SNMP::Info::CiscoStack::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 = (
|
%GLOBALS = (
|
||||||
%SNMP::Info::Layer3::GLOBALS,
|
%SNMP::Info::Layer3::GLOBALS,
|
||||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
%SNMP::Info::CiscoPower::GLOBALS,
|
||||||
%SNMP::Info::CiscoStack::GLOBALS,
|
%SNMP::Info::CiscoConfig::GLOBALS,
|
||||||
'ports2' => 'ifNumber',
|
%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 = (
|
%FUNCS = (
|
||||||
%SNMP::Info::Layer3::FUNCS,
|
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CiscoPower::FUNCS,
|
||||||
%SNMP::Info::CiscoVTP::FUNCS,
|
%SNMP::Info::CiscoConfig::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
|
||||||
%SNMP::Info::CiscoStack::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 = (
|
%MUNGE = (
|
||||||
# Inherit all the built in munging
|
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoPower::MUNGE,
|
||||||
%SNMP::Info::Layer3::MUNGE,
|
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
|
||||||
%SNMP::Info::CiscoVTP::MUNGE,
|
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
|
||||||
%SNMP::Info::CiscoStack::MUNGE,
|
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::CDP::MUNGE,
|
||||||
);
|
%SNMP::Info::CiscoStack::MUNGE, %SNMP::Info::CiscoStpExtensions::MUNGE,
|
||||||
|
%SNMP::Info::CiscoVTP::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;
|
|
||||||
|
|
||||||
sub vendor {
|
sub vendor {
|
||||||
return 'cisco';
|
return 'cisco';
|
||||||
@@ -90,12 +120,12 @@ sub vendor {
|
|||||||
|
|
||||||
sub model {
|
sub model {
|
||||||
my $c3550 = shift;
|
my $c3550 = shift;
|
||||||
my $id = $c3550->id();
|
my $id = $c3550->id();
|
||||||
my $model = &SNMP::translateObj($id) || $id;
|
my $model = &SNMP::translateObj($id) || $id;
|
||||||
$model =~ s/^catalyst//;
|
$model =~ s/^catalyst//;
|
||||||
|
|
||||||
# turn 355048 into 3550-48
|
# 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";
|
$model = "$1-$2";
|
||||||
}
|
}
|
||||||
return $model;
|
return $model;
|
||||||
@@ -105,42 +135,129 @@ sub model {
|
|||||||
sub ports {
|
sub ports {
|
||||||
my $c3550 = shift;
|
my $c3550 = shift;
|
||||||
|
|
||||||
my $ports2 = $c3550->ports2();
|
my $id = $c3550->id();
|
||||||
|
|
||||||
my $id = $c3550->id();
|
|
||||||
my $model = &SNMP::translateObj($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 $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 {
|
sub cisco_comm_indexing {
|
||||||
1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
# Let SNMP::Info determine the correct subclass for you.
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
my $c3550 = new SNMP::Info(
|
my $c3550 = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
# These arguments are passed directly to SNMP::Session
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
)
|
)
|
||||||
or die "Can't connect to DestHost.\n";
|
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.
|
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).
|
These devices run IOS but have some of the same characteristics as the
|
||||||
For example, forwarding tables are held in VLANs, and extened interface information
|
Catalyst WS-C family (5xxx,6xxx). For example, forwarding tables are held in
|
||||||
is gleened from CISCO-SWITCH-MIB.
|
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
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
a more specific class using the method above.
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
my $c3550 = new SNMP::Info::Layer3::C3550(...);
|
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::Layer3
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoSTPExtensions
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoPower
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoPortSecurity
|
||||||
|
|
||||||
=item SNMP::Info::CiscoVTP
|
=item SNMP::Info::CiscoVTP
|
||||||
|
|
||||||
=item SNMP::Info::CiscoStack
|
=item SNMP::Info::CiscoStack
|
||||||
|
|
||||||
|
=item SNMP::Info::CDP
|
||||||
|
|
||||||
|
=item SNMP::Info::LLDP
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoStats
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoImage
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Required MIBs
|
=head2 Required MIBs
|
||||||
@@ -178,11 +309,26 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=item Inherited Classes' MIBs
|
=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
|
=back
|
||||||
|
|
||||||
@@ -194,37 +340,149 @@ These are methods that return scalar value from SNMP
|
|||||||
|
|
||||||
=item $c3550->vendor()
|
=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
|
=back
|
||||||
|
|
||||||
=head2 Globals imported from SNMP::Info::Layer3
|
=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
|
=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
|
=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
|
These are methods that return tables of information in the form of a reference
|
||||||
to a hash.
|
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
|
=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
|
=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
|
=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
|
=cut
|
||||||
|
|||||||
337
Info/Layer3/C4000.pm
Normal file
337
Info/Layer3/C4000.pm
Normal file
@@ -0,0 +1,337 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
%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;
|
||||||
|
|
||||||
|
*SNMP::Info::Layer3::C4000::set_i_duplex_admin
|
||||||
|
= \&SNMP::Info::MAU::mau_set_i_duplex_admin;
|
||||||
|
*SNMP::Info::Layer3::C4000::set_i_speed_admin
|
||||||
|
= \&SNMP::Info::MAU::mau_set_i_speed_admin;
|
||||||
|
|
||||||
|
|
||||||
|
sub fan {
|
||||||
|
my $c4000 = shift;
|
||||||
|
my $fan_state = $c4000->fan_state();
|
||||||
|
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.
|
||||||
|
|
||||||
|
=item $c4000->set_i_speed_admin(speed, ifIndex)
|
||||||
|
|
||||||
|
Sets port speed, must be supplied with speed and port C<ifIndex>.
|
||||||
|
|
||||||
|
Speed choices are '10', '100', '1000', 'auto'.
|
||||||
|
|
||||||
|
=item $c4000->set_i_duplex_admin(duplex, ifIndex)
|
||||||
|
|
||||||
|
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
|
||||||
|
|
||||||
|
Duplex choices are 'auto', 'half', 'full'.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||||
|
|
||||||
|
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,311 @@
|
|||||||
# SNMP::Info::Layer3::C6500
|
# 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.
|
# 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:
|
# modification, are permitted provided that the following conditions are met:
|
||||||
#
|
#
|
||||||
# * Redistributions of source code must retain the above copyright notice,
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
# this list of conditions and the following disclaimer.
|
# this list of conditions and the following disclaimer.
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
# and/or other materials provided with the distribution.
|
# documentation and/or other materials provided with the distribution.
|
||||||
# * Neither the name of the Author, nor
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
# names of its contributors may be used to endorse or promote products
|
# names of its contributors may be used to endorse or promote products
|
||||||
# derived from this software without specific prior written permission.
|
# derived from this software without specific prior written permission.
|
||||||
#
|
#
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# 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;
|
package SNMP::Info::Layer3::C6500;
|
||||||
$VERSION = 0.8;
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
use SNMP::Info::Layer3;
|
|
||||||
use SNMP::Info::CiscoVTP;
|
|
||||||
use SNMP::Info::CiscoStack;
|
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 SNMP::Info::CiscoAgg;
|
||||||
|
use SNMP::Info::MAU;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
# NOTE : Top-most items gets precedence for @ISA
|
||||||
|
@SNMP::Info::Layer3::C6500::ISA = qw/
|
||||||
|
SNMP::Info::CiscoAgg
|
||||||
|
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
|
||||||
|
SNMP::Info::MAU
|
||||||
|
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//;
|
@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
|
$VERSION = '3.15';
|
||||||
# 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 = (
|
%MIBS = (
|
||||||
%SNMP::Info::Layer3::MIBS,
|
%SNMP::Info::MAU::MIBS,
|
||||||
%SNMP::Info::CiscoVTP::MIBS,
|
%SNMP::Info::Layer3::MIBS,
|
||||||
%SNMP::Info::CiscoStack::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,
|
||||||
|
%SNMP::Info::CiscoAgg::MIBS,
|
||||||
|
'CISCO-VIRTUAL-SWITCH-MIB' => 'cvsSwitchMode',
|
||||||
|
);
|
||||||
|
|
||||||
%GLOBALS = (
|
%GLOBALS = (
|
||||||
%SNMP::Info::Layer3::GLOBALS,
|
%SNMP::Info::MAU::GLOBALS,
|
||||||
%SNMP::Info::CiscoVTP::GLOBALS,
|
%SNMP::Info::Layer3::GLOBALS,
|
||||||
%SNMP::Info::CiscoStack::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 = (
|
%FUNCS = (
|
||||||
%SNMP::Info::Layer3::FUNCS,
|
%SNMP::Info::MAU::FUNCS, %SNMP::Info::Layer3::FUNCS,
|
||||||
%SNMP::Info::CiscoVTP::FUNCS,
|
%SNMP::Info::CiscoPower::FUNCS, %SNMP::Info::CiscoConfig::FUNCS,
|
||||||
%SNMP::Info::CiscoStack::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 = (
|
%MUNGE = (
|
||||||
# Inherit all the built in munging
|
%SNMP::Info::MAU::MUNGE, %SNMP::Info::Layer3::MUNGE,
|
||||||
%SNMP::Info::Layer3::MUNGE,
|
%SNMP::Info::CiscoPower::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
|
||||||
%SNMP::Info::CiscoVTP::MUNGE,
|
%SNMP::Info::CiscoPortSecurity::MUNGE, %SNMP::Info::CiscoImage::MUNGE,
|
||||||
%SNMP::Info::CiscoStack::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,
|
||||||
# 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();
|
|
||||||
}
|
|
||||||
|
|
||||||
sub vendor {
|
sub vendor {
|
||||||
return 'cisco';
|
return 'cisco';
|
||||||
}
|
}
|
||||||
|
|
||||||
sub cisco_comm_indexing {
|
sub cisco_comm_indexing { return 1; }
|
||||||
1;
|
|
||||||
|
sub serial {
|
||||||
|
my $c6500 = shift;
|
||||||
|
|
||||||
|
my $serial = $c6500->SUPER::serial();
|
||||||
|
return $serial if defined $serial and $serial;
|
||||||
|
|
||||||
|
# now grab the table only if SUPER cannot find it
|
||||||
|
my $e_serial = $c6500->e_serial();
|
||||||
|
|
||||||
|
# Find entity table entry for this unit
|
||||||
|
foreach my $e ( sort keys %$e_serial ) {
|
||||||
|
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
|
||||||
|
return $e_serial->{$e};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Newer versions use the ETHERLIKE-MIB to report operational duplex.
|
||||||
|
|
||||||
|
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 is_virtual_switch {
|
||||||
|
my $cvs = shift;
|
||||||
|
my $cvsSwM = $cvs->cvsSwitchMode() || '';
|
||||||
|
|
||||||
|
if ( $cvsSwM eq 'multiNode' ) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_i_duplex_admin {
|
||||||
|
|
||||||
|
# map a textual duplex to an integer one the switch understands
|
||||||
|
my %duplexes = qw/half 1 full 2 auto 4/;
|
||||||
|
|
||||||
|
my $c6500 = shift;
|
||||||
|
my ( $duplex, $iid ) = @_;
|
||||||
|
|
||||||
|
if ( $c6500->is_virtual_switch() ) {
|
||||||
|
|
||||||
|
# VSS -> MAU
|
||||||
|
# Due to VSS bug
|
||||||
|
# 1. Set the ifMauDefaultType
|
||||||
|
# 2. Disable ifMauAutoNegAdminStatus
|
||||||
|
# If the second set is not done, this is not going to be
|
||||||
|
# working... Cisco Bug id CSCty97033.
|
||||||
|
# SXI is not working (up to at least relase SXI9).
|
||||||
|
# SXJ is working at SXJ3 (not before).
|
||||||
|
|
||||||
|
return $c6500->mau_set_i_duplex_admin( $duplex, $iid );
|
||||||
|
}
|
||||||
|
|
||||||
|
my $el_duplex = $c6500->el_duplex($iid);
|
||||||
|
|
||||||
|
# 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( $duplex, $iid );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_i_speed_admin {
|
||||||
|
my $c6500 = shift;
|
||||||
|
my ( $speed, $iid ) = @_;
|
||||||
|
|
||||||
|
if ( $c6500->is_virtual_switch() ) {
|
||||||
|
|
||||||
|
# VSS -> MAU
|
||||||
|
# Due to VSS bug
|
||||||
|
# 1. Set the ifMauDefaultType
|
||||||
|
# 2. Disable ifMauAutoNegAdminStatus
|
||||||
|
# If the second set is not done, this is not going to be working...
|
||||||
|
# Cisco Bug id CSCty97033.
|
||||||
|
# SXI is not working (at least up to relase SXI9).
|
||||||
|
# SXJ is working at SXJ3 (not before).
|
||||||
|
|
||||||
|
return $c6500->mau_set_i_speed_admin( $speed, $iid );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
# normal behavior using the CiscoStack method
|
||||||
|
return $c6500->SUPER::set_i_speed_admin( $speed, $iid );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
__END__
|
__END__
|
||||||
|
|
||||||
=head1 NAME
|
=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
|
=head1 AUTHOR
|
||||||
|
|
||||||
Max Baker (C<max@warped.org>)
|
Max Baker
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
# Let SNMP::Info determine the correct subclass for you.
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
my $c6500 = new SNMP::Info(
|
my $c6500 = new SNMP::Info(
|
||||||
AutoSpecify => 1,
|
AutoSpecify => 1,
|
||||||
Debug => 1,
|
Debug => 1,
|
||||||
# These arguments are passed directly on to SNMP::Session
|
# These arguments are passed directly to SNMP::Session
|
||||||
DestHost => 'myswitch',
|
DestHost => 'myswitch',
|
||||||
Community => 'public',
|
Community => 'public',
|
||||||
Version => 2
|
Version => 2
|
||||||
)
|
)
|
||||||
or die "Can't connect to DestHost.\n";
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
@@ -129,12 +316,12 @@ Max Baker (C<max@warped.org>)
|
|||||||
|
|
||||||
Abstraction subclass for Cisco Catalyst 6500 Layer 2/3 Switches.
|
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).
|
These devices run IOS but have some of the same characteristics as the
|
||||||
For example, forwarding tables are held in VLANs, and extened interface information
|
Catalyst WS-C family (5xxx). For example, forwarding tables are held in
|
||||||
is gleened from CISCO-SWITCH-MIB.
|
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
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
a more specific class using the method above.
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
my $c6500 = new SNMP::Info::Layer3::C6500(...);
|
my $c6500 = new SNMP::Info::Layer3::C6500(...);
|
||||||
|
|
||||||
@@ -142,12 +329,28 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item SNMP::Info::Layer3
|
=item SNMP::Info::CiscoAgg
|
||||||
|
|
||||||
=item SNMP::Info::CiscoVTP
|
=item SNMP::Info::CiscoVTP
|
||||||
|
|
||||||
=item SNMP::Info::CiscoStack
|
=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
|
=back
|
||||||
|
|
||||||
=head2 Required MIBs
|
=head2 Required MIBs
|
||||||
@@ -156,11 +359,28 @@ a more specific class using the method above.
|
|||||||
|
|
||||||
=item Inherited Classes' MIBs
|
=item Inherited Classes' MIBs
|
||||||
|
|
||||||
See SNMP::Info::Layer3 for its own MIB requirements.
|
See L<SNMP::Info::CiscoAgg/"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::CiscoStack/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
|
||||||
|
requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
@@ -174,36 +394,158 @@ These are methods that return scalar value from SNMP
|
|||||||
|
|
||||||
Returns 'cisco'
|
Returns 'cisco'
|
||||||
|
|
||||||
|
=item $c6500->cisco_comm_indexing()
|
||||||
|
|
||||||
|
Returns 1. Use vlan indexing.
|
||||||
|
|
||||||
|
=item $c6500->cvsSwitchMode()
|
||||||
|
|
||||||
|
Returns the Switch status: multiNode or standalone.
|
||||||
|
|
||||||
|
=item $c6500->is_virtual_switch()
|
||||||
|
|
||||||
|
Return 1 if the switch (C<cvsSwitchMode>) is in multimode (VSS).
|
||||||
|
|
||||||
|
=item $c6500->serial()
|
||||||
|
|
||||||
|
Returns serial number of unit (falls back to C<entPhysicalSerialNum>).
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Globals imported from SNMP::Info::Layer3
|
|
||||||
|
|
||||||
See documentation in SNMP::Info::Layer3 for details.
|
|
||||||
|
|
||||||
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
=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
|
=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
|
These are methods that return tables of information in the form of a reference
|
||||||
to a hash.
|
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);
|
||||||
|
|
||||||
|
=item $c6500->set_i_speed_admin(speed, ifIndex)
|
||||||
|
|
||||||
|
Sets port speed, must be supplied with speed and port C<ifIndex>.
|
||||||
|
|
||||||
|
Speed choices are '10', '100', '1000'.
|
||||||
|
|
||||||
|
Crosses $c6500->p_port() with $c6500->p_speed() to utilize port C<ifIndex>.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
=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
|
=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
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for
|
||||||
|
details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|||||||
315
Info/Layer3/Cisco.pm
Normal file
315
Info/Layer3/Cisco.pm
Normal file
@@ -0,0 +1,315 @@
|
|||||||
|
# SNMP::Info::Layer3::Cisco
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Max Baker
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer3::Cisco;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::CiscoVTP;
|
||||||
|
use SNMP::Info::CDP;
|
||||||
|
use SNMP::Info::CiscoStats;
|
||||||
|
use SNMP::Info::CiscoImage;
|
||||||
|
use SNMP::Info::CiscoRTT;
|
||||||
|
use SNMP::Info::CiscoQOS;
|
||||||
|
use SNMP::Info::CiscoConfig;
|
||||||
|
use SNMP::Info::CiscoPower;
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||||
|
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
|
||||||
|
SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
|
||||||
|
SNMP::Info::CiscoConfig SNMP::Info::CiscoPower
|
||||||
|
SNMP::Info::Layer3
|
||||||
|
Exporter/;
|
||||||
|
@SNMP::Info::Layer3::Cisco::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer3::MIBS,
|
||||||
|
%SNMP::Info::CiscoPower::MIBS,
|
||||||
|
%SNMP::Info::CiscoConfig::MIBS,
|
||||||
|
%SNMP::Info::CiscoQOS::MIBS,
|
||||||
|
%SNMP::Info::CiscoRTT::MIBS,
|
||||||
|
%SNMP::Info::CiscoImage::MIBS,
|
||||||
|
%SNMP::Info::CiscoStats::MIBS,
|
||||||
|
%SNMP::Info::CDP::MIBS,
|
||||||
|
%SNMP::Info::CiscoVTP::MIBS,
|
||||||
|
'CISCO-EIGRP-MIB' => 'cEigrpAsRouterId',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoPower::GLOBALS,
|
||||||
|
%SNMP::Info::CiscoConfig::GLOBALS, %SNMP::Info::CiscoQOS::GLOBALS,
|
||||||
|
%SNMP::Info::CiscoRTT::GLOBALS, %SNMP::Info::CiscoImage::GLOBALS,
|
||||||
|
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
|
||||||
|
%SNMP::Info::CiscoVTP::GLOBALS, 'eigrp_id' => 'cEigrpAsRouterId',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer3::FUNCS,
|
||||||
|
%SNMP::Info::CiscoPower::FUNCS,
|
||||||
|
%SNMP::Info::CiscoConfig::FUNCS,
|
||||||
|
%SNMP::Info::CiscoQOS::FUNCS,
|
||||||
|
%SNMP::Info::CiscoRTT::FUNCS,
|
||||||
|
%SNMP::Info::CiscoImage::FUNCS,
|
||||||
|
%SNMP::Info::CiscoStats::FUNCS,
|
||||||
|
%SNMP::Info::CDP::FUNCS,
|
||||||
|
%SNMP::Info::CiscoVTP::FUNCS,
|
||||||
|
|
||||||
|
# EIGRP
|
||||||
|
'eigrp_peers' => 'cEigrpPeerAddr',
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::Layer3::MUNGE,
|
||||||
|
%SNMP::Info::CiscoPower::MUNGE,
|
||||||
|
%SNMP::Info::CiscoConfig::MUNGE,
|
||||||
|
%SNMP::Info::CiscoQOS::MUNGE,
|
||||||
|
%SNMP::Info::CiscoRTT::MUNGE,
|
||||||
|
%SNMP::Info::CiscoImage::MUNGE,
|
||||||
|
%SNMP::Info::CiscoStats::MUNGE,
|
||||||
|
%SNMP::Info::CDP::MUNGE,
|
||||||
|
%SNMP::Info::CiscoVTP::MUNGE,
|
||||||
|
'eigrp_peers' => \&SNMP::Info::munge_ip,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub i_vlan {
|
||||||
|
my ($cisco) = shift;
|
||||||
|
my ($partial) = shift;
|
||||||
|
|
||||||
|
my ($i_type) = $cisco->i_type($partial);
|
||||||
|
my ($i_descr) = $cisco->i_description($partial);
|
||||||
|
my %i_vlan;
|
||||||
|
|
||||||
|
foreach my $idx ( keys %$i_descr ) {
|
||||||
|
if ( $i_type->{$idx} eq 'l2vlan' || $i_type->{$idx} eq 135 ) {
|
||||||
|
if ( $i_descr->{$idx} =~ /\.(\d+)$/ ) {
|
||||||
|
$i_vlan{$idx} = $1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return \%i_vlan;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer3::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
|
||||||
|
that are not covered in other classes.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Max Baker
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $cisco = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
# These arguments are passed directly to SNMP::Session
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $cisco->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Subclass for Generic Cisco Routers running IOS
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoVTP
|
||||||
|
|
||||||
|
=item SNMP::Info::CDP
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoStats
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoImage
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoRTT
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoQOS
|
||||||
|
|
||||||
|
=item SNMP::Info::CiscoConfig
|
||||||
|
|
||||||
|
=item SNMP::Info::Power
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer3
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<CISCO-EIGRP-MIB>
|
||||||
|
|
||||||
|
=item Inherited Classes' MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoQOS/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $cisco->vendor()
|
||||||
|
|
||||||
|
Returns 'cisco'
|
||||||
|
|
||||||
|
=item $cisco->eigrp_id()
|
||||||
|
|
||||||
|
(C<cEigrpAsRouterId>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::CiscoVTP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::CDP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::CiscoStats
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::CiscoImage
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::CiscoRTT
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::CiscoQOS
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::CiscoConfig
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::CiscoPower
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a reference
|
||||||
|
to a hash.
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $cisco->eigrp_peers()
|
||||||
|
|
||||||
|
Returns EIGRP peer IP addresses
|
||||||
|
|
||||||
|
(C<cEigrpPeerAddr>)
|
||||||
|
|
||||||
|
=item $cisco->i_vlan()
|
||||||
|
|
||||||
|
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::CiscoVTP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::CDP
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::CiscoStats
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::CiscoImage
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::CiscoRTT
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::CiscoQOS
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::CiscoConfig
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::CiscoPower
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
252
Info/Layer3/CiscoASA.pm
Normal file
252
Info/Layer3/CiscoASA.pm
Normal file
@@ -0,0 +1,252 @@
|
|||||||
|
# SNMP::Info::Layer3::CiscoASA
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013 Moe Kraus
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR
|
||||||
|
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer3::CiscoASA;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::CiscoVTP;
|
||||||
|
use SNMP::Info::CDP;
|
||||||
|
use SNMP::Info::CiscoStats;
|
||||||
|
use SNMP::Info::CiscoImage;
|
||||||
|
use SNMP::Info::CiscoRTT;
|
||||||
|
use SNMP::Info::CiscoQOS;
|
||||||
|
use SNMP::Info::CiscoConfig;
|
||||||
|
use SNMP::Info::CiscoPower;
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
use SNMP::Info::Layer3::Cisco;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::CiscoASA::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
|
||||||
|
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
|
||||||
|
SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
|
||||||
|
SNMP::Info::CiscoConfig SNMP::Info::CiscoPower
|
||||||
|
SNMP::Info::Layer3::Cisco
|
||||||
|
SNMP::Info::Layer3
|
||||||
|
Exporter/;
|
||||||
|
@SNMP::Info::Layer3::CiscoASA::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%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 ASA Devices
|
||||||
|
|
||||||
|
=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.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer3::Cisco::MIBS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer3::Cisco::GLOBALS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer3::Cisco::FUNCS,
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::Layer3::Cisco::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# For FWSMs, the ipNetToPhysicalPhysAddress table appears to be of the form:
|
||||||
|
# $ifindex.$inetaddresstype.$proto.$ip_address -> $mac_address
|
||||||
|
#
|
||||||
|
# Using the output of ipNetToPhysicalPhysAddress, we can emulate the other
|
||||||
|
# functions.
|
||||||
|
#
|
||||||
|
# This doesn't really line up to what at_* return, so we munge it
|
||||||
|
|
||||||
|
sub at_paddr {
|
||||||
|
my ($fwsm) = shift;
|
||||||
|
my ($partial) = shift;
|
||||||
|
|
||||||
|
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||||
|
my $n_paddrs = {};
|
||||||
|
|
||||||
|
foreach my $key (keys %$paddrs) {
|
||||||
|
my $paddr = $paddrs->{$key};
|
||||||
|
my @parts = split /\./, $key;
|
||||||
|
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
|
||||||
|
my $ip = join ".", @parts;
|
||||||
|
|
||||||
|
next if($proto != 4); # at_paddr doesn't support non-IPv4
|
||||||
|
|
||||||
|
$n_paddrs->{"$ifindex.$ip"} = $paddr;
|
||||||
|
}
|
||||||
|
return $n_paddrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub at_netaddr {
|
||||||
|
my ($fwsm) = shift;
|
||||||
|
my ($partial) = shift;
|
||||||
|
|
||||||
|
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||||
|
|
||||||
|
my $netaddrs = {};
|
||||||
|
|
||||||
|
foreach my $key (keys %$paddrs) {
|
||||||
|
my $paddr = $paddrs->{$key};
|
||||||
|
my @parts = split /\./, $key;
|
||||||
|
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
|
||||||
|
my $ip = join ".", @parts;
|
||||||
|
|
||||||
|
next if($proto != 4); # at_netaddr doesn't support non-IPv4
|
||||||
|
|
||||||
|
$netaddrs->{"$ifindex.$ip"} = $ip;
|
||||||
|
}
|
||||||
|
return $netaddrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub at_ifaddr {
|
||||||
|
my ($fwsm) = shift;
|
||||||
|
my ($partial) = shift;
|
||||||
|
|
||||||
|
my $paddrs = $fwsm->n2p_paddr($partial);
|
||||||
|
|
||||||
|
my $ifaddrs = {};
|
||||||
|
|
||||||
|
foreach my $key (keys %$paddrs) {
|
||||||
|
my $paddr = $paddrs->{$key};
|
||||||
|
my @parts = split /\./, $key;
|
||||||
|
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
|
||||||
|
my $ip = join ".", @parts;
|
||||||
|
|
||||||
|
next if($proto != 4); # at_ifaddr doesn't support non-IPv4
|
||||||
|
|
||||||
|
$ifaddrs->{"$ifindex.$ip"} = $ip;
|
||||||
|
}
|
||||||
|
return $ifaddrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer3::CiscoFWSM - SNMP Interface to Firewall Services Modules for
|
||||||
|
features not covered elsewhere.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Brian De Wolf
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $fwsm = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
# These arguments are passed directly to SNMP::Session
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $fwsm->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Subclass for Cisco Firewall Services Modules
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer3::Cisco
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item Inherited Classes' MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
=head2 Global Methods imported from SNMP::Info::Layer3::Cisco
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a reference
|
||||||
|
to a hash.
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $fwsm->at_paddr()
|
||||||
|
|
||||||
|
This function derives the at_paddr information from the n2p_paddr() table as
|
||||||
|
the MIB to provide that information isn't supported on FWSM.
|
||||||
|
|
||||||
|
=item $fwsm->at_netaddr()
|
||||||
|
|
||||||
|
This function derives the at_netaddr information from the n2p_paddr() table as
|
||||||
|
the MIB to provide that information isn't supported on FWSM.
|
||||||
|
|
||||||
|
=item $fwsm->at_ifaddr()
|
||||||
|
|
||||||
|
This function derives the at_ifaddr information from the n2p_paddr() table as
|
||||||
|
the MIB to provide that information isn't supported on FWSM.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer3::Cisco
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
314
Info/Layer3/Contivity.pm
Normal file
314
Info/Layer3/Contivity.pm
Normal file
@@ -0,0 +1,314 @@
|
|||||||
|
# SNMP::Info::Layer3::Contivity
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2010 Eric Miller
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Santa Cruz nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer3::Contivity;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info;
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
use SNMP::Info::Entity;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::Contivity::ISA
|
||||||
|
= qw/SNMP::Info SNMP::Info::Layer3 SNMP::Info::Entity Exporter/;
|
||||||
|
@SNMP::Info::Layer3::Contivity::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
|
||||||
|
%SNMP::Info::Entity::GLOBALS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::FUNCS, %SNMP::Info::Layer3::FUNCS,
|
||||||
|
%SNMP::Info::Entity::FUNCS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::MUNGE, %SNMP::Info::Layer3::MUNGE,
|
||||||
|
%SNMP::Info::Entity::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub layers {
|
||||||
|
return '00000100';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'avaya';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $contivity = shift;
|
||||||
|
my $e_model = $contivity->e_model() || {};
|
||||||
|
|
||||||
|
my $model = $e_model->{1} || undef;
|
||||||
|
|
||||||
|
return $1 if ( defined $model and $model =~ /(CES\d+|NVR\d+)/i );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'contivity';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_ver {
|
||||||
|
my $contivity = shift;
|
||||||
|
my $descr = $contivity->description();
|
||||||
|
return unless defined $descr;
|
||||||
|
|
||||||
|
if ( $descr =~ m/V(\d+_\d+\.\d+)/i ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub mac {
|
||||||
|
my $contivity = shift;
|
||||||
|
my $i_mac = $contivity->i_mac();
|
||||||
|
|
||||||
|
# Return Interface MAC
|
||||||
|
foreach my $entry ( keys %$i_mac ) {
|
||||||
|
my $sn = $i_mac->{$entry};
|
||||||
|
next unless $sn;
|
||||||
|
return $sn;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub serial {
|
||||||
|
my $contivity = shift;
|
||||||
|
my $e_serial = $contivity->e_serial() || {};
|
||||||
|
|
||||||
|
my $serial = $e_serial->{1} || undef;
|
||||||
|
|
||||||
|
return $1 if ( defined $serial and $serial =~ /(\d+)/ );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub interfaces {
|
||||||
|
my $contivity = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $description = $contivity->i_description($partial) || {};
|
||||||
|
|
||||||
|
my %interfaces = ();
|
||||||
|
foreach my $iid ( keys %$description ) {
|
||||||
|
my $desc = $description->{$iid};
|
||||||
|
|
||||||
|
# Skip everything except Ethernet interfaces
|
||||||
|
next unless ( defined $desc and $desc =~ /fe/i );
|
||||||
|
|
||||||
|
$interfaces{$iid} = $desc;
|
||||||
|
}
|
||||||
|
return \%interfaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_name {
|
||||||
|
my $contivity = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $i_name2 = $contivity->orig_i_name($partial) || {};
|
||||||
|
|
||||||
|
my %i_name;
|
||||||
|
foreach my $iid ( keys %$i_name2 ) {
|
||||||
|
my $name = $i_name2->{$iid};
|
||||||
|
|
||||||
|
#Skip everything except Ethernet interfaces
|
||||||
|
next unless ( defined $name and $name =~ /fe/i );
|
||||||
|
|
||||||
|
$name = $1 if $name =~ /(fei\.\d+\.\d+)/;
|
||||||
|
|
||||||
|
$i_name{$iid} = $name;
|
||||||
|
}
|
||||||
|
return \%i_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer3::Contivity - SNMP Interface to Avaya/Nortel VPN Routers
|
||||||
|
(formerly Contivity Extranet Switches).
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $contivity = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $contivity->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Abstraction subclass for Avaya/Nortel VPN Routers (formerly Contivity
|
||||||
|
Extranet Switch).
|
||||||
|
|
||||||
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
|
my $contivity = new SNMP::Info::Layer3::Contivity(...);
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer3
|
||||||
|
|
||||||
|
=item SNMP::Info::Entity
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item Inherited Classes' MIBs
|
||||||
|
|
||||||
|
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
See L<SNMP::Info::Entity/"Required MIBs"> for its own MIB requirements.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 GLOBALS
|
||||||
|
|
||||||
|
These are methods that return scalar value from SNMP
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $contivity->vendor()
|
||||||
|
|
||||||
|
Returns 'avaya'
|
||||||
|
|
||||||
|
=item $contivity->model()
|
||||||
|
|
||||||
|
Returns the chassis name.
|
||||||
|
|
||||||
|
(C<entPhysicalModelName.1>)
|
||||||
|
|
||||||
|
=item $contivity->os()
|
||||||
|
|
||||||
|
Returns C<'CES'>
|
||||||
|
|
||||||
|
=item $contivity->os_ver()
|
||||||
|
|
||||||
|
Returns the software version extracted from (C<sysDescr>).
|
||||||
|
|
||||||
|
=item $contivity->serial()
|
||||||
|
|
||||||
|
Returns the chassis serial number.
|
||||||
|
|
||||||
|
(C<entPhysicalSerialNum.1>)
|
||||||
|
|
||||||
|
=item $contivity->mac()
|
||||||
|
|
||||||
|
Returns the MAC address of the first Ethernet Interface.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $contivity->layers()
|
||||||
|
|
||||||
|
Returns 00000100. Contivity does not support bridge MIB, so override reported
|
||||||
|
layers.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head2 Globals imported from SNMP::Info::Entity
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
|
||||||
|
|
||||||
|
=head1 TABLE METHODS
|
||||||
|
|
||||||
|
These are methods that return tables of information in the form of a reference
|
||||||
|
to a hash.
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $contivity->interfaces()
|
||||||
|
|
||||||
|
Returns reference to the map between IID and physical Port. Skips loopback
|
||||||
|
and tunnel interfaces.
|
||||||
|
|
||||||
|
=item $contivity->i_name()
|
||||||
|
|
||||||
|
Interface Name field. Skips loopback and tunnel interfaces.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Entity
|
||||||
|
|
||||||
|
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
|
||||||
|
|
||||||
|
=cut
|
||||||
400
Info/Layer3/Dell.pm
Normal file
400
Info/Layer3/Dell.pm
Normal file
@@ -0,0 +1,400 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
%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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
=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
|
||||||
400
Info/Layer3/Enterasys.pm
Normal file
400
Info/Layer3/Enterasys.pm
Normal file
@@ -0,0 +1,400 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
%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);
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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">.
|
||||||
|
|
||||||
|
=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
|
||||||
1044
Info/Layer3/Extreme.pm
Normal file
1044
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.15';
|
||||||
|
|
||||||
|
%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
|
||||||
309
Info/Layer3/Force10.pm
Normal file
309
Info/Layer3/Force10.pm
Normal file
@@ -0,0 +1,309 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
%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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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->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
|
||||||
File diff suppressed because it is too large
Load Diff
249
Info/Layer3/H3C.pm
Normal file
249
Info/Layer3/H3C.pm
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
# 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;
|
||||||
|
use SNMP::Info::IEEE802dot3ad 'agg_ports_lag';
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::H3C::ISA = qw/
|
||||||
|
SNMP::Info::IEEE802dot3ad
|
||||||
|
SNMP::Info::LLDP
|
||||||
|
SNMP::Info::Layer3
|
||||||
|
Exporter
|
||||||
|
/;
|
||||||
|
@SNMP::Info::Layer3::H3C::EXPORT_OK = qw/
|
||||||
|
agg_ports
|
||||||
|
/;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer3::MIBS,
|
||||||
|
%SNMP::Info::LLDP::MIBS,
|
||||||
|
%SNMP::Info::IEEE802dot3ad::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;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub agg_ports { return agg_ports_lag(@_) }
|
||||||
|
|
||||||
|
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 C<agg_ports>
|
||||||
|
|
||||||
|
Returns a HASH reference mapping from slave to master port for each member of
|
||||||
|
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
|
||||||
|
ifIndex of the corresponding master ports.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Table Methods imported from SNMP::Info::Layer3
|
||||||
|
|
||||||
|
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.15';
|
||||||
|
|
||||||
|
%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
|
||||||
407
Info/Layer3/IBMGbTor.pm
Normal file
407
Info/Layer3/IBMGbTor.pm
Normal file
@@ -0,0 +1,407 @@
|
|||||||
|
# SNMP::Info::Layer3::IBMGbTor - SNMP Interface to IBM Rackswitch devices
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# 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::Layer3::IBMGbTor;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
use SNMP::Info::LLDP;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::IBMGbTor::ISA
|
||||||
|
= qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||||
|
@SNMP::Info::Layer3::IBMGbTor::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer3::MIBS,
|
||||||
|
|
||||||
|
# LLDP MIBs not loaded to prevent possible unqualified namespace conflict
|
||||||
|
# with IBM definitions
|
||||||
|
'IBM-GbTOR-10G-L2L3-MIB' => 'lldpInfoRemoteDevicesLocalPort',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer3::GLOBALS,
|
||||||
|
%SNMP::Info::LLDP::GLOBALS,
|
||||||
|
'temp' => 'hwTempSensors',
|
||||||
|
'fan' => 'hwFanSpeed',
|
||||||
|
|
||||||
|
# Can't find the equivalent in IBM-GbTOR-10G-L2L3-MIB
|
||||||
|
# use a different strategy for lldp_sys_cap in hasLLDP()
|
||||||
|
#'lldp_sysname' => 'lldpLocSysName',
|
||||||
|
#'lldp_sysdesc' => 'lldpLocSysDesc',
|
||||||
|
#'lldp_sys_cap' => 'lldpLocSysCapEnabled',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer3::FUNCS,
|
||||||
|
%SNMP::Info::LLDP::FUNCS,
|
||||||
|
|
||||||
|
# IBM-GbTOR-10G-L2L3-MIB::portInfoTable
|
||||||
|
'sw_duplex' => 'portInfoMode',
|
||||||
|
|
||||||
|
# Can't find the equivalent in IBM-GbTOR-10G-L2L3-MIB
|
||||||
|
# not currently used in LLDP class
|
||||||
|
#'lldp_lman_addr' => 'lldpLocManAddrIfId',
|
||||||
|
|
||||||
|
# IBM-GbTOR-10G-L2L3-MIB::lldpInfoPortTable
|
||||||
|
'lldp_port_status' => 'lldpInfoPortAdminStatus',
|
||||||
|
|
||||||
|
# IBM-GbTOR-10G-L2L3-MIB::lldpInfoRemoteDevicesTable
|
||||||
|
'lldp_rem_id_type' => 'lldpInfoRemoteDevicesChassisSubtype',
|
||||||
|
'lldp_rem_id' => 'lldpInfoRemoteDevicesSystemName',
|
||||||
|
'lldp_rem_pid_type' => 'lldpInfoRemoteDevicesPortSubtype',
|
||||||
|
'lldp_rem_pid' => 'lldpInfoRemoteDevicesPortId',
|
||||||
|
'lldp_rem_desc' => 'lldpInfoRemoteDevicesPortDescription',
|
||||||
|
'lldp_rem_sysname' => 'lldpInfoRemoteDevicesSystemName',
|
||||||
|
'lldp_rem_sysdesc' => 'lldpInfoRemoteDevicesSystemDescription',
|
||||||
|
'lldp_rem_sys_cap' => 'lldpInfoRemoteDevicesSystemCapEnabled',
|
||||||
|
|
||||||
|
# IBM-GbTOR-10G-L2L3-MIB::lldpInfoRemoteDevicesManAddrTable
|
||||||
|
'lldp_rman_type' => 'lldpInfoRemoteDevicesManAddrSubtype',
|
||||||
|
'lldp_rman_addr' => 'lldpInfoRemoteDevicesManAddr',
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE, );
|
||||||
|
|
||||||
|
sub hasLLDP {
|
||||||
|
my $ibm = shift;
|
||||||
|
|
||||||
|
# We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
|
||||||
|
# Look to see if LLDP Rx enabled on any port
|
||||||
|
my $lldp_cap = $ibm->lldp_port_status();
|
||||||
|
|
||||||
|
foreach my $if ( keys %$lldp_cap ) {
|
||||||
|
if ( $lldp_cap->{$if} =~ /enabledRx/i ) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub lldp_ip {
|
||||||
|
my $ibm = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $rman_type = $ibm->lldp_rman_type($partial) || {};
|
||||||
|
my $rman_addr = $ibm->lldp_rman_addr($partial) || {};
|
||||||
|
|
||||||
|
my %lldp_ip;
|
||||||
|
foreach my $key ( keys %$rman_addr ) {
|
||||||
|
my $type = $rman_type->{$key};
|
||||||
|
next unless defined $type;
|
||||||
|
next unless $type eq 'ipV4';
|
||||||
|
if ( $key =~ /^(\d+)\./ ) {
|
||||||
|
$lldp_ip{$1} = $rman_addr->{$key};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return \%lldp_ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub lldp_if {
|
||||||
|
my $lldp = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $lldp_desc = $lldp->lldpInfoRemoteDevicesLocalPort($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 %$lldp_desc ) {
|
||||||
|
|
||||||
|
# Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex,
|
||||||
|
# prefer ifAlias over ifDescr since MIB says 'alias'.
|
||||||
|
my $desc = $lldp_desc->{$key};
|
||||||
|
next unless $desc;
|
||||||
|
my $port = $desc;
|
||||||
|
|
||||||
|
# If cross reference is successful use it, otherwise stick with
|
||||||
|
# lldpRemLocalPortNum
|
||||||
|
if ( exists $r_i_alias{$desc} ) {
|
||||||
|
$port = $r_i_alias{$desc};
|
||||||
|
}
|
||||||
|
elsif ( exists $r_i_descr{$desc} ) {
|
||||||
|
$port = $r_i_descr{$desc};
|
||||||
|
}
|
||||||
|
|
||||||
|
$lldp_if{$key} = $port;
|
||||||
|
}
|
||||||
|
return \%lldp_if;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub lldp_platform {
|
||||||
|
my $ibm = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $ibm->lldpInfoRemoteDevicesSystemDescription($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub i_ignore {
|
||||||
|
my $ibm = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $interfaces = $ibm->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 $ibm = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
return $ibm->sw_duplex($partial);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $ibm = shift;
|
||||||
|
my $id = $ibm->id();
|
||||||
|
my $descr = $ibm->description();
|
||||||
|
my $model = &SNMP::translateObj($id);
|
||||||
|
|
||||||
|
if ( $descr =~ /RackSwitch\s(.*)/ ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $model || $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'ibm';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'ibm';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_ver {
|
||||||
|
my $ibm = shift;
|
||||||
|
|
||||||
|
return $ibm->agSoftwareVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
sub interfaces {
|
||||||
|
my $ibm = shift;
|
||||||
|
my $partial = shift;
|
||||||
|
|
||||||
|
my $i_descr = $ibm->i_description($partial) || {};
|
||||||
|
my $i_name = $ibm->i_name($partial) || {};
|
||||||
|
|
||||||
|
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::IBMGbTor - SNMP Interface to IBM Rackswitch devices
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $ibm = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 1
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $ibm->class();
|
||||||
|
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Abstraction subclass for IBM Rackswitch (formerly Blade Network Technologies)
|
||||||
|
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 $ibm = new SNMP::Info::Layer3::IBMGbTor(...);
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer3;
|
||||||
|
|
||||||
|
=item SNMP::Info::LLDP;
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<IBM-GbTOR-10G-L2L3-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 $ibm->model()
|
||||||
|
|
||||||
|
Returns model type. Attempts to pull model from device description.
|
||||||
|
Otherwise checks $ibm->id() against the F<IBM-GbTOR-10G-L2L3-MIB>.
|
||||||
|
|
||||||
|
=item $ibm->vendor()
|
||||||
|
|
||||||
|
Returns 'ibm'
|
||||||
|
|
||||||
|
=item $ibm->os()
|
||||||
|
|
||||||
|
Returns 'ibm'
|
||||||
|
|
||||||
|
=item $ibm->os_ver()
|
||||||
|
|
||||||
|
Returns the software version
|
||||||
|
|
||||||
|
(C<agSoftwareVersion>)
|
||||||
|
|
||||||
|
=item $ibm->temp()
|
||||||
|
|
||||||
|
(C<hwTempSensors>)
|
||||||
|
|
||||||
|
=item $ibm->fan()
|
||||||
|
|
||||||
|
(C<hwFanSpeed>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $ibm->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.
|
||||||
|
|
||||||
|
Checks to see if at least one interface is enabled to receive LLDP packets.
|
||||||
|
|
||||||
|
=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::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 $ibm->interfaces()
|
||||||
|
|
||||||
|
Returns reference to hash of interface names to iids.
|
||||||
|
|
||||||
|
=item $ibm->i_ignore()
|
||||||
|
|
||||||
|
Returns reference to hash of interfaces to be ignored.
|
||||||
|
|
||||||
|
Ignores interfaces with descriptions of tunnel, loopback, and null.
|
||||||
|
|
||||||
|
=item $ibm->i_duplex()
|
||||||
|
|
||||||
|
Returns reference to hash of interface link duplex status.
|
||||||
|
|
||||||
|
(C<portInfoMode>)
|
||||||
|
|
||||||
|
=item $ibm->lldp_if()
|
||||||
|
|
||||||
|
Returns the mapping to the SNMP Interface Table. Tries to cross reference
|
||||||
|
(C<lldpInfoRemoteDevicesLocalPort>) with (C<ifDescr>) and (C<ifAlias>)
|
||||||
|
to get (C<ifIndex>).
|
||||||
|
|
||||||
|
=item $ibm->lldp_ip()
|
||||||
|
|
||||||
|
Returns remote IPv4 address. Returns for all other address types, use
|
||||||
|
lldp_addr if you want any return address type.
|
||||||
|
|
||||||
|
=item $ibm->lldp_platform()
|
||||||
|
|
||||||
|
Returns remote device system description.
|
||||||
|
|
||||||
|
(C<lldpInfoRemoteDevicesSystemDescription>)
|
||||||
|
|
||||||
|
=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
|
||||||
731
Info/Layer3/Juniper.pm
Normal file
731
Info/Layer3/Juniper.pm
Normal file
@@ -0,0 +1,731 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
%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;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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 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.15';
|
||||||
|
|
||||||
|
%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.15';
|
||||||
|
|
||||||
|
%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
|
||||||
217
Info/Layer3/Mikrotik.pm
Normal file
217
Info/Layer3/Mikrotik.pm
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer3::MIBS,
|
||||||
|
'HOST-RESOURCES-MIB' => 'hrSystem',
|
||||||
|
'MIKROTIK-MIB' => 'mtxrLicVersion',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer3::GLOBALS,
|
||||||
|
'hrSystemUptime' => 'hrSystemUptime',
|
||||||
|
'os_level' => 'mtxrLicLevel',
|
||||||
|
'os_ver' => 'mtxrLicVersion',
|
||||||
|
'serial1' => 'mtxrSystem.3.0',
|
||||||
|
'firmware' => 'mtxrSystem.4.0',
|
||||||
|
'fan_type' => 'mtxrHlActiveFan',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer3::FUNCS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::Layer3::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'mikrotik';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub serial {
|
||||||
|
my $mikrotik = shift;
|
||||||
|
return $mikrotik->serial1;
|
||||||
|
}
|
||||||
|
|
||||||
|
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';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub board_temp {
|
||||||
|
my $mikrotik = shift;
|
||||||
|
my $temp = $mikrotik->mtxrHlTemperature;
|
||||||
|
return $temp / 10.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub cpu_temp {
|
||||||
|
my $mikrotik = shift;
|
||||||
|
my $temp = $mikrotik->mtxrHlProcessorTemperature;
|
||||||
|
return $temp / 10.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
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>.
|
||||||
|
|
||||||
|
=item $mikrotik->os_level()
|
||||||
|
|
||||||
|
Returns the value of RouterOS level C<mtxrLicLevel>
|
||||||
|
|
||||||
|
=item $mikrotik->board_temp()
|
||||||
|
=item $mikrotik->cpu_temp()
|
||||||
|
|
||||||
|
Returns the appropriate temperature values
|
||||||
|
|
||||||
|
=item $mikrotik->serial()
|
||||||
|
|
||||||
|
Returns the device serial.
|
||||||
|
|
||||||
|
=item $mikrotik->firmware()
|
||||||
|
|
||||||
|
Returns the firmware version of hardware.
|
||||||
|
|
||||||
|
=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.15';
|
||||||
|
|
||||||
|
%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.15';
|
||||||
|
|
||||||
|
%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
|
||||||
811
Info/Layer3/Netscreen.pm
Normal file
811
Info/Layer3/Netscreen.pm
Normal file
@@ -0,0 +1,811 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
%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',
|
||||||
|
bp_index => 'nsIfInfo',
|
||||||
|
std_at_paddr => 'ipNetToMediaPhysAddress',
|
||||||
|
ns_at_paddr => 'nsIpArpMac',
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::Layer3::MUNGE,
|
||||||
|
%SNMP::Info::IEEE802dot11::MUNGE,
|
||||||
|
'ns_i_mac' => \&SNMP::Info::munge_mac,
|
||||||
|
'ns_at_paddr' => \&SNMP::Info::munge_mac,
|
||||||
|
'std_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Interfaces can have two addresses, we want to capture both the network
|
||||||
|
# address and the management address
|
||||||
|
sub ip_index {
|
||||||
|
my $netscreen = shift;
|
||||||
|
|
||||||
|
my $ns_ip = $netscreen->ns_ip_table() || {};
|
||||||
|
my $if_mng_ip = $netscreen->nsIfMngIp() || {};
|
||||||
|
|
||||||
|
my %ip_index = ();
|
||||||
|
foreach my $iid ( keys %$ns_ip ) {
|
||||||
|
$ip_index{ $ns_ip->{$iid} } = $iid if $ns_ip->{$iid} ne "0.0.0.0";
|
||||||
|
}
|
||||||
|
foreach my $iid ( keys %$if_mng_ip ) {
|
||||||
|
$ip_index{ $if_mng_ip->{$iid} } = $iid
|
||||||
|
if $if_mng_ip->{$iid} ne "0.0.0.0";
|
||||||
|
}
|
||||||
|
return \%ip_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ip_table {
|
||||||
|
my $netscreen = shift;
|
||||||
|
|
||||||
|
my $ip_index = $netscreen->ip_index() || {};
|
||||||
|
my $if_mng_ip = $netscreen->nsIfMngIp() || {};
|
||||||
|
|
||||||
|
my %ip_table = ();
|
||||||
|
foreach my $iid ( keys %$ip_index ) {
|
||||||
|
my $mgmt_ip = $if_mng_ip->{$iid};
|
||||||
|
|
||||||
|
if ( defined $mgmt_ip && $mgmt_ip ne '0.0.0.0' ) {
|
||||||
|
$ip_table{$iid} = $mgmt_ip;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$ip_table{$iid} = $iid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return \%ip_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
# There is only one netmask for the interface both network and management
|
||||||
|
# addresses should have the same netmask
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub at_index {
|
||||||
|
my $netscreen = shift;
|
||||||
|
|
||||||
|
my $std = $netscreen->ipNetToMediaIfIndex();
|
||||||
|
return $std if (ref {} eq ref $std and scalar keys %$std);
|
||||||
|
|
||||||
|
return $netscreen->nsIpArpIfIdx();
|
||||||
|
}
|
||||||
|
|
||||||
|
sub at_paddr {
|
||||||
|
my $netscreen = shift;
|
||||||
|
|
||||||
|
my $std = $netscreen->std_at_paddr();
|
||||||
|
return $std if (ref {} eq ref $std and scalar keys %$std);
|
||||||
|
|
||||||
|
return $netscreen->ns_at_paddr();
|
||||||
|
}
|
||||||
|
|
||||||
|
sub at_netaddr {
|
||||||
|
my $netscreen = shift;
|
||||||
|
|
||||||
|
my $std = $netscreen->ipNetToMediaNetAddress();
|
||||||
|
return $std if (ref {} eq ref $std and scalar keys %$std);
|
||||||
|
|
||||||
|
return $netscreen->nsIpArpIp();
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
=head2 Arp Cache Table
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $netscreen->at_index()
|
||||||
|
|
||||||
|
Returns reference to hash. Maps ARP table entries to Interface IIDs
|
||||||
|
|
||||||
|
If the device doesn't support C<ipNetToMediaIfIndex>, this will try
|
||||||
|
the proprietary C<nsIpArpIfIdx>.
|
||||||
|
|
||||||
|
=item $netscreen->at_paddr()
|
||||||
|
|
||||||
|
Returns reference to hash. Maps ARP table entries to MAC addresses.
|
||||||
|
|
||||||
|
If the device doesn't support C<ipNetToMediaPhysAddress>, this will try
|
||||||
|
the proprietary C<nsIpArpMac>.
|
||||||
|
|
||||||
|
=item $netscreen->at_netaddr()
|
||||||
|
|
||||||
|
Returns reference to hash. Maps ARP table entries to IP addresses.
|
||||||
|
|
||||||
|
If the device doesn't support C<ipNetToMediaNetAddress>, this will try
|
||||||
|
the proprietary C<nsIpArpIp>.
|
||||||
|
|
||||||
|
=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
|
||||||
|
|
||||||
494
Info/Layer3/Nexus.pm
Normal file
494
Info/Layer3/Nexus.pm
Normal file
@@ -0,0 +1,494 @@
|
|||||||
|
# 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.15';
|
||||||
|
|
||||||
|
# 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_parent = $nexus->e_parent();
|
||||||
|
|
||||||
|
foreach my $iid ( keys %$e_parent ) {
|
||||||
|
my $parent = $e_parent->{$iid};
|
||||||
|
if ($parent eq '0') {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Reported version 6.x of NX-OS doesn't use the IPv4 address as index
|
||||||
|
# override methods in ipAddrTable
|
||||||
|
sub ip_table {
|
||||||
|
my $nexus = shift;
|
||||||
|
my $orig_ip_table = $nexus->orig_ip_table();
|
||||||
|
|
||||||
|
my %ip_table;
|
||||||
|
foreach my $iid ( keys %$orig_ip_table ) {
|
||||||
|
my $ip = $orig_ip_table->{$iid};
|
||||||
|
next unless defined $ip;
|
||||||
|
|
||||||
|
$ip_table{$ip} = $ip;
|
||||||
|
}
|
||||||
|
return \%ip_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ip_index {
|
||||||
|
my $nexus = shift;
|
||||||
|
my $orig_ip_table = $nexus->orig_ip_table();
|
||||||
|
my $orig_ip_index = $nexus->orig_ip_index();
|
||||||
|
|
||||||
|
my %ip_index;
|
||||||
|
foreach my $iid ( keys %$orig_ip_table ) {
|
||||||
|
my $ip = $orig_ip_table->{$iid};
|
||||||
|
my $index = $orig_ip_index->{$iid};
|
||||||
|
|
||||||
|
next unless ( defined $ip && defined $index );
|
||||||
|
|
||||||
|
$ip_index{$ip} = $index;
|
||||||
|
}
|
||||||
|
return \%ip_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ip_netmask {
|
||||||
|
my $nexus = shift;
|
||||||
|
my $orig_ip_table = $nexus->orig_ip_table();
|
||||||
|
my $orig_ip_netmask = $nexus->orig_ip_netmask();
|
||||||
|
|
||||||
|
my %ip_netmask;
|
||||||
|
foreach my $iid ( keys %$orig_ip_table ) {
|
||||||
|
my $ip = $orig_ip_table->{$iid};
|
||||||
|
my $netmask = $orig_ip_netmask->{$iid};
|
||||||
|
|
||||||
|
next unless ( defined $ip && defined $netmask );
|
||||||
|
|
||||||
|
$ip_netmask{$ip} = $netmask;
|
||||||
|
}
|
||||||
|
return \%ip_netmask;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub ip_broadcast {
|
||||||
|
my $nexus = shift;
|
||||||
|
my $orig_ip_table = $nexus->orig_ip_table();
|
||||||
|
my $orig_ip_broadcast = $nexus->orig_ip_broadcast();
|
||||||
|
|
||||||
|
my %ip_broadcast;
|
||||||
|
foreach my $iid ( keys %$orig_ip_table ) {
|
||||||
|
my $ip = $orig_ip_table->{$iid};
|
||||||
|
my $broadcast = $orig_ip_broadcast->{$iid};
|
||||||
|
|
||||||
|
next unless ( defined $ip && defined $broadcast );
|
||||||
|
|
||||||
|
$ip_broadcast{$ip} = $broadcast;
|
||||||
|
}
|
||||||
|
return \%ip_broadcast;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 Overrides
|
||||||
|
|
||||||
|
=head3 IP Address Table
|
||||||
|
|
||||||
|
Each entry in this table is an IP address in use on this device. Some
|
||||||
|
versions do not index the table with the IPv4 address in accordance with
|
||||||
|
the MIB definition, these overrides correct that behavior.
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $nexus->ip_index()
|
||||||
|
|
||||||
|
Maps the IP Table to the IID
|
||||||
|
|
||||||
|
(C<ipAdEntIfIndex>)
|
||||||
|
|
||||||
|
=item $nexus->ip_table()
|
||||||
|
|
||||||
|
Maps the Table to the IP address
|
||||||
|
|
||||||
|
(C<ipAdEntAddr>)
|
||||||
|
|
||||||
|
=item $nexus->ip_netmask()
|
||||||
|
|
||||||
|
Gives netmask setting for IP table entry.
|
||||||
|
|
||||||
|
(C<ipAdEntNetMask>)
|
||||||
|
|
||||||
|
=item $nexus->ip_broadcast()
|
||||||
|
|
||||||
|
Gives broadcast address for IP table entry.
|
||||||
|
|
||||||
|
(C<ipAdEntBcastAddr>)
|
||||||
|
|
||||||
|
=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.15';
|
||||||
|
|
||||||
|
%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
|
||||||
1434
Info/Layer3/Passport.pm
Normal file
1434
Info/Layer3/Passport.pm
Normal file
File diff suppressed because it is too large
Load Diff
230
Info/Layer3/Pf.pm
Normal file
230
Info/Layer3/Pf.pm
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
# SNMP::Info::Layer3::Pf
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# Copyright (c) 2010 Max Baker
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of Pf Networks, Inc. nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package SNMP::Info::Layer3::Pf;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
use SNMP::Info::LLDP;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::Pf::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||||
|
@SNMP::Info::Layer3::Pf::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%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
|
||||||
191
Info/Layer3/Pica8.pm
Normal file
191
Info/Layer3/Pica8.pm
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
# SNMP::Info::Layer3::Pica8
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013 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::Pica8;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
use SNMP::Info::LLDP;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::Pica8::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
|
||||||
|
@SNMP::Info::Layer3::Pica8::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer3::MIBS,
|
||||||
|
%SNMP::Info::LLDP::MIBS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%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 'Pica8';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
my $pica8 = shift;
|
||||||
|
my $descr = $pica8->description();
|
||||||
|
|
||||||
|
return $1 if ( $descr =~ /(\S+)\s+Platform Software/i );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_ver {
|
||||||
|
my $pica8 = shift;
|
||||||
|
my $descr = $pica8->description();
|
||||||
|
|
||||||
|
return $1 if ( $descr =~ /Software version ([\d\.]+)/i );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $pica8 = shift;
|
||||||
|
my $descr = $pica8->description();
|
||||||
|
|
||||||
|
return $1 if ( $descr =~ /Hardware model (P-\d{4})/i );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer3::Pica8 - SNMP Interface to L3 Devices, Pica8
|
||||||
|
|
||||||
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
Jeroen van Ingen
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $pica8 = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myrouter',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $pica8->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Subclass for Pica8 devices
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer3
|
||||||
|
|
||||||
|
=item SNMP::Info::LLDP
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item F<PICA-PRIVATE-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 $pica8->vendor()
|
||||||
|
|
||||||
|
Returns 'Pica8'
|
||||||
|
|
||||||
|
=item $pica8->model()
|
||||||
|
|
||||||
|
Returns the model name extracted from C<sysDescr>.
|
||||||
|
|
||||||
|
=item $pica8->os()
|
||||||
|
|
||||||
|
Returns the OS extracted from C<sysDescr>.
|
||||||
|
|
||||||
|
=item $pica8->os_ver()
|
||||||
|
|
||||||
|
Returns the OS version 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 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
|
||||||
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.15';
|
||||||
|
|
||||||
|
%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
|
||||||
|
|
||||||
216
Info/Layer3/Steelhead.pm
Normal file
216
Info/Layer3/Steelhead.pm
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
# SNMP::Info::Layer3::Steelhead
|
||||||
|
#
|
||||||
|
# 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::Layer3::Steelhead;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Exporter;
|
||||||
|
use SNMP::Info::Layer3;
|
||||||
|
|
||||||
|
@SNMP::Info::Layer3::Steelhead::ISA
|
||||||
|
= qw/SNMP::Info::Layer3 Exporter/;
|
||||||
|
@SNMP::Info::Layer3::Steelhead::EXPORT_OK = qw//;
|
||||||
|
|
||||||
|
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
|
||||||
|
|
||||||
|
$VERSION = '3.15';
|
||||||
|
|
||||||
|
%MIBS = (
|
||||||
|
%SNMP::Info::Layer3::MIBS,
|
||||||
|
'STEELHEAD-MIB' => 'serialNumber',
|
||||||
|
);
|
||||||
|
|
||||||
|
%GLOBALS = (
|
||||||
|
%SNMP::Info::Layer3::GLOBALS,
|
||||||
|
# Fully qualified to remove ambiguity of 'model'
|
||||||
|
'rb_model' => 'STEELHEAD-MIB::model',
|
||||||
|
);
|
||||||
|
|
||||||
|
%FUNCS = (
|
||||||
|
%SNMP::Info::Layer3::FUNCS,
|
||||||
|
);
|
||||||
|
|
||||||
|
%MUNGE = (
|
||||||
|
%SNMP::Info::Layer3::MUNGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub layers {
|
||||||
|
return '01001100';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub vendor {
|
||||||
|
return 'riverbed';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub model {
|
||||||
|
my $riverbed = shift;
|
||||||
|
|
||||||
|
my $model = $riverbed->rb_model() || '';
|
||||||
|
|
||||||
|
if ($model =~ /^(\d+)/) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os {
|
||||||
|
return 'steelhead';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub os_ver {
|
||||||
|
my $riverbed = shift;
|
||||||
|
|
||||||
|
my $ver = $riverbed->systemVersion() || '';
|
||||||
|
|
||||||
|
if ( $ver =~ /(\d+[\.\d]+)/ ) {
|
||||||
|
return $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ver;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub serial {
|
||||||
|
my $riverbed = shift;
|
||||||
|
|
||||||
|
return $riverbed->serialNumber();
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
SNMP::Info::Layer3::Steelhead - SNMP Interface to Riverbed Steelhead WAN
|
||||||
|
optimization appliances.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Eric Miller
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
# Let SNMP::Info determine the correct subclass for you.
|
||||||
|
my $riverbed = new SNMP::Info(
|
||||||
|
AutoSpecify => 1,
|
||||||
|
Debug => 1,
|
||||||
|
DestHost => 'myswitch',
|
||||||
|
Community => 'public',
|
||||||
|
Version => 2
|
||||||
|
)
|
||||||
|
or die "Can't connect to DestHost.\n";
|
||||||
|
|
||||||
|
my $class = $riverbed->class();
|
||||||
|
print "SNMP::Info determined this device to fall under subclass : $class\n";
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
Abstraction subclass for Riverbed Steelhead WAN optimization appliances.
|
||||||
|
|
||||||
|
For speed or debugging purposes you can call the subclass directly, but not
|
||||||
|
after determining a more specific class using the method above.
|
||||||
|
|
||||||
|
my $riverbed = new SNMP::Info::Layer3::Steelhead(...);
|
||||||
|
|
||||||
|
=head2 Inherited Classes
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item SNMP::Info::Layer3
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Required MIBs
|
||||||
|
|
||||||
|
F<STEELHEAD-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
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $riverbed->vendor()
|
||||||
|
|
||||||
|
Returns 'riverbed'
|
||||||
|
|
||||||
|
=item $riverbed->model()
|
||||||
|
|
||||||
|
Returns the chassis model.
|
||||||
|
|
||||||
|
(C<STEELHEAD-MIB::model>)
|
||||||
|
|
||||||
|
=item $riverbed->os()
|
||||||
|
|
||||||
|
Returns 'steelhead'
|
||||||
|
|
||||||
|
=item $riverbed->os_ver()
|
||||||
|
|
||||||
|
Returns the software version extracted from (C<systemVersion>).
|
||||||
|
|
||||||
|
=item $riverbed->serial()
|
||||||
|
|
||||||
|
Returns the chassis serial number.
|
||||||
|
|
||||||
|
(C<serialNumber>)
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 Overrides
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $riverbed->layers()
|
||||||
|
|
||||||
|
Returns 01001100. Steelhead does not support bridge MIB, so override reported
|
||||||
|
layers.
|
||||||
|
|
||||||
|
=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 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.15';
|
||||||
|
|
||||||
|
%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
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user